From f45d9964f3e65abdc7a2f216bf10ef61aa6db7be Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Tue, 30 Jun 2020 10:07:16 -0700 Subject: [PATCH 001/476] removed obsoleted module name --- misp_modules/modules/import_mod/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index 45e3359..fbad911 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -15,5 +15,4 @@ __all__ = [ 'threatanalyzer_import', 'csvimport', 'joe_import', - 'trustar_import', ] From 8180ecbfa80a9cac3fd5ff9601b00ff913fdc98b Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 27 Jul 2020 17:20:36 +0200 Subject: [PATCH 002/476] chg: Making use of the Greynoise v2 API --- misp_modules/modules/expansion/greynoise.py | 56 +++++++++++++++------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index dd54158..4cd89d5 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -3,35 +3,59 @@ import json misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-dst', 'ip-src'], 'output': ['text']} -moduleinfo = {'version': '0.1', 'author': 'Aurélien Schwab ', 'description': 'Module to access GreyNoise.io API.', 'module-type': ['hover']} -moduleconfig = ['user-agent'] # TODO take this into account in the code +moduleinfo = { + 'version': '0.2', + 'author': 'Aurélien Schwab ', + 'description': 'Module to access GreyNoise.io API.', + 'module-type': ['hover'] +} +moduleconfig = ['api_key'] -greynoise_api_url = 'http://api.greynoise.io:8888/v1/query/ip' -default_user_agent = 'MISP-Module' +greynoise_api_url = 'https://api.greynoise.io/v2/noise/quick/' +codes_mapping = { + '0x00': 'The IP has never been observed scanning the Internet', + '0x01': 'The IP has been observed by the GreyNoise sensor network', + '0x02': 'The IP has been observed scanning the GreyNoise sensor network, but has not completed a full connection, meaning this can be spoofed', + '0x03': 'The IP is adjacent to another host that has been directly observed by the GreyNoise sensor network', + '0x04': 'Reserved', + '0x05': 'This IP is commonly spoofed in Internet-scan activity', + '0x06': 'This IP has been observed as noise, but this host belongs to a cloud provider where IPs can be cycled frequently', + '0x07': 'This IP is invalid', + '0x08': 'This IP was classified as noise, but has not been observed engaging in Internet-wide scans or attacks in over 60 days' +} def handler(q=False): if q is False: return False request = json.loads(q) + if not request.get('config') or not request['config'].get('api_key'): + return {'error': 'Missing Greynoise API key.'} + headers = { + 'Accept': 'application/json', + 'key': request['config']['api_key'] + } for input_type in mispattributes['input']: if input_type in request: ip = request[input_type] break else: - misperrors['error'] = "Unsupported attributes type" + misperrors['error'] = "Unsupported attributes type." return misperrors - data = {'ip': ip} - r = requests.post(greynoise_api_url, data=data, headers={'user-agent': default_user_agent}) # Real request - if r.status_code == 200: # OK (record found) - response = r.text - if response: - return {'results': [{'types': mispattributes['output'], 'values': response}]} - elif r.status_code == 404: # Not found (not an error) - return {'results': [{'types': mispattributes['output'], 'values': 'No data'}]} - else: # Real error - misperrors['error'] = 'GreyNoise API not accessible (HTTP ' + str(r.status_code) + ')' - return misperrors['error'] + response = requests.get(f'{greynoise_api_url}{ip}', headers=headers) # Real request + if response.status_code == 200: # OK (record found) + return {'results': [{'types': mispattributes['output'], 'values': codes_mapping[response.json()['code']]}]} + # There is an error + errors = { + 400: "Bad request.", + 401: "Unauthorized. Please check your API key.", + 429: "Too many requests. You've hit the rate-limit." + } + try: + misperrors['error'] = errors[response.status_code] + except KeyError: + misperrors['error'] = f'GreyNoise API not accessible (HTTP {response.status_code})' + return misperrors['error'] def introspection(): From f7b60bed2982454e922d4e23a33b033413b3dfc3 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 27 Jul 2020 17:21:52 +0200 Subject: [PATCH 003/476] chg: Updated Greynoise tests following the latest changes on the expansion module --- tests/test_expansions.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index b853c25..a56fbe7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -229,11 +229,24 @@ class TestExpansions(unittest.TestCase): self.assertEqual(to_check, 'OK (Not Found)', response) def test_greynoise(self): - query = {"module": "greynoise", "ip-dst": "1.1.1.1"} - response = self.misp_modules_post(query) - value = self.get_values(response) - if value != 'GreyNoise API not accessible (HTTP 429)': - self.assertTrue(value.startswith('{"ip":"1.1.1.1","status":"ok"')) + module_name = 'greynoise' + query = {"module": module_name, "ip-dst": "1.1.1.1"} + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + try: + self.assertEqual(self.get_values(response), 'This IP is commonly spoofed in Internet-scan activity') + except Exception: + self.assertIn( + self.get_errors(reponse), + ( + "Unauthorized. Please check your API key.", + "Too many requests. You've hit the rate-limit." + ) + ) + else: + response = self.misp_modules_post(query) + self.assertEqual(self.get_errors(response), 'Missing Greynoise API key.') def test_ipasn(self): query = {"module": "ipasn", From 6d528628c7f7aa65ec2e25a1074abc52a0818fab Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 27 Jul 2020 17:26:07 +0200 Subject: [PATCH 004/476] chg: Updated documentation about the greynoise module --- doc/README.md | 4 +++- doc/expansion/greynoise.json | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/README.md b/doc/README.md index e173ad4..21030d4 100644 --- a/doc/README.md +++ b/doc/README.md @@ -502,13 +502,15 @@ Module to query a local copy of Maxmind's Geolite database. Module to access GreyNoise.io API - **features**: ->The module takes an IP address as input and queries Greynoise for some additional information about it. The result is returned as text. +>The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. - **input**: >An IP address. - **output**: >Additional information about the IP fetched from Greynoise API. - **references**: >https://greynoise.io/, https://github.com/GreyNoise-Intelligence/api.greynoise.io +- **requirements**: +>A Greynoise API key. ----- diff --git a/doc/expansion/greynoise.json b/doc/expansion/greynoise.json index f1f1003..49ba481 100644 --- a/doc/expansion/greynoise.json +++ b/doc/expansion/greynoise.json @@ -1,9 +1,9 @@ { "description": "Module to access GreyNoise.io API", "logo": "logos/greynoise.png", - "requirements": [], + "requirements": ["A Greynoise API key."], "input": "An IP address.", "output": "Additional information about the IP fetched from Greynoise API.", "references": ["https://greynoise.io/", "https://github.com/GreyNoise-Intelligence/api.greynoise.io"], - "features": "The module takes an IP address as input and queries Greynoise for some additional information about it. The result is returned as text." + "features": "The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text." } From 3b7a5c4dc2541f3b07baee69a7e8b9694a1627fc Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 28 Jul 2020 11:47:53 +0200 Subject: [PATCH 005/476] add: Specific error message for misp_standard format expansion modules - Checking if the input format is respected and displaying an error message if it is not --- misp_modules/modules/expansion/__init__.py | 9 +++++++++ misp_modules/modules/expansion/apivoid.py | 7 ++++++- misp_modules/modules/expansion/assemblyline_query.py | 5 +++++ misp_modules/modules/expansion/censys_enrich.py | 7 ++++--- misp_modules/modules/expansion/circl_passivedns.py | 7 ++++--- misp_modules/modules/expansion/circl_passivessl.py | 7 ++++--- misp_modules/modules/expansion/cve_advanced.py | 8 +++++--- misp_modules/modules/expansion/cytomic_orion.py | 6 ++++-- misp_modules/modules/expansion/ipasn.py | 11 ++++++----- misp_modules/modules/expansion/joesandbox_query.py | 5 +++++ misp_modules/modules/expansion/lastline_query.py | 4 +++- misp_modules/modules/expansion/malwarebazaar.py | 5 +++++ misp_modules/modules/expansion/ransomcoindb.py | 5 +++++ misp_modules/modules/expansion/recordedfuture.py | 5 +++++ misp_modules/modules/expansion/sophoslabs_intelix.py | 7 +++++++ misp_modules/modules/expansion/trustar_enrich.py | 5 +++++ misp_modules/modules/expansion/urlhaus.py | 8 +++++++- misp_modules/modules/expansion/virustotal.py | 8 +++++++- misp_modules/modules/expansion/virustotal_public.py | 7 ++++++- misp_modules/modules/expansion/xforceexchange.py | 5 +++++ 20 files changed, 107 insertions(+), 24 deletions(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 14d5499..af895e3 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -19,3 +19,12 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture'] + + +minimum_required_fields = ('type', 'uuid', 'value') + +checking_error = 'containing at least a "type" field and a "value" field' +standard_error_message = 'This module requires an "attribute" field as input' + +def check_input_attribute(attribute, requirements=minimum_required_fields): + return all(feature in attribute for feature in requirements) diff --git a/misp_modules/modules/expansion/apivoid.py b/misp_modules/modules/expansion/apivoid.py index 5d6395e..a71b5e6 100755 --- a/misp_modules/modules/expansion/apivoid.py +++ b/misp_modules/modules/expansion/apivoid.py @@ -1,5 +1,6 @@ import json import requests +from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} @@ -74,7 +75,11 @@ def handler(q=False): request = json.loads(q) if not request.get('config', {}).get('apikey'): return {'error': 'An API key for APIVoid is required.'} - attribute = request.get('attribute') + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} apikey = request['config']['apikey'] apivoid_parser = APIVoidParser(attribute) apivoid_parser.parse_domain(apikey) diff --git a/misp_modules/modules/expansion/assemblyline_query.py b/misp_modules/modules/expansion/assemblyline_query.py index 226e4dd..67fce45 100644 --- a/misp_modules/modules/expansion/assemblyline_query.py +++ b/misp_modules/modules/expansion/assemblyline_query.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import json +from . import check_input_attribute, standard_error_message from assemblyline_client import Client, ClientError from collections import defaultdict from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -139,6 +140,10 @@ def handler(q=False): if q is False: return False request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} if not request.get('config'): return {"error": "Missing configuration."} if not request['config'].get('apiurl'): diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index 0fc61ae..d5823ff 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -3,6 +3,7 @@ import json import base64 import codecs from dateutil.parser import isoparse +from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject try: import censys.base @@ -36,11 +37,11 @@ def handler(q=False): api_id = request['config']['api_id'] api_secret = request['config']['api_secret'] - if not request.get('attribute'): - return {'error': 'Unsupported input.'} + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} attribute = request['attribute'] if not any(input_type == attribute['type'] for input_type in mispattributes['input']): - return {'error': 'Unsupported attributes type'} + return {'error': 'Unsupported attribute type.'} attribute = MISPAttribute() attribute.from_dict(**request['attribute']) diff --git a/misp_modules/modules/expansion/circl_passivedns.py b/misp_modules/modules/expansion/circl_passivedns.py index d278a85..5f98314 100755 --- a/misp_modules/modules/expansion/circl_passivedns.py +++ b/misp_modules/modules/expansion/circl_passivedns.py @@ -1,5 +1,6 @@ import json import pypdns +from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject mispattributes = {'input': ['hostname', 'domain', 'ip-src', 'ip-dst', 'ip-src|port', 'ip-dst|port'], 'format': 'misp_standard'} @@ -58,11 +59,11 @@ def handler(q=False): if not request['config'].get('username') or not request['config'].get('password'): return {'error': 'CIRCL Passive DNS authentication is incomplete, please provide your username and password.'} authentication = (request['config']['username'], request['config']['password']) - if not request.get('attribute'): - return {'error': 'Unsupported input.'} + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} attribute = request['attribute'] if not any(input_type == attribute['type'] for input_type in mispattributes['input']): - return {'error': 'Unsupported attributes type'} + return {'error': 'Unsupported attribute type.'} pdns_parser = PassiveDNSParser(attribute, authentication) pdns_parser.parse() return pdns_parser.get_results() diff --git a/misp_modules/modules/expansion/circl_passivessl.py b/misp_modules/modules/expansion/circl_passivessl.py index 102bed8..65783d7 100755 --- a/misp_modules/modules/expansion/circl_passivessl.py +++ b/misp_modules/modules/expansion/circl_passivessl.py @@ -1,5 +1,6 @@ import json import pypssl +from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject mispattributes = {'input': ['ip-src', 'ip-dst', 'ip-src|port', 'ip-dst|port'], 'format': 'misp_standard'} @@ -83,11 +84,11 @@ def handler(q=False): if not request['config'].get('username') or not request['config'].get('password'): return {'error': 'CIRCL Passive SSL authentication is incomplete, please provide your username and password.'} authentication = (request['config']['username'], request['config']['password']) - if not request.get('attribute'): - return {'error': 'Unsupported input.'} + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} attribute = request['attribute'] if not any(input_type == attribute['type'] for input_type in mispattributes['input']): - return {'error': 'Unsupported attributes type'} + return {'error': 'Unsupported attribute type.'} pssl_parser = PassiveSSLParser(attribute, authentication) pssl_parser.parse() return pssl_parser.get_results() diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index 86cba8c..bd2d277 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -1,7 +1,8 @@ -from collections import defaultdict -from pymisp import MISPEvent, MISPObject import json import requests +from . import check_input_attribute, standard_error_message +from collections import defaultdict +from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} @@ -108,7 +109,8 @@ def handler(q=False): if q is False: return False request = json.loads(q) - attribute = request.get('attribute') + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} if attribute.get('type') != 'vulnerability': misperrors['error'] = 'Vulnerability id missing.' return misperrors diff --git a/misp_modules/modules/expansion/cytomic_orion.py b/misp_modules/modules/expansion/cytomic_orion.py index 9723ed6..b730135 100755 --- a/misp_modules/modules/expansion/cytomic_orion.py +++ b/misp_modules/modules/expansion/cytomic_orion.py @@ -7,6 +7,7 @@ An expansion module to enrich attributes in MISP and share indicators of comprom ''' +from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject import json import requests @@ -146,9 +147,10 @@ def handler(q=False): if not request.get('attribute'): return {'error': 'Unsupported input.'} - attribute = request['attribute'] + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} if not any(input_type == attribute['type'] for input_type in mispattributes['input']): - return {'error': 'Unsupported attributes type'} + return {'error': 'Unsupported attribute type.'} if not request.get('config'): return {'error': 'Missing configuration'} diff --git a/misp_modules/modules/expansion/ipasn.py b/misp_modules/modules/expansion/ipasn.py index 3c6867c..3a32358 100755 --- a/misp_modules/modules/expansion/ipasn.py +++ b/misp_modules/modules/expansion/ipasn.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import json +from . import check_input_attribute, standard_error_message from pyipasnhistory import IPASNHistory from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -34,11 +35,11 @@ def handler(q=False): if q is False: return False request = json.loads(q) - if request.get('attribute') and request['attribute'].get('type') in mispattributes['input']: - toquery = request['attribute']['value'] - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} + toquery = request['attribute']['value'] ipasn = IPASNHistory() values = ipasn.query(toquery) diff --git a/misp_modules/modules/expansion/joesandbox_query.py b/misp_modules/modules/expansion/joesandbox_query.py index 1ace259..b9c4987 100644 --- a/misp_modules/modules/expansion/joesandbox_query.py +++ b/misp_modules/modules/expansion/joesandbox_query.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import jbxapi import json +from . import check_input_attribute, checking_error, standard_error_message from joe_parser import JoeParser misperrors = {'error': 'Error'} @@ -27,6 +28,10 @@ def handler(q=False): if not apikey: return {'error': 'No API key provided'} + if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): + return {'error': f'{standard_error_message}, {checking_error} that is the link to the Joe Sandbox report.'} + if request['attribute']['type'] != 'link': + return {'error': 'Unsupported attribute type.'} url = request['attribute']['value'] if "/submissions/" not in url: return {'error': "The URL does not point to a Joe Sandbox analysis."} diff --git a/misp_modules/modules/expansion/lastline_query.py b/misp_modules/modules/expansion/lastline_query.py index 4ce4e47..dcabda5 100644 --- a/misp_modules/modules/expansion/lastline_query.py +++ b/misp_modules/modules/expansion/lastline_query.py @@ -3,8 +3,8 @@ Module (type "expansion") to query a Lastline report from an analysis link. """ import json - import lastline_api +from . import check_input_attribute, checking_error, standard_error_message misperrors = { @@ -52,6 +52,8 @@ def handler(q=False): try: config = request["config"] auth_data = lastline_api.LastlineAbstractClient.get_login_params_from_dict(config) + if not request.get('attribute') or not request['attribute'].get('value'): + return {'error': f'{standard_error_message}, {checking_error} that is the link to a Lastline analysis.'} analysis_link = request['attribute']['value'] # The API url changes based on the analysis link host name api_url = lastline_api.get_portal_url_from_task_link(analysis_link) diff --git a/misp_modules/modules/expansion/malwarebazaar.py b/misp_modules/modules/expansion/malwarebazaar.py index 4574b75..60739e8 100644 --- a/misp_modules/modules/expansion/malwarebazaar.py +++ b/misp_modules/modules/expansion/malwarebazaar.py @@ -1,5 +1,6 @@ import json import requests +from . import check_input_attribute, checking_error, standard_error_message from pymisp import MISPEvent, MISPObject mispattributes = {'input': ['md5', 'sha1', 'sha256'], @@ -34,7 +35,11 @@ def handler(q=False): if q is False: return False request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): + return {'error': f'{standard_error_message}, {checking_error} that is the hash to submit to Malware Bazaar.'} attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} url = 'https://mb-api.abuse.ch/api/v1/' response = requests.post(url, data={'query': 'get_info', 'hash': attribute['value']}).json() query_status = response['query_status'] diff --git a/misp_modules/modules/expansion/ransomcoindb.py b/misp_modules/modules/expansion/ransomcoindb.py index 2b9b566..d9a1712 100644 --- a/misp_modules/modules/expansion/ransomcoindb.py +++ b/misp_modules/modules/expansion/ransomcoindb.py @@ -1,4 +1,5 @@ import json +from . import check_input_attribute, checking_error, standard_error_message from ._ransomcoindb import ransomcoindb from pymisp import MISPObject @@ -28,6 +29,10 @@ def handler(q=False): q = json.loads(q) if "config" not in q or "api-key" not in q["config"]: return {"error": "Ransomcoindb API key is missing"} + if not q.get('attribute') or not check_input_attribute(attribute, requirements=('type', 'value')): + return {'error': f'{standard_error_message}, {checking_error}.'} + if q['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} api_key = q["config"]["api-key"] r = {"results": []} diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index c42a42b..2f71dbb 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -1,6 +1,7 @@ import json import logging import requests +from . import check_input_attribute, checking_error, standard_error_message from urllib.parse import quote from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject @@ -257,6 +258,10 @@ def handler(q=False): else: misperrors['error'] = 'Missing Recorded Future token.' return misperrors + if not request.get('attribute') or not check_input_attribute(request['atttribute'], requirements=('type', 'value')): + return {'error': f'{standard_error_message}, {checking_error}.'} + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} input_attribute = request.get('attribute') rf_enricher = RFEnricher(token, input_attribute) diff --git a/misp_modules/modules/expansion/sophoslabs_intelix.py b/misp_modules/modules/expansion/sophoslabs_intelix.py index 017683a..6c6204a 100644 --- a/misp_modules/modules/expansion/sophoslabs_intelix.py +++ b/misp_modules/modules/expansion/sophoslabs_intelix.py @@ -1,3 +1,4 @@ +from. import check_input_attribute, checking_error, standard_error_message from pymisp import MISPEvent, MISPObject import json import requests @@ -105,6 +106,12 @@ def handler(q=False): misperrors['error'] = "Missing client_id or client_secret value for SOPHOSLabs Intelix. \ It's free to sign up here https://aws.amazon.com/marketplace/pp/B07SLZPMCS." return misperrors + to_check = (('type', 'value'), ('type', 'value1')) + if not request.get('attribute') or not any(check_input_attribute(request['attribute'], requirements=check) for check in to_check): + return {'error': f'{standard_error_message}, {checking_error}.'} + attribute = request['attribute'] + if attribute['type'] not in misp_types_in: + return {'error': 'Unsupported attribute type.'} client = SophosLabsApi(j['config']['client_id'], j['config']['client_secret']) if j['attribute']['type'] == "sha256": client.hash_lookup(j['attribute']['value1']) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index efe7c53..a0d6177 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -1,5 +1,6 @@ import json import pymisp +from . import check_input_attribute, checking_error, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject from trustar import TruStar @@ -110,7 +111,11 @@ def handler(q=False): misperrors['error'] = "Your TruSTAR API key and secret are required for indicator enrichment." return misperrors + if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): + return {'error': f'{standard_error_message}, {checking_error}.'} attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} trustar_parser = TruSTARParser(attribute, config) try: diff --git a/misp_modules/modules/expansion/urlhaus.py b/misp_modules/modules/expansion/urlhaus.py index baaaaf6..ed13b77 100644 --- a/misp_modules/modules/expansion/urlhaus.py +++ b/misp_modules/modules/expansion/urlhaus.py @@ -1,6 +1,8 @@ -from pymisp import MISPAttribute, MISPEvent, MISPObject +# -*- coding: utf-8 -*- import json import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['domain', 'hostname', 'ip-src', 'ip-dst', 'md5', 'sha256', 'url'], @@ -134,7 +136,11 @@ def handler(q=False): if q is False: return False request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} urlhaus_parser = _misp_type_mapping[attribute['type']](attribute) return urlhaus_parser.query_api() diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index b09de81..12f7552 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -1,6 +1,7 @@ -from pymisp import MISPAttribute, MISPEvent, MISPObject import json import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sha1", "sha256", "url"], @@ -195,6 +196,11 @@ def handler(q=False): if not request.get('config') or not request['config'].get('apikey'): misperrors['error'] = "A VirusTotal api key is required for this module." return misperrors + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} + event_limit = request['config'].get('event_limit') if not isinstance(event_limit, int): event_limit = 5 diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index e7c2e96..6ffb7f9 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -1,6 +1,7 @@ -from pymisp import MISPAttribute, MISPEvent, MISPObject import json import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sha1", "sha256", "url"], @@ -174,7 +175,11 @@ def handler(q=False): if not request.get('config') or not request['config'].get('apikey'): misperrors['error'] = "A VirusTotal api key is required for this module." return misperrors + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} query_type, to_call = misp_type_mapping[attribute['type']] parser = to_call(request['config']['apikey'], attribute) query_result = parser.get_query_result(query_type) diff --git a/misp_modules/modules/expansion/xforceexchange.py b/misp_modules/modules/expansion/xforceexchange.py index 7999ce2..936917f 100644 --- a/misp_modules/modules/expansion/xforceexchange.py +++ b/misp_modules/modules/expansion/xforceexchange.py @@ -1,6 +1,7 @@ import requests import json import sys +from . import check_input_attribute, standard_error_message from collections import defaultdict from pymisp import MISPAttribute, MISPEvent, MISPObject from requests.auth import HTTPBasicAuth @@ -160,6 +161,10 @@ def handler(q=False): return misperrors key = request["config"]["apikey"] password = request['config']['apipassword'] + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message} which should contain at least a type, a value and an uuid.'} + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} parser = XforceExchange(request['attribute'], key, password) parser.parse() return parser.get_result() From 3ab67b23b66831dc49e6ecd0a346a8b9b52cbdce Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 28 Jul 2020 11:56:03 +0200 Subject: [PATCH 006/476] fix: Avoid issues with the attribute value field name - The module setup allows 'value1' as attribute value field name, but we want to make sure that users passing standard misp format with 'value' instead, will not have issues, as well as keeping the current setup --- .../modules/expansion/sophoslabs_intelix.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/sophoslabs_intelix.py b/misp_modules/modules/expansion/sophoslabs_intelix.py index 6c6204a..38d4293 100644 --- a/misp_modules/modules/expansion/sophoslabs_intelix.py +++ b/misp_modules/modules/expansion/sophoslabs_intelix.py @@ -113,12 +113,18 @@ def handler(q=False): if attribute['type'] not in misp_types_in: return {'error': 'Unsupported attribute type.'} client = SophosLabsApi(j['config']['client_id'], j['config']['client_secret']) - if j['attribute']['type'] == "sha256": - client.hash_lookup(j['attribute']['value1']) - if j['attribute']['type'] in ['ip-dst', 'ip-src', 'ip']: - client.ip_lookup(j["attribute"]["value1"]) - if j['attribute']['type'] in ['uri', 'url', 'domain', 'hostname']: - client.url_lookup(j["attribute"]["value1"]) + mapping = { + 'sha256': 'hash_lookup', + 'ip-dst': 'ip_lookup', + 'ip-src': 'ip_lookup', + 'ip': 'ip_lookup', + 'uri': 'url_lookup', + 'url': 'url_lookup', + 'domain': 'url_lookup', + 'hostname': 'url_lookup' + } + attribute_value = attribute['value'] if 'value' in attribute else attribute['value1'] + getattr(client, mapping[attribute['type']])(attribute_value) return client.get_result() From a316e1877f55995df55ad917ca8f8a3a471548e2 Mon Sep 17 00:00:00 2001 From: johannesh Date: Tue, 28 Jul 2020 13:33:48 +0200 Subject: [PATCH 007/476] Add Recorded Future module documentation --- doc/README.md | 18 ++++++++++++++++++ doc/expansion/recordedfuture.json | 9 +++++++++ doc/logos/recordedfuture.png | Bin 0 -> 39310 bytes 3 files changed, 27 insertions(+) create mode 100644 doc/expansion/recordedfuture.json create mode 100644 doc/logos/recordedfuture.png diff --git a/doc/README.md b/doc/README.md index e173ad4..77c1e82 100644 --- a/doc/README.md +++ b/doc/README.md @@ -964,6 +964,24 @@ Module to check an IPv4 address against known RBLs. ----- +#### [recordedfuture](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/recordedfuture.py) + + + +Module to enrich attributes with threat intelligence from Recorded Future. +- **features**: +>Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future will be matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object will also include a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes. +- **input**: +>A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness. +- **output**: +>A MISP object containing a copy of the enriched attribute with added tags from Recorded Future and a list of new attributes related to the enriched attribute. +- **references**: +>https://www.recordedfuture.com/ +- **requirements**: +>A Recorded Future API token. + +----- + #### [reversedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/reversedns.py) Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes. diff --git a/doc/expansion/recordedfuture.json b/doc/expansion/recordedfuture.json new file mode 100644 index 0000000..bbeea07 --- /dev/null +++ b/doc/expansion/recordedfuture.json @@ -0,0 +1,9 @@ +{ + "description": "Module to enrich attributes with threat intelligence from Recorded Future.", + "logo": "logos/recordedfuture.png", + "requirements": ["A Recorded Future API token."], + "input": "A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness.", + "output": "A MISP object containing a copy of the enriched attribute with added tags from Recorded Future and a list of new attributes related to the enriched attribute.", + "references": ["https://www.recordedfuture.com/"], + "features": "Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future will be matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object will also include a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes." +} diff --git a/doc/logos/recordedfuture.png b/doc/logos/recordedfuture.png new file mode 100644 index 0000000000000000000000000000000000000000..a208c0453e811fe2f8fefab566158f5d4ca76e9a GIT binary patch literal 39310 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 literal 0 HcmV?d00001 From 988bf3487d4c47b16f9d95d42d85b6158ed4f1a9 Mon Sep 17 00:00:00 2001 From: johannesh Date: Tue, 28 Jul 2020 13:46:43 +0200 Subject: [PATCH 008/476] Improve wording --- doc/README.md | 2 +- doc/expansion/recordedfuture.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README.md b/doc/README.md index 77c1e82..5e15147 100644 --- a/doc/README.md +++ b/doc/README.md @@ -970,7 +970,7 @@ Module to check an IPv4 address against known RBLs. Module to enrich attributes with threat intelligence from Recorded Future. - **features**: ->Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future will be matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object will also include a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes. +>Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future is matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object also includes a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes. - **input**: >A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness. - **output**: diff --git a/doc/expansion/recordedfuture.json b/doc/expansion/recordedfuture.json index bbeea07..2fec7eb 100644 --- a/doc/expansion/recordedfuture.json +++ b/doc/expansion/recordedfuture.json @@ -5,5 +5,5 @@ "input": "A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness.", "output": "A MISP object containing a copy of the enriched attribute with added tags from Recorded Future and a list of new attributes related to the enriched attribute.", "references": ["https://www.recordedfuture.com/"], - "features": "Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future will be matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object will also include a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes." + "features": "Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future is matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object also includes a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes." } From d2661c7a2017f669baf98cfaee5f4b9a7a18bf66 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 28 Jul 2020 15:06:25 +0200 Subject: [PATCH 009/476] fix: Fixed pep8 + some copy paste issues introduced with the latest commits --- misp_modules/modules/expansion/__init__.py | 1 + misp_modules/modules/expansion/cve_advanced.py | 1 + misp_modules/modules/expansion/cytomic_orion.py | 1 + misp_modules/modules/expansion/ransomcoindb.py | 2 +- misp_modules/modules/expansion/sophoslabs_intelix.py | 8 ++++---- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index af895e3..1b6d2bb 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -26,5 +26,6 @@ minimum_required_fields = ('type', 'uuid', 'value') checking_error = 'containing at least a "type" field and a "value" field' standard_error_message = 'This module requires an "attribute" field as input' + def check_input_attribute(attribute, requirements=minimum_required_fields): return all(feature in attribute for feature in requirements) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index bd2d277..cd36655 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -111,6 +111,7 @@ def handler(q=False): request = json.loads(q) if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] if attribute.get('type') != 'vulnerability': misperrors['error'] = 'Vulnerability id missing.' return misperrors diff --git a/misp_modules/modules/expansion/cytomic_orion.py b/misp_modules/modules/expansion/cytomic_orion.py index b730135..c13b254 100755 --- a/misp_modules/modules/expansion/cytomic_orion.py +++ b/misp_modules/modules/expansion/cytomic_orion.py @@ -149,6 +149,7 @@ def handler(q=False): if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] if not any(input_type == attribute['type'] for input_type in mispattributes['input']): return {'error': 'Unsupported attribute type.'} diff --git a/misp_modules/modules/expansion/ransomcoindb.py b/misp_modules/modules/expansion/ransomcoindb.py index d9a1712..0e05855 100644 --- a/misp_modules/modules/expansion/ransomcoindb.py +++ b/misp_modules/modules/expansion/ransomcoindb.py @@ -29,7 +29,7 @@ def handler(q=False): q = json.loads(q) if "config" not in q or "api-key" not in q["config"]: return {"error": "Ransomcoindb API key is missing"} - if not q.get('attribute') or not check_input_attribute(attribute, requirements=('type', 'value')): + if not q.get('attribute') or not check_input_attribute(q['attribute'], requirements=('type', 'value')): return {'error': f'{standard_error_message}, {checking_error}.'} if q['attribute']['type'] not in mispattributes['input']: return {'error': 'Unsupported attribute type.'} diff --git a/misp_modules/modules/expansion/sophoslabs_intelix.py b/misp_modules/modules/expansion/sophoslabs_intelix.py index 38d4293..254437b 100644 --- a/misp_modules/modules/expansion/sophoslabs_intelix.py +++ b/misp_modules/modules/expansion/sophoslabs_intelix.py @@ -1,8 +1,8 @@ -from. import check_input_attribute, checking_error, standard_error_message -from pymisp import MISPEvent, MISPObject import json import requests import base64 +from. import check_input_attribute, checking_error, standard_error_message +from pymisp import MISPEvent, MISPObject from urllib.parse import quote moduleinfo = {'version': '1.0', @@ -107,9 +107,9 @@ def handler(q=False): It's free to sign up here https://aws.amazon.com/marketplace/pp/B07SLZPMCS." return misperrors to_check = (('type', 'value'), ('type', 'value1')) - if not request.get('attribute') or not any(check_input_attribute(request['attribute'], requirements=check) for check in to_check): + if not j.get('attribute') or not any(check_input_attribute(j['attribute'], requirements=check) for check in to_check): return {'error': f'{standard_error_message}, {checking_error}.'} - attribute = request['attribute'] + attribute = j['attribute'] if attribute['type'] not in misp_types_in: return {'error': 'Unsupported attribute type.'} client = SophosLabsApi(j['config']['client_id'], j['config']['client_secret']) From f1dac0c8dfb5aff60611d3dbd439b67feaa1a03e Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 28 Jul 2020 15:23:24 +0200 Subject: [PATCH 010/476] fix: Fixed pep8 --- misp_modules/modules/expansion/lastline_query.py | 2 +- misp_modules/modules/expansion/sophoslabs_intelix.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/lastline_query.py b/misp_modules/modules/expansion/lastline_query.py index dcabda5..dbfdf14 100644 --- a/misp_modules/modules/expansion/lastline_query.py +++ b/misp_modules/modules/expansion/lastline_query.py @@ -52,7 +52,7 @@ def handler(q=False): try: config = request["config"] auth_data = lastline_api.LastlineAbstractClient.get_login_params_from_dict(config) - if not request.get('attribute') or not request['attribute'].get('value'): + if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): return {'error': f'{standard_error_message}, {checking_error} that is the link to a Lastline analysis.'} analysis_link = request['attribute']['value'] # The API url changes based on the analysis link host name diff --git a/misp_modules/modules/expansion/sophoslabs_intelix.py b/misp_modules/modules/expansion/sophoslabs_intelix.py index 254437b..4d7c413 100644 --- a/misp_modules/modules/expansion/sophoslabs_intelix.py +++ b/misp_modules/modules/expansion/sophoslabs_intelix.py @@ -1,7 +1,7 @@ import json import requests import base64 -from. import check_input_attribute, checking_error, standard_error_message +from . import check_input_attribute, checking_error, standard_error_message from pymisp import MISPEvent, MISPObject from urllib.parse import quote From 0b869750d75dd170c502fca089ee989cf3a4f14c Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Wed, 29 Jul 2020 09:35:08 -0700 Subject: [PATCH 011/476] added description to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index db199a0..17d6f2b 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [STIX2 pattern syntax validator](misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) - a module to check a STIX2 pattern syntax. * [ThreatCrowd](misp_modules/modules/expansion/threatcrowd.py) - an expansion module for [ThreatCrowd](https://www.threatcrowd.org/). * [threatminer](misp_modules/modules/expansion/threatminer.py) - an expansion module to expand from [ThreatMiner](https://www.threatminer.org/). +* [TruSTAR Enrich](misp_modules/modules/expansion/trustar_enrich.py) - an expansion module to enrich MISP data with [TruSTAR](https://www.trustar.co/). * [urlhaus](misp_modules/modules/expansion/urlhaus.py) - Query urlhaus to get additional data about a domain, hash, hostname, ip or url. * [urlscan](misp_modules/modules/expansion/urlscan.py) - an expansion module to query [urlscan.io](https://urlscan.io). * [virustotal](misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) From ee21a88127abc91332abfff10dabd04c1afca422 Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Thu, 6 Aug 2020 21:59:13 -0700 Subject: [PATCH 012/476] updating to include metadata and alter type of trustar link generated --- .../modules/expansion/trustar_enrich.py | 70 +++++++++++++------ 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 48b4895..f4df990 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -1,7 +1,10 @@ import json import pymisp +from base64 import b64encode +from collections import OrderedDict from pymisp import MISPAttribute, MISPEvent, MISPObject from trustar import TruStar +from urllib.parse import quote misperrors = {'error': "Error"} mispattributes = { @@ -33,9 +36,12 @@ class TruSTARParser: 'SHA256': "sha256" } + SUMMARY_FIELDS = ["source", "score", "attributes"] + METADATA_FIELDS = ["sightings", "first_seen", "last_seen", "tags"] + REPORT_BASE_URL = "https://station.trustar.co/constellation/reports/{}" - CLIENT_METATAG = "MISP-{}".format(pymisp.__version__) + CLIENT_METATAG = f"MISP-{pymisp.__version__}" def __init__(self, attribute, config): config['enclave_ids'] = config.get('enclave_ids', "").strip().split(',') @@ -55,20 +61,36 @@ class TruSTARParser: results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} - def generate_trustar_links(self, entity_value): + def generate_trustar_link(self, entity_type, entity_value): """ - Generates links to TruSTAR reports if they exist. + Generates link to TruSTAR report of entity. :param entity_value: Value of entity. """ - report_links = list() - trustar_reports = self.ts_client.search_reports(entity_value) - for report in trustar_reports: - report_links.append(self.REPORT_BASE_URL.format(report.id)) + report_id = b64encode(quote(f"{entity_type}|{entity_value}").encode()).decode() - return report_links + return self.REPORT_BASE_URL.format(report_id) - def parse_indicator_summary(self, summaries): + def generate_enrichment_report(self, summary, metadata): + """ + Extracts desired fields from summary and metadata reports and + generates an enrichment report. + + :param summary: Indicator summary report. + :param metadata: Indicator metadata report. + :return: Enrichment report. + """ + enrichment_report = OrderedDict() + + for field in self.SUMMARY_FIELDS: + enrichment_report[field] = summary.get(field) + + for field in self.METADATA_FIELDS: + enrichment_report[field] = metadata.get(field) + + return enrichment_report + + def parse_indicator_summary(self, summaries, metadata): """ Converts a response from the TruSTAR /1.3/indicators/summaries endpoint a MISP trustar_report object and adds the summary data and links as attributes. @@ -78,18 +100,21 @@ class TruSTARParser: """ for summary in summaries: - trustar_obj = MISPObject('trustar_report') - indicator_type = summary.indicator_type - indicator_value = summary.value - if summary_type in self.ENTITY_TYPE_MAPPINGS: - trustar_obj.add_attribute(indicator_type, attribute_type=self.ENTITY_TYPE_MAPPINGS[indicator_type], - value=indicator_value) - trustar_obj.add_attribute("INDICATOR_SUMMARY", attribute_type="text", - value=json.dumps(summary.to_dict(), sort_keys=True, indent=4)) - report_links = self.generate_trustar_links(indicator_value) - for link in report_links: - trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=link) - self.misp_event.add_object(**trustar_obj) + if summary.indicator_type in self.ENTITY_TYPE_MAPPINGS: + indicator_type = summary.indicator_type + indicator_value = summary.indicator_value + try: + enrichment_report = self.generate_enrichment_report(summary.to_dict(), metadata.to_dict()) + trustar_obj = MISPObject('trustar_report') + trustar_obj.add_attribute(indicator_type, attribute_type=self.ENTITY_TYPE_MAPPINGS[indicator_type], + value=indicator_value) + trustar_obj.add_attribute("INDICATOR_SUMMARY", attribute_type="text", + value=json.dumps(enrichment_report, indent=4)) + report_link = self.generate_trustar_link(indicator_type, indicator_value) + trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=report_link) + self.misp_event.add_object(**trustar_obj) + except Exception as e: + misperrors['error'] = f"Error enriching data with TruSTAR -- {e}" def handler(q=False): @@ -114,10 +139,11 @@ def handler(q=False): trustar_parser = TruSTARParser(attribute, config) try: + metadata = trustar_parser.ts_client.get_indicators_metadata([attribute['value']]) summaries = list( trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE)) except Exception as e: - misperrors['error'] = "Unable to retrieve TruSTAR summary data: {}".format(e) + misperrors['error'] = f"Unable to retrieve TruSTAR summary data: {e}" return misperrors trustar_parser.parse_indicator_summary(summaries) From 85d319e85e1e53349685b3124aa13b020891b382 Mon Sep 17 00:00:00 2001 From: johannesh Date: Fri, 7 Aug 2020 10:36:40 +0200 Subject: [PATCH 013/476] Fix typo error introduced in commit: 3b7a5c4dc2541f3b07baee69a7e8b9694a1627fc --- misp_modules/modules/expansion/recordedfuture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index 2f71dbb..8fdff09 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -258,7 +258,7 @@ def handler(q=False): else: misperrors['error'] = 'Missing Recorded Future token.' return misperrors - if not request.get('attribute') or not check_input_attribute(request['atttribute'], requirements=('type', 'value')): + if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): return {'error': f'{standard_error_message}, {checking_error}.'} if request['attribute']['type'] not in mispattributes['input']: return {'error': 'Unsupported attribute type.'} From 2d464adfd635d89c9b9db402a17aece813a503ab Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Sun, 9 Aug 2020 20:29:37 -0700 Subject: [PATCH 014/476] added error checking --- .../modules/expansion/trustar_enrich.py | 123 ++++++++++++------ 1 file changed, 86 insertions(+), 37 deletions(-) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index f4df990..81238ad 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -3,7 +3,7 @@ import pymisp from base64 import b64encode from collections import OrderedDict from pymisp import MISPAttribute, MISPEvent, MISPObject -from trustar import TruStar +from trustar import TruStar, Indicator from urllib.parse import quote misperrors = {'error': "Error"} @@ -36,7 +36,7 @@ class TruSTARParser: 'SHA256': "sha256" } - SUMMARY_FIELDS = ["source", "score", "attributes"] + SUMMARY_FIELDS = ["severityLevel", "source", "score", "attributes"] METADATA_FIELDS = ["sightings", "first_seen", "last_seen", "tags"] REPORT_BASE_URL = "https://station.trustar.co/constellation/reports/{}" @@ -57,64 +57,104 @@ class TruSTARParser: """ Returns the MISP Event enriched with TruSTAR indicator summary data. """ - event = json.loads(self.misp_event.to_json()) - results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} - return {'results': results} + try: + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + except Exception as e: + misperrors['error'] += f" -- Encountered issue serializing enrichment data -- {e}" + return misperrors def generate_trustar_link(self, entity_type, entity_value): """ Generates link to TruSTAR report of entity. + :param entity_type: Type of entity. :param entity_value: Value of entity. + :return: Link to indicator report in TruSTAR platform. """ report_id = b64encode(quote(f"{entity_type}|{entity_value}").encode()).decode() return self.REPORT_BASE_URL.format(report_id) + @staticmethod + def extract_tags(enrichment_report): + """ + Extracts tags from the enrichment report in order to add them + to the TruSTAR MISP Object. Removes tags from report to avoid + redundancy. + + :param: Enrichment data. + """ + if enrichment_report and enrichment_report.get('tags'): + return [tag.get('name') for tag in enrichment_report.pop('tags')] + return None + def generate_enrichment_report(self, summary, metadata): """ Extracts desired fields from summary and metadata reports and generates an enrichment report. - :param summary: Indicator summary report. - :param metadata: Indicator metadata report. + :param summary: Indicator summary report. + :param metadata: Indicator metadata report. :return: Enrichment report. """ enrichment_report = OrderedDict() - for field in self.SUMMARY_FIELDS: - enrichment_report[field] = summary.get(field) + if summary: + summary_dict = summary.to_dict() + enrichment_report.update( + {field: summary_dict[field] for field in self.SUMMARY_FIELDS if summary_dict.get(field)}) - for field in self.METADATA_FIELDS: - enrichment_report[field] = metadata.get(field) + if metadata: + metadata_dict = metadata.to_dict() + enrichment_report.update( + {field: metadata_dict[field] for field in self.METADATA_FIELDS if metadata_dict.get(field)}) return enrichment_report - def parse_indicator_summary(self, summaries, metadata): + def parse_indicator_summary(self, indicator, summary, metadata): """ - Converts a response from the TruSTAR /1.3/indicators/summaries endpoint - a MISP trustar_report object and adds the summary data and links as attributes. + Pulls enrichment data from the TruSTAR /indicators/summaries and /indicators/metadata endpoints + and creates a MISP trustar_report. - :param summaries: A TruSTAR Python SDK Page.generator object for generating - indicator summaries pages. + :param indicator: Value of the attribute + :summary: Indicator summary response object. + :metadata: Indicator response object. """ - for summary in summaries: - if summary.indicator_type in self.ENTITY_TYPE_MAPPINGS: - indicator_type = summary.indicator_type - indicator_value = summary.indicator_value - try: - enrichment_report = self.generate_enrichment_report(summary.to_dict(), metadata.to_dict()) - trustar_obj = MISPObject('trustar_report') - trustar_obj.add_attribute(indicator_type, attribute_type=self.ENTITY_TYPE_MAPPINGS[indicator_type], - value=indicator_value) - trustar_obj.add_attribute("INDICATOR_SUMMARY", attribute_type="text", - value=json.dumps(enrichment_report, indent=4)) - report_link = self.generate_trustar_link(indicator_type, indicator_value) - trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=report_link) - self.misp_event.add_object(**trustar_obj) - except Exception as e: - misperrors['error'] = f"Error enriching data with TruSTAR -- {e}" + # Verify that the indicator type is supported by TruSTAR + if summary and summary.indicator_type in self.ENTITY_TYPE_MAPPINGS: + indicator_type = summary.indicator_type + elif metadata and metadata.type in self.ENTITY_TYPE_MAPPINGS: + indicator_type = metadata.type + else: + misperrors['error'] += " -- Attribute not found or not supported" + raise Exception + + try: + # Extract most relevant fields from indicator summary and metadata responses + enrichment_report = self.generate_enrichment_report(summary, metadata) + tags = self.extract_tags(enrichment_report) + + if enrichment_report: + trustar_obj = MISPObject('trustar_report') + trustar_obj.add_attribute(indicator_type, attribute_type=self.ENTITY_TYPE_MAPPINGS[indicator_type], + value=indicator) + trustar_obj.add_attribute("INDICATOR_SUMMARY", attribute_type="text", + value=json.dumps(enrichment_report, indent=4)) + report_link = self.generate_trustar_link(indicator_type, indicator) + trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=report_link) + self.misp_event.add_object(**trustar_obj) + elif not tags: + raise Exception("No relevant data found") + + if tags: + for tag in tags: + self.misp_event.add_attribute_tag(tag, indicator) + except Exception as e: + misperrors['error'] += f" -- Error enriching attribute {indicator} -- {e}" + raise e def handler(q=False): @@ -139,14 +179,23 @@ def handler(q=False): trustar_parser = TruSTARParser(attribute, config) try: - metadata = trustar_parser.ts_client.get_indicators_metadata([attribute['value']]) - summaries = list( - trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE)) + metadata = trustar_parser.ts_client.get_indicators_metadata([Indicator(value=attribute['value'])])[0] except Exception as e: - misperrors['error'] = f"Unable to retrieve TruSTAR summary data: {e}" + metadata = None + misperrors['error'] += f" -- Could not retrieve indicator metadata from TruSTAR {e}" + + try: + summary = list( + trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE))[0] + except Exception as e: + summary = None + misperrors['error'] += f" -- Unable to retrieve TruSTAR summary data: {e}" + + try: + trustar_parser.parse_indicator_summary(attribute['value'], summary, metadata) + except Exception: return misperrors - trustar_parser.parse_indicator_summary(summaries) return trustar_parser.get_results() From 0b576faa68c1067af8a520085c37798bba146361 Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Sun, 9 Aug 2020 20:36:47 -0700 Subject: [PATCH 015/476] added comments --- misp_modules/modules/expansion/trustar_enrich.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 81238ad..6e615db 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -99,6 +99,7 @@ class TruSTARParser: :param metadata: Indicator metadata report. :return: Enrichment report. """ + # Preserve order of fields as they exist in SUMMARY_FIELDS and METADATA_FIELDS enrichment_report = OrderedDict() if summary: @@ -147,11 +148,13 @@ class TruSTARParser: trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=report_link) self.misp_event.add_object(**trustar_obj) elif not tags: + # If enrichment report is empty and there are no tags, nothing to add to attribute raise Exception("No relevant data found") if tags: for tag in tags: self.misp_event.add_attribute_tag(tag, indicator) + except Exception as e: misperrors['error'] += f" -- Error enriching attribute {indicator} -- {e}" raise e @@ -177,18 +180,18 @@ def handler(q=False): attribute = request['attribute'] trustar_parser = TruSTARParser(attribute, config) + metadata = None + summary = None try: metadata = trustar_parser.ts_client.get_indicators_metadata([Indicator(value=attribute['value'])])[0] except Exception as e: - metadata = None misperrors['error'] += f" -- Could not retrieve indicator metadata from TruSTAR {e}" try: summary = list( trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE))[0] except Exception as e: - summary = None misperrors['error'] += f" -- Unable to retrieve TruSTAR summary data: {e}" try: From 91417d390b85f141b6ae337f7050833b1d846208 Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Sun, 9 Aug 2020 20:41:52 -0700 Subject: [PATCH 016/476] added comments --- misp_modules/modules/expansion/trustar_enrich.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 6e615db..7b6ff3c 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -85,6 +85,7 @@ class TruSTARParser: redundancy. :param: Enrichment data. + :return: List of tags. """ if enrichment_report and enrichment_report.get('tags'): return [tag.get('name') for tag in enrichment_report.pop('tags')] From a3c01fa318b8b1a008e302885ff9161731349589 Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Mon, 10 Aug 2020 07:53:24 -0700 Subject: [PATCH 017/476] added comments --- misp_modules/modules/expansion/trustar_enrich.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 7b6ff3c..33dd814 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -36,6 +36,7 @@ class TruSTARParser: 'SHA256': "sha256" } + # Relevant fields from each TruSTAR endpoint SUMMARY_FIELDS = ["severityLevel", "source", "score", "attributes"] METADATA_FIELDS = ["sightings", "first_seen", "last_seen", "tags"] @@ -140,13 +141,16 @@ class TruSTARParser: tags = self.extract_tags(enrichment_report) if enrichment_report: + # Create MISP trustar_report object and populate it with enrichment data trustar_obj = MISPObject('trustar_report') trustar_obj.add_attribute(indicator_type, attribute_type=self.ENTITY_TYPE_MAPPINGS[indicator_type], value=indicator) trustar_obj.add_attribute("INDICATOR_SUMMARY", attribute_type="text", value=json.dumps(enrichment_report, indent=4)) + report_link = self.generate_trustar_link(indicator_type, indicator) trustar_obj.add_attribute("REPORT_LINK", attribute_type="link", value=report_link) + self.misp_event.add_object(**trustar_obj) elif not tags: # If enrichment report is empty and there are no tags, nothing to add to attribute From bd7f7fa1f3340921a7c451d25e640950f3de9a9d Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Mon, 17 Aug 2020 17:34:21 +0200 Subject: [PATCH 018/476] fix: [virustotal] Resolve key error when user enrich hostname --- misp_modules/modules/expansion/virustotal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index b09de81..1e2c6c5 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -143,7 +143,7 @@ class VirusTotalParser(object): def parse_resolutions(self, resolutions, subdomains=None, uuids=None): domain_ip_object = MISPObject('domain-ip') - if self.attribute.type == 'domain': + if self.attribute.type in ('domain', 'hostname'): domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') else: From b5d7c9c7a3f7b56378569747fb84dd3f91e8e6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Andr=C3=A9?= Date: Mon, 24 Aug 2020 10:11:08 +0200 Subject: [PATCH 019/476] Disable correlation for detection-ratio in virustotal.py --- misp_modules/modules/expansion/virustotal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index 12f7552..6d3b52d 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -175,7 +175,7 @@ class VirusTotalParser(object): vt_object = MISPObject('virustotal-report') vt_object.add_attribute('permalink', type='link', value=query_result['permalink']) detection_ratio = '{}/{}'.format(query_result['positives'], query_result['total']) - vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio) + vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) self.misp_event.add_object(**vt_object) return vt_object.uuid From 8087c9a6a1eb10eba9f4da112f24f83b21b5d8a0 Mon Sep 17 00:00:00 2001 From: johannesh Date: Mon, 24 Aug 2020 11:19:15 +0200 Subject: [PATCH 020/476] Add proxy support and User-Agent header --- .../modules/expansion/recordedfuture.py | 261 +++++++++++++----- 1 file changed, 186 insertions(+), 75 deletions(-) diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index 8fdff09..537e997 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -1,36 +1,89 @@ import json import logging import requests +from requests.exceptions import HTTPError, ProxyError,\ + InvalidURL, ConnectTimeout, ConnectionError from . import check_input_attribute, checking_error, standard_error_message -from urllib.parse import quote +import platform +import os +from urllib.parse import quote, urlparse from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject -moduleinfo = {'version': '1.0', 'author': 'Recorded Future', - 'description': 'Module to retrieve data from Recorded Future', - 'module-type': ['expansion', 'hover']} +moduleinfo = { + 'version': '1.0.1', + 'author': 'Recorded Future', + 'description': 'Module to retrieve data from Recorded Future', + 'module-type': ['expansion', 'hover'] +} -moduleconfig = ['token'] +moduleconfig = ['token', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] misperrors = {'error': 'Error'} -mispattributes = {'input': ['ip', 'ip-src', 'ip-dst', 'domain', 'hostname', 'md5', 'sha1', 'sha256', - 'uri', 'url', 'vulnerability', 'weakness'], - 'output': ['ip', 'ip-src', 'ip-dst', 'domain', 'hostname', 'md5', 'sha1', 'sha256', - 'uri', 'url', 'vulnerability', 'weakness', 'email-src', 'text'], - 'format': 'misp_standard'} +ATTRIBUTES = [ + 'ip', + 'ip-src', + 'ip-dst', + 'domain', + 'hostname', + 'md5', + 'sha1', + 'sha256', + 'uri', + 'url', + 'vulnerability', + 'weakness' +] + +mispattributes = { + 'input': ATTRIBUTES, + 'output': ATTRIBUTES + ['email-src', 'text'], + 'format': 'misp_standard' +} LOGGER = logging.getLogger('recorded_future') LOGGER.setLevel(logging.INFO) -def rf_lookup(api_token: str, category: str, ioc: str) -> requests.Response: - """Do a lookup call using Recorded Future's ConnectAPI.""" - auth_header = {"X-RFToken": api_token} - parsed_ioc = quote(ioc, safe='') - url = f'https://api.recordedfuture.com/v2/{category}/{parsed_ioc}?fields=risk%2CrelatedEntities' - response = requests.get(url, headers=auth_header) - response.raise_for_status() - return response +class RequestHandler: + """A class for handling any outbound requests from this module.""" + def __init__(self): + self.session = requests.Session() + self.app_id = f'{os.path.basename(__file__)}/{moduleinfo["version"]} ({platform.platform()}) ' \ + f'misp_enrichment/{moduleinfo["version"]} python-requests/{requests.__version__}' + self.proxies = None + self.rf_token = None + + def get(self, url: str, headers: dict = None) -> requests.Response: + """General get method with proxy error handling.""" + try: + timeout = 7 if self.proxies else None + response = self.session.get(url, headers=headers, proxies=self.proxies, timeout=timeout) + response.raise_for_status() + return response + except (ConnectTimeout, ProxyError, InvalidURL) as error: + msg = f'Error connecting with proxy, please check the Recorded Future app proxy settings.' + LOGGER.error(f'{msg} Error: {error}') + misperrors['error'] = msg + raise + + def rf_lookup(self, category: str, ioc: str) -> requests.Response: + """Do a lookup call using Recorded Future's ConnectAPI.""" + parsed_ioc = quote(ioc, safe='') + url = f'https://api.recordedfuture.com/v2/{category}/{parsed_ioc}?fields=risk%2CrelatedEntities' + headers = {'X-RFToken': self.rf_token, + 'User-Agent': self.app_id} + try: + response = self.get(url, headers) + except HTTPError as error: + msg = f'Error when requesting data from Recorded Future. {error.response}: {error.response.reason}' + LOGGER.error(msg) + misperrors['error'] = msg + raise + return response + + +GLOBAL_REQUEST_HANDLER = RequestHandler() class GalaxyFinder: @@ -38,46 +91,45 @@ class GalaxyFinder: def __init__(self): self.session = requests.Session() self.sources = { - 'RelatedThreatActor': ['https://raw.githubusercontent.com/MISP/misp-galaxy/' - 'main/clusters/threat-actor.json'], - 'RelatedMalware': ['https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/banker.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/botnet.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/exploit-kit.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/rat.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/ransomware.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/malpedia.json'] + 'RelatedThreatActor': [ + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/threat-actor.json' + ], + 'RelatedMalware': [ + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/banker.json', + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/botnet.json', + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/exploit-kit.json', + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/rat.json', + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/ransomware.json', + 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/malpedia.json' + ] } self.galaxy_clusters = {} - def pull_galaxy_cluster(self, related_type: str): + def pull_galaxy_cluster(self, related_type: str) -> None: """Fetches galaxy clusters for the related_type from the remote json files specified as self.sources.""" # Only fetch clusters if not fetched previously if not self.galaxy_clusters.get(related_type): for source in self.sources.get(related_type): - response = self.session.get(source) - if response.ok: + try: + response = GLOBAL_REQUEST_HANDLER.get(source) name = source.split('/')[-1].split('.')[0] self.galaxy_clusters[related_type] = {name: response.json()} - else: - LOGGER.info(f'pull_galaxy_cluster failed for source: {source},' - f' got response: {response}, {response.reason}.') + except ConnectionError as error: + LOGGER.warning(f'pull_galaxy_cluster failed for source: {source}, with error: {error}.') def find_galaxy_match(self, indicator: str, related_type: str) -> str: """Searches the clusters of the related_type for a match with the indicator. :returns the first matching galaxy string or an empty string if no galaxy match is found. """ self.pull_galaxy_cluster(related_type) - try: - for cluster_name, cluster in self.galaxy_clusters[related_type].items(): - for value in cluster['values']: - try: - if indicator in value['meta']['synonyms'] or indicator in value['value']: - value = value['value'] - return f'misp-galaxy:{cluster_name}="{value}"' - except KeyError: - pass - except KeyError: - pass + for cluster_name, cluster in self.galaxy_clusters.get(related_type, {}).items(): + for value in cluster['values']: + try: + if indicator in value['meta']['synonyms'] or indicator in value['value']: + value = value['value'] + return f'misp-galaxy:{cluster_name}="{value}"' + except KeyError: + pass return '' @@ -113,57 +165,70 @@ class RFEnricher: """Class for enriching an attribute with data from Recorded Future. The enrichment data is returned as a custom MISP object. """ - def __init__(self, api_token: str, attribute_props: dict): - self.api_token = api_token + def __init__(self, attribute_props: dict): self.event = MISPEvent() self.enrichment_object = MISPObject('Recorded Future Enrichment') - self.enrichment_object.from_dict(**{'meta-category': 'misc', - 'description': 'An object containing the enriched attribute and related ' - 'entities from Recorded Future.', - 'distribution': 0}) + description = ( + 'An object containing the enriched attribute and ' + 'related entities from Recorded Future.' + ) + self.enrichment_object.from_dict(**{ + 'meta-category': 'misc', + 'description': description, + 'distribution': 0 + }) # Create a copy of enriched attribute to add tags to temp_attr = MISPAttribute() temp_attr.from_dict(**attribute_props) self.enriched_attribute = MISPAttribute() - self.enriched_attribute.from_dict(**{'value': temp_attr.value, 'type': temp_attr.type, 'distribution': 0}) + self.enriched_attribute.from_dict(**{ + 'value': temp_attr.value, + 'type': temp_attr.type, + 'distribution': 0 + }) self.related_attributes = [] self.color_picker = RFColors() self.galaxy_finder = GalaxyFinder() # Mapping from MISP-type to RF-type - self.type_to_rf_category = {'ip': 'ip', 'ip-src': 'ip', 'ip-dst': 'ip', - 'domain': 'domain', 'hostname': 'domain', - 'md5': 'hash', 'sha1': 'hash', 'sha256': 'hash', - 'uri': 'url', 'url': 'url', - 'vulnerability': 'vulnerability', 'weakness': 'vulnerability'} + self.type_to_rf_category = { + 'ip': 'ip', + 'ip-src': 'ip', + 'ip-dst': 'ip', + 'domain': 'domain', + 'hostname': 'domain', + 'md5': 'hash', + 'sha1': 'hash', + 'sha256': 'hash', + 'uri': 'url', + 'url': 'url', + 'vulnerability': 'vulnerability', + 'weakness': 'vulnerability' + } # Related entities from RF portrayed as related attributes in MISP - self.related_attribute_types = ['RelatedIpAddress', 'RelatedInternetDomainName', 'RelatedHash', - 'RelatedEmailAddress', 'RelatedCyberVulnerability'] + self.related_attribute_types = [ + 'RelatedIpAddress', 'RelatedInternetDomainName', 'RelatedHash', + 'RelatedEmailAddress', 'RelatedCyberVulnerability' + ] # Related entities from RF portrayed as tags in MISP self.galaxy_tag_types = ['RelatedMalware', 'RelatedThreatActor'] - def enrich(self): + def enrich(self) -> None: """Run the enrichment.""" category = self.type_to_rf_category.get(self.enriched_attribute.type) - - try: - response = rf_lookup(self.api_token, category, self.enriched_attribute.value) - json_response = json.loads(response.content) - except requests.HTTPError as error: - misperrors['error'] = f'Error when requesting data from Recorded Future. ' \ - f'{error.response} : {error.response.reason}' - raise error + json_response = GLOBAL_REQUEST_HANDLER.rf_lookup(category, self.enriched_attribute.value) + response = json.loads(json_response.content) try: # Add risk score and risk rules as tags to the enriched attribute - risk_score = json_response['data']['risk']['score'] + risk_score = response['data']['risk']['score'] hex_color = self.color_picker.riskscore_color(risk_score) tag_name = f'recorded-future:risk-score="{risk_score}"' self.add_tag(tag_name, hex_color) - for evidence in json_response['data']['risk']['evidenceDetails']: + for evidence in response['data']['risk']['evidenceDetails']: risk_rule = evidence['rule'] criticality = evidence['criticality'] hex_color = self.color_picker.riskrule_color(criticality) @@ -171,7 +236,7 @@ class RFEnricher: self.add_tag(tag_name, hex_color) # Retrieve related entities - for related_entity in json_response['data']['relatedEntities']: + for related_entity in response['data']['relatedEntities']: related_type = related_entity['type'] if related_type in self.related_attribute_types: # Related entities returned as additional attributes @@ -191,9 +256,9 @@ class RFEnricher: galaxy_tags.append(galaxy) for galaxy in galaxy_tags: self.add_tag(galaxy) - except KeyError as error: + except KeyError: misperrors['error'] = 'Unexpected format in Recorded Future api response.' - raise error + raise def add_related_attribute(self, indicator: str, related_type: str) -> None: """Helper method for adding an indicator to the related attribute list.""" @@ -247,14 +312,54 @@ class RFEnricher: return {'results': result} +def get_proxy_settings(config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') + + if host: + if not port: + misperrors['error'] = 'The recordedfuture_proxy_host config is set, ' \ + 'please also set the recordedfuture_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' + else: + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' + + if username: + if not password: + misperrors['error'] = 'The recordedfuture_proxy_username config is set, ' \ + 'please also set the recordedfuture_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host + + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + + LOGGER.info(f'Proxy settings: {proxies}') + return proxies + + def handler(q=False): """Handle enrichment.""" if q is False: return False request = json.loads(q) - if request.get('config') and request['config'].get('token'): - token = request['config'].get('token') + config = request.get('config') + if config and config.get('token'): + GLOBAL_REQUEST_HANDLER.rf_token = config.get('token') else: misperrors['error'] = 'Missing Recorded Future token.' return misperrors @@ -263,11 +368,17 @@ def handler(q=False): if request['attribute']['type'] not in mispattributes['input']: return {'error': 'Unsupported attribute type.'} + try: + GLOBAL_REQUEST_HANDLER.proxies = get_proxy_settings(config) + except KeyError: + return misperrors + input_attribute = request.get('attribute') - rf_enricher = RFEnricher(token, input_attribute) + rf_enricher = RFEnricher(input_attribute) + try: rf_enricher.enrich() - except (requests.HTTPError, KeyError): + except (HTTPError, ConnectTimeout, ProxyError, InvalidURL, KeyError): return misperrors return rf_enricher.get_results() From 1349ef61a515b00d84b69bae06b6afd9d830e9b6 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 28 Aug 2020 16:55:50 +0200 Subject: [PATCH 021/476] chg: Turned the Shodan expansion module into a misp_standard format module - As expected with the misp_standard modules, the input is a full attribute and the module is able to return attributes and objects - There was a lot of data that was parsed as regkey attributes by the freetext import, the module now parses properly the different field of the result of the query returned by Shodan --- misp_modules/modules/expansion/shodan.py | 226 +++++++++++++++++++++-- 1 file changed, 206 insertions(+), 20 deletions(-) diff --git a/misp_modules/modules/expansion/shodan.py b/misp_modules/modules/expansion/shodan.py index 5a4b792..ecd5b82 100755 --- a/misp_modules/modules/expansion/shodan.py +++ b/misp_modules/modules/expansion/shodan.py @@ -5,38 +5,224 @@ try: import shodan except ImportError: print("shodan module not installed.") +from . import check_input_attribute, standard_error_message +from datetime import datetime +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['ip-src', 'ip-dst'], 'output': ['freetext']} -moduleinfo = {'version': '0.1', 'author': 'Raphaël Vinot', +mispattributes = {'input': ['ip-src', 'ip-dst'], + 'format': 'misp_standard'} +moduleinfo = {'version': '0.2', 'author': 'Raphaël Vinot', 'description': 'Query on Shodan', 'module-type': ['expansion']} moduleconfig = ['apikey'] +class ShodanParser(): + def __init__(self, attribute): + self.misp_event = MISPEvent() + self.attribute = MISPAttribute() + self.attribute.from_dict(**attribute) + self.misp_event.add_attribute(**self.attribute) + self.ip_address_mapping = { + 'asn': {'type': 'AS', 'object_relation': 'asn'}, + 'city': {'type': 'text', 'object_relation': 'city'}, + 'country_code': {'type': 'text', 'object_relation': 'country-code'}, + 'country_name': {'type': 'text', 'object_relation': 'country'}, + 'isp': {'type': 'text', 'object_relation': 'ISP'}, + 'latitude': {'type': 'float', 'object_relation': 'latitude'}, + 'longitude': {'type': 'float', 'object_relation': 'longitude'}, + 'org': {'type': 'text', 'object_relation': 'organization'}, + 'postal_code': {'type': 'text', 'object_relation': 'zipcode'}, + 'region_code': {'type': 'text', 'object_relation': 'region-code'} + } + self.ip_port_mapping = { + 'domains': {'type': 'domain', 'object_relation': 'domain'}, + 'hostnames': {'type': 'hostname', 'object_relation': 'hostname'} + } + self.vulnerability_mapping = { + 'cvss': {'type': 'float', 'object_relation': 'cvss-score'}, + 'summary': {'type': 'text', 'object_relation': 'summary'} + } + self.x509_mapping = { + 'bits': {'type': 'text', 'object_relation': 'pubkey-info-size'}, + 'expires': {'type': 'datetime', 'object_relation': 'validity-not-after'}, + 'issued': {'type': 'datetime', 'object_relation': 'validity-not-before'}, + 'issuer': {'type': 'text', 'object_relation': 'issuer'}, + 'serial': {'type': 'text', 'object_relation': 'serial-number'}, + 'sig_alg': {'type': 'text', 'object_relation': 'signature_algorithm'}, + 'subject': {'type': 'text', 'object_relation': 'subject'}, + 'type': {'type': 'text', 'object_relation': 'pubkey-info-algorithm'}, + 'version': {'type': 'text', 'object_relation': 'version'} + } + + def query_shodan(self, apikey): + # Query Shodan and get the results in a json blob + api = shodan.Shodan(apikey) + query_results = api.host(self.attribute.value) + + # Parse the information about the IP address used as input + ip_address_attributes = [] + for feature, mapping in self.ip_address_mapping.items(): + if query_results.get(feature): + attribute = {'value': query_results[feature]} + attribute.update(mapping) + ip_address_attributes.append(attribute) + if ip_address_attributes: + ip_address_object = MISPObject('ip-api-address') + for attribute in ip_address_attributes: + ip_address_object.add_attribute(**attribute) + ip_address_object.add_attribute(**self._get_source_attribute()) + ip_address_object.add_reference(self.attribute.uuid, 'describes') + self.misp_event.add_object(ip_address_object) + + # Parse the hostnames / domains and ports associated with the IP address + if query_results.get('ports'): + ip_port_object = MISPObject('ip-port') + ip_port_object.add_attribute(**self._get_source_attribute()) + feature = self.attribute.type.split('-')[1] + for port in query_results['ports']: + attribute = { + 'type': 'port', + 'object_relation': f'{feature}-port', + 'value': port + } + ip_port_object.add_attribute(**attribute) + for feature, mapping in self.ip_port_mapping.items(): + for value in query_results.get(feature, []): + attribute = {'value': value} + attribute.update(mapping) + ip_port_object.add_attribute(**attribute) + ip_port_object.add_reference(self.attribute.uuid, 'extends') + self.misp_event.add_object(ip_port_object) + else: + if any(query_results.get(feature) for feature in ('domains', 'hostnames')): + domain_ip_object = MISPObject('domain-ip') + domain_ip_object.add_attribute(**self._get_source_attribute()) + for feature in ('domains', 'hostnames'): + for value in query_results[feature]: + attribute = { + 'type': 'domain', + 'object_relation': 'domain', + 'value': value + } + domain_ip_object.add_attribute(**attribute) + domain_ip_object.add_reference(self.attribute.uuid, 'extends') + self.misp_event.add_object(domain_ip_object) + + # Parse data within the "data" field + if query_results.get('vulns'): + vulnerabilities = {} + for data in query_results['data']: + # Parse vulnerabilities + if data.get('vulns'): + for cve, vulnerability in data['vulns'].items(): + if cve not in vulnerabilities: + vulnerabilities[cve] = vulnerability + # Also parse the certificates + if data.get('ssl'): + self._parse_cert(data['ssl']) + for cve, vulnerability in vulnerabilities.items(): + vulnerability_object = MISPObject('vulnerability') + vulnerability_object.add_attribute(**{ + 'type': 'vulnerability', + 'object_relation': 'id', + 'value': cve + }) + for feature, mapping in self.vulnerability_mapping.items(): + if vulnerability.get(feature): + attribute = {'value': vulnerability[feature]} + attribute.update(mapping) + vulnerability_object.add_attribute(**attribute) + if vulnerability.get('references'): + for reference in vulnerability['references']: + vulnerability_object.add_attribute(**{ + 'type': 'link', + 'object_relation': 'references', + 'value': reference + }) + vulnerability_object.add_reference(self.attribute.uuid, 'vulnerability-of') + self.misp_event.add_object(vulnerability_object) + for cve_id in query_results['vulns']: + if cve_id not in vulnerabilities: + attribute = { + 'type': 'vulnerability', + 'value': cve_id + } + self.misp_event.add_attribute(**attribute) + else: + # We have no vulnerability data, we only check if we have + # certificates within the "data" field + for data in query_results['data']: + if data.get('ssl'): + self._parse_cert(data['ssl']['cert']) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + # When we want to add the IP address information in objects such as the + # domain-ip or ip-port objects referencing the input IP address attribute + def _get_source_attribute(self): + return { + 'type': self.attribute.type, + 'object_relation': self.attribute.type, + 'value': self.attribute.value + } + + def _parse_cert(self, certificate): + x509_object = MISPObject('x509') + for feature in ('serial', 'sig_alg', 'version'): + if certificate.get(feature): + attribute = {'value': certificate[feature]} + attribute.update(self.x509_mapping[feature]) + x509_object.add_attribute(**attribute) + # Parse issuer and subject value + for feature in ('issuer', 'subject'): + if certificate.get(feature): + attribute_value = (f'{identifier}={value}' for identifier, value in certificate[feature].items()) + attribute = {'value': f'/{"/".join(attribute_value)}'} + attribute.update(self.x509_mapping[feature]) + x509_object.add_attribute(**attribute) + # Parse datetime attributes + for feature in ('expires', 'issued'): + if certificate.get(feature): + attribute = {'value': datetime.strptime(certificate[feature], '%Y%m%d%H%M%SZ')} + attribute.update(self.x509_mapping[feature]) + x509_object.add_attribute(**attribute) + # Parse fingerprints + if certificate.get('fingerprint'): + for hash_type, hash_value in certificate['fingerprint'].items(): + x509_object.add_attribute(**{ + 'type': f'x509-fingerprint-{hash_type}', + 'object_relation': f'x509-fingerprint-{hash_type}', + 'value': hash_value + }) + # Parse public key related info + if certificate.get('pubkey'): + for feature, value in certificate['pubkey'].items(): + attribute = {'value': value} + attribute.update(self.x509_mapping[feature]) + x509_object.add_attribute(**attribute) + x509_object.add_reference(self.attribute.uuid, 'identifies') + self.misp_event.add_object(x509_object) + def handler(q=False): if q is False: return False request = json.loads(q) - if request.get('ip-src'): - toquery = request['ip-src'] - elif request.get('ip-dst'): - toquery = request['ip-dst'] - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors - - if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = 'Shodan authentication is missing' - return misperrors - api = shodan.Shodan(request['config'].get('apikey')) - - return handle_expansion(api, toquery) - - -def handle_expansion(api, domain): - return {'results': [{'types': mispattributes['output'], 'values': json.dumps(api.host(domain))}]} + if not request.get('config', {}).get('apikey'): + return {'error': 'Shodan authentication is missing'} + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} + shodan_parser = ShodanParser(attribute) + shodan_parser.query_shodan(request['config']['apikey']) + return shodan_parser.get_result() def introspection(): From ae1016946bbbe0dd2652e0c383b8c5214fca4527 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 28 Aug 2020 17:30:23 +0200 Subject: [PATCH 022/476] fix: Making pep8 happy --- misp_modules/modules/expansion/recordedfuture.py | 2 +- misp_modules/modules/expansion/shodan.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index 537e997..ccea31b 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -62,7 +62,7 @@ class RequestHandler: response.raise_for_status() return response except (ConnectTimeout, ProxyError, InvalidURL) as error: - msg = f'Error connecting with proxy, please check the Recorded Future app proxy settings.' + msg = 'Error connecting with proxy, please check the Recorded Future app proxy settings.' LOGGER.error(f'{msg} Error: {error}') misperrors['error'] = msg raise diff --git a/misp_modules/modules/expansion/shodan.py b/misp_modules/modules/expansion/shodan.py index ecd5b82..f295deb 100755 --- a/misp_modules/modules/expansion/shodan.py +++ b/misp_modules/modules/expansion/shodan.py @@ -209,6 +209,7 @@ class ShodanParser(): x509_object.add_reference(self.attribute.uuid, 'identifies') self.misp_event.add_object(x509_object) + def handler(q=False): if q is False: return False From 3101e5bc26ee3e45afed16dfb7a5b45ac70a270c Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 8 Sep 2020 16:08:57 +0200 Subject: [PATCH 023/476] chg: Updated the bgpranking expansion module to return MISP objects - The module no longer returns freetext, since the result returned to the freetext import as text only allowed MISP to parse the same AS number as the input attribute. - The new result returned with the updated module is an asn object describing more precisely the AS number, and its ranking for a given day --- misp_modules/modules/expansion/bgpranking.py | 72 ++++++++++++++++---- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/misp_modules/modules/expansion/bgpranking.py b/misp_modules/modules/expansion/bgpranking.py index b01088d..c021d62 100755 --- a/misp_modules/modules/expansion/bgpranking.py +++ b/misp_modules/modules/expansion/bgpranking.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- import json -from datetime import date, timedelta +from . import check_input_attribute, standard_error_message +from datetime import date, datetime, timedelta from pybgpranking import BGPRanking +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['AS'], 'output': ['freetext']} +mispattributes = {'input': ['AS'], 'format': 'misp_standard'} moduleinfo = {'version': '0.1', 'author': 'Raphaël Vinot', - 'description': 'Query an ASN Description history service (https://github.com/CIRCL/ASN-Description-History.git)', + 'description': 'Query BGP Ranking to get the ranking of an Autonomous System number.', 'module-type': ['expansion', 'hover']} @@ -15,19 +17,65 @@ def handler(q=False): if q is False: return False request = json.loads(q) - if request.get('AS'): - toquery = request['AS'] - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + toquery = request['attribute'] + if toquery['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type.'} bgpranking = BGPRanking() - values = bgpranking.query(toquery, date=(date.today() - timedelta(1)).isoformat()) + value_toquery = int(toquery['value'][2:]) if toquery['value'].startswith('AS') else int(toquery['value']) + values = bgpranking.query(value_toquery, date=(date.today() - timedelta(1)).isoformat()) - if not values: - misperrors['error'] = 'Unable to find the ASN in BGP Ranking' + if not values['response'] or not values['response']['asn_description']: + misperrors['error'] = 'There is no result about this ASN in BGP Ranking' return misperrors - return {'results': [{'types': mispattributes['output'], 'values': values}]} + + event = MISPEvent() + attribute = MISPAttribute() + attribute.from_dict(**toquery) + event.add_attribute(**attribute) + + asn_object = MISPObject('asn') + asn_object.add_attribute(**{ + 'type': 'AS', + 'object_relation': 'asn', + 'value': values['meta']['asn'] + }) + description, country = values['response']['asn_description'].split(', ') + for relation, value in zip(('description', 'country'), (description, country)): + asn_object.add_attribute(**{ + 'type': 'text', + 'object_relation': relation, + 'value': value + }) + + mapping = { + 'address_family': {'type': 'text', 'object_relation': 'address-family'}, + 'date': {'type': 'datetime', 'object_relation': 'date'}, + 'position': {'type': 'float', 'object_relation': 'position'}, + 'rank': {'type': 'float', 'object_relation': 'ranking'} + } + bgp_object = MISPObject('bgp-ranking') + for feature in ('rank', 'position'): + bgp_attribute = {'value': values['response']['ranking'][feature]} + bgp_attribute.update(mapping[feature]) + bgp_object.add_attribute(**bgp_attribute) + date_attribute = {'value': datetime.strptime(values['meta']['date'], '%Y-%m-%d')} + date_attribute.update(mapping['date']) + bgp_object.add_attribute(**date_attribute) + address_attribute = {'value': values['meta']['address_family']} + address_attribute.update(mapping['address_family']) + bgp_object.add_attribute(**address_attribute) + + asn_object.add_reference(attribute.uuid, 'describes') + asn_object.add_reference(bgp_object.uuid, 'ranked-with') + event.add_object(asn_object) + event.add_object(bgp_object) + + event = json.loads(event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} def introspection(): From 589a0a03210b1f1734ff507919fd01c7f154bbf8 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 8 Sep 2020 16:15:23 +0200 Subject: [PATCH 024/476] chg: Updated documentation for the recently updated bgpranking module --- README.md | 2 +- doc/README.md | 4 ++-- doc/expansion/bgpranking.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 83b4dc6..26dce03 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [AssemblyLine submit](misp_modules/modules/expansion/assemblyline_submit.py) - an expansion module to submit samples and urls to AssemblyLine. * [AssemblyLine query](misp_modules/modules/expansion/assemblyline_query.py) - an expansion module to query AssemblyLine and parse the full submission report. * [Backscatter.io](misp_modules/modules/expansion/backscatter_io.py) - a hover and expansion module to expand an IP address with mass-scanning observations. -* [BGP Ranking](misp_modules/modules/expansion/bgpranking.py) - a hover and expansion module to expand an AS number with the ASN description, its history, and position in BGP Ranking. +* [BGP Ranking](misp_modules/modules/expansion/bgpranking.py) - a hover and expansion module to expand an AS number with the ASN description and its ranking and position in BGP Ranking. * [RansomcoinDB check](misp_modules/modules/expansion/ransomcoindb.py) - An expansion hover module to query the [ransomcoinDB](https://ransomcoindb.concinnity-risks.com): it contains mapping between BTC addresses and malware hashes. Enrich MISP by querying for BTC -> hash or hash -> BTC addresses. * [BTC scam check](misp_modules/modules/expansion/btc_scam_check.py) - An expansion hover module to instantly check if a BTC address has been abused. * [BTC transactions](misp_modules/modules/expansion/btc_steroids.py) - An expansion hover module to get a blockchain balance and the transactions from a BTC address in MISP. diff --git a/doc/README.md b/doc/README.md index 7979348..6469dd0 100644 --- a/doc/README.md +++ b/doc/README.md @@ -108,13 +108,13 @@ Query backscatter.io (https://backscatter.io/). Query BGP Ranking (https://bgpranking-ng.circl.lu/). - **features**: ->The module takes an AS number attribute as input and displays its description and history, and position in BGP Ranking. +>The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day. > > - **input**: >Autonomous system number. - **output**: ->Text containing a description of the ASN, its history, and the position in BGP Ranking. +>An asn object with its related bgp-ranking object. - **references**: >https://github.com/D4-project/BGP-Ranking/ - **requirements**: diff --git a/doc/expansion/bgpranking.json b/doc/expansion/bgpranking.json index a98b780..4695aa1 100644 --- a/doc/expansion/bgpranking.json +++ b/doc/expansion/bgpranking.json @@ -1,8 +1,8 @@ { "description": "Query BGP Ranking (https://bgpranking-ng.circl.lu/).", "requirements": ["pybgpranking python library"], - "features": "The module takes an AS number attribute as input and displays its description and history, and position in BGP Ranking.\n\n", + "features": "The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day.\n\n", "references": ["https://github.com/D4-project/BGP-Ranking/"], "input": "Autonomous system number.", - "output": "Text containing a description of the ASN, its history, and the position in BGP Ranking." + "output": "An asn object with its related bgp-ranking object." } From 9f315f1728d54796bb05db52839333643c313b2b Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 8 Sep 2020 16:24:41 +0200 Subject: [PATCH 025/476] chg: Updated the bgpranking expansion module test --- tests/test_expansions.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index a56fbe7..1aa0f7a 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -97,9 +97,16 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), 'An API key for APIVoid is required.') def test_bgpranking(self): - query = {"module": "bgpranking", "AS": "13335"} + query = { + "module": "bgpranking", + "attribute": { + "type": "AS", + "value": "13335", + "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d" + } + } response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response)['response']['asn_description'], 'CLOUDFLARENET, US') + self.assertEqual(self.get_object(response), 'asn') def test_btc_steroids(self): query = {"module": "btc_steroids", "btc": "1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA"} From 2dde6e8757bc43cffde65e238ef370c461b71cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Wed, 9 Sep 2020 10:56:01 +0200 Subject: [PATCH 026/476] fix: Typo in EMailObject Fix #427 --- misp_modules/modules/import_mod/email_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/email_import.py b/misp_modules/modules/import_mod/email_import.py index 114f8c9..7453dcd 100644 --- a/misp_modules/modules/import_mod/email_import.py +++ b/misp_modules/modules/import_mod/email_import.py @@ -42,7 +42,7 @@ def handler(q=False): # request data is always base 64 byte encoded data = base64.b64decode(request["data"]) - email_object = EMailObject(pseudofile=BytesIO(data), attach_original_mail=True, standalone=False) + email_object = EMailObject(pseudofile=BytesIO(data), attach_original_email=True, standalone=False) # Check if we were given a configuration config = request.get("config", {}) From c5abf8980534b127785d97c8a292534cf8d88a3b Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 28 Sep 2020 12:34:00 +0200 Subject: [PATCH 027/476] fix: [virustotal_public] Resolve key error when user enrich hostname - Same as #424 --- misp_modules/modules/expansion/virustotal_public.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index 6ffb7f9..989e48d 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -37,7 +37,7 @@ class VirusTotalParser(): def parse_resolutions(self, resolutions, subdomains=None, uuids=None): domain_ip_object = MISPObject('domain-ip') - if self.attribute.type == 'domain': + if self.attribute.type in ('domain', 'hostname'): domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') else: From 14aa6e2d1a0a4933f1d26c181215487bf25c6cf4 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 1 Oct 2020 22:44:39 +0200 Subject: [PATCH 028/476] fix: [cve_advanced] Avoiding potential MISP object references issues - Adding objects as dictionaries in an event may cause issues in some cases. It is better to pass the MISP object as is, as it is already a valid object since the MISPObject class is used --- misp_modules/modules/expansion/cve_advanced.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index cd36655..d15711f 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -56,7 +56,7 @@ class VulnerabilityParser(): value = value['title'] vulnerability_object.add_attribute(relation, **{'type': attribute_type, 'value': value}) vulnerability_object.add_reference(self.attribute['uuid'], 'related-to') - self.misp_event.add_object(**vulnerability_object) + self.misp_event.add_object(vulnerability_object) if 'cwe' in self.vulnerability and self.vulnerability['cwe'] not in ('Unknown', 'NVD-CWE-noinfo'): self.__parse_weakness(vulnerability_object.uuid) if 'capec' in self.vulnerability: @@ -79,7 +79,7 @@ class VulnerabilityParser(): for related_weakness in capec['related_weakness']: attribute = dict(type='weakness', value="CWE-{}".format(related_weakness)) capec_object.add_attribute('related-weakness', **attribute) - self.misp_event.add_object(**capec_object) + self.misp_event.add_object(capec_object) self.references[vulnerability_uuid].append(dict(referenced_uuid=capec_object.uuid, relationship_type='targeted-by')) @@ -95,7 +95,7 @@ class VulnerabilityParser(): for feature, relation in self.weakness_mapping.items(): if cwe.get(feature): weakness_object.add_attribute(relation, **dict(type=attribute_type, value=cwe[feature])) - self.misp_event.add_object(**weakness_object) + self.misp_event.add_object(weakness_object) self.references[vulnerability_uuid].append(dict(referenced_uuid=weakness_object.uuid, relationship_type='weakened-by')) break From 9a766d601089ff17e7c0f99561fe2d1e697073f4 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 1 Oct 2020 23:25:39 +0200 Subject: [PATCH 029/476] add: New module using socialscan library to check email addresses and usernames linked to accounts on online platforms --- misp_modules/modules/expansion/__init__.py | 2 +- misp_modules/modules/expansion/socialscan.py | 102 +++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 misp_modules/modules/expansion/socialscan.py diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1b6d2bb..10254e4 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'virustotal_public', 'apiosintds', 'urlscan', 'securitytrails', 'apivoid', 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', - 'trustar_enrich', 'recordedfuture'] + 'trustar_enrich', 'recordedfuture', 'socialscan'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/socialscan.py b/misp_modules/modules/expansion/socialscan.py new file mode 100644 index 0000000..7c59a35 --- /dev/null +++ b/misp_modules/modules/expansion/socialscan.py @@ -0,0 +1,102 @@ +import json +from socialscan.platforms import Platforms +from socialscan.util import sync_execute_queries + +moduleinfo = { + 'version': '1', + 'author': 'Christian Studer', + 'description': 'Module to query several online platforms to look for existing accounts.', + 'module-type': ['hover'] +} +mispattributes = { + 'input': [ + 'github-username', + 'target-user', + 'email', + 'email-src', + 'email-dst', + 'target-email', + 'whois-registrant-email' + ], + 'output': ['text'] +} +moduleconfig = [] + +_PLATFORMS = [ + Platforms.INSTAGRAM, + Platforms.TWITTER, + Platforms.GITHUB, + Platforms.TUMBLR, + Platforms.LASTFM +] +_EMAIL_PLATFORMS = [ + Platforms.PINTEREST, + Platforms.SPOTIFY, + Platforms.FIREFOX +] +_EMAIL_PLATFORMS.extend(_PLATFORMS) +_USERNAME_PLATFORMS = [ + Platforms.SNAPCHAT, + Platforms.GITLAB, + Platforms.REDDIT, + Platforms.YAHOO +] +_USERNAME_PLATFORMS.extend(_PLATFORMS) + + +def parse_results(query_results, feature): + results = [] + for result in query_results: + if not result.success: + results.append(f'Unable to retrieve the {feature} on {result.platform}.') + continue + if not result.valid: + results.append(f'Invalid response from {result.platform}.') + continue + statement = 'No account' if result.available else 'There is an account' + results.append(f'{statement} linked to the {feature} on {result.platform}.') + to_return = [ + { + 'types': mispattributes['output'], + 'values': result + } for result in results + ] + print(json.dumps(to_return, indent=4)) + return {'results': to_return} + + +def parse_email(email): + results = sync_execute_queries([email], platforms=_EMAIL_PLATFORMS) + return parse_results(results, 'email address') + + +def parse_username(username, platforms=_USERNAME_PLATFORMS): + results = sync_execute_queries([username], platforms=platforms) + return parse_results(results, 'username') + + +def parse_github_username(username): + return parse_username(username, platforms=[Platforms.GITHUB]) + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if request.get('github-username'): + return parse_github_username(request['github-username']) + if request.get('target-user'): + return parse_username(request['target-user']) + for attribute_type in mispattributes['input'][2:]: + if request.get(attribute_type): + return parse_email(request[attribute_type]) + return {'error': 'Unsupported attributes type'} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 39904b7f6c0eb0a5d030bbfb623bb41e3631ba06 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 1 Oct 2020 23:27:43 +0200 Subject: [PATCH 030/476] chg: Added socialscan library in Pipfile and updated the lock file --- Pipfile | 1 + Pipfile.lock | 870 ++++++++++++++++++++++++++++----------------------- 2 files changed, 471 insertions(+), 400 deletions(-) diff --git a/Pipfile b/Pipfile index 1169368..5bd615c 100644 --- a/Pipfile +++ b/Pipfile @@ -61,6 +61,7 @@ apiosintDS = "*" assemblyline_client = "*" vt-graph-api = "*" trustar = "*" +socialscan="*" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index 73aeaed..23af91a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c2d937b384431e4b313b29bb02db0bd1d3a866ddcb7c6e91cbfa34f88d351b59" + "sha256": "41a685412700814c27cc8835a0a650a5f44dab172239cd06a7cb02f201a63e73" }, "pipfile-spec": 6, "requires": { @@ -57,11 +57,10 @@ }, "assemblyline-client": { "hashes": [ - "sha256:6f45cab3be3ec60984a5c2049d46dac80d4e3d4f3d9538220518a44c7a6ddb15", - "sha256:971371065f2b41027325bf9fa9c72960262a446c7e08bda57865d34dcc4108b0" + "sha256:39c54d9f49a8299de5bffc2422138f0254e2d9ddc49fec7a41b537194e4be29a" ], "index": "pypi", - "version": "==3.7.3" + "version": "==4.0.0" }, "async-timeout": { "hashes": [ @@ -73,11 +72,11 @@ }, "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.3.0" + "version": "==20.2.0" }, "backscatter": { "hashes": [ @@ -89,12 +88,12 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7", - "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8", - "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c" + "sha256:1edf5e39f3a5bc6e38b235b369128416c7239b34f692acccececb040233032a1", + "sha256:5dfe44f8fddc89ac5453f02659d3ab1668f2c0d9684839f0785037e8c6d9ac8d", + "sha256:645d833a828722357038299b7f6879940c11dddd95b900fe5387c258b72bb883" ], "index": "pypi", - "version": "==4.9.1" + "version": "==4.9.2" }, "blockchain": { "hashes": [ @@ -112,36 +111,44 @@ }, "cffi": { "hashes": [ - "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", - "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", - "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", - "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", - "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", - "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", - "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", - "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", - "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", - "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", - "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", - "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", - "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", - "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", - "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", - "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", - "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", - "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", - "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", - "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", - "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", - "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", - "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", - "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", - "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", - "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", - "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", - "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d", + "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b", + "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4", + "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f", + "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3", + "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579", + "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537", + "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e", + "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05", + "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171", + "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca", + "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522", + "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c", + "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc", + "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d", + "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808", + "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828", + "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869", + "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d", + "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9", + "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0", + "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc", + "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15", + "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c", + "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a", + "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3", + "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1", + "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768", + "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d", + "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b", + "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e", + "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d", + "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730", + "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394", + "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1", + "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591" ], - "version": "==1.14.0" + "version": "==1.14.3" }, "chardet": { "hashes": [ @@ -183,27 +190,30 @@ }, "cryptography": { "hashes": [ - "sha256:091d31c42f444c6f519485ed528d8b451d1a0c7bf30e8ca583a0cac44b8a0df6", - "sha256:18452582a3c85b96014b45686af264563e3e5d99d226589f057ace56196ec78b", - "sha256:1dfa985f62b137909496e7fc182dac687206d8d089dd03eaeb28ae16eec8e7d5", - "sha256:1e4014639d3d73fbc5ceff206049c5a9a849cefd106a49fa7aaaa25cc0ce35cf", - "sha256:22e91636a51170df0ae4dcbd250d318fd28c9f491c4e50b625a49964b24fe46e", - "sha256:3b3eba865ea2754738616f87292b7f29448aec342a7c720956f8083d252bf28b", - "sha256:651448cd2e3a6bc2bb76c3663785133c40d5e1a8c1a9c5429e4354201c6024ae", - "sha256:726086c17f94747cedbee6efa77e99ae170caebeb1116353c6cf0ab67ea6829b", - "sha256:844a76bc04472e5135b909da6aed84360f522ff5dfa47f93e3dd2a0b84a89fa0", - "sha256:88c881dd5a147e08d1bdcf2315c04972381d026cdb803325c03fe2b4a8ed858b", - "sha256:96c080ae7118c10fcbe6229ab43eb8b090fccd31a09ef55f83f690d1ef619a1d", - "sha256:a0c30272fb4ddda5f5ffc1089d7405b7a71b0b0f51993cb4e5dbb4590b2fc229", - "sha256:bb1f0281887d89617b4c68e8db9a2c42b9efebf2702a3c5bf70599421a8623e3", - "sha256:c447cf087cf2dbddc1add6987bbe2f767ed5317adb2d08af940db517dd704365", - "sha256:c4fd17d92e9d55b84707f4fd09992081ba872d1a0c610c109c18e062e06a2e55", - "sha256:d0d5aeaedd29be304848f1c5059074a740fa9f6f26b84c5b63e8b29e73dfc270", - "sha256:daf54a4b07d67ad437ff239c8a4080cfd1cc7213df57d33c97de7b4738048d5e", - "sha256:e993468c859d084d5579e2ebee101de8f5a27ce8e2159959b6673b418fd8c785", - "sha256:f118a95c7480f5be0df8afeb9a11bd199aa20afab7a96bcf20409b411a3a85f0" + "sha256:21b47c59fcb1c36f1113f3709d37935368e34815ea1d7073862e92f810dc7499", + "sha256:451cdf60be4dafb6a3b78802006a020e6cd709c22d240f94f7a0696240a17154", + "sha256:4549b137d8cbe3c2eadfa56c0c858b78acbeff956bd461e40000b2164d9167c6", + "sha256:48ee615a779ffa749d7d50c291761dc921d93d7cf203dca2db663b4f193f0e49", + "sha256:559d622aef2a2dff98a892eef321433ba5bc55b2485220a8ca289c1ecc2bd54f", + "sha256:5d52c72449bb02dd45a773a203196e6d4fae34e158769c896012401f33064396", + "sha256:65beb15e7f9c16e15934569d29fb4def74ea1469d8781f6b3507ab896d6d8719", + "sha256:680da076cad81cdf5ffcac50c477b6790be81768d30f9da9e01960c4b18a66db", + "sha256:762bc5a0df03c51ee3f09c621e1cee64e3a079a2b5020de82f1613873d79ee70", + "sha256:89aceb31cd5f9fc2449fe8cf3810797ca52b65f1489002d58fe190bfb265c536", + "sha256:983c0c3de4cb9fcba68fd3f45ed846eb86a2a8b8d8bc5bb18364c4d00b3c61fe", + "sha256:99d4984aabd4c7182050bca76176ce2dbc9fa9748afe583a7865c12954d714ba", + "sha256:9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d", + "sha256:a7597ffc67987b37b12e09c029bd1dc43965f75d328076ae85721b84046e9ca7", + "sha256:ab010e461bb6b444eaf7f8c813bb716be2d78ab786103f9608ffd37a4bd7d490", + "sha256:b12e715c10a13ca1bd27fbceed9adc8c5ff640f8e1f7ea76416352de703523c8", + "sha256:b2bded09c578d19e08bd2c5bb8fed7f103e089752c9cf7ca7ca7de522326e921", + "sha256:b372026ebf32fe2523159f27d9f0e9f485092e43b00a5adacf732192a70ba118", + "sha256:cb179acdd4ae1e4a5a160d80b87841b3d0e0be84af46c7bb2cd7ece57a39c4ba", + "sha256:e97a3b627e3cb63c415a16245d6cef2139cca18bb1183d1b9375a1c14e83f3b3", + "sha256:f0e099fc4cc697450c3dd4031791559692dd941a95254cb9aeded66a7aa8b9bc", + "sha256:f99317a0fa2e49917689b8cf977510addcfaaab769b3f899b9c481bbd76730c2" ], - "version": "==2.9.2" + "version": "==3.1.1" }, "decorator": { "hashes": [ @@ -222,11 +232,11 @@ }, "dnspython": { "hashes": [ - "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01", - "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d" + "sha256:044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7", + "sha256:40bb3c24b9d4ec12500f0124288a65df232a3aa749bb0c39734b782873a2544d" ], "index": "pypi", - "version": "==1.16.0" + "version": "==2.0.0" }, "domaintools-api": { "hashes": [ @@ -273,11 +283,11 @@ }, "geoip2": { "hashes": [ - "sha256:5869e987bc54c0d707264fec4710661332cc38d2dca5a7f9bb5362d0308e2ce0", - "sha256:99ec12d2f1271a73a0a4a2b663fe6ce25fd02289c0a6bef05c0a1c3b30ee95a4" + "sha256:57d8d15de2527e0697bbef44fc16812bba709f03a07ef99297bd56c1df3b1efd", + "sha256:707025542ef076bd8fd80e97138bebdb7812527b2a007d141a27ad98b0370fff" ], "index": "pypi", - "version": "==3.0.0" + "version": "==4.1.0" }, "httplib2": { "hashes": [ @@ -310,10 +320,16 @@ }, "jbxapi": { "hashes": [ - "sha256:58eb7d77a52169309e2322ce874c0f00a7900a515d1d0798ff85973cdb2766e3" + "sha256:a5dc57e418363f5e2ab39f79fdfdb71dbad758cfc2ff254a3eb8e353bc9994ae" ], "index": "pypi", - "version": "==3.8.0" + "version": "==3.10.0" + }, + "json-log-formatter": { + "hashes": [ + "sha256:ee187c9a80936cbf1259f73573973450fc24b84a4fb54e53eb0dcff86ea1e759" + ], + "version": "==0.3.0" }, "jsonschema": { "hashes": [ @@ -343,36 +359,40 @@ }, "lxml": { "hashes": [ - "sha256:06748c7192eab0f48e3d35a7adae609a329c6257495d5e53878003660dc0fec6", - "sha256:0790ddca3f825dd914978c94c2545dbea5f56f008b050e835403714babe62a5f", - "sha256:1aa7a6197c1cdd65d974f3e4953764eee3d9c7b67e3966616b41fab7f8f516b7", - "sha256:22c6d34fdb0e65d5f782a4d1a1edb52e0a8365858dafb1c08cb1d16546cf0786", - "sha256:2754d4406438c83144f9ffd3628bbe2dcc6d62b20dbc5c1ec4bc4385e5d44b42", - "sha256:27ee0faf8077c7c1a589573b1450743011117f1aa1a91d5ae776bbc5ca6070f2", - "sha256:2b02c106709466a93ed424454ce4c970791c486d5fcdf52b0d822a7e29789626", - "sha256:2d1ddce96cf15f1254a68dba6935e6e0f1fe39247de631c115e84dd404a6f031", - "sha256:4f282737d187ae723b2633856085c31ae5d4d432968b7f3f478a48a54835f5c4", - "sha256:51bb4edeb36d24ec97eb3e6a6007be128b720114f9a875d6b370317d62ac80b9", - "sha256:7eee37c1b9815e6505847aa5e68f192e8a1b730c5c7ead39ff317fde9ce29448", - "sha256:7fd88cb91a470b383aafad554c3fe1ccf6dfb2456ff0e84b95335d582a799804", - "sha256:9144ce36ca0824b29ebc2e02ca186e54040ebb224292072250467190fb613b96", - "sha256:925baf6ff1ef2c45169f548cc85204433e061360bfa7d01e1be7ae38bef73194", - "sha256:a636346c6c0e1092ffc202d97ec1843a75937d8c98aaf6771348ad6422e44bb0", - "sha256:a87dbee7ad9dce3aaefada2081843caf08a44a8f52e03e0a4cc5819f8398f2f4", - "sha256:a9e3b8011388e7e373565daa5e92f6c9cb844790dc18e43073212bb3e76f7007", - "sha256:afb53edf1046599991fb4a7d03e601ab5f5422a5435c47ee6ba91ec3b61416a6", - "sha256:b26719890c79a1dae7d53acac5f089d66fd8cc68a81f4e4bd355e45470dc25e1", - "sha256:b7462cdab6fffcda853338e1741ce99706cdf880d921b5a769202ea7b94e8528", - "sha256:b77975465234ff49fdad871c08aa747aae06f5e5be62866595057c43f8d2f62c", - "sha256:c47a8a5d00060122ca5908909478abce7bbf62d812e3fc35c6c802df8fb01fe7", - "sha256:c79e5debbe092e3c93ca4aee44c9a7631bdd407b2871cb541b979fd350bbbc29", - "sha256:d8d40e0121ca1606aa9e78c28a3a7d88a05c06b3ca61630242cded87d8ce55fa", - "sha256:ee2be8b8f72a2772e72ab926a3bccebf47bb727bda41ae070dc91d1fb759b726", - "sha256:f95d28193c3863132b1f55c1056036bf580b5a488d908f7d22a04ace8935a3a9", - "sha256:fadd2a63a2bfd7fb604508e553d1cf68eca250b2fbdbd81213b5f6f2fbf23529" + "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f", + "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730", + "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f", + "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1", + "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3", + "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7", + "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a", + "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe", + "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1", + "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e", + "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d", + "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20", + "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae", + "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5", + "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba", + "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293", + "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a", + "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6", + "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88", + "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed", + "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843", + "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443", + "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0", + "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304", + "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258", + "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6", + "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1", + "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481", + "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef", + "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd", + "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee" ], "index": "pypi", - "version": "==4.5.1" + "version": "==4.5.2" }, "maclookup": { "hashes": [ @@ -384,10 +404,10 @@ }, "maxminddb": { "hashes": [ - "sha256:f4d28823d9ca23323d113dc7af8db2087aa4f657fafc64ff8f7a8afda871425b" + "sha256:b95d8ed21799e6604683669c7ed3c6a184fcd92434d5762dccdb139b4f29e597" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.5.4" + "markers": "python_version >= '3.6'", + "version": "==2.0.2" }, "misp-modules": { "editable": true, @@ -425,35 +445,35 @@ }, "numpy": { "hashes": [ - "sha256:13af0184177469192d80db9bd02619f6fa8b922f9f327e077d6f2a6acb1ce1c0", - "sha256:26a45798ca2a4e168d00de75d4a524abf5907949231512f372b217ede3429e98", - "sha256:26f509450db547e4dfa3ec739419b31edad646d21fb8d0ed0734188b35ff6b27", - "sha256:30a59fb41bb6b8c465ab50d60a1b298d1cd7b85274e71f38af5a75d6c475d2d2", - "sha256:33c623ef9ca5e19e05991f127c1be5aeb1ab5cdf30cb1c5cf3960752e58b599b", - "sha256:356f96c9fbec59974a592452ab6a036cd6f180822a60b529a975c9467fcd5f23", - "sha256:3c40c827d36c6d1c3cf413694d7dc843d50997ebffbc7c87d888a203ed6403a7", - "sha256:4d054f013a1983551254e2379385e359884e5af105e3efe00418977d02f634a7", - "sha256:63d971bb211ad3ca37b2adecdd5365f40f3b741a455beecba70fd0dde8b2a4cb", - "sha256:658624a11f6e1c252b2cd170d94bf28c8f9410acab9f2fd4369e11e1cd4e1aaf", - "sha256:76766cc80d6128750075378d3bb7812cf146415bd29b588616f72c943c00d598", - "sha256:7b57f26e5e6ee2f14f960db46bd58ffdca25ca06dd997729b1b179fddd35f5a3", - "sha256:7b852817800eb02e109ae4a9cef2beda8dd50d98b76b6cfb7b5c0099d27b52d4", - "sha256:8cde829f14bd38f6da7b2954be0f2837043e8b8d7a9110ec5e318ae6bf706610", - "sha256:a2e3a39f43f0ce95204beb8fe0831199542ccab1e0c6e486a0b4947256215632", - "sha256:a86c962e211f37edd61d6e11bb4df7eddc4a519a38a856e20a6498c319efa6b0", - "sha256:a8705c5073fe3fcc297fb8e0b31aa794e05af6a329e81b7ca4ffecab7f2b95ef", - "sha256:b6aaeadf1e4866ca0fdf7bb4eed25e521ae21a7947c59f78154b24fc7abbe1dd", - "sha256:be62aeff8f2f054eff7725f502f6228298891fd648dc2630e03e44bf63e8cee0", - "sha256:c2edbb783c841e36ca0fa159f0ae97a88ce8137fb3a6cd82eae77349ba4b607b", - "sha256:cbe326f6d364375a8e5a8ccb7e9cd73f4b2f6dc3b2ed205633a0db8243e2a96a", - "sha256:d34fbb98ad0d6b563b95de852a284074514331e6b9da0a9fc894fb1cdae7a79e", - "sha256:d97a86937cf9970453c3b62abb55a6475f173347b4cde7f8dcdb48c8e1b9952d", - "sha256:dd53d7c4a69e766e4900f29db5872f5824a06827d594427cf1a4aa542818b796", - "sha256:df1889701e2dfd8ba4dc9b1a010f0a60950077fb5242bb92c8b5c7f1a6f2668a", - "sha256:fa1fe75b4a9e18b66ae7f0b122543c42debcf800aaafa0212aaff3ad273c2596" + "sha256:04c7d4ebc5ff93d9822075ddb1751ff392a4375e5885299445fcebf877f179d5", + "sha256:0bfd85053d1e9f60234f28f63d4a5147ada7f432943c113a11afcf3e65d9d4c8", + "sha256:0c66da1d202c52051625e55a249da35b31f65a81cb56e4c69af0dfb8fb0125bf", + "sha256:0d310730e1e793527065ad7dde736197b705d0e4c9999775f212b03c44a8484c", + "sha256:1669ec8e42f169ff715a904c9b2105b6640f3f2a4c4c2cb4920ae8b2785dac65", + "sha256:2117536e968abb7357d34d754e3733b0d7113d4c9f1d921f21a3d96dec5ff716", + "sha256:3733640466733441295b0d6d3dcbf8e1ffa7e897d4d82903169529fd3386919a", + "sha256:4339741994c775396e1a274dba3609c69ab0f16056c1077f18979bec2a2c2e6e", + "sha256:51ee93e1fac3fe08ef54ff1c7f329db64d8a9c5557e6c8e908be9497ac76374b", + "sha256:54045b198aebf41bf6bf4088012777c1d11703bf74461d70cd350c0af2182e45", + "sha256:58d66a6b3b55178a1f8a5fe98df26ace76260a70de694d99577ddeab7eaa9a9d", + "sha256:59f3d687faea7a4f7f93bd9665e5b102f32f3fa28514f15b126f099b7997203d", + "sha256:62139af94728d22350a571b7c82795b9d59be77fc162414ada6c8b6a10ef5d02", + "sha256:7118f0a9f2f617f921ec7d278d981244ba83c85eea197be7c5a4f84af80a9c3c", + "sha256:7c6646314291d8f5ea900a7ea9c4261f834b5b62159ba2abe3836f4fa6705526", + "sha256:967c92435f0b3ba37a4257c48b8715b76741410467e2bdb1097e8391fccfae15", + "sha256:9a3001248b9231ed73894c773142658bab914645261275f675d86c290c37f66d", + "sha256:aba1d5daf1144b956bc87ffb87966791f5e9f3e1f6fab3d7f581db1f5b598f7a", + "sha256:addaa551b298052c16885fc70408d3848d4e2e7352de4e7a1e13e691abc734c1", + "sha256:b594f76771bc7fc8a044c5ba303427ee67c17a09b36e1fa32bde82f5c419d17a", + "sha256:c35a01777f81e7333bcf276b605f39c872e28295441c265cd0c860f4b40148c1", + "sha256:cebd4f4e64cfe87f2039e4725781f6326a61f095bc77b3716502bed812b385a9", + "sha256:d526fa58ae4aead839161535d59ea9565863bb0b0bdb3cc63214613fb16aced4", + "sha256:d7ac33585e1f09e7345aa902c281bd777fdb792432d27fca857f39b70e5dd31c", + "sha256:e6ddbdc5113628f15de7e4911c02aed74a4ccff531842c583e5032f6e5a179bd", + "sha256:eb25c381d168daf351147713f49c626030dcff7a393d5caa62515d415a6071d8" ], "markers": "python_version >= '3.6'", - "version": "==1.19.0" + "version": "==1.19.2" }, "oauth2": { "hashes": [ @@ -470,51 +490,47 @@ }, "opencv-python": { "hashes": [ - "sha256:068928b9907b3d3acd53b129062557d6b0b8b324bfade77f028dbe4dfe482bf2", - "sha256:0e7c91718351449877c2d4141abd64eee1f9c8701bcfaf4e8627bd023e303368", - "sha256:1ab92d807427641ec45d28d5907426aa06b4ffd19c5b794729c74d91cd95090e", - "sha256:31d634dea1b47c231b88d384f90605c598214d0c596443c9bb808e11761829f5", - "sha256:5fdfc0bed37315f27d30ae5ae9bad47ec0a0a28c323739d39c8177b7e0929238", - "sha256:6fa8fac14dd5af4819d475f74af12d65fbbfa391d3110c3a972934a5e6507c24", - "sha256:78cc89ebc808886eb190626ee71ab65e47f374121975f86e4d5f7c0e3ce6bed9", - "sha256:7c7ba11720d01cb572b4b6945d115cb103462c0a28996b44d4e540d06e6a90fd", - "sha256:a37ee82f1b8ed4b4645619c504311e71ce845b78f40055e78d71add5fab7da82", - "sha256:aa3ca1f54054e1c6439fdf1edafa2a2b940a9eaac04a7b422a1cba9b2d7b9690", - "sha256:b9de3dd956574662712da8e285f0f54327959a4e95b96a2847d3c3f5ee7b96e2", - "sha256:c0087b428cef9a32d977390656d91b02245e0e91f909870492df7e39202645dd", - "sha256:d87e506ab205799727f0efa34b3888949bf029a3ada5eb000ff632606370ca6e", - "sha256:d8a55585631f9c9eca4b1a996e9732ae023169cf2f46f69e4518d67d96198226", - "sha256:dcb8da8c5ebaa6360c8555547a4c7beb6cd983dd95ba895bb78b86cc8cf3de2b", - "sha256:e2206bb8c17c0f212f1f356d82d72dd090ff4651994034416da9bf0c29732825", - "sha256:e3c57d6579e5bf85f564d6d48d8ee89868b92879a9232b9975d072c346625e92", - "sha256:ef89cbf332b9a735d8a82e9ff79cc743eeeb775ad1cd7100bc2aa2429b496f07", - "sha256:f45c1c3cdda1857bedd4dfe0bbd49c9419af0cc57f33490341edeae97d18f037", - "sha256:fb3c855347310788e4286b867997be354c55535597966ed5dac876d9166013a4" + "sha256:16864152aa6ac346ef83588d6f4f5dc974d27851c034d6970fcb7b6a98bbd318", + "sha256:23dade76fe0194139112eea7ecdfa02ae09924b1d8d853f17f387a356519e484", + "sha256:27d5b83edd245a12dd6b8562569ad3f23e5ffe30cef8cfcc70756dd24b55d12f", + "sha256:2a2a7590b99d872b193cda0592b2c1cd6561159c31b361597c0e69e8926c8d16", + "sha256:46032d4648c74730115f8522effda8ac39bd0385f07edc7aab57b41cc7617933", + "sha256:4c195597d5286d1cc7259aeaeb7e6c1cde07fec9bddf26523eab1b15709291aa", + "sha256:69c971fefb633cfd334ed195d58e76e87f267649f98a2394f7400b178e918936", + "sha256:80b5b68e9c5dda29205ca112e6d5bd647b6b43cf917cfa5ce178d61675291bba", + "sha256:98676d349fdfc17dba9f23b87e9b6a639733d35f5f0ffcccb90e76c8200568f4", + "sha256:9df617736351100879b70d914366b9f9e38aa227885f2590b48badc4a233119d", + "sha256:b2147317b00b20e8d7e01201221af2b278aed449fa436316c42bc63f653e8245", + "sha256:d838ee4562f52793b1b10876e5067cae1a6bb1c3c575091644be9b88cf45d255", + "sha256:db74a92ef9c2a0810e1436d586b3b15d421a39b72f06263358f15c7a609498e0", + "sha256:e100a4ffdeed8c4afac6a5b3f6b4481efe0ad90e0a0ae2d129478abd4bd790bc", + "sha256:e87d88a820050c0e886c9add48eac2f80ff29207a98cca25869a6868c519daa4", + "sha256:fdf017c5b93d58ad77e2690e59322fd09414705c28d69b52fad4a19985422e6c" ], "index": "pypi", - "version": "==4.2.0.34" + "version": "==4.4.0.44" }, "pandas": { "hashes": [ - "sha256:02f1e8f71cd994ed7fcb9a35b6ddddeb4314822a0e09a9c5b2d278f8cb5d4096", - "sha256:13f75fb18486759da3ff40f5345d9dd20e7d78f2a39c5884d013456cec9876f0", - "sha256:35b670b0abcfed7cad76f2834041dcf7ae47fd9b22b63622d67cdc933d79f453", - "sha256:4c73f373b0800eb3062ffd13d4a7a2a6d522792fa6eb204d67a4fad0a40f03dc", - "sha256:5759edf0b686b6f25a5d4a447ea588983a33afc8a0081a0954184a4a87fd0dd7", - "sha256:5a7cf6044467c1356b2b49ef69e50bf4d231e773c3ca0558807cdba56b76820b", - "sha256:69c5d920a0b2a9838e677f78f4dde506b95ea8e4d30da25859db6469ded84fa8", - "sha256:8778a5cc5a8437a561e3276b85367412e10ae9fff07db1eed986e427d9a674f8", - "sha256:9871ef5ee17f388f1cb35f76dc6106d40cb8165c562d573470672f4cdefa59ef", - "sha256:9c31d52f1a7dd2bb4681d9f62646c7aa554f19e8e9addc17e8b1b20011d7522d", - "sha256:ab8173a8efe5418bbe50e43f321994ac6673afc5c7c4839014cf6401bbdd0705", - "sha256:ae961f1f0e270f1e4e2273f6a539b2ea33248e0e3a11ffb479d757918a5e03a9", - "sha256:b3c4f93fcb6e97d993bf87cdd917883b7dab7d20c627699f360a8fb49e9e0b91", - "sha256:c9410ce8a3dee77653bc0684cfa1535a7f9c291663bd7ad79e39f5ab58f67ab3", - "sha256:f69e0f7b7c09f1f612b1f8f59e2df72faa8a6b41c5a436dde5b615aaf948f107", - "sha256:faa42a78d1350b02a7d2f0dbe3c80791cf785663d6997891549d0f86dc49125e" + "sha256:026d764d0b86ee53183aa4c0b90774b6146123eeada4e24946d7d24290777be1", + "sha256:02ec9f5f0b7df7227931a884569ef0b6d32d76789c84bcac1a719dafd1f912e8", + "sha256:08783a33989a6747317766b75be30a594a9764b9f145bb4bcc06e337930d9807", + "sha256:0936991228241db937e87f82ec552a33888dd04a2e0d5a2fa3c689f92fab09e0", + "sha256:188cdfbf8399bc144fa95040536b5ce3429d2eda6c9c8b238c987af7df9f128c", + "sha256:1edf6c254d2d138188e9987159978ee70e23362fe9197f3f100844a197f7e1e4", + "sha256:474fa53e3b2f3a543cbca81f7457bd1f44e7eb1be7171067636307e21b624e9c", + "sha256:59df9f0276aa4854d8bff28c5e5aeb74d9c6bb4d9f55d272b7124a7df40e47d0", + "sha256:9e135ce9929cd0f0ba24f0545936af17ba935f844d4c3a2b979354a73c9440e0", + "sha256:ab6ea0f3116f408a8a59cd50158bfd19d2a024f4e221f14ab1bcd2da4f0c6fdf", + "sha256:b64ffd87a2cfd31b40acd4b92cb72ea9a52a48165aec4c140e78fd69c45d1444", + "sha256:b821f239514a9ce46dd1cd6c9298a03ed58d0235d414ea264aacc1b14916bbe4", + "sha256:c9235b37489168ed6b173551c816b50aa89f03c24a8549a8b4d47d8dc79bfb1e", + "sha256:eb0ac2fd04428f18b547716f70c699a7cc9c65a6947ed8c7e688d96eb91e3db8", + "sha256:eeb64c5b3d4f2ea072ca8afdeb2b946cd681a863382ca79734f1b520b8d2fa26", + "sha256:f7008ec22b92d771b145150978d930a28fab8da3a10131b01bbf39574acdad0b" ], "index": "pypi", - "version": "==1.0.5" + "version": "==1.1.2" }, "pandas-ods-reader": { "hashes": [ @@ -535,66 +551,68 @@ }, "pdftotext": { "hashes": [ - "sha256:d37864049581fb13cdcf7b23d4ea23dac7ca2e9c646e8ecac1a39275ab1cae03" + "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" ], "index": "pypi", - "version": "==2.1.4" + "version": "==2.1.5" }, "pillow": { "hashes": [ + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117" ], "index": "pypi", "version": "==7.2.0" }, "progressbar2": { "hashes": [ - "sha256:13f228cf357f94cdef933c91c1e771e52e1b1931dbae48267be8fcdc2ae2ce36", - "sha256:27abf038efe5b1b5dd91ecc5f704bc88683c1e2a0b2c0fee04de80a648634a0c" + "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", + "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" ], - "version": "==3.51.4" + "version": "==3.53.1" }, "psutil": { "hashes": [ - "sha256:1413f4158eb50e110777c4f15d7c759521703bd6beb58926f1d562da40180058", - "sha256:298af2f14b635c3c7118fd9183843f4e73e681bb6f01e12284d4d70d48a60953", - "sha256:60b86f327c198561f101a92be1995f9ae0399736b6eced8f24af41ec64fb88d4", - "sha256:685ec16ca14d079455892f25bd124df26ff9137664af445563c1bd36629b5e0e", - "sha256:73f35ab66c6c7a9ce82ba44b1e9b1050be2a80cd4dcc3352cc108656b115c74f", - "sha256:75e22717d4dbc7ca529ec5063000b2b294fc9a367f9c9ede1f65846c7955fd38", - "sha256:a02f4ac50d4a23253b68233b07e7cdb567bd025b982d5cf0ee78296990c22d9e", - "sha256:d008ddc00c6906ec80040d26dc2d3e3962109e40ad07fd8a12d0284ce5e0e4f8", - "sha256:d84029b190c8a66a946e28b4d3934d2ca1528ec94764b180f7d6ea57b0e75e26", - "sha256:e2d0c5b07c6fe5a87fa27b7855017edb0d52ee73b71e6ee368fae268605cc3f5", - "sha256:f344ca230dd8e8d5eee16827596f1c22ec0876127c28e800d7ae20ed44c4b310" + "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8", + "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498", + "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6", + "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c", + "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195", + "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f", + "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb", + "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1", + "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf", + "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2", + "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.7.0" + "version": "==5.7.2" }, "pybgpranking": { "editable": true, @@ -612,72 +630,82 @@ }, "pycryptodome": { "hashes": [ - "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", - "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", - "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", - "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", - "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", - "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", - "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", - "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", - "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", - "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", - "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", + "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", + "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94", "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", - "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", - "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", - "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", - "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", - "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", - "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", - "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", - "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", + "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", + "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", + "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", + "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", + "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", - "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94" + "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", + "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", + "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", + "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", + "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", + "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", + "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", + "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", + "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", + "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", + "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", + "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", + "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", + "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", + "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", + "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", + "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", + "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", + "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", + "sha256:663f8de2b3df2e744d6e1610506e0ea4e213bde906795953c1e82279c169f0a7", + "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", + "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", + "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", + "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", + "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" }, "pycryptodomex": { "hashes": [ - "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f", - "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", - "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", - "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", - "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", - "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", - "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", - "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", - "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", - "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", - "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", - "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", - "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", - "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", - "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", - "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", - "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", + "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", + "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", + "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", + "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", + "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", + "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", + "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", + "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", + "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", + "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", + "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", + "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", + "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", + "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", + "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", + "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060", - "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", + "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", + "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb", + "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", + "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", + "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb" + "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", + "sha256:85c108b42e47d4073344ff61d4e019f1d95bb7725ca0fe87d0a2deb237c10e49", + "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", + "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", + "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", + "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" @@ -728,7 +756,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "ec28820cf491ca7d385477996afa0547eb6b6830" + "ref": "77e7111c29f935f5dc4790c7493a3cc91f79131e" }, "pyonyphe": { "editable": true, @@ -767,16 +795,23 @@ }, "pyrsistent": { "hashes": [ - "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3" + "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" ], - "version": "==0.16.0" + "markers": "python_version >= '3.5'", + "version": "==0.17.3" }, "pytesseract": { "hashes": [ - "sha256:afd8a5cdf8ab5d35690efbe71cbf5f89419f668ea8dde7649149815d5c5a899a" + "sha256:b79641b7915ff039da22d5591cb2f5ca6cb0ed7c65194c9c750360dc6a1cc87f" ], "index": "pypi", - "version": "==0.3.4" + "version": "==0.3.6" + }, + "python-baseconv": { + "hashes": [ + "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" + ], + "version": "==1.2.2" }, "python-dateutil": { "hashes": [ @@ -793,6 +828,13 @@ "index": "pypi", "version": "==0.8.10" }, + "python-engineio": { + "hashes": [ + "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b", + "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6" + ], + "version": "==3.13.2" + }, "python-magic": { "hashes": [ "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", @@ -807,6 +849,16 @@ "index": "pypi", "version": "==0.6.18" }, + "python-socketio": { + "extras": [ + "client" + ], + "hashes": [ + "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a", + "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522" + ], + "version": "==4.6.0" + }, "python-utils": { "hashes": [ "sha256:ebaadab29d0cb9dca0a82eab9c405f5be5125dbbff35b8f32cc433fa498dbaa7", @@ -871,49 +923,49 @@ }, "reportlab": { "hashes": [ - "sha256:0f0c2d98e213d51ae527c0301364d3376cb05f6c47251368a9abd4c3197fcefa", - "sha256:1425c7ea60b8691a881ae21ea0f6907a1dc480d84204ccbfea6da41fbee8f594", - "sha256:204f1d245875ab3d076b37c1a18ac8d2e3222842e13cfa282bcd95282be239e5", - "sha256:21627b57249303bf9b5a633099d058ae9f8625fd6f90cfe79348c48fd5a242cd", - "sha256:2e8e3242f80b79f2470f1b5979abbdb41f31b1333543b830749100342f837d40", - "sha256:2eced06dec3f36135c626b9823649ef9cac95c5634d1bc743a15ee470027483b", - "sha256:3472aa0b74a3b2f252dce823f3c3ba6af8a24de0c1729441deaaf50bed6de9f9", - "sha256:3f0353ffefd3afc0061f4794ef608d6c6f32e69816885f4d45c625c20d8eaf5b", - "sha256:4a9f4540a8eddf56d900ceeb8136bd0ca866c208ba3dcbcde73f07405dbadfba", - "sha256:4eea1afb4aa89780734f44175508edff82928fdf460c9bd60bc719dd99041dc3", - "sha256:5803ffebd36de1ada417f50ce65d379ea5a0bf1a2e8f5d5710a031b3b349b726", - "sha256:58f5f72fc8e5932dedcf24789908a81c6b1e13ea4d63bd9a9a39dc698d8c3321", - "sha256:5b588e5f251c76a8d3589023d1c369c7968e0efe2b38ad5948f665edbf6f9e8b", - "sha256:5d922768fe11a58d80694852aba7389d613c15eb1871c5581a2f075996873d57", - "sha256:5d98f297c5cdd5bc0ccf5697c20b03602ee3378c97938d20312662b27cd9a1d6", - "sha256:66d1d96e97a562614943ecb9daf438e392b3d0b033bd5f4a8098ab616dd877da", - "sha256:670650970c7ba7164cf6340bcd182e7e933eff5d65183af98ee77b40cc25a438", - "sha256:67bb95af7bc8ad7925d299f310d15d556d3e7026fe1b60d8e290454604ae0a85", - "sha256:9c999f5d1a600c4970ba293789b6da14e02e3763a8d3d9abe42dcafa8a5318e9", - "sha256:9d62bef5347063a984e63410fa5a69f1d2cc2fdf8d6ed3d0b9d4ea2ccb4b4154", - "sha256:a14a0d603727b6be2e549c52dd42678ab2d06d2721d4580199e3161843e59298", - "sha256:a3a17b46ff1a15eb29370e11796d8914ef4ea67471bdbc4aa9a9eb9284f4e44c", - "sha256:a6d3e20beeba3fd68cec73b8c0785bfa648c06ac76d1f142c60ccb1a8d2506b6", - "sha256:ad7d7003c732f2be42580e3906e92bd9d2aca5e098898c597554be9ca627fad5", - "sha256:af0ee7b50b85543b68b043e61271963ff5671e564e1d620a404c24a24d4f537c", - "sha256:b3eec55274f5ead7e3af2bf0c01b481ffe1b4c6a7dae42b63d85543e9f2f9a0f", - "sha256:b48c21d43a7ab956954591ce3f71db92ce542bb7428db09734425e2b77ac3142", - "sha256:b761905ab85beb79cf7929c9a019f30ad65664e5733d57a30a995e7b9bef06d1", - "sha256:bbae2f054d0f234c3382076efa337802997aca0f3f664e314f65eefb9d694fa9", - "sha256:bd4157d0bc40fb72bb676fc745fdd648022cccaf4ccfbb291af7f48831d0d5d9", - "sha256:bf74cfabf332034f42a54938eb335543cbf92790170300dbe236ba83b7601cd0", - "sha256:c253c8571db2df3886e390a2bfbe917222953054f4643437373b824f64b013cd", - "sha256:ce1277a6acbc62e9966f410f2596ac533ee0cd5df9b69d5fe4406338a169b7d8", - "sha256:ce8f56987e0e456063e311f066a81496b8b9626c846f2cb0ebb554d1a5f40839", - "sha256:d6264a0589ba8032d9c3bdca9a3e87a897ede09b7f6a8ad5e83b57573212e01e", - "sha256:e6fa0c97e3929d00db27e8cf3b2b5771e94f5f179086c4b0e3213dff53637372", - "sha256:f0930f2b6dddd477b3331ec670171a4662336aac1a778e1a30e980a5cbf40b17", - "sha256:f8cb2b4b925ca6b6e4fdefd288a707776ac686c45034f34d4c952f122d11c40b", - "sha256:f9b71539f518323d95850405c49c01fc3d2f0f0b9f3e157de6d2786804fb28a4", - "sha256:fc488e661f99c915362e0373218f8727cecf888eb1b0eb3a8fe1af624a1b9776" + "sha256:0734f63685038e8c9dc176fa44676c660f347420b78abe1be81245c8ca48fa0d", + "sha256:0738973406752c9e36c066ca453b4332ceae110294e8640d2a9b3846c6c381dc", + "sha256:09238d17bc97d63289b9adc2e1c16699f54985bfaf6ca7c681a2b92edda3e577", + "sha256:124b0d449f33464d9b2132d18574d8757b613bea4090a34a99381037e7ec781d", + "sha256:15e696e490432aea873fe01c042b83f9df87a5cc0c225cd8240dfa80d383466d", + "sha256:24c55a6d8229186ebf3587d4d81ddb1b4261975f2cfeef6b8fcc259cbde49a68", + "sha256:26c410c6f9b9ccda0b7dc827a494fdff1c87267b7f506e2a6ec8d7ae6f41317d", + "sha256:35285ab45b9c5575ebe3642fc772450aa04886713e69270ef80e6589e3232d1f", + "sha256:4441bed8cd679c4769624a9349c31880a0769a925b5114ff79a43cac2ec25b78", + "sha256:52e60b52180006da54510ba8a153f278490d6d4a65c63f5240a9e788ca2db2a0", + "sha256:5b4c7329340bef4ee2d773ef48d022a37f6dacfeda5fa1834827d2bc83df53fe", + "sha256:62a8b80af9b479277f6a10db62c60b2c2d3e2e28958ad851521efbbd5659c179", + "sha256:67525ae908f0c9812f6bf33578805f5e50689a4ba3a0bc9730338327727b4b2a", + "sha256:6e49e1822c0ee2459ac358fb29b36968d839f6dcc2fd6790cd73c4527ce42b7f", + "sha256:6edd891881e2536c420fcda443ac693d349a27a739a79dc9d75cc80a9854be12", + "sha256:726c2ddf51a43c1025979f1a3e27b24d441f9cd4a017887c21321c48d401308d", + "sha256:7357c7286e638ac9ee572d0b86fbd84d809879ca0231112aa7cece18f9fd5b73", + "sha256:7c0ecfee57321dbf25e0a2957056aa24b57c9334ad5e6e044b512a22040967ef", + "sha256:7ea16cab0ca2a1373a78e3f723ebb53b6f8bd17b406395f3168b2549861bf763", + "sha256:7f283fdcd0417a43431886cb4b9adeb3c0dce6b8e701b8258d6ef73e323ee105", + "sha256:847164d15142652a3f11f9101603878136c6a2f663460046d08421c039f6bc7d", + "sha256:8499aeb496b6ff6df0602c1395b201d1b40b96d43d29e5c0805c81b55f333ef6", + "sha256:9894bb2f41950f2cb2d84a46b39d487fc0f8f083730bfe2120be2743b7145fd0", + "sha256:a4f3eec7985642f139cb9b522e5dd1581186cf9ee016853d4b3b5abf2e5b8bc4", + "sha256:a5ad4696987fdb42d976093e1b1a585ec2ad42634b5ce94dbb71362dcc758afb", + "sha256:a85b0c694104f5e45ede8172c41ba6593554df3db6c50131bb6b7d7a0866d633", + "sha256:a8d5bc7413a6b23c8023e2daac879986f35fd55c94ee69f5e94de2afe1a6b40e", + "sha256:aeaa2d1c8e4227ac80ab6768cbb7b807b2185581cb8be52026ba87289f4f8afd", + "sha256:b4ea035fccca8d98e2106d0d18c11bf58c1c75179c949be6ac169c362543520d", + "sha256:b8f4ba3560ced143835c65d18c114070dbd9caa9c7250554319f23c3caa63528", + "sha256:ba9bcadc5d8ea45d2b009ccff56d89f40c29b0daa373142fa758c892f1699b3d", + "sha256:bfde3244b5df701ccc7423d7ad8b0b5b138ee84a5aa523a25a4d22f801db7e34", + "sha256:c8ad3619d18b61ab024d519f3e95fac412259b4a6b074aef1b702755ebd6de38", + "sha256:caea1f634b89b19d9a7a474b92ce0c330aef51e8a9e57e193d77e206da4f1534", + "sha256:d6ef866c7783b3fedcbd4396617e18cb947349e99d04c7253dfaab0bc38f49e4", + "sha256:d853bffa2394bf8da27c0f94fe3121830ebd418e911f09b074d8b08b909ec5e4", + "sha256:d9ef21229dc82bf76f75858ee02185dd5522abd2a175c9a5cff3add9426cf98b", + "sha256:dc1f231ae768baf88bf462a6736e9091606c3326d3b242d22e6df6f0dd9553fc", + "sha256:de271298f61ce674354826b2a64f932a4f41317460be610909c213ebc44ab988", + "sha256:e28065627fcbed9978d6d1f9bf68b0bec5d7fa40a7ab64bda3149590d4022f91" ], "index": "pypi", - "version": "==3.5.44" + "version": "==3.5.52" }, "requests": { "extras": [ @@ -935,18 +987,18 @@ }, "shodan": { "hashes": [ - "sha256:31b0740ffaf7c5196a26a0b1edf7d271dffe54ea52bb1b34ba87aa231b5c339b" + "sha256:d2d37d47dd084747df672e6d981f6d72d5d03f4ee12f0ce2170e618147578349" ], "index": "pypi", - "version": "==1.23.0" + "version": "==1.23.1" }, "sigmatools": { "hashes": [ - "sha256:5453717e452aa7860c5e6ac80bcee4f398d70956fc2ee9859bc7255067da8736", - "sha256:cdfeb8200c09c0a40ea1a015e57f3b8e2ba62a28352ca05fa015674f640871e3" + "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", + "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" ], "index": "pypi", - "version": "==0.17.0" + "version": "==0.18.1" }, "six": { "hashes": [ @@ -956,18 +1008,26 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.15.0" }, + "socialscan": { + "hashes": [ + "sha256:688ef0ae170f3270f541c0fdfaa859bad1fe56955c692fdd3b312deed8a16362", + "sha256:6db737865f08f5a6745fb8ccd001ef13856b19b887da1c8dcd480544a3d47e92" + ], + "index": "pypi", + "version": "==1.3.0" + }, "socketio-client": { "hashes": [ - "sha256:540d8ab209154d1d9cdb97c170c589a14f7d7f17e19c14e2f59f0307e6175485" + "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" ], - "version": "==0.5.6" + "version": "==0.5.7.4" }, "soupsieve": { "hashes": [ "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" ], - "markers": "python_version >= '3.5'", + "markers": "python_version >= '3.0'", "version": "==2.0.1" }, "sparqlwrapper": { @@ -983,11 +1043,11 @@ }, "stix2-patterns": { "hashes": [ - "sha256:587a82545680311431e5610036dd6c8c247347a24243fafdafaae2df4d6d7799", - "sha256:7fcb2fa67efeac2a8c493d367c93d0ce6243a10e2eff715ae9f2983e6b32b95d" + "sha256:373a3de163e1b146499c6e5a7908e1f0987173139480897728fcbbba6a806f95", + "sha256:5a38f634adc856b7d03e13dd140d38e184ac1ef11077c1ffca28a262fa6d8c41" ], "index": "pypi", - "version": "==1.3.0" + "version": "==1.3.1" }, "tabulate": { "hashes": [ @@ -1011,12 +1071,20 @@ "markers": "python_version >= '3.5'", "version": "==6.0.4" }, + "tqdm": { + "hashes": [ + "sha256:2dd75fdb764f673b8187643496fcfbeac38348015b665878e582b152f3391cdb", + "sha256:93b7a6a9129fce904f6df4cf3ae7ff431d779be681a95c3344c26f3e6c09abfa" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==4.50.0" + }, "trustar": { "hashes": [ - "sha256:73336b94012427b66ee61db65fc3c2cea2ed743beaa56cdd5a4c1674ef1a7660" + "sha256:47c45674a4a310dc8d932035e0de112de55c1e899663865b996a6b6b2d79cbde" ], "index": "pypi", - "version": "==0.3.29" + "version": "==0.3.33" }, "tzlocal": { "hashes": [ @@ -1048,11 +1116,11 @@ }, "urllib3": { "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", + "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.9" + "version": "==1.25.10" }, "uwhois": { "editable": true, @@ -1076,20 +1144,20 @@ }, "vulners": { "hashes": [ - "sha256:00ff8744d07f398880afc1efcab6dac4abb614c84553fa31b2d439f986b8e0db", - "sha256:90a855915b4fb4dbd0325643d9e643602975fcb931162e5dc2e7778d1daa2fd8", - "sha256:f230bfcd42663326b7c9b8fa117752e26cad4ccca528caaab531c5b592af8cb5" + "sha256:4e78fc7492d33a1e612e7d5046e51f4c272eb7febdfc0fc06061648d2153e75a", + "sha256:6b088b7c8da9bdcc16e8283afd4a8f804388f1432d12d17b29b770778113ec62", + "sha256:7964884c1f262004a950d5915d49520d22afa3ab175d473492e2dbcc6b5e0a9a" ], "index": "pypi", - "version": "==1.5.5" + "version": "==1.5.8" }, "wand": { "hashes": [ - "sha256:d5b75ac13d7485032970926415648586eafeeb1eb62ed6ebd0778358cf9d70e0", - "sha256:df0780b1b54938a43d29279a6588fde11e349550c8958a673d57c26a3e6de7f1" + "sha256:566b3d049858efa879096a7ab2e0516d67a240e6c3ffd7a267298c41e81c14b7", + "sha256:d21429288fe0de63d829dbbfb26736ebaed9fd0792c2a0dc5943c5cab803a708" ], "index": "pypi", - "version": "==0.6.1" + "version": "==0.6.3" }, "websocket-client": { "hashes": [ @@ -1114,10 +1182,10 @@ }, "xlsxwriter": { "hashes": [ - "sha256:828b3285fc95105f5b1946a6a015b31cf388bd5378fdc6604e4d1b7839df2e77", - "sha256:82a3b0e73e3913483da23791d1a25e4d2dbb3837d1be4129473526b9a270a5cc" + "sha256:99b665203d737db31378ec729c9990a004c1abae53a6fa211c104f8c2e36cffd", + "sha256:b89002dea57bb3d4c8207f3e28ef8244bfd9e936b85d74e7dd1f97e11bb70313" ], - "version": "==1.2.9" + "version": "==1.3.6" }, "yara-python": { "hashes": [ @@ -1138,36 +1206,36 @@ }, "yarl": { "hashes": [ - "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce", - "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6", - "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce", - "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae", - "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d", - "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f", - "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b", - "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b", - "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb", - "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462", - "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea", - "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70", - "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1", - "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a", - "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b", - "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080", - "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2" + "sha256:04a54f126a0732af75e5edc9addeaa2113e2ca7c6fce8974a63549a70a25e50e", + "sha256:3cc860d72ed989f3b1f3abbd6ecf38e412de722fb38b8f1b1a086315cf0d69c5", + "sha256:5d84cc36981eb5a8533be79d6c43454c8e6a39ee3118ceaadbd3c029ab2ee580", + "sha256:5e447e7f3780f44f890360ea973418025e8c0cdcd7d6a1b221d952600fd945dc", + "sha256:61d3ea3c175fe45f1498af868879c6ffeb989d4143ac542163c45538ba5ec21b", + "sha256:67c5ea0970da882eaf9efcf65b66792557c526f8e55f752194eff8ec722c75c2", + "sha256:6f6898429ec3c4cfbef12907047136fd7b9e81a6ee9f105b45505e633427330a", + "sha256:7ce35944e8e61927a8f4eb78f5bc5d1e6da6d40eadd77e3f79d4e9399e263921", + "sha256:b7c199d2cbaf892ba0f91ed36d12ff41ecd0dde46cbf64ff4bfe997a3ebc925e", + "sha256:c15d71a640fb1f8e98a1423f9c64d7f1f6a3a168f803042eaf3a5b5022fde0c1", + "sha256:c22607421f49c0cb6ff3ed593a49b6a99c6ffdeaaa6c944cdda83c2393c8864d", + "sha256:c604998ab8115db802cc55cb1b91619b2831a6128a62ca7eea577fc8ea4d3131", + "sha256:d088ea9319e49273f25b1c96a3763bf19a882cff774d1792ae6fba34bd40550a", + "sha256:db9eb8307219d7e09b33bcb43287222ef35cbcf1586ba9472b0a4b833666ada1", + "sha256:e31fef4e7b68184545c3d68baec7074532e077bd1906b040ecfba659737df188", + "sha256:e32f0fb443afcfe7f01f95172b66f279938fbc6bdaebe294b0ff6747fb6db020", + "sha256:fcbe419805c9b20db9a51d33b942feddbf6e7fb468cb20686fd7089d4164c12a" ], "markers": "python_version >= '3.5'", - "version": "==1.4.2" + "version": "==1.6.0" } }, "develop": { "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.3.0" + "version": "==20.2.0" }, "certifi": { "hashes": [ @@ -1185,49 +1253,52 @@ }, "codecov": { "hashes": [ - "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091", - "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728", - "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34" + "sha256:24545847177a893716b3455ac5bfbafe0465f38d4eb86ea922c09adc7f327e65", + "sha256:355fc7e0c0b8a133045f0d6089bde351c845e7b52b99fec5903b4ea3ab5f6aab", + "sha256:7877f68effde3c2baadcff807a5d13f01019a337f9596eece0d64e57393adf3a" ], "index": "pypi", - "version": "==2.1.7" + "version": "==2.1.9" }, "coverage": { "hashes": [ - "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a", - "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355", - "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65", - "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7", - "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9", - "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1", - "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0", - "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55", - "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c", - "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6", - "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef", - "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019", - "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e", - "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0", - "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf", - "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24", - "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2", - "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c", - "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4", - "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0", - "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd", - "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04", - "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e", - "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730", - "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2", - "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768", - "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796", - "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7", - "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a", - "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489", - "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052" + "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516", + "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259", + "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9", + "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097", + "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0", + "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f", + "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7", + "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c", + "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5", + "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7", + "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729", + "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978", + "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9", + "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f", + "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9", + "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822", + "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418", + "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82", + "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f", + "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d", + "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221", + "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4", + "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21", + "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709", + "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54", + "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d", + "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270", + "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24", + "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751", + "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a", + "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237", + "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7", + "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636", + "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.1" + "version": "==5.3" }, "flake8": { "hashes": [ @@ -1245,6 +1316,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, + "iniconfig": { + "hashes": [ + "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437", + "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69" + ], + "version": "==1.0.1" + }, "mccabe": { "hashes": [ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", @@ -1252,14 +1330,6 @@ ], "version": "==0.6.1" }, - "more-itertools": { - "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" - ], - "markers": "python_version >= '3.5'", - "version": "==8.4.0" - }, "nose": { "hashes": [ "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", @@ -1319,11 +1389,11 @@ }, "pytest": { "hashes": [ - "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", - "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" + "sha256:1cd09785c0a50f9af72220dd12aa78cfa49cbffc356c61eab009ca189e018a33", + "sha256:d010e24666435b39a4cf48740b039885642b6c273a3f77be3e7e03554d2806b7" ], "index": "pypi", - "version": "==5.4.3" + "version": "==6.1.0" }, "requests": { "extras": [ @@ -1344,20 +1414,20 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.15.0" }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "version": "==0.10.1" + }, "urllib3": { "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", + "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.9" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" + "version": "==1.25.10" } } } From d950b4d7ec80f5dec748ab71e69d2063a8762168 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 2 Oct 2020 01:50:49 +0200 Subject: [PATCH 031/476] fix: Removed debugging print command --- misp_modules/modules/expansion/socialscan.py | 1 - 1 file changed, 1 deletion(-) diff --git a/misp_modules/modules/expansion/socialscan.py b/misp_modules/modules/expansion/socialscan.py index 7c59a35..da30e4c 100644 --- a/misp_modules/modules/expansion/socialscan.py +++ b/misp_modules/modules/expansion/socialscan.py @@ -61,7 +61,6 @@ def parse_results(query_results, feature): 'values': result } for result in results ] - print(json.dumps(to_return, indent=4)) return {'results': to_return} From 0072e04627f3dc33db0412598ac809dcaeec3f4b Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 2 Oct 2020 16:41:47 +0200 Subject: [PATCH 032/476] chg: Updated expansion modules documentation - Added documentation for the missing modules - Renamed some of the documentation files to match with the module names and avoid issues within the documentation file (README.md) with the link of the miss-spelled module names --- doc/README.md | 155 +++++++++++++++++- doc/expansion/cve_advanced.json | 8 + .../{docx-enrich.json => docx_enrich.json} | 0 doc/expansion/geoip_asn.json | 9 + doc/expansion/geoip_city.json | 9 + doc/expansion/google_search.json | 9 + doc/expansion/intel471.json | 9 + .../{ocr-enrich.json => ocr_enrich.json} | 0 .../{ods-enrich.json => ods_enrich.json} | 0 .../{odt-enrich.json => odt_enrich.json} | 0 .../{pdf-enrich.json => pdf_enrich.json} | 0 .../{pptx-enrich.json => pptx_enrich.json} | 0 doc/expansion/ransomcoindb.json | 8 + doc/expansion/sophoslabs_intelix.json | 9 + .../{xlsx-enrich.json => xlsx_enrich.json} | 0 doc/logos/google.png | Bin 0 -> 15903 bytes doc/logos/intel471.png | Bin 0 -> 6713 bytes doc/logos/sophoslabs_intelix.svg | 32 ++++ 18 files changed, 241 insertions(+), 7 deletions(-) create mode 100644 doc/expansion/cve_advanced.json rename doc/expansion/{docx-enrich.json => docx_enrich.json} (100%) create mode 100644 doc/expansion/geoip_asn.json create mode 100644 doc/expansion/geoip_city.json create mode 100644 doc/expansion/google_search.json create mode 100644 doc/expansion/intel471.json rename doc/expansion/{ocr-enrich.json => ocr_enrich.json} (100%) rename doc/expansion/{ods-enrich.json => ods_enrich.json} (100%) rename doc/expansion/{odt-enrich.json => odt_enrich.json} (100%) rename doc/expansion/{pdf-enrich.json => pdf_enrich.json} (100%) rename doc/expansion/{pptx-enrich.json => pptx_enrich.json} (100%) create mode 100644 doc/expansion/ransomcoindb.json create mode 100644 doc/expansion/sophoslabs_intelix.json rename doc/expansion/{xlsx-enrich.json => xlsx_enrich.json} (100%) create mode 100644 doc/logos/google.png create mode 100644 doc/logos/intel471.png create mode 100644 doc/logos/sophoslabs_intelix.svg diff --git a/doc/README.md b/doc/README.md index 6469dd0..1225780 100644 --- a/doc/README.md +++ b/doc/README.md @@ -311,6 +311,26 @@ An expansion hover module to expand information about CVE id. ----- +#### [cve_advanced](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve_advanced.py) + + + +An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE). +- **features**: +>The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to gather additional information. +> +>The result of the query is then parsed to return additional information about the vulnerability, like its cvss score or some references, as well as the potential related weaknesses and attack patterns. +> +>The vulnerability additional data is returned in a vulnerability MISP object, and the related additional information are put into weakness and attack-pattern MISP objects. +- **input**: +>Vulnerability attribute. +- **output**: +>Additional information about the vulnerability, such as its cvss score, some references, or the related weaknesses and attack patterns. +- **references**: +>https://cve.circl.lu, https://cve/mitre.org/ + +----- + #### [cytomic_orion](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cytomic_orion.py) @@ -369,7 +389,7 @@ A simple DNS expansion service to resolve IP address from domain MISP attributes ----- -#### [docx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/docx-enrich.py) +#### [docx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/docx_enrich.py) @@ -476,6 +496,42 @@ Module to access Farsight DNSDB Passive DNS. ----- +#### [geoip_asn](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_asn.py) + + +- **descrption**: +>An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about its related AS number. +- **features**: +>The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the related AS number. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text containing information about the AS number of the IP address. +- **references**: +>https://www.maxmind.com/en/home +- **requirements**: +>A local copy of Maxmind's Geolite database + +----- + +#### [geoip_city](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_city.py) + + + +An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about the city where it is located. +- **features**: +>The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the city where this IP address is located. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text containing information about the city where the IP address is located. +- **references**: +>https://www.maxmind.com/en/home +- **requirements**: +>A local copy of Maxmind's Geolite database + +----- + #### [geoip_country](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_country.py) @@ -496,6 +552,24 @@ Module to query a local copy of Maxmind's Geolite database. ----- +#### [google_search](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/google_search.py) + + +- **descrption**: +>A hover module to get information about an url using a Google search. +- **features**: +>The module takes an url as input to query the Google search API. The result of the query is then return as raw text. +- **input**: +>An url attribute. +- **output**: +>Text containing the result of a Google search on the input url. +- **references**: +>https://github.com/abenassi/Google-Search-API +- **requirements**: +>The python Google Search API library + +----- + #### [greynoise](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/greynoise.py) @@ -544,6 +618,37 @@ Module to access haveibeenpwned.com API. ----- +#### [intel471](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intel471.py) + + +- **descrption**: +>An expansion module to query Intel471 in order to get additional information about a domain, ip address, email address, url or hash. +- **features**: +>The module uses the Intel471 python library to query the Intel471 API with the value of the input attribute. The result of the query is then returned as freetext so the Freetext import parses it. +- **input**: +>A MISP attribute whose type is included in the following list: +>- hostname +>- domain +>- url +>- ip-src +>- ip-dst +>- email-src +>- email-dst +>- target-email +>- whois-registrant-email +>- whois-registrant-name +>- md5 +>- sha1 +>- sha256 +- **output**: +>Freetext +- **references**: +>https://public.intel471.com/ +- **requirements**: +>The intel471 python library + +----- + #### [intelmq_eventdb](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intelmq_eventdb.py) @@ -733,7 +838,7 @@ Query the MALWAREbazaar API to get additional information about the input hash a ----- -#### [ocr-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ocr-enrich.py) +#### [ocr_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ocr_enrich.py) Module to process some optical character recognition on pictures. - **features**: @@ -747,7 +852,7 @@ Module to process some optical character recognition on pictures. ----- -#### [ods-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ods-enrich.py) +#### [ods_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ods_enrich.py) @@ -763,7 +868,7 @@ Module to extract freetext from a .ods document. ----- -#### [odt-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/odt-enrich.py) +#### [odt_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/odt_enrich.py) @@ -902,7 +1007,7 @@ Module to get information from AlienVault OTX. ----- -#### [pdf-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pdf-enrich.py) +#### [pdf_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pdf_enrich.py) @@ -918,7 +1023,7 @@ Module to extract freetext from a PDF document. ----- -#### [pptx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pptx-enrich.py) +#### [pptx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pptx_enrich.py) @@ -948,6 +1053,24 @@ Module to decode QR codes. ----- +#### [ransomcoindb](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ransomcoindb.py) +- **descrption**: +>Module to access the ransomcoinDB with a hash or btc address attribute and get the associated btc address of hashes. +- **features**: +>The module takes either a hash attribute or a btc attribute as input to query the ransomcoinDB API for some additional data. +> +>If the input is a btc address, we will get the associated hashes returned in a file MISP object. If we query ransomcoinDB with a hash, the response contains the associated btc addresses returned as single MISP btc attributes. +- **input**: +>A hash (md5, sha1 or sha256) or btc attribute. +- **output**: +>Hashes associated to a btc address or btc addresses associated to a hash. +- **references**: +>https://ransomcoindb.concinnity-risks.com +- **requirements**: +>A ransomcoinDB API key. + +----- + #### [rbl](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/rbl.py) Module to check an IPv4 address against known RBLs. @@ -1091,6 +1214,24 @@ An expansion hover module to perform a syntax check on sigma rules. ----- +#### [sophoslabs_intelix](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sophoslabs_intelix.py) + + + +An expansion module to query the Sophoslabs intelix API to get additional information about an ip address, url, domain or sha256 attribute. +- **features**: +>The module takes an ip address, url, domain or sha256 attribute and queries the SophosLabs Intelix API with the attribute value. The result of this query is a SophosLabs Intelix hash report, or an ip or url lookup, that is then parsed and returned in a MISP object. +- **input**: +>An ip address, url, domain or sha256 attribute. +- **output**: +>SophosLabs Intelix report and lookup objects +- **references**: +>https://aws.amazon.com/marketplace/pp/B07SLZPMCS +- **requirements**: +>A client_id and client_secret pair to authenticate to the SophosLabs Intelix API + +----- + #### [sourcecache](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sourcecache.py) Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page. @@ -1442,7 +1583,7 @@ An expansion module for IBM X-Force Exchange. ----- -#### [xlsx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xlsx-enrich.py) +#### [xlsx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xlsx_enrich.py) diff --git a/doc/expansion/cve_advanced.json b/doc/expansion/cve_advanced.json new file mode 100644 index 0000000..a4b2ac6 --- /dev/null +++ b/doc/expansion/cve_advanced.json @@ -0,0 +1,8 @@ +{ + "description": "An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE).", + "logo": "logos/cve.png", + "input": "Vulnerability attribute.", + "output": "Additional information about the vulnerability, such as its cvss score, some references, or the related weaknesses and attack patterns.", + "references": ["https://cve.circl.lu", "https://cve/mitre.org/"], + "features": "The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to gather additional information.\n\nThe result of the query is then parsed to return additional information about the vulnerability, like its cvss score or some references, as well as the potential related weaknesses and attack patterns.\n\nThe vulnerability additional data is returned in a vulnerability MISP object, and the related additional information are put into weakness and attack-pattern MISP objects." +} diff --git a/doc/expansion/docx-enrich.json b/doc/expansion/docx_enrich.json similarity index 100% rename from doc/expansion/docx-enrich.json rename to doc/expansion/docx_enrich.json diff --git a/doc/expansion/geoip_asn.json b/doc/expansion/geoip_asn.json new file mode 100644 index 0000000..98189c7 --- /dev/null +++ b/doc/expansion/geoip_asn.json @@ -0,0 +1,9 @@ +{ + "descrption": "An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about its related AS number.", + "logo": "logos/maxmind.png", + "requirements": ["A local copy of Maxmind's Geolite database"], + "input": "An IP address MISP attribute.", + "output": "Text containing information about the AS number of the IP address.", + "references": ["https://www.maxmind.com/en/home"], + "features": "The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the related AS number." +} diff --git a/doc/expansion/geoip_city.json b/doc/expansion/geoip_city.json new file mode 100644 index 0000000..bf6d8fa --- /dev/null +++ b/doc/expansion/geoip_city.json @@ -0,0 +1,9 @@ +{ + "description": "An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about the city where it is located.", + "logo": "logos/maxmind.png", + "requirements": ["A local copy of Maxmind's Geolite database"], + "input": "An IP address MISP attribute.", + "output": "Text containing information about the city where the IP address is located.", + "references": ["https://www.maxmind.com/en/home"], + "features": "The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the city where this IP address is located." +} diff --git a/doc/expansion/google_search.json b/doc/expansion/google_search.json new file mode 100644 index 0000000..a3caddf --- /dev/null +++ b/doc/expansion/google_search.json @@ -0,0 +1,9 @@ +{ + "descrption": "A hover module to get information about an url using a Google search.", + "logo": "logos/google.png", + "requirements": ["The python Google Search API library"], + "input": "An url attribute.", + "output": "Text containing the result of a Google search on the input url.", + "references": ["https://github.com/abenassi/Google-Search-API"], + "features": "The module takes an url as input to query the Google search API. The result of the query is then return as raw text." +} diff --git a/doc/expansion/intel471.json b/doc/expansion/intel471.json new file mode 100644 index 0000000..72dbaba --- /dev/null +++ b/doc/expansion/intel471.json @@ -0,0 +1,9 @@ +{ + "descrption": "An expansion module to query Intel471 in order to get additional information about a domain, ip address, email address, url or hash.", + "logo": "logos/intel471.png", + "requirements": ["The intel471 python library"], + "input": "A MISP attribute whose type is included in the following list:\n- hostname\n- domain\n- url\n- ip-src\n- ip-dst\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-name\n- md5\n- sha1\n- sha256", + "output": "Freetext", + "references": ["https://public.intel471.com/"], + "features": "The module uses the Intel471 python library to query the Intel471 API with the value of the input attribute. The result of the query is then returned as freetext so the Freetext import parses it." +} diff --git a/doc/expansion/ocr-enrich.json b/doc/expansion/ocr_enrich.json similarity index 100% rename from doc/expansion/ocr-enrich.json rename to doc/expansion/ocr_enrich.json diff --git a/doc/expansion/ods-enrich.json b/doc/expansion/ods_enrich.json similarity index 100% rename from doc/expansion/ods-enrich.json rename to doc/expansion/ods_enrich.json diff --git a/doc/expansion/odt-enrich.json b/doc/expansion/odt_enrich.json similarity index 100% rename from doc/expansion/odt-enrich.json rename to doc/expansion/odt_enrich.json diff --git a/doc/expansion/pdf-enrich.json b/doc/expansion/pdf_enrich.json similarity index 100% rename from doc/expansion/pdf-enrich.json rename to doc/expansion/pdf_enrich.json diff --git a/doc/expansion/pptx-enrich.json b/doc/expansion/pptx_enrich.json similarity index 100% rename from doc/expansion/pptx-enrich.json rename to doc/expansion/pptx_enrich.json diff --git a/doc/expansion/ransomcoindb.json b/doc/expansion/ransomcoindb.json new file mode 100644 index 0000000..bc4e2ab --- /dev/null +++ b/doc/expansion/ransomcoindb.json @@ -0,0 +1,8 @@ +{ + "descrption": "Module to access the ransomcoinDB with a hash or btc address attribute and get the associated btc address of hashes.", + "requirements": ["A ransomcoinDB API key."], + "input": "A hash (md5, sha1 or sha256) or btc attribute.", + "output": "Hashes associated to a btc address or btc addresses associated to a hash.", + "references": ["https://ransomcoindb.concinnity-risks.com"], + "features": "The module takes either a hash attribute or a btc attribute as input to query the ransomcoinDB API for some additional data.\n\nIf the input is a btc address, we will get the associated hashes returned in a file MISP object. If we query ransomcoinDB with a hash, the response contains the associated btc addresses returned as single MISP btc attributes." +} diff --git a/doc/expansion/sophoslabs_intelix.json b/doc/expansion/sophoslabs_intelix.json new file mode 100644 index 0000000..18dd7c1 --- /dev/null +++ b/doc/expansion/sophoslabs_intelix.json @@ -0,0 +1,9 @@ +{ + "description": "An expansion module to query the Sophoslabs intelix API to get additional information about an ip address, url, domain or sha256 attribute.", + "logo": "logos/sophoslabs_intelix.svg", + "requirements": ["A client_id and client_secret pair to authenticate to the SophosLabs Intelix API"], + "input": "An ip address, url, domain or sha256 attribute.", + "output": "SophosLabs Intelix report and lookup objects", + "references": ["https://aws.amazon.com/marketplace/pp/B07SLZPMCS"], + "features": "The module takes an ip address, url, domain or sha256 attribute and queries the SophosLabs Intelix API with the attribute value. The result of this query is a SophosLabs Intelix hash report, or an ip or url lookup, that is then parsed and returned in a MISP object." +} diff --git a/doc/expansion/xlsx-enrich.json b/doc/expansion/xlsx_enrich.json similarity index 100% rename from doc/expansion/xlsx-enrich.json rename to doc/expansion/xlsx_enrich.json diff --git a/doc/logos/google.png b/doc/logos/google.png new file mode 100644 index 0000000000000000000000000000000000000000..492f44c27eb2d402e0dd3446b4d38192e75874c4 GIT binary patch literal 15903 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�ZkvUe1M)ErGJS$u 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 literal 0 HcmV?d00001 diff --git a/doc/logos/intel471.png b/doc/logos/intel471.png new file mode 100644 index 0000000000000000000000000000000000000000..08264e9499fe9b749ccf0a609a488c9c5eb69657 GIT binary patch literal 6713 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 G5B>{C#F}mZ literal 0 HcmV?d00001 diff --git a/doc/logos/sophoslabs_intelix.svg b/doc/logos/sophoslabs_intelix.svg new file mode 100644 index 0000000..9fe952f --- /dev/null +++ b/doc/logos/sophoslabs_intelix.svg @@ -0,0 +1,32 @@ + + + + CC812F0D-F9F0-4D68-9347-3579CDA181A3 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 48635d8f1b11ff9cd23d8a1b4d2995ce1bf91971 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 2 Oct 2020 17:01:02 +0200 Subject: [PATCH 033/476] add: Added documentation for the socialscan new module - Also quick fix of the message for an invalid result or response concerning the queried email address or username --- README.md | 3 ++- doc/README.md | 16 ++++++++++++++++ doc/expansion/socialscan.json | 8 ++++++++ misp_modules/modules/expansion/socialscan.py | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 doc/expansion/socialscan.json diff --git a/README.md b/README.md index 26dce03..ce9b57c 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,8 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [shodan](misp_modules/modules/expansion/shodan.py) - a minimal [shodan](https://www.shodan.io/) expansion module. * [Sigma queries](misp_modules/modules/expansion/sigma_queries.py) - Experimental expansion module querying a sigma rule to convert it into all the available SIEM signatures. * [Sigma syntax validator](misp_modules/modules/expansion/sigma_syntax_validator.py) - Sigma syntax validator. -* [SophosLabs Intelix](misp_modules/modules/expansion/sophoslabs_intelix.py) - SophosLabs Intelix is an API for Threat Intelligence and Analysis (free tier availible). [SophosLabs](https://aws.amazon.com/marketplace/pp/B07SLZPMCS) +* [Socialscan](misp_modules/modules/expansion/socialscan.py) - a hover module to check if an email address or a username is used on different online platforms, using the [socialscan](https://github.com/iojw/socialscan) python library +* [SophosLabs Intelix](misp_modules/modules/expansion/sophoslabs_intelix.py) - SophosLabs Intelix is an API for Threat Intelligence and Analysis (free tier available). [SophosLabs](https://aws.amazon.com/marketplace/pp/B07SLZPMCS) * [sourcecache](misp_modules/modules/expansion/sourcecache.py) - a module to cache a specific link from a MISP instance. * [STIX2 pattern syntax validator](misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) - a module to check a STIX2 pattern syntax. * [ThreatCrowd](misp_modules/modules/expansion/threatcrowd.py) - an expansion module for [ThreatCrowd](https://www.threatcrowd.org/). diff --git a/doc/README.md b/doc/README.md index 1225780..1407ae7 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1214,6 +1214,22 @@ An expansion hover module to perform a syntax check on sigma rules. ----- +#### [socialscan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/socialscan.py) + +A hover module to get information on the availability of an email address or username on some online platforms. +- **features**: +>The module takes an email address or username as input and check its availability on some online platforms. The results for each platform are then returned to see if the email address or the username is used, available or if there is an issue with it. +- **input**: +>An email address or usename attribute. +- **output**: +>Text containing information about the availability of an email address or a username in some online platforms. +- **references**: +>https://github.com/iojw/socialscan +- **requirements**: +>The socialscan python library + +----- + #### [sophoslabs_intelix](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sophoslabs_intelix.py) diff --git a/doc/expansion/socialscan.json b/doc/expansion/socialscan.json new file mode 100644 index 0000000..a1cf359 --- /dev/null +++ b/doc/expansion/socialscan.json @@ -0,0 +1,8 @@ +{ + "description": "A hover module to get information on the availability of an email address or username on some online platforms.", + "requirements": ["The socialscan python library"], + "input": "An email address or usename attribute.", + "output": "Text containing information about the availability of an email address or a username in some online platforms.", + "references": ["https://github.com/iojw/socialscan"], + "features": "The module takes an email address or username as input and check its availability on some online platforms. The results for each platform are then returned to see if the email address or the username is used, available or if there is an issue with it." +} diff --git a/misp_modules/modules/expansion/socialscan.py b/misp_modules/modules/expansion/socialscan.py index da30e4c..54f58f6 100644 --- a/misp_modules/modules/expansion/socialscan.py +++ b/misp_modules/modules/expansion/socialscan.py @@ -51,7 +51,7 @@ def parse_results(query_results, feature): results.append(f'Unable to retrieve the {feature} on {result.platform}.') continue if not result.valid: - results.append(f'Invalid response from {result.platform}.') + results.append(f'Invalid response from {result.platform}, or invalid {feature}.') continue statement = 'No account' if result.available else 'There is an account' results.append(f'{statement} linked to the {feature} on {result.platform}.') From a907613ce2350db9ac2739955eeb05f0a2570c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Fri, 9 Oct 2020 14:24:19 +0200 Subject: [PATCH 034/476] chg: Bump deps --- Pipfile.lock | 855 +++++++++++++++++++++++++++------------------------ 1 file changed, 456 insertions(+), 399 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 73aeaed..ef0923f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -57,11 +57,10 @@ }, "assemblyline-client": { "hashes": [ - "sha256:6f45cab3be3ec60984a5c2049d46dac80d4e3d4f3d9538220518a44c7a6ddb15", - "sha256:971371065f2b41027325bf9fa9c72960262a446c7e08bda57865d34dcc4108b0" + "sha256:6a36a654185ba40d10bdd0213a1926aacb4351290824e406cbff6b6b5b251f5f" ], "index": "pypi", - "version": "==3.7.3" + "version": "==4.0.1" }, "async-timeout": { "hashes": [ @@ -73,11 +72,11 @@ }, "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.3.0" + "version": "==20.2.0" }, "backscatter": { "hashes": [ @@ -89,12 +88,12 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7", - "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8", - "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c" + "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35", + "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25", + "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666" ], "index": "pypi", - "version": "==4.9.1" + "version": "==4.9.3" }, "blockchain": { "hashes": [ @@ -112,36 +111,44 @@ }, "cffi": { "hashes": [ - "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", - "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", - "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", - "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", - "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", - "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", - "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", - "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", - "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", - "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", - "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", - "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", - "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", - "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", - "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", - "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", - "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", - "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", - "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", - "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", - "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", - "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", - "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", - "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", - "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", - "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", - "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", - "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d", + "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b", + "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4", + "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f", + "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3", + "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579", + "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537", + "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e", + "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05", + "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171", + "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca", + "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522", + "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c", + "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc", + "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d", + "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808", + "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828", + "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869", + "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d", + "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9", + "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0", + "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc", + "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15", + "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c", + "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a", + "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3", + "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1", + "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768", + "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d", + "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b", + "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e", + "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d", + "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730", + "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394", + "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1", + "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591" ], - "version": "==1.14.0" + "version": "==1.14.3" }, "chardet": { "hashes": [ @@ -175,35 +182,38 @@ }, "configparser": { "hashes": [ - "sha256:2ca44140ee259b5e3d8aaf47c79c36a7ab0d5e94d70bd4105c03ede7a20ea5a1", - "sha256:cffc044844040c7ce04e9acd1838b5f2e5fa3170182f6fda4d2ea8b0099dbadd" + "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", + "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" ], "markers": "python_version >= '3.6'", - "version": "==5.0.0" + "version": "==5.0.1" }, "cryptography": { "hashes": [ - "sha256:091d31c42f444c6f519485ed528d8b451d1a0c7bf30e8ca583a0cac44b8a0df6", - "sha256:18452582a3c85b96014b45686af264563e3e5d99d226589f057ace56196ec78b", - "sha256:1dfa985f62b137909496e7fc182dac687206d8d089dd03eaeb28ae16eec8e7d5", - "sha256:1e4014639d3d73fbc5ceff206049c5a9a849cefd106a49fa7aaaa25cc0ce35cf", - "sha256:22e91636a51170df0ae4dcbd250d318fd28c9f491c4e50b625a49964b24fe46e", - "sha256:3b3eba865ea2754738616f87292b7f29448aec342a7c720956f8083d252bf28b", - "sha256:651448cd2e3a6bc2bb76c3663785133c40d5e1a8c1a9c5429e4354201c6024ae", - "sha256:726086c17f94747cedbee6efa77e99ae170caebeb1116353c6cf0ab67ea6829b", - "sha256:844a76bc04472e5135b909da6aed84360f522ff5dfa47f93e3dd2a0b84a89fa0", - "sha256:88c881dd5a147e08d1bdcf2315c04972381d026cdb803325c03fe2b4a8ed858b", - "sha256:96c080ae7118c10fcbe6229ab43eb8b090fccd31a09ef55f83f690d1ef619a1d", - "sha256:a0c30272fb4ddda5f5ffc1089d7405b7a71b0b0f51993cb4e5dbb4590b2fc229", - "sha256:bb1f0281887d89617b4c68e8db9a2c42b9efebf2702a3c5bf70599421a8623e3", - "sha256:c447cf087cf2dbddc1add6987bbe2f767ed5317adb2d08af940db517dd704365", - "sha256:c4fd17d92e9d55b84707f4fd09992081ba872d1a0c610c109c18e062e06a2e55", - "sha256:d0d5aeaedd29be304848f1c5059074a740fa9f6f26b84c5b63e8b29e73dfc270", - "sha256:daf54a4b07d67ad437ff239c8a4080cfd1cc7213df57d33c97de7b4738048d5e", - "sha256:e993468c859d084d5579e2ebee101de8f5a27ce8e2159959b6673b418fd8c785", - "sha256:f118a95c7480f5be0df8afeb9a11bd199aa20afab7a96bcf20409b411a3a85f0" + "sha256:21b47c59fcb1c36f1113f3709d37935368e34815ea1d7073862e92f810dc7499", + "sha256:451cdf60be4dafb6a3b78802006a020e6cd709c22d240f94f7a0696240a17154", + "sha256:4549b137d8cbe3c2eadfa56c0c858b78acbeff956bd461e40000b2164d9167c6", + "sha256:48ee615a779ffa749d7d50c291761dc921d93d7cf203dca2db663b4f193f0e49", + "sha256:559d622aef2a2dff98a892eef321433ba5bc55b2485220a8ca289c1ecc2bd54f", + "sha256:5d52c72449bb02dd45a773a203196e6d4fae34e158769c896012401f33064396", + "sha256:65beb15e7f9c16e15934569d29fb4def74ea1469d8781f6b3507ab896d6d8719", + "sha256:680da076cad81cdf5ffcac50c477b6790be81768d30f9da9e01960c4b18a66db", + "sha256:762bc5a0df03c51ee3f09c621e1cee64e3a079a2b5020de82f1613873d79ee70", + "sha256:89aceb31cd5f9fc2449fe8cf3810797ca52b65f1489002d58fe190bfb265c536", + "sha256:983c0c3de4cb9fcba68fd3f45ed846eb86a2a8b8d8bc5bb18364c4d00b3c61fe", + "sha256:99d4984aabd4c7182050bca76176ce2dbc9fa9748afe583a7865c12954d714ba", + "sha256:9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d", + "sha256:a7597ffc67987b37b12e09c029bd1dc43965f75d328076ae85721b84046e9ca7", + "sha256:ab010e461bb6b444eaf7f8c813bb716be2d78ab786103f9608ffd37a4bd7d490", + "sha256:b12e715c10a13ca1bd27fbceed9adc8c5ff640f8e1f7ea76416352de703523c8", + "sha256:b2bded09c578d19e08bd2c5bb8fed7f103e089752c9cf7ca7ca7de522326e921", + "sha256:b372026ebf32fe2523159f27d9f0e9f485092e43b00a5adacf732192a70ba118", + "sha256:cb179acdd4ae1e4a5a160d80b87841b3d0e0be84af46c7bb2cd7ece57a39c4ba", + "sha256:e97a3b627e3cb63c415a16245d6cef2139cca18bb1183d1b9375a1c14e83f3b3", + "sha256:f0e099fc4cc697450c3dd4031791559692dd941a95254cb9aeded66a7aa8b9bc", + "sha256:f99317a0fa2e49917689b8cf977510addcfaaab769b3f899b9c481bbd76730c2" ], - "version": "==2.9.2" + "version": "==3.1.1" }, "decorator": { "hashes": [ @@ -222,11 +232,11 @@ }, "dnspython": { "hashes": [ - "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01", - "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d" + "sha256:044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7", + "sha256:40bb3c24b9d4ec12500f0124288a65df232a3aa749bb0c39734b782873a2544d" ], "index": "pypi", - "version": "==1.16.0" + "version": "==2.0.0" }, "domaintools-api": { "hashes": [ @@ -273,11 +283,11 @@ }, "geoip2": { "hashes": [ - "sha256:5869e987bc54c0d707264fec4710661332cc38d2dca5a7f9bb5362d0308e2ce0", - "sha256:99ec12d2f1271a73a0a4a2b663fe6ce25fd02289c0a6bef05c0a1c3b30ee95a4" + "sha256:57d8d15de2527e0697bbef44fc16812bba709f03a07ef99297bd56c1df3b1efd", + "sha256:707025542ef076bd8fd80e97138bebdb7812527b2a007d141a27ad98b0370fff" ], "index": "pypi", - "version": "==3.0.0" + "version": "==4.1.0" }, "httplib2": { "hashes": [ @@ -310,10 +320,16 @@ }, "jbxapi": { "hashes": [ - "sha256:58eb7d77a52169309e2322ce874c0f00a7900a515d1d0798ff85973cdb2766e3" + "sha256:8458f01a9b4e4245d61f6fa75edef17e2992192975f746c51ed5392ba9aa7ce5" ], "index": "pypi", - "version": "==3.8.0" + "version": "==3.11.0" + }, + "json-log-formatter": { + "hashes": [ + "sha256:ee187c9a80936cbf1259f73573973450fc24b84a4fb54e53eb0dcff86ea1e759" + ], + "version": "==0.3.0" }, "jsonschema": { "hashes": [ @@ -343,36 +359,40 @@ }, "lxml": { "hashes": [ - "sha256:06748c7192eab0f48e3d35a7adae609a329c6257495d5e53878003660dc0fec6", - "sha256:0790ddca3f825dd914978c94c2545dbea5f56f008b050e835403714babe62a5f", - "sha256:1aa7a6197c1cdd65d974f3e4953764eee3d9c7b67e3966616b41fab7f8f516b7", - "sha256:22c6d34fdb0e65d5f782a4d1a1edb52e0a8365858dafb1c08cb1d16546cf0786", - "sha256:2754d4406438c83144f9ffd3628bbe2dcc6d62b20dbc5c1ec4bc4385e5d44b42", - "sha256:27ee0faf8077c7c1a589573b1450743011117f1aa1a91d5ae776bbc5ca6070f2", - "sha256:2b02c106709466a93ed424454ce4c970791c486d5fcdf52b0d822a7e29789626", - "sha256:2d1ddce96cf15f1254a68dba6935e6e0f1fe39247de631c115e84dd404a6f031", - "sha256:4f282737d187ae723b2633856085c31ae5d4d432968b7f3f478a48a54835f5c4", - "sha256:51bb4edeb36d24ec97eb3e6a6007be128b720114f9a875d6b370317d62ac80b9", - "sha256:7eee37c1b9815e6505847aa5e68f192e8a1b730c5c7ead39ff317fde9ce29448", - "sha256:7fd88cb91a470b383aafad554c3fe1ccf6dfb2456ff0e84b95335d582a799804", - "sha256:9144ce36ca0824b29ebc2e02ca186e54040ebb224292072250467190fb613b96", - "sha256:925baf6ff1ef2c45169f548cc85204433e061360bfa7d01e1be7ae38bef73194", - "sha256:a636346c6c0e1092ffc202d97ec1843a75937d8c98aaf6771348ad6422e44bb0", - "sha256:a87dbee7ad9dce3aaefada2081843caf08a44a8f52e03e0a4cc5819f8398f2f4", - "sha256:a9e3b8011388e7e373565daa5e92f6c9cb844790dc18e43073212bb3e76f7007", - "sha256:afb53edf1046599991fb4a7d03e601ab5f5422a5435c47ee6ba91ec3b61416a6", - "sha256:b26719890c79a1dae7d53acac5f089d66fd8cc68a81f4e4bd355e45470dc25e1", - "sha256:b7462cdab6fffcda853338e1741ce99706cdf880d921b5a769202ea7b94e8528", - "sha256:b77975465234ff49fdad871c08aa747aae06f5e5be62866595057c43f8d2f62c", - "sha256:c47a8a5d00060122ca5908909478abce7bbf62d812e3fc35c6c802df8fb01fe7", - "sha256:c79e5debbe092e3c93ca4aee44c9a7631bdd407b2871cb541b979fd350bbbc29", - "sha256:d8d40e0121ca1606aa9e78c28a3a7d88a05c06b3ca61630242cded87d8ce55fa", - "sha256:ee2be8b8f72a2772e72ab926a3bccebf47bb727bda41ae070dc91d1fb759b726", - "sha256:f95d28193c3863132b1f55c1056036bf580b5a488d908f7d22a04ace8935a3a9", - "sha256:fadd2a63a2bfd7fb604508e553d1cf68eca250b2fbdbd81213b5f6f2fbf23529" + "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f", + "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730", + "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f", + "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1", + "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3", + "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7", + "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a", + "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe", + "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1", + "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e", + "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d", + "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20", + "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae", + "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5", + "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba", + "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293", + "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a", + "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6", + "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88", + "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed", + "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843", + "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443", + "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0", + "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304", + "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258", + "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6", + "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1", + "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481", + "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef", + "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd", + "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee" ], "index": "pypi", - "version": "==4.5.1" + "version": "==4.5.2" }, "maclookup": { "hashes": [ @@ -384,10 +404,10 @@ }, "maxminddb": { "hashes": [ - "sha256:f4d28823d9ca23323d113dc7af8db2087aa4f657fafc64ff8f7a8afda871425b" + "sha256:b95d8ed21799e6604683669c7ed3c6a184fcd92434d5762dccdb139b4f29e597" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.5.4" + "markers": "python_version >= '3.6'", + "version": "==2.0.2" }, "misp-modules": { "editable": true, @@ -425,35 +445,35 @@ }, "numpy": { "hashes": [ - "sha256:13af0184177469192d80db9bd02619f6fa8b922f9f327e077d6f2a6acb1ce1c0", - "sha256:26a45798ca2a4e168d00de75d4a524abf5907949231512f372b217ede3429e98", - "sha256:26f509450db547e4dfa3ec739419b31edad646d21fb8d0ed0734188b35ff6b27", - "sha256:30a59fb41bb6b8c465ab50d60a1b298d1cd7b85274e71f38af5a75d6c475d2d2", - "sha256:33c623ef9ca5e19e05991f127c1be5aeb1ab5cdf30cb1c5cf3960752e58b599b", - "sha256:356f96c9fbec59974a592452ab6a036cd6f180822a60b529a975c9467fcd5f23", - "sha256:3c40c827d36c6d1c3cf413694d7dc843d50997ebffbc7c87d888a203ed6403a7", - "sha256:4d054f013a1983551254e2379385e359884e5af105e3efe00418977d02f634a7", - "sha256:63d971bb211ad3ca37b2adecdd5365f40f3b741a455beecba70fd0dde8b2a4cb", - "sha256:658624a11f6e1c252b2cd170d94bf28c8f9410acab9f2fd4369e11e1cd4e1aaf", - "sha256:76766cc80d6128750075378d3bb7812cf146415bd29b588616f72c943c00d598", - "sha256:7b57f26e5e6ee2f14f960db46bd58ffdca25ca06dd997729b1b179fddd35f5a3", - "sha256:7b852817800eb02e109ae4a9cef2beda8dd50d98b76b6cfb7b5c0099d27b52d4", - "sha256:8cde829f14bd38f6da7b2954be0f2837043e8b8d7a9110ec5e318ae6bf706610", - "sha256:a2e3a39f43f0ce95204beb8fe0831199542ccab1e0c6e486a0b4947256215632", - "sha256:a86c962e211f37edd61d6e11bb4df7eddc4a519a38a856e20a6498c319efa6b0", - "sha256:a8705c5073fe3fcc297fb8e0b31aa794e05af6a329e81b7ca4ffecab7f2b95ef", - "sha256:b6aaeadf1e4866ca0fdf7bb4eed25e521ae21a7947c59f78154b24fc7abbe1dd", - "sha256:be62aeff8f2f054eff7725f502f6228298891fd648dc2630e03e44bf63e8cee0", - "sha256:c2edbb783c841e36ca0fa159f0ae97a88ce8137fb3a6cd82eae77349ba4b607b", - "sha256:cbe326f6d364375a8e5a8ccb7e9cd73f4b2f6dc3b2ed205633a0db8243e2a96a", - "sha256:d34fbb98ad0d6b563b95de852a284074514331e6b9da0a9fc894fb1cdae7a79e", - "sha256:d97a86937cf9970453c3b62abb55a6475f173347b4cde7f8dcdb48c8e1b9952d", - "sha256:dd53d7c4a69e766e4900f29db5872f5824a06827d594427cf1a4aa542818b796", - "sha256:df1889701e2dfd8ba4dc9b1a010f0a60950077fb5242bb92c8b5c7f1a6f2668a", - "sha256:fa1fe75b4a9e18b66ae7f0b122543c42debcf800aaafa0212aaff3ad273c2596" + "sha256:04c7d4ebc5ff93d9822075ddb1751ff392a4375e5885299445fcebf877f179d5", + "sha256:0bfd85053d1e9f60234f28f63d4a5147ada7f432943c113a11afcf3e65d9d4c8", + "sha256:0c66da1d202c52051625e55a249da35b31f65a81cb56e4c69af0dfb8fb0125bf", + "sha256:0d310730e1e793527065ad7dde736197b705d0e4c9999775f212b03c44a8484c", + "sha256:1669ec8e42f169ff715a904c9b2105b6640f3f2a4c4c2cb4920ae8b2785dac65", + "sha256:2117536e968abb7357d34d754e3733b0d7113d4c9f1d921f21a3d96dec5ff716", + "sha256:3733640466733441295b0d6d3dcbf8e1ffa7e897d4d82903169529fd3386919a", + "sha256:4339741994c775396e1a274dba3609c69ab0f16056c1077f18979bec2a2c2e6e", + "sha256:51ee93e1fac3fe08ef54ff1c7f329db64d8a9c5557e6c8e908be9497ac76374b", + "sha256:54045b198aebf41bf6bf4088012777c1d11703bf74461d70cd350c0af2182e45", + "sha256:58d66a6b3b55178a1f8a5fe98df26ace76260a70de694d99577ddeab7eaa9a9d", + "sha256:59f3d687faea7a4f7f93bd9665e5b102f32f3fa28514f15b126f099b7997203d", + "sha256:62139af94728d22350a571b7c82795b9d59be77fc162414ada6c8b6a10ef5d02", + "sha256:7118f0a9f2f617f921ec7d278d981244ba83c85eea197be7c5a4f84af80a9c3c", + "sha256:7c6646314291d8f5ea900a7ea9c4261f834b5b62159ba2abe3836f4fa6705526", + "sha256:967c92435f0b3ba37a4257c48b8715b76741410467e2bdb1097e8391fccfae15", + "sha256:9a3001248b9231ed73894c773142658bab914645261275f675d86c290c37f66d", + "sha256:aba1d5daf1144b956bc87ffb87966791f5e9f3e1f6fab3d7f581db1f5b598f7a", + "sha256:addaa551b298052c16885fc70408d3848d4e2e7352de4e7a1e13e691abc734c1", + "sha256:b594f76771bc7fc8a044c5ba303427ee67c17a09b36e1fa32bde82f5c419d17a", + "sha256:c35a01777f81e7333bcf276b605f39c872e28295441c265cd0c860f4b40148c1", + "sha256:cebd4f4e64cfe87f2039e4725781f6326a61f095bc77b3716502bed812b385a9", + "sha256:d526fa58ae4aead839161535d59ea9565863bb0b0bdb3cc63214613fb16aced4", + "sha256:d7ac33585e1f09e7345aa902c281bd777fdb792432d27fca857f39b70e5dd31c", + "sha256:e6ddbdc5113628f15de7e4911c02aed74a4ccff531842c583e5032f6e5a179bd", + "sha256:eb25c381d168daf351147713f49c626030dcff7a393d5caa62515d415a6071d8" ], "markers": "python_version >= '3.6'", - "version": "==1.19.0" + "version": "==1.19.2" }, "oauth2": { "hashes": [ @@ -470,51 +490,50 @@ }, "opencv-python": { "hashes": [ - "sha256:068928b9907b3d3acd53b129062557d6b0b8b324bfade77f028dbe4dfe482bf2", - "sha256:0e7c91718351449877c2d4141abd64eee1f9c8701bcfaf4e8627bd023e303368", - "sha256:1ab92d807427641ec45d28d5907426aa06b4ffd19c5b794729c74d91cd95090e", - "sha256:31d634dea1b47c231b88d384f90605c598214d0c596443c9bb808e11761829f5", - "sha256:5fdfc0bed37315f27d30ae5ae9bad47ec0a0a28c323739d39c8177b7e0929238", - "sha256:6fa8fac14dd5af4819d475f74af12d65fbbfa391d3110c3a972934a5e6507c24", - "sha256:78cc89ebc808886eb190626ee71ab65e47f374121975f86e4d5f7c0e3ce6bed9", - "sha256:7c7ba11720d01cb572b4b6945d115cb103462c0a28996b44d4e540d06e6a90fd", - "sha256:a37ee82f1b8ed4b4645619c504311e71ce845b78f40055e78d71add5fab7da82", - "sha256:aa3ca1f54054e1c6439fdf1edafa2a2b940a9eaac04a7b422a1cba9b2d7b9690", - "sha256:b9de3dd956574662712da8e285f0f54327959a4e95b96a2847d3c3f5ee7b96e2", - "sha256:c0087b428cef9a32d977390656d91b02245e0e91f909870492df7e39202645dd", - "sha256:d87e506ab205799727f0efa34b3888949bf029a3ada5eb000ff632606370ca6e", - "sha256:d8a55585631f9c9eca4b1a996e9732ae023169cf2f46f69e4518d67d96198226", - "sha256:dcb8da8c5ebaa6360c8555547a4c7beb6cd983dd95ba895bb78b86cc8cf3de2b", - "sha256:e2206bb8c17c0f212f1f356d82d72dd090ff4651994034416da9bf0c29732825", - "sha256:e3c57d6579e5bf85f564d6d48d8ee89868b92879a9232b9975d072c346625e92", - "sha256:ef89cbf332b9a735d8a82e9ff79cc743eeeb775ad1cd7100bc2aa2429b496f07", - "sha256:f45c1c3cdda1857bedd4dfe0bbd49c9419af0cc57f33490341edeae97d18f037", - "sha256:fb3c855347310788e4286b867997be354c55535597966ed5dac876d9166013a4" + "sha256:16864152aa6ac346ef83588d6f4f5dc974d27851c034d6970fcb7b6a98bbd318", + "sha256:23dade76fe0194139112eea7ecdfa02ae09924b1d8d853f17f387a356519e484", + "sha256:27d5b83edd245a12dd6b8562569ad3f23e5ffe30cef8cfcc70756dd24b55d12f", + "sha256:2a2a7590b99d872b193cda0592b2c1cd6561159c31b361597c0e69e8926c8d16", + "sha256:46032d4648c74730115f8522effda8ac39bd0385f07edc7aab57b41cc7617933", + "sha256:4c195597d5286d1cc7259aeaeb7e6c1cde07fec9bddf26523eab1b15709291aa", + "sha256:69c971fefb633cfd334ed195d58e76e87f267649f98a2394f7400b178e918936", + "sha256:80b5b68e9c5dda29205ca112e6d5bd647b6b43cf917cfa5ce178d61675291bba", + "sha256:98676d349fdfc17dba9f23b87e9b6a639733d35f5f0ffcccb90e76c8200568f4", + "sha256:9df617736351100879b70d914366b9f9e38aa227885f2590b48badc4a233119d", + "sha256:b2147317b00b20e8d7e01201221af2b278aed449fa436316c42bc63f653e8245", + "sha256:d838ee4562f52793b1b10876e5067cae1a6bb1c3c575091644be9b88cf45d255", + "sha256:db74a92ef9c2a0810e1436d586b3b15d421a39b72f06263358f15c7a609498e0", + "sha256:e100a4ffdeed8c4afac6a5b3f6b4481efe0ad90e0a0ae2d129478abd4bd790bc", + "sha256:e87d88a820050c0e886c9add48eac2f80ff29207a98cca25869a6868c519daa4", + "sha256:fdf017c5b93d58ad77e2690e59322fd09414705c28d69b52fad4a19985422e6c" ], "index": "pypi", - "version": "==4.2.0.34" + "version": "==4.4.0.44" }, "pandas": { "hashes": [ - "sha256:02f1e8f71cd994ed7fcb9a35b6ddddeb4314822a0e09a9c5b2d278f8cb5d4096", - "sha256:13f75fb18486759da3ff40f5345d9dd20e7d78f2a39c5884d013456cec9876f0", - "sha256:35b670b0abcfed7cad76f2834041dcf7ae47fd9b22b63622d67cdc933d79f453", - "sha256:4c73f373b0800eb3062ffd13d4a7a2a6d522792fa6eb204d67a4fad0a40f03dc", - "sha256:5759edf0b686b6f25a5d4a447ea588983a33afc8a0081a0954184a4a87fd0dd7", - "sha256:5a7cf6044467c1356b2b49ef69e50bf4d231e773c3ca0558807cdba56b76820b", - "sha256:69c5d920a0b2a9838e677f78f4dde506b95ea8e4d30da25859db6469ded84fa8", - "sha256:8778a5cc5a8437a561e3276b85367412e10ae9fff07db1eed986e427d9a674f8", - "sha256:9871ef5ee17f388f1cb35f76dc6106d40cb8165c562d573470672f4cdefa59ef", - "sha256:9c31d52f1a7dd2bb4681d9f62646c7aa554f19e8e9addc17e8b1b20011d7522d", - "sha256:ab8173a8efe5418bbe50e43f321994ac6673afc5c7c4839014cf6401bbdd0705", - "sha256:ae961f1f0e270f1e4e2273f6a539b2ea33248e0e3a11ffb479d757918a5e03a9", - "sha256:b3c4f93fcb6e97d993bf87cdd917883b7dab7d20c627699f360a8fb49e9e0b91", - "sha256:c9410ce8a3dee77653bc0684cfa1535a7f9c291663bd7ad79e39f5ab58f67ab3", - "sha256:f69e0f7b7c09f1f612b1f8f59e2df72faa8a6b41c5a436dde5b615aaf948f107", - "sha256:faa42a78d1350b02a7d2f0dbe3c80791cf785663d6997891549d0f86dc49125e" + "sha256:206d7c3e5356dcadf082e64dc25c24bc8541718045826074f96346e9d6d05a20", + "sha256:24f61f40febe47edac271eda45d683e42838b7db2bd0f82574d9800259d2b182", + "sha256:3a038cd5da602b955d335aa80cbaa0e5774f68501ff47b9c21509906981478da", + "sha256:427be9938b2f79ab298de84f87693914cda238a27cf10580da96caf3dff64115", + "sha256:54f5f564058b0280d588c3758abde82e280702c440db5faf0c686b80336096f9", + "sha256:5a8a84b75ca3a29bb4263b35d5ed9fcaae2b062f014feed8c5daa897339c7d85", + "sha256:84a4ffe668df357e31f98c829536e3a7142c3036c82f996e639f644c5d32eda1", + "sha256:882012763668af54b48f1412bab95c5cc0a7ccce5a2a8221cfc3839a6e3394ef", + "sha256:920d30fdff65a079f071db635d282b4f583c2b26f2b58d5dca218aac7c59974d", + "sha256:a605054fbca71ed1d08bb2aef6f73c84a579bbac956bfe8f9718d5e84cb41248", + "sha256:b11b496c317dbe007898de699fd59eaf687d0fe8c1b7dad109db6010155d28ae", + "sha256:babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613", + "sha256:c22e40f1b4d162ca18eb6b2c572e63eef220dbc9cc3de0241cefb77972621bb7", + "sha256:ca31ac8578d48da354cf66a473d4d5ff99277ca71d321dc7ea4e6fad3c6bb0fd", + "sha256:ca71a5aa9eeb3ef5b31feca7d9b6369d6b3d0b2e9c85d7a89abe3ecb013f1e86", + "sha256:d6b1f9d506dc23da2915bcae5c5968990049c9cec44108bd9855d2c7c89d91dc", + "sha256:d89dbc58aec1544722a8d5046f880b597c497ef8a82c5fe695b4b2effafac5ec", + "sha256:df43ea0e9fd9f9672b0de9cac26d01255ad50481994bf3cb4687c21eec2d7bbc", + "sha256:fd6f05b6101d0e76f3e5c26a47be5be7be96ed84ef3981dc1852e76898e73594" ], "index": "pypi", - "version": "==1.0.5" + "version": "==1.1.3" }, "pandas-ods-reader": { "hashes": [ @@ -535,66 +554,68 @@ }, "pdftotext": { "hashes": [ - "sha256:d37864049581fb13cdcf7b23d4ea23dac7ca2e9c646e8ecac1a39275ab1cae03" + "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" ], "index": "pypi", - "version": "==2.1.4" + "version": "==2.1.5" }, "pillow": { "hashes": [ - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6" ], "index": "pypi", "version": "==7.2.0" }, "progressbar2": { "hashes": [ - "sha256:13f228cf357f94cdef933c91c1e771e52e1b1931dbae48267be8fcdc2ae2ce36", - "sha256:27abf038efe5b1b5dd91ecc5f704bc88683c1e2a0b2c0fee04de80a648634a0c" + "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", + "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" ], - "version": "==3.51.4" + "version": "==3.53.1" }, "psutil": { "hashes": [ - "sha256:1413f4158eb50e110777c4f15d7c759521703bd6beb58926f1d562da40180058", - "sha256:298af2f14b635c3c7118fd9183843f4e73e681bb6f01e12284d4d70d48a60953", - "sha256:60b86f327c198561f101a92be1995f9ae0399736b6eced8f24af41ec64fb88d4", - "sha256:685ec16ca14d079455892f25bd124df26ff9137664af445563c1bd36629b5e0e", - "sha256:73f35ab66c6c7a9ce82ba44b1e9b1050be2a80cd4dcc3352cc108656b115c74f", - "sha256:75e22717d4dbc7ca529ec5063000b2b294fc9a367f9c9ede1f65846c7955fd38", - "sha256:a02f4ac50d4a23253b68233b07e7cdb567bd025b982d5cf0ee78296990c22d9e", - "sha256:d008ddc00c6906ec80040d26dc2d3e3962109e40ad07fd8a12d0284ce5e0e4f8", - "sha256:d84029b190c8a66a946e28b4d3934d2ca1528ec94764b180f7d6ea57b0e75e26", - "sha256:e2d0c5b07c6fe5a87fa27b7855017edb0d52ee73b71e6ee368fae268605cc3f5", - "sha256:f344ca230dd8e8d5eee16827596f1c22ec0876127c28e800d7ae20ed44c4b310" + "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8", + "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498", + "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6", + "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c", + "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195", + "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f", + "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb", + "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1", + "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf", + "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2", + "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.7.0" + "version": "==5.7.2" }, "pybgpranking": { "editable": true, @@ -612,36 +633,41 @@ }, "pycryptodome": { "hashes": [ - "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", - "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", + "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", + "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", + "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", + "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", + "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", + "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", + "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", + "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", + "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", + "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", + "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", - "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", - "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", - "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", - "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", - "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", - "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", - "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", - "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", - "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", + "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", + "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", + "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94", "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", + "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", + "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", + "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", + "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", + "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", + "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", + "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", + "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", - "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", - "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", - "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", - "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94" + "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", + "sha256:663f8de2b3df2e744d6e1610506e0ea4e213bde906795953c1e82279c169f0a7", + "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", + "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", + "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" @@ -649,35 +675,40 @@ "pycryptodomex": { "hashes": [ "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f", - "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", - "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", - "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", - "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", - "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", + "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb", "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", - "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", - "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", - "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", - "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", + "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", - "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", - "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", - "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", - "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", - "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", - "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", - "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", + "sha256:85c108b42e47d4073344ff61d4e019f1d95bb7725ca0fe87d0a2deb237c10e49", + "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", + "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", + "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", - "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060", - "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", + "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", + "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", + "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", + "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", + "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", + "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", + "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", + "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb" + "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", + "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", + "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", + "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", + "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", + "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", + "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", + "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", + "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", + "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", + "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", + "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", + "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" @@ -728,7 +759,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "ec28820cf491ca7d385477996afa0547eb6b6830" + "ref": "bacd4c78cd83d3bf45dcf55cd9ad3514747ac985" }, "pyonyphe": { "editable": true, @@ -767,16 +798,23 @@ }, "pyrsistent": { "hashes": [ - "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3" + "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" ], - "version": "==0.16.0" + "markers": "python_version >= '3.5'", + "version": "==0.17.3" }, "pytesseract": { "hashes": [ - "sha256:afd8a5cdf8ab5d35690efbe71cbf5f89419f668ea8dde7649149815d5c5a899a" + "sha256:b79641b7915ff039da22d5591cb2f5ca6cb0ed7c65194c9c750360dc6a1cc87f" ], "index": "pypi", - "version": "==0.3.4" + "version": "==0.3.6" + }, + "python-baseconv": { + "hashes": [ + "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" + ], + "version": "==1.2.2" }, "python-dateutil": { "hashes": [ @@ -793,6 +831,13 @@ "index": "pypi", "version": "==0.8.10" }, + "python-engineio": { + "hashes": [ + "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b", + "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6" + ], + "version": "==3.13.2" + }, "python-magic": { "hashes": [ "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", @@ -807,6 +852,16 @@ "index": "pypi", "version": "==0.6.18" }, + "python-socketio": { + "extras": [ + "client" + ], + "hashes": [ + "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a", + "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522" + ], + "version": "==4.6.0" + }, "python-utils": { "hashes": [ "sha256:ebaadab29d0cb9dca0a82eab9c405f5be5125dbbff35b8f32cc433fa498dbaa7", @@ -871,49 +926,49 @@ }, "reportlab": { "hashes": [ - "sha256:0f0c2d98e213d51ae527c0301364d3376cb05f6c47251368a9abd4c3197fcefa", - "sha256:1425c7ea60b8691a881ae21ea0f6907a1dc480d84204ccbfea6da41fbee8f594", - "sha256:204f1d245875ab3d076b37c1a18ac8d2e3222842e13cfa282bcd95282be239e5", - "sha256:21627b57249303bf9b5a633099d058ae9f8625fd6f90cfe79348c48fd5a242cd", - "sha256:2e8e3242f80b79f2470f1b5979abbdb41f31b1333543b830749100342f837d40", - "sha256:2eced06dec3f36135c626b9823649ef9cac95c5634d1bc743a15ee470027483b", - "sha256:3472aa0b74a3b2f252dce823f3c3ba6af8a24de0c1729441deaaf50bed6de9f9", - "sha256:3f0353ffefd3afc0061f4794ef608d6c6f32e69816885f4d45c625c20d8eaf5b", - "sha256:4a9f4540a8eddf56d900ceeb8136bd0ca866c208ba3dcbcde73f07405dbadfba", - "sha256:4eea1afb4aa89780734f44175508edff82928fdf460c9bd60bc719dd99041dc3", - "sha256:5803ffebd36de1ada417f50ce65d379ea5a0bf1a2e8f5d5710a031b3b349b726", - "sha256:58f5f72fc8e5932dedcf24789908a81c6b1e13ea4d63bd9a9a39dc698d8c3321", - "sha256:5b588e5f251c76a8d3589023d1c369c7968e0efe2b38ad5948f665edbf6f9e8b", - "sha256:5d922768fe11a58d80694852aba7389d613c15eb1871c5581a2f075996873d57", - "sha256:5d98f297c5cdd5bc0ccf5697c20b03602ee3378c97938d20312662b27cd9a1d6", - "sha256:66d1d96e97a562614943ecb9daf438e392b3d0b033bd5f4a8098ab616dd877da", - "sha256:670650970c7ba7164cf6340bcd182e7e933eff5d65183af98ee77b40cc25a438", - "sha256:67bb95af7bc8ad7925d299f310d15d556d3e7026fe1b60d8e290454604ae0a85", - "sha256:9c999f5d1a600c4970ba293789b6da14e02e3763a8d3d9abe42dcafa8a5318e9", - "sha256:9d62bef5347063a984e63410fa5a69f1d2cc2fdf8d6ed3d0b9d4ea2ccb4b4154", - "sha256:a14a0d603727b6be2e549c52dd42678ab2d06d2721d4580199e3161843e59298", - "sha256:a3a17b46ff1a15eb29370e11796d8914ef4ea67471bdbc4aa9a9eb9284f4e44c", - "sha256:a6d3e20beeba3fd68cec73b8c0785bfa648c06ac76d1f142c60ccb1a8d2506b6", - "sha256:ad7d7003c732f2be42580e3906e92bd9d2aca5e098898c597554be9ca627fad5", - "sha256:af0ee7b50b85543b68b043e61271963ff5671e564e1d620a404c24a24d4f537c", - "sha256:b3eec55274f5ead7e3af2bf0c01b481ffe1b4c6a7dae42b63d85543e9f2f9a0f", - "sha256:b48c21d43a7ab956954591ce3f71db92ce542bb7428db09734425e2b77ac3142", - "sha256:b761905ab85beb79cf7929c9a019f30ad65664e5733d57a30a995e7b9bef06d1", - "sha256:bbae2f054d0f234c3382076efa337802997aca0f3f664e314f65eefb9d694fa9", - "sha256:bd4157d0bc40fb72bb676fc745fdd648022cccaf4ccfbb291af7f48831d0d5d9", - "sha256:bf74cfabf332034f42a54938eb335543cbf92790170300dbe236ba83b7601cd0", - "sha256:c253c8571db2df3886e390a2bfbe917222953054f4643437373b824f64b013cd", - "sha256:ce1277a6acbc62e9966f410f2596ac533ee0cd5df9b69d5fe4406338a169b7d8", - "sha256:ce8f56987e0e456063e311f066a81496b8b9626c846f2cb0ebb554d1a5f40839", - "sha256:d6264a0589ba8032d9c3bdca9a3e87a897ede09b7f6a8ad5e83b57573212e01e", - "sha256:e6fa0c97e3929d00db27e8cf3b2b5771e94f5f179086c4b0e3213dff53637372", - "sha256:f0930f2b6dddd477b3331ec670171a4662336aac1a778e1a30e980a5cbf40b17", - "sha256:f8cb2b4b925ca6b6e4fdefd288a707776ac686c45034f34d4c952f122d11c40b", - "sha256:f9b71539f518323d95850405c49c01fc3d2f0f0b9f3e157de6d2786804fb28a4", - "sha256:fc488e661f99c915362e0373218f8727cecf888eb1b0eb3a8fe1af624a1b9776" + "sha256:0145233d3596fa5828972eb474b5a9f3fd5dea45d6f196fe006a7a7a461fcd03", + "sha256:04fd4a129393006c4ba9cd9fff56b78ad60fe6702326e9260f55d4abac9f1df2", + "sha256:067800caa12ea69e8df0a9206a7eda6697f91a33edb8413b778647d270bc9f34", + "sha256:106a61093cf6084fbcb1272768f090b06137027e09c5e53c573c6c7b90216066", + "sha256:13afbdca2b0844c19ee6804220bb96630f44ffa2571781de66a04e3f83609295", + "sha256:155887770694a1febb4b1bcd2e2856c931225fa1fe8c5ef6772fce47c07f6204", + "sha256:17c906bc410f5eef01795d709ad88663ab98447683d21b6e97bac9b366504a8a", + "sha256:1880282b9a278b4df5139b2083b9116388d9e1fb4a438c60b3cc4ad983da1bc5", + "sha256:2248f9c362f417d108329fdf5083ede1914757534f1b255d6c37a9a6d99c5efe", + "sha256:2dc571be9d2fec76f8bddb540581429eb16057ff9101767d8b15166ad1de70db", + "sha256:35dda0a1994a8fc009bf5826fe34dcdb15e561b05a5a01c506d949accfbdf027", + "sha256:3858534058ab99fbedb34ceae31f85bbadeeb8e4dbb78a58927599a6f0422617", + "sha256:4710d237fe9f729eacbbb7477d14eea00781704e0cdb83c789e610365e40627f", + "sha256:49e32586d3a814a5f77407c0590504a72743ca278518b3c0f90182430f2d87af", + "sha256:4cdb2ab88839f0d36364b71744b742e09699bde9b943aa35da26580831c3f106", + "sha256:5e995f77124933d3e16ddc09f95ab36793083a1cb08ed2557811f8cfb254434b", + "sha256:73bc92579692609837fb13f271f7436fdb7b6ddebb9e10185452d45814c365c3", + "sha256:7931097db5f18e3ac6909a223e94dd3ad0258541f9802effa5b8f519ef9278e4", + "sha256:7eb3d96adb309593bded364d25a32b80f9dc18b2f9a4b2001972194027a77eef", + "sha256:886bdc7c13e6c6513696eb044000491c787fd53a486aa3adea060d34aa3cd028", + "sha256:8c242a2be8d71ff18e11938cf45114d1144544984cd34fea0606f04144d62bea", + "sha256:8f2759d2a81ee992054e7a1123cadd6baff4edecc1249e503bb6decd6b55e8ee", + "sha256:9765c0eec5e6927aaccf6bd460fe24a014d35a3979f2c7507644fd5946775921", + "sha256:9c7173def03fd3048f07bce00d4ca4793efc37239811d9b3eb77edb561363cd2", + "sha256:a1d0e20cae86c6ba5e6626a9e07eca4d298341adfee778f87d5837bc76912135", + "sha256:a5398e7af6136c25a34569132e7e2646c72a2f89e53028ef109fb03b5a2923a6", + "sha256:a690fe672aa51ee3a6ff4c96d2f5d9744d3b6f27c999a795b9c513923f875bfc", + "sha256:b18ea3593d4edc7f05c510ab298d48548d9a4473a643f37661b1669365d7d33c", + "sha256:b727050ec5dfc4baeded07199d4640156f360ff4624b0194d8e91b234fc0c26b", + "sha256:be53e8423f35d3c80b0560aec034226fdab5623bb4d64b962c3f04b65980b3e0", + "sha256:c70e9c9cfdc0596c3912e0d147f42e83c7ac5642ac82d6fe05d85a6326bae14d", + "sha256:ce7c13eb469f864085a546881a3bc9b46e20a73dc1a43b9e84153833e628dee3", + "sha256:d6bd4d59f4b558165f05f9f7dfad37b9d788bcc05c0b37a6b0fcb6165d6893ec", + "sha256:d75114965cc84ee51aaf3d7eda90f3554f3ac67350ebacd1dbb9193a7a525e21", + "sha256:d78fdb967bd7652515d9a23ff3088e32e32ef96332737696e9eb0fda5602bf81", + "sha256:d930a3de0fa9711b9c960dee92ff2b30c3f69568f00f0244834fe28d5563ea9b", + "sha256:e32af1e47076a3fc77e6be5f7e2c8cbbc82fe493a5cd3f6190c0f8980c401e59", + "sha256:e50de7d196f2d3940f3fdea0f30bf67929686d57285b3779fb071d05a810d65f", + "sha256:e7b7e4a0ce0f455a4777528a8a316e87cc6cf887eaa2a4e6a0cc103f031c57c2", + "sha256:e8dd01462a1bb41b6806aa93a703100d3fbba760f8feca96fcec710db9384a25" ], "index": "pypi", - "version": "==3.5.44" + "version": "==3.5.53" }, "requests": { "extras": [ @@ -935,18 +990,18 @@ }, "shodan": { "hashes": [ - "sha256:31b0740ffaf7c5196a26a0b1edf7d271dffe54ea52bb1b34ba87aa231b5c339b" + "sha256:d2d37d47dd084747df672e6d981f6d72d5d03f4ee12f0ce2170e618147578349" ], "index": "pypi", - "version": "==1.23.0" + "version": "==1.23.1" }, "sigmatools": { "hashes": [ - "sha256:5453717e452aa7860c5e6ac80bcee4f398d70956fc2ee9859bc7255067da8736", - "sha256:cdfeb8200c09c0a40ea1a015e57f3b8e2ba62a28352ca05fa015674f640871e3" + "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", + "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" ], "index": "pypi", - "version": "==0.17.0" + "version": "==0.18.1" }, "six": { "hashes": [ @@ -958,16 +1013,16 @@ }, "socketio-client": { "hashes": [ - "sha256:540d8ab209154d1d9cdb97c170c589a14f7d7f17e19c14e2f59f0307e6175485" + "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" ], - "version": "==0.5.6" + "version": "==0.5.7.4" }, "soupsieve": { "hashes": [ "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" ], - "markers": "python_version >= '3.5'", + "markers": "python_version >= '3.0'", "version": "==2.0.1" }, "sparqlwrapper": { @@ -983,11 +1038,11 @@ }, "stix2-patterns": { "hashes": [ - "sha256:587a82545680311431e5610036dd6c8c247347a24243fafdafaae2df4d6d7799", - "sha256:7fcb2fa67efeac2a8c493d367c93d0ce6243a10e2eff715ae9f2983e6b32b95d" + "sha256:373a3de163e1b146499c6e5a7908e1f0987173139480897728fcbbba6a806f95", + "sha256:5a38f634adc856b7d03e13dd140d38e184ac1ef11077c1ffca28a262fa6d8c41" ], "index": "pypi", - "version": "==1.3.0" + "version": "==1.3.1" }, "tabulate": { "hashes": [ @@ -1013,10 +1068,10 @@ }, "trustar": { "hashes": [ - "sha256:73336b94012427b66ee61db65fc3c2cea2ed743beaa56cdd5a4c1674ef1a7660" + "sha256:47c45674a4a310dc8d932035e0de112de55c1e899663865b996a6b6b2d79cbde" ], "index": "pypi", - "version": "==0.3.29" + "version": "==0.3.33" }, "tzlocal": { "hashes": [ @@ -1048,11 +1103,11 @@ }, "urllib3": { "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", + "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.9" + "version": "==1.25.10" }, "uwhois": { "editable": true, @@ -1076,20 +1131,20 @@ }, "vulners": { "hashes": [ - "sha256:00ff8744d07f398880afc1efcab6dac4abb614c84553fa31b2d439f986b8e0db", - "sha256:90a855915b4fb4dbd0325643d9e643602975fcb931162e5dc2e7778d1daa2fd8", - "sha256:f230bfcd42663326b7c9b8fa117752e26cad4ccca528caaab531c5b592af8cb5" + "sha256:4e78fc7492d33a1e612e7d5046e51f4c272eb7febdfc0fc06061648d2153e75a", + "sha256:6b088b7c8da9bdcc16e8283afd4a8f804388f1432d12d17b29b770778113ec62", + "sha256:7964884c1f262004a950d5915d49520d22afa3ab175d473492e2dbcc6b5e0a9a" ], "index": "pypi", - "version": "==1.5.5" + "version": "==1.5.8" }, "wand": { "hashes": [ - "sha256:d5b75ac13d7485032970926415648586eafeeb1eb62ed6ebd0778358cf9d70e0", - "sha256:df0780b1b54938a43d29279a6588fde11e349550c8958a673d57c26a3e6de7f1" + "sha256:566b3d049858efa879096a7ab2e0516d67a240e6c3ffd7a267298c41e81c14b7", + "sha256:d21429288fe0de63d829dbbfb26736ebaed9fd0792c2a0dc5943c5cab803a708" ], "index": "pypi", - "version": "==0.6.1" + "version": "==0.6.3" }, "websocket-client": { "hashes": [ @@ -1114,10 +1169,10 @@ }, "xlsxwriter": { "hashes": [ - "sha256:828b3285fc95105f5b1946a6a015b31cf388bd5378fdc6604e4d1b7839df2e77", - "sha256:82a3b0e73e3913483da23791d1a25e4d2dbb3837d1be4129473526b9a270a5cc" + "sha256:99b665203d737db31378ec729c9990a004c1abae53a6fa211c104f8c2e36cffd", + "sha256:b89002dea57bb3d4c8207f3e28ef8244bfd9e936b85d74e7dd1f97e11bb70313" ], - "version": "==1.2.9" + "version": "==1.3.6" }, "yara-python": { "hashes": [ @@ -1138,36 +1193,36 @@ }, "yarl": { "hashes": [ - "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce", - "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6", - "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce", - "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae", - "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d", - "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f", - "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b", - "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b", - "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb", - "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462", - "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea", - "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70", - "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1", - "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a", - "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b", - "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080", - "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2" + "sha256:04a54f126a0732af75e5edc9addeaa2113e2ca7c6fce8974a63549a70a25e50e", + "sha256:3cc860d72ed989f3b1f3abbd6ecf38e412de722fb38b8f1b1a086315cf0d69c5", + "sha256:5d84cc36981eb5a8533be79d6c43454c8e6a39ee3118ceaadbd3c029ab2ee580", + "sha256:5e447e7f3780f44f890360ea973418025e8c0cdcd7d6a1b221d952600fd945dc", + "sha256:61d3ea3c175fe45f1498af868879c6ffeb989d4143ac542163c45538ba5ec21b", + "sha256:67c5ea0970da882eaf9efcf65b66792557c526f8e55f752194eff8ec722c75c2", + "sha256:6f6898429ec3c4cfbef12907047136fd7b9e81a6ee9f105b45505e633427330a", + "sha256:7ce35944e8e61927a8f4eb78f5bc5d1e6da6d40eadd77e3f79d4e9399e263921", + "sha256:b7c199d2cbaf892ba0f91ed36d12ff41ecd0dde46cbf64ff4bfe997a3ebc925e", + "sha256:c15d71a640fb1f8e98a1423f9c64d7f1f6a3a168f803042eaf3a5b5022fde0c1", + "sha256:c22607421f49c0cb6ff3ed593a49b6a99c6ffdeaaa6c944cdda83c2393c8864d", + "sha256:c604998ab8115db802cc55cb1b91619b2831a6128a62ca7eea577fc8ea4d3131", + "sha256:d088ea9319e49273f25b1c96a3763bf19a882cff774d1792ae6fba34bd40550a", + "sha256:db9eb8307219d7e09b33bcb43287222ef35cbcf1586ba9472b0a4b833666ada1", + "sha256:e31fef4e7b68184545c3d68baec7074532e077bd1906b040ecfba659737df188", + "sha256:e32f0fb443afcfe7f01f95172b66f279938fbc6bdaebe294b0ff6747fb6db020", + "sha256:fcbe419805c9b20db9a51d33b942feddbf6e7fb468cb20686fd7089d4164c12a" ], "markers": "python_version >= '3.5'", - "version": "==1.4.2" + "version": "==1.6.0" } }, "develop": { "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==19.3.0" + "version": "==20.2.0" }, "certifi": { "hashes": [ @@ -1185,57 +1240,60 @@ }, "codecov": { "hashes": [ - "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091", - "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728", - "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34" + "sha256:24545847177a893716b3455ac5bfbafe0465f38d4eb86ea922c09adc7f327e65", + "sha256:355fc7e0c0b8a133045f0d6089bde351c845e7b52b99fec5903b4ea3ab5f6aab", + "sha256:7877f68effde3c2baadcff807a5d13f01019a337f9596eece0d64e57393adf3a" ], "index": "pypi", - "version": "==2.1.7" + "version": "==2.1.9" }, "coverage": { "hashes": [ - "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a", - "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355", - "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65", - "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7", - "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9", - "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1", - "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0", - "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55", - "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c", - "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6", - "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef", - "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019", - "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e", - "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0", - "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf", - "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24", - "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2", - "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c", - "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4", - "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0", - "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd", - "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04", - "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e", - "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730", - "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2", - "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768", - "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796", - "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7", - "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a", - "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489", - "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052" + "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516", + "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259", + "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9", + "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097", + "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0", + "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f", + "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7", + "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c", + "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5", + "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7", + "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729", + "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978", + "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9", + "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f", + "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9", + "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822", + "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418", + "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82", + "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f", + "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d", + "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221", + "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4", + "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21", + "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709", + "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54", + "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d", + "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270", + "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24", + "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751", + "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a", + "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237", + "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7", + "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636", + "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.1" + "version": "==5.3" }, "flake8": { "hashes": [ - "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c", - "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208" + "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839", + "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b" ], "index": "pypi", - "version": "==3.8.3" + "version": "==3.8.4" }, "idna": { "hashes": [ @@ -1245,6 +1303,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, + "iniconfig": { + "hashes": [ + "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437", + "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69" + ], + "version": "==1.0.1" + }, "mccabe": { "hashes": [ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", @@ -1252,14 +1317,6 @@ ], "version": "==0.6.1" }, - "more-itertools": { - "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" - ], - "markers": "python_version >= '3.5'", - "version": "==8.4.0" - }, "nose": { "hashes": [ "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", @@ -1319,11 +1376,11 @@ }, "pytest": { "hashes": [ - "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", - "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" + "sha256:7a8190790c17d79a11f847fba0b004ee9a8122582ebff4729a082c109e81a4c9", + "sha256:8f593023c1a0f916110285b6efd7f99db07d59546e3d8c36fc60e2ab05d3be92" ], "index": "pypi", - "version": "==5.4.3" + "version": "==6.1.1" }, "requests": { "extras": [ @@ -1344,20 +1401,20 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.15.0" }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "version": "==0.10.1" + }, "urllib3": { "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", + "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.9" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" + "version": "==1.25.10" } } } From 095fbfd75f6d34c89cb3804b8255b7adb5a3402c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Fri, 9 Oct 2020 14:40:46 +0200 Subject: [PATCH 035/476] chg: Bump deps --- Pipfile.lock | 164 +++++++++++++++++++++++++-------------------------- REQUIREMENTS | 131 ++++++++++++++++++++-------------------- 2 files changed, 149 insertions(+), 146 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index ef0923f..1229e98 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -561,34 +561,34 @@ }, "pillow": { "hashes": [ - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", + "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", + "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6" + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" ], "index": "pypi", "version": "==7.2.0" @@ -633,41 +633,41 @@ }, "pycryptodome": { "hashes": [ - "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", - "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", - "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", - "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", - "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", - "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", + "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", + "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", + "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", - "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", - "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94", - "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", - "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", - "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", - "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", - "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", - "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", + "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", + "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", + "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", - "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", - "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", - "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", - "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", + "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", "sha256:663f8de2b3df2e744d6e1610506e0ea4e213bde906795953c1e82279c169f0a7", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", + "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", + "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21" + "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", + "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", + "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", + "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", + "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", + "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", + "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", + "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", + "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", + "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", + "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", + "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", + "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", + "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", + "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", + "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", + "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", + "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" @@ -675,40 +675,40 @@ "pycryptodomex": { "hashes": [ "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb", - "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", - "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", + "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", + "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", + "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", + "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", + "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", + "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", + "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", + "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", + "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", + "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", + "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", "sha256:85c108b42e47d4073344ff61d4e019f1d95bb7725ca0fe87d0a2deb237c10e49", - "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", - "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", - "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", - "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", - "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", - "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", - "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", - "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", - "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", - "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", - "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", - "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", - "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", - "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", - "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", - "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", - "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", - "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", - "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", - "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", - "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", - "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060" + "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", + "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", + "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", + "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", + "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", + "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", + "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", + "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", + "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", + "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", + "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", + "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", + "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060", + "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", + "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", + "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", + "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", + "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.9.8" diff --git a/REQUIREMENTS b/REQUIREMENTS index 73b002a..955ecad 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -3,110 +3,113 @@ -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client -e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/MISP/PyMISP.git@b5b40ae2c5225a4b349c26294cfc012309a61352#egg=pymisp[fileobjects,openioc,virustotal,pdfexport] --e git+https://github.com/Rafiot/uwhoisd.git@411572840eba4c72dc321c549b36a54ed5cea9de#egg=uwhois&subdirectory=client +-e git+https://github.com/MISP/PyMISP.git@bacd4c78cd83d3bf45dcf55cd9ad3514747ac985#egg=pymisp[fileobjects,openioc,pdfexport] +-e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe --e git+https://github.com/stricaud/faup.git#egg=pyfaup&subdirectory=src/lib/bindings/python -aiohttp==3.4.4 -antlr4-python3-runtime==4.8 ; python_version >= '3' +aiohttp==3.6.2; python_full_version >= '3.5.3' +antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 argparse==1.4.0 -assemblyline-client==3.7.3 -async-timeout==3.0.1 -attrs==19.3.0 +assemblyline-client==4.0.1 +async-timeout==3.0.1; python_full_version >= '3.5.3' +attrs==20.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' backscatter==0.2.4 -beautifulsoup4==4.8.2 +beautifulsoup4==4.9.3 blockchain==1.4.4 -censys==0.0.8 -certifi==2019.11.28 -cffi==1.14.0 +certifi==2020.6.20 +cffi==1.14.3 chardet==3.0.4 click-plugins==1.1.1 -click==7.1.1 -colorama==0.4.3 -cryptography==2.8 +click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +colorama==0.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +configparser==5.0.1; python_version >= '3.6' +cryptography==3.1.1 decorator==4.4.2 -deprecated==1.2.7 -dnspython==1.16.0 -domaintools-api==0.3.3 +deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +dnspython==2.0.0 +domaintools-api==0.5.2 enum-compat==0.0.3 ez-setup==0.9 ezodf==0.3.2 -future==0.18.2 +future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' futures==3.1.1 -geoip2==3.0.0 -httplib2==0.17.0 -idna-ssl==1.1.0 ; python_version < '3.7' -idna==2.9 -importlib-metadata==1.6.0 ; python_version < '3.8' +geoip2==4.1.0 +httplib2==0.18.1 +idna-ssl==1.1.0; python_version < '3.7' +idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' isodate==0.6.0 -jbxapi==3.4.0 +jbxapi==3.11.0 +json-log-formatter==0.3.0 jsonschema==3.2.0 lief==0.10.1 -lxml==4.5.0 +lxml==4.5.2 maclookup==1.0.3 -maxminddb==1.5.2 -multidict==4.7.5 +maxminddb==2.0.2; python_version >= '3.6' +multidict==4.7.6; python_version >= '3.5' np==1.0.2 -numpy==1.18.2 +numpy==1.19.2; python_version >= '3.6' oauth2==1.9.0.post1 -opencv-python==4.2.0.32 +opencv-python==4.4.0.44 pandas-ods-reader==0.0.7 -pandas==1.0.3 +pandas==1.1.3 passivetotal==1.0.31 -pdftotext==2.1.4 -pillow==7.0.0 -progressbar2==3.50.1 -psutil==5.7.0 -pycparser==2.20 -pycryptodome==3.9.7 -pycryptodomex==3.9.7 +pdftotext==2.1.5 +pillow==7.2.0 +progressbar2==3.53.1 +psutil==5.7.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycryptodome==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycryptodomex==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pydeep==0.4 -pyeupi==1.0 +pyeupi==1.1 pygeoip==0.3.2 pyopenssl==19.1.0 -pyparsing==2.4.6 +pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.1 pypssl==2.1 -pyrsistent==0.16.0 -pytesseract==0.3.3 -python-dateutil==2.8.1 +pyrsistent==0.17.3; python_version >= '3.5' +pytesseract==0.3.6 +python-baseconv==1.2.2 +python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.10 -python-magic==0.4.15 +python-engineio==3.13.2 +python-magic==0.4.18 python-pptx==0.6.18 +python-socketio[client]==4.6.0 python-utils==2.4.0 pytz==2019.3 pyyaml==5.3.1 pyzbar==0.1.8 -pyzipper==0.3.1 ; python_version >= '3.5' -rdflib==4.2.2 -redis==3.4.1 -reportlab==3.5.42 +pyzipper==0.3.3; python_version >= '3.5' +rdflib==5.0.0 +redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +reportlab==3.5.53 requests-cache==0.5.2 -requests[security]==2.23.0 -shodan==1.22.0 -sigmatools==0.16.0 -six==1.14.0 -socketio-client==0.5.6 -soupsieve==2.0 +requests[security]==2.24.0 +shodan==1.23.1 +sigmatools==0.18.1 +six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +socketio-client==0.5.7.4 +soupsieve==2.0.1; python_version >= '3.0' sparqlwrapper==1.8.5 -stix2-patterns==1.3.0 +stix2-patterns==1.3.1 tabulate==0.8.7 -tornado==6.0.4 -trustar==0.3.28 -url-normalize==1.4.1 +tornado==6.0.4; python_version >= '3.5' +trustar==0.3.33 +tzlocal==2.1 +unicodecsv==0.14.1 +url-normalize==1.4.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.25.8 +urllib3==1.25.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' validators==0.14.0 vt-graph-api==1.0.1 -vulners==1.5.5 -wand==0.5.9 +vulners==1.5.8 +wand==0.6.3 websocket-client==0.57.0 wrapt==1.12.1 xlrd==1.2.0 -xlsxwriter==1.2.8 +xlsxwriter==1.3.6 yara-python==3.8.1 -yarl==1.4.2 -zipp==3.1.0 +yarl==1.6.0; python_version >= '3.5' From f2de7ab87f067b32a3332b789470c3d41ad0e3a3 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Sat, 17 Oct 2020 20:41:02 +0200 Subject: [PATCH 036/476] new: [clamav] Module for malware scan by ClamAV --- REQUIREMENTS | 1 + misp_modules/modules/expansion/clamav.py | 127 +++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 misp_modules/modules/expansion/clamav.py diff --git a/REQUIREMENTS b/REQUIREMENTS index 955ecad..9b26d1c 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -26,6 +26,7 @@ click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, colorama==0.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' configparser==5.0.1; python_version >= '3.6' cryptography==3.1.1 +clamd==1.0.2 decorator==4.4.2 deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnspython==2.0.0 diff --git a/misp_modules/modules/expansion/clamav.py b/misp_modules/modules/expansion/clamav.py new file mode 100644 index 0000000..2358691 --- /dev/null +++ b/misp_modules/modules/expansion/clamav.py @@ -0,0 +1,127 @@ +import base64 +import io +import json +import logging +import sys +import zipfile +import clamd +from typing import Optional +from pymisp import MISPEvent, MISPObject + +log = logging.getLogger("clamav") +log.setLevel(logging.DEBUG) +sh = logging.StreamHandler(sys.stdout) +sh.setLevel(logging.DEBUG) +fmt = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" +) +sh.setFormatter(fmt) +log.addHandler(sh) + +moduleinfo = { + "full_name": "ClamAV", + "version": "0.1", + "author": "Jakub Onderka", + "description": "Submit file to ClamAV", + "module-type": ["expansion"] +} +moduleconfig = ["connection"] +mispattributes = { + "input": ["attachment", "malware-sample"], + "format": "misp_standard" +} + + +def create_response(software: str, signature: Optional[str] = None) -> dict: + misp_event = MISPEvent() + if signature: + av_signature_object = MISPObject("av-signature") + av_signature_object.add_attribute("signature", signature) + av_signature_object.add_attribute("software", software) + + misp_event.add_object(av_signature_object) + + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {"results": results} + + +def connect_to_clamav(connection_string: str) -> clamd.ClamdNetworkSocket: + if connection_string.startswith("unix://"): + return clamd.ClamdUnixSocket(connection_string.replace("unix://", "")) + elif ":" in connection_string: + host, port = connection_string.split(":") + return clamd.ClamdNetworkSocket(host, port) + else: + raise Exception("ClamAV connection string is invalid") + + +def handler(q=False): + if q is False: + return False + + request = json.loads(q) + + connection_string: str = request["config"].get("connection") + if not connection_string: + return {"error": "No ClamAV connection string provided"} + + attribute = request.get("attribute") + if not attribute: + return {"error": "No attribute provided"} + + attribute_type = attribute.get("type") + if not attribute_type: + return {"error": "No attribute type provided"} + + if attribute_type not in mispattributes["input"]: + return {"error": "Invalid attribute type provided, expected 'malware-sample' or 'attachment'"} + + attribute_data = attribute.get("data") + if not attribute_data: + return {"error": "No attribute data provided"} + + try: + clamav = connect_to_clamav(connection_string) + software_version = clamav.version() + except Exception: + logging.exception("Could not connect to ClamAV") + return {"error": "Could not connect to ClamAV"} + + try: + data = base64.b64decode(attribute_data, validate=True) + except Exception: + logging.exception("Provided data is not valid base64 encoded string") + return {"error": "Provided data is not valid base64 encoded string"} + + if attribute_type == "malware-sample": + try: + with zipfile.ZipFile(io.BytesIO(data)) as zipf: + data = zipf.read(zipf.namelist()[0], pwd=b"infected") + except Exception: + logging.exception("Could not extract malware sample from ZIP file") + return {"error": "Could not extract malware sample from ZIP file"} + + try: + status, reason = clamav.instream(io.BytesIO(data))["stream"] + except Exception: + logging.exception("Could not send attribute data to ClamAV. Maybe file is too big?") + return {"error": "Could not send attribute data to ClamAV. Maybe file is too big?"} + + if status == "ERROR": + return {"error": "ClamAV returned error message: {}".format(reason)} + elif status == "OK": + return {"results": {}} + elif status == "FOUND": + return create_response(software_version, reason) + else: + return {"error": "ClamAV returned invalid status {}: {}".format(status, reason)} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo["config"] = moduleconfig + return moduleinfo From 0872bb820c75a522c3947c372b0ebd63b9086c54 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 20 Oct 2020 10:17:52 +0200 Subject: [PATCH 037/476] chg: [clamav] TCP port connection must be an integer --- misp_modules/modules/expansion/clamav.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/clamav.py b/misp_modules/modules/expansion/clamav.py index 2358691..2eb0c62 100644 --- a/misp_modules/modules/expansion/clamav.py +++ b/misp_modules/modules/expansion/clamav.py @@ -51,7 +51,7 @@ def connect_to_clamav(connection_string: str) -> clamd.ClamdNetworkSocket: return clamd.ClamdUnixSocket(connection_string.replace("unix://", "")) elif ":" in connection_string: host, port = connection_string.split(":") - return clamd.ClamdNetworkSocket(host, port) + return clamd.ClamdNetworkSocket(host, int(port)) else: raise Exception("ClamAV connection string is invalid") From 7ad5eb0bfad089069541aa76f4e1d7371db4b55f Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Tue, 20 Oct 2020 13:23:14 +0200 Subject: [PATCH 038/476] chg: [clamav] Add reference to original attribute --- misp_modules/modules/expansion/clamav.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/misp_modules/modules/expansion/clamav.py b/misp_modules/modules/expansion/clamav.py index 2eb0c62..1582409 100644 --- a/misp_modules/modules/expansion/clamav.py +++ b/misp_modules/modules/expansion/clamav.py @@ -5,6 +5,7 @@ import logging import sys import zipfile import clamd +from . import check_input_attribute, standard_error_message from typing import Optional from pymisp import MISPEvent, MISPObject @@ -19,7 +20,6 @@ sh.setFormatter(fmt) log.addHandler(sh) moduleinfo = { - "full_name": "ClamAV", "version": "0.1", "author": "Jakub Onderka", "description": "Submit file to ClamAV", @@ -32,13 +32,15 @@ mispattributes = { } -def create_response(software: str, signature: Optional[str] = None) -> dict: +def create_response(original_attribute: dict, software: str, signature: Optional[str] = None) -> dict: misp_event = MISPEvent() if signature: + misp_event.add_attribute(**original_attribute) + av_signature_object = MISPObject("av-signature") av_signature_object.add_attribute("signature", signature) av_signature_object.add_attribute("software", software) - + av_signature_object.add_reference(original_attribute["uuid"], "belongs-to") misp_event.add_object(av_signature_object) event = json.loads(misp_event.to_json()) @@ -53,7 +55,7 @@ def connect_to_clamav(connection_string: str) -> clamd.ClamdNetworkSocket: host, port = connection_string.split(":") return clamd.ClamdNetworkSocket(host, int(port)) else: - raise Exception("ClamAV connection string is invalid") + raise Exception("ClamAV connection string is invalid. It must be unix socket path with 'unix://' prefix or IP:PORT.") def handler(q=False): @@ -70,11 +72,10 @@ def handler(q=False): if not attribute: return {"error": "No attribute provided"} - attribute_type = attribute.get("type") - if not attribute_type: - return {"error": "No attribute type provided"} + if not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} - if attribute_type not in mispattributes["input"]: + if attribute["type"] not in mispattributes["input"]: return {"error": "Invalid attribute type provided, expected 'malware-sample' or 'attachment'"} attribute_data = attribute.get("data") @@ -94,7 +95,7 @@ def handler(q=False): logging.exception("Provided data is not valid base64 encoded string") return {"error": "Provided data is not valid base64 encoded string"} - if attribute_type == "malware-sample": + if attribute["type"] == "malware-sample": try: with zipfile.ZipFile(io.BytesIO(data)) as zipf: data = zipf.read(zipf.namelist()[0], pwd=b"infected") @@ -113,7 +114,7 @@ def handler(q=False): elif status == "OK": return {"results": {}} elif status == "FOUND": - return create_response(software_version, reason) + return create_response(attribute, software_version, reason) else: return {"error": "ClamAV returned invalid status {}: {}".format(status, reason)} From d0115e8b367536972efd1b3bb6fd3cfa1071c18d Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Thu, 22 Oct 2020 18:03:29 +0200 Subject: [PATCH 039/476] fix: [main] Disable duplicate JSON decoding --- misp_modules/__init__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/misp_modules/__init__.py b/misp_modules/__init__.py index 440ad3f..21e3db3 100644 --- a/misp_modules/__init__.py +++ b/misp_modules/__init__.py @@ -183,10 +183,9 @@ class QueryModule(tornado.web.RequestHandler): executor = ThreadPoolExecutor(nb_threads) @run_on_executor - def run_request(self, jsonpayload): - x = json.loads(jsonpayload) + def run_request(self, module, jsonpayload): log.debug('MISP QueryModule request {0}'.format(jsonpayload)) - response = mhandlers[x['module']].handler(q=jsonpayload) + response = mhandlers[module].handler(q=jsonpayload) return json.dumps(response) @tornado.gen.coroutine @@ -198,7 +197,7 @@ class QueryModule(tornado.web.RequestHandler): timeout = datetime.timedelta(seconds=int(dict_payload.get('timeout'))) else: timeout = datetime.timedelta(seconds=300) - response = yield tornado.gen.with_timeout(timeout, self.run_request(jsonpayload)) + response = yield tornado.gen.with_timeout(timeout, self.run_request(dict_payload['module'], jsonpayload)) self.write(response) except tornado.gen.TimeoutError: log.warning('Timeout on {} '.format(dict_payload['module'])) From c00349e1984ee7b00b88eb36e382f9a5c98cd94e Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 22 Oct 2020 23:25:20 +0200 Subject: [PATCH 040/476] fix: [cve-advanced] Using the cpe and weakness attribute types --- .../modules/expansion/cve_advanced.py | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index d15711f..9071ff9 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -23,9 +23,9 @@ class VulnerabilityParser(): self.references = defaultdict(list) self.capec_features = ('id', 'name', 'summary', 'prerequisites', 'solutions') self.vulnerability_mapping = { - 'id': ('text', 'id'), 'summary': ('text', 'summary'), - 'vulnerable_configuration': ('text', 'vulnerable_configuration'), - 'vulnerable_configuration_cpe_2_2': ('text', 'vulnerable_configuration'), + 'id': ('vulnerability', 'id'), 'summary': ('text', 'summary'), + 'vulnerable_configuration': ('cpe', 'vulnerable_configuration'), + 'vulnerable_configuration_cpe_2_2': ('cpe', 'vulnerable_configuration'), 'Modified': ('datetime', 'modified'), 'Published': ('datetime', 'published'), 'references': ('link', 'references'), 'cvss': ('float', 'cvss-score')} self.weakness_mapping = {'name': 'name', 'description_summary': 'description', @@ -71,33 +71,39 @@ class VulnerabilityParser(): break def __parse_capec(self, vulnerability_uuid): - attribute_type = 'text' for capec in self.vulnerability['capec']: capec_object = MISPObject('attack-pattern') for feature in self.capec_features: - capec_object.add_attribute(feature, **dict(type=attribute_type, value=capec[feature])) + capec_object.add_attribute(feature, **{'type': 'text', 'value': capec[feature]}) for related_weakness in capec['related_weakness']: - attribute = dict(type='weakness', value="CWE-{}".format(related_weakness)) + attribute = {'type': 'weakness', 'value': f"CWE-{related_weakness}"} capec_object.add_attribute('related-weakness', **attribute) self.misp_event.add_object(capec_object) - self.references[vulnerability_uuid].append(dict(referenced_uuid=capec_object.uuid, - relationship_type='targeted-by')) + self.references[vulnerability_uuid].append( + { + 'referenced_uuid': capec_object.uuid, + 'relationship_type': 'targeted-by' + } + ) def __parse_weakness(self, vulnerability_uuid): - attribute_type = 'text' cwe_string, cwe_id = self.vulnerability['cwe'].split('-') cwes = requests.get(self.api_url.replace('/cve/', '/cwe')) if cwes.status_code == 200: for cwe in cwes.json(): if cwe['id'] == cwe_id: weakness_object = MISPObject('weakness') - weakness_object.add_attribute('id', **dict(type=attribute_type, value='-'.join([cwe_string, cwe_id]))) + weakness_object.add_attribute('id', {'type': 'weakness', 'value': f'{cwe_string}-{cwe_id}'}) for feature, relation in self.weakness_mapping.items(): if cwe.get(feature): - weakness_object.add_attribute(relation, **dict(type=attribute_type, value=cwe[feature])) + weakness_object.add_attribute(relation, **{'type': 'text', 'value': cwe[feature]}) self.misp_event.add_object(weakness_object) - self.references[vulnerability_uuid].append(dict(referenced_uuid=weakness_object.uuid, - relationship_type='weakened-by')) + self.references[vulnerability_uuid].append( + { + 'referenced_uuid': weakness_object.uuid, + 'relationship_type': 'weakened-by' + } + ) break From 410aaaeb2896bfb69d14b7ac2f293a22f914fadc Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 23 Oct 2020 21:19:26 +0200 Subject: [PATCH 041/476] add: First shot of an expansio module to query cve-search with a cpe to get the related vulnerabilities --- misp_modules/modules/expansion/cpe.py | 122 ++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 misp_modules/modules/expansion/cpe.py diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py new file mode 100644 index 0000000..74cb1b6 --- /dev/null +++ b/misp_modules/modules/expansion/cpe.py @@ -0,0 +1,122 @@ +import json +import requests +from . import check_input_attribute, standard_error_message + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} +moduleinfo = { + 'version': '1', + 'author': 'Christian Studer', + 'description': 'An expansion module to enrich a CPE attribute with the related vulnerabilities.', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ["custom_API_URL"] + + +class VulnerabilityParser(): + def __init__(self, attribute, api_url): + self.attribute = attribute + self.api_url = api_url + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.vulnerability_mapping = { + 'id': { + 'type': 'vulnerability', + 'object_relation': 'id' + }, + 'summary': { + 'type': 'text', + 'object_relation': 'summary' + }, + 'vulnerable_configuration': { + 'type': 'cpe', + 'object_relation': 'vulnerable_configuration' + }, + 'vulnerable_configuration_cpe_2_2': { + 'type': 'cpe', + 'object_relation': 'vulnerable_configuration' + }, + 'Modified': { + 'type': 'datetime', + 'object_relation': 'modified' + }, + 'Published': { + 'type': 'datetime', + 'object_relation': 'published' + }, + 'references': { + 'type': 'link', + 'object_relation': 'references' + }, + 'cvss': { + 'type': 'float', + 'object_relation': 'cvss-score' + } + } + + def parse_vulnerabilities(self, vulnerabilities): + for vulnerability in vulnerabilities: + vulnerability_object = MISPObject('vulnerability') + for feature in ('id', 'summary', 'Modified', 'Published', 'cvss'): + if vulnerability.get(feature): + attribute = {'value': vulnerability[feature]} + atttribute.update(self.vulnerability_mapping[feature]) + vulnerability_object.add_attribute(**attribute) + if vulnerability.get('Published'): + vulnerability_object.add_attribute(**{ + 'type': 'text', + 'object_relation': 'state', + 'value': 'Published' + }) + for feature in ('references', 'vulnerable_configuration', 'vulnerable_configuration_cpe_2_2'): + if vulnerability.get(feature): + for value in vulnerability[feature]: + if isinstance(value, dict): + value = value['title'] + attribute = {'value': value} + attribute.update(self.vulnerability_mapping[feature]) + vulnerability_object.add_attribute(**attribute) + vulnerability_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(vulnerability_object) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') != 'cpe': + return {'error': 'Wrong input attribute type.'} + if not request.get('config') or not request['config'].get('custom_API_URL'): + return {'error': 'Missing API URL'} + api_url = check_url(request['config']['custom_API_URL']) + response = requests.get("{}{}".format(api_url, attribute['value'])) + if response.status_code == 200: + vulnerabilities = response.json() + if not vulnerabilities: + return {'error': 'No related vulnerability for this CPE.'} + else: + return {'error': 'API not accessible.'} + parser = VulnerabilitiesParser(attribute, api_url) + parser.parse_vulnerabilities(vulnerabilities) + return parser.get_result() + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 2be1d7a0cde74703e15e2afd70c4205d9a4c3844 Mon Sep 17 00:00:00 2001 From: mokaddem Date: Fri, 23 Oct 2020 22:17:47 +0200 Subject: [PATCH 042/476] new: [expansion] Added html_to_markdown module It fetches the HTML from the provided URL, performs a bit of DOM clean-up then convert it into markdown --- REQUIREMENTS | 1 + misp_modules/modules/expansion/__init__.py | 2 +- .../modules/expansion/html_to_markdown.py | 53 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100755 misp_modules/modules/expansion/html_to_markdown.py diff --git a/REQUIREMENTS b/REQUIREMENTS index 9b26d1c..f6362b5 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -47,6 +47,7 @@ jsonschema==3.2.0 lief==0.10.1 lxml==4.5.2 maclookup==1.0.3 +markdownify==0.5.3 maxminddb==2.0.2; python_version >= '3.6' multidict==4.7.6; python_version >= '3.5' np==1.0.2 diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1b6d2bb..6485140 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'virustotal_public', 'apiosintds', 'urlscan', 'securitytrails', 'apivoid', 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', - 'trustar_enrich', 'recordedfuture'] + 'trustar_enrich', 'recordedfuture', 'html_to_markdown'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/html_to_markdown.py b/misp_modules/modules/expansion/html_to_markdown.py new file mode 100755 index 0000000..228b4bc --- /dev/null +++ b/misp_modules/modules/expansion/html_to_markdown.py @@ -0,0 +1,53 @@ +import json +import requests +from markdownify import markdownify +from bs4 import BeautifulSoup + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['url'], 'output': ['text']} +moduleinfo = {'version': '0.1', 'author': 'Sami Mokaddem', + 'description': 'Simple HTML fetcher', + 'module-type': ['expansion']} + + +def fetchHTML(url): + r = requests.get(url) + return r.text + + +def stripUselessTags(html): + soup = BeautifulSoup(html, 'html.parser') + toRemove = ['script', 'head', 'header', 'footer', 'meta', 'link'] + for tag in soup.find_all(toRemove): + tag.decompose() + return str(soup) + + +def convertHTML(html): + toStrip = ['a', 'img'] + return markdownify(html, heading_style='ATX', strip=toStrip) + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if request.get('url'): + url = request['url'] + else: + return False + html = fetchHTML(url) + html = stripUselessTags(html) + markdown = convertHTML(html) + + r = {'results': [{'types': mispattributes['output'], + 'values':[str(markdown)]}]} + return r + + +def introspection(): + return mispattributes + + +def version(): + return moduleinfo From 88c8d9077c3255c9c380b7cf623f9139ab30e9c2 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sat, 24 Oct 2020 02:40:31 +0200 Subject: [PATCH 043/476] fix: [cpe] Typos and variable name issues fixed + Making the module available in MISP --- misp_modules/modules/expansion/__init__.py | 4 ++-- misp_modules/modules/expansion/cpe.py | 23 ++++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1b6d2bb..fcd7774 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -5,8 +5,8 @@ import sys sys.path.append('{}/lib'.format('/'.join((os.path.realpath(__file__)).split('/')[:-3]))) __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'circl_passivessl', - 'countrycode', 'cve', 'cve_advanced', 'dns', 'btc_steroids', 'domaintools', 'eupi', 'eql', - 'farsight_passivedns', 'ipasn', 'passivetotal', 'sourcecache', 'virustotal', + 'countrycode', 'cve', 'cve_advanced', 'cpe', 'dns', 'btc_steroids', 'domaintools', 'eupi', + 'eql', 'farsight_passivedns', 'ipasn', 'passivetotal', 'sourcecache', 'virustotal', 'whois', 'shodan', 'reversedns', 'geoip_asn', 'geoip_city', 'geoip_country', 'wiki', 'iprep', 'threatminer', 'otx', 'threatcrowd', 'vulndb', 'crowdstrike_falcon', 'yara_syntax_validator', 'hashdd', 'onyphe', 'onyphe_full', 'rbl', diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index 74cb1b6..9298876 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -1,19 +1,21 @@ import json import requests from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} +mispattributes = {'input': ['cpe'], 'format': 'misp_standard'} moduleinfo = { 'version': '1', 'author': 'Christian Studer', - 'description': 'An expansion module to enrich a CPE attribute with the related vulnerabilities.', + 'description': 'An expansion module to enrich a CPE attribute with its related vulnerabilities.', 'module-type': ['expansion', 'hover'] } -moduleconfig = ["custom_API_URL"] +moduleconfig = ["custom_API_URL", "limit"] +cveapi_url = 'https://cve.circl.lu/api/cvefor/' -class VulnerabilityParser(): +class VulnerabilitiesParser(): def __init__(self, attribute, api_url): self.attribute = attribute self.api_url = api_url @@ -60,7 +62,7 @@ class VulnerabilityParser(): for feature in ('id', 'summary', 'Modified', 'Published', 'cvss'): if vulnerability.get(feature): attribute = {'value': vulnerability[feature]} - atttribute.update(self.vulnerability_mapping[feature]) + attribute.update(self.vulnerability_mapping[feature]) vulnerability_object.add_attribute(**attribute) if vulnerability.get('Published'): vulnerability_object.add_attribute(**{ @@ -81,7 +83,7 @@ class VulnerabilityParser(): def get_result(self): event = json.loads(self.misp_event.to_json()) - results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + results = {key: event[key] for key in ('Attribute', 'Object')} return {'results': results} @@ -98,10 +100,11 @@ def handler(q=False): attribute = request['attribute'] if attribute.get('type') != 'cpe': return {'error': 'Wrong input attribute type.'} - if not request.get('config') or not request['config'].get('custom_API_URL'): - return {'error': 'Missing API URL'} - api_url = check_url(request['config']['custom_API_URL']) - response = requests.get("{}{}".format(api_url, attribute['value'])) + api_url = check_url(request['config']['custom_API_URL']) if request['config'].get('custom_API_URL') else cveapi_url + url = f"{api_url}{attribute['value']}" + if request['config'].get('limit'): + url = f"{url}/{request['config']['limit']}" + response = requests.get(url) if response.status_code == 200: vulnerabilities = response.json() if not vulnerabilities: From 6660e2fc11748f61d35dc2542ac088b1d4341f57 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sat, 24 Oct 2020 23:52:06 +0200 Subject: [PATCH 044/476] add: Added documentation for the cpe module --- README.md | 1 + doc/README.md | 21 +++++++++++++++++++++ misp_modules/modules/expansion/cpe.py | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 26dce03..6a38688 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [CIRCL Passive SSL](misp_modules/modules/expansion/circl_passivessl.py) - a hover and expansion module to expand IP addresses with the X.509 certificate(s) seen. * [countrycode](misp_modules/modules/expansion/countrycode.py) - a hover module to tell you what country a URL belongs to. * [CrowdStrike Falcon](misp_modules/modules/expansion/crowdstrike_falcon.py) - an expansion module to expand using CrowdStrike Falcon Intel Indicator API. +* [CPE](misp_modules/modules/expansion/cpe.py) - An expansion module to query the CVE Search API with a cpe code, to get its related vulnerabilities. * [CVE](misp_modules/modules/expansion/cve.py) - a hover module to give more information about a vulnerability (CVE). * [CVE advanced](misp_modules/modules/expansion/cve_advanced.py) - An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE). * [Cuckoo submit](misp_modules/modules/expansion/cuckoo_submit.py) - A hover module to submit malware sample, url, attachment, domain to Cuckoo Sandbox. diff --git a/doc/README.md b/doc/README.md index 1225780..2245c3c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -222,6 +222,27 @@ Module to expand country codes. ----- +#### [cpe](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cpe.py) + + + +An expansion module to query the CVE search API with a cpe code to get its related vulnerabilities. +- **features**: +>The module takes a cpe attribute as input and queries the CVE search API to get its related vulnerabilities. +>The list of vulnerabilities is then parsed and returned as vulnerability objects. +> +>Users can use their own CVE search API url by defining a value to the custom_API_URL parameter. If no custom API url is given, the default cve.circl.lu api url is used. +> +>In order to limit the amount of data returned by CVE serach, users can also the limit parameter. With the limit set, the API returns only the requested number of vulnerabilities, sorted from the highest cvss score to the lowest one. +- **input**: +>CPE attribute. +- **output**: +>The vulnerabilities related to the CPE. +- **references**: +>https://cve.circl.lu/api/ + +----- + #### [crowdstrike_falcon](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/crowdstrike_falcon.py) diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index 9298876..8ea0f65 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -88,7 +88,7 @@ class VulnerabilitiesParser(): def check_url(url): - return "{}/".format(url) if not url.endswith('/') else url + return url if url.endswith('/') else f"{url}/" def handler(q=False): From 06d93101b1ddc3ecb820884c14341cfd5f114c11 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 29 Oct 2020 18:03:25 +0100 Subject: [PATCH 045/476] add: Documentation for the html_to_markdown expansion module --- README.md | 1 + doc/README.md | 14 ++++++++++++++ doc/expansion/html_to_markdown.json | 7 +++++++ 3 files changed, 22 insertions(+) create mode 100644 doc/expansion/html_to_markdown.json diff --git a/README.md b/README.md index 26dce03..354100f 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [Greynoise](misp_modules/modules/expansion/greynoise.py) - a hover to get information from greynoise. * [hashdd](misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. * [hibp](misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? +* [html_to_markdown](misp_modules/modules/expansion/html_to_markdown) - Simple HTML to markdown converter * [intel471](misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). * [IPASN](misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. * [iprep](misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. diff --git a/doc/README.md b/doc/README.md index 1225780..dc81b6b 100644 --- a/doc/README.md +++ b/doc/README.md @@ -618,6 +618,20 @@ Module to access haveibeenpwned.com API. ----- +#### [html_to_markdown](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/html_to_markdown.py) + +Expansion module to fetch the html content from an url and convert it into markdown. +- **features**: +>The module take an URL as input and the HTML content is fetched from it. This content is then converted into markdown that is returned as text. +- **input**: +>URL attribute. +- **output**: +>Markdown content converted from the HTML fetched from the url. +- **requirements**: +>The markdownify python library + +----- + #### [intel471](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intel471.py) diff --git a/doc/expansion/html_to_markdown.json b/doc/expansion/html_to_markdown.json new file mode 100644 index 0000000..45f6596 --- /dev/null +++ b/doc/expansion/html_to_markdown.json @@ -0,0 +1,7 @@ +{ + "description": "Expansion module to fetch the html content from an url and convert it into markdown.", + "input": "URL attribute.", + "output": "Markdown content converted from the HTML fetched from the url.", + "requirements": ["The markdownify python library"], + "features": "The module take an URL as input and the HTML content is fetched from it. This content is then converted into markdown that is returned as text." +} From e4d2f9076737d32b11f5fc5f399277a2f701ccfc Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 29 Oct 2020 18:22:07 +0100 Subject: [PATCH 046/476] fix: Updated Pipfile --- Pipfile | 1 + Pipfile.lock | 619 +++++++++++++++++++++++++++++---------------------- 2 files changed, 354 insertions(+), 266 deletions(-) diff --git a/Pipfile b/Pipfile index 1169368..a79e260 100644 --- a/Pipfile +++ b/Pipfile @@ -61,6 +61,7 @@ apiosintDS = "*" assemblyline_client = "*" vt-graph-api = "*" trustar = "*" +markdownify = "==0.5.3" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index 1229e98..bc00dee 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c2d937b384431e4b313b29bb02db0bd1d3a866ddcb7c6e91cbfa34f88d351b59" + "sha256": "f707a3cd3025e6d0182d2a440138a9c3ab0810632aedc308274c6f9437489a87" }, "pipfile-spec": 6, "requires": { @@ -18,21 +18,42 @@ "default": { "aiohttp": { "hashes": [ - "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e", - "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326", - "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a", - "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654", - "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a", - "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4", - "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17", - "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec", - "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd", - "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48", - "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59", - "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965" + "sha256:027be45c4b37e21be81d07ae5242361d73eebad1562c033f80032f955f34df82", + "sha256:06efdb01ab71ec20786b592d510d1d354fbe0b2e4449ee47067b9ca65d45a006", + "sha256:0989ff15834a4503056d103077ec3652f9ea5699835e1ceaee46b91cf59830bf", + "sha256:11e087c316e933f1f52f3d4a09ce13f15ad966fc43df47f44ca4e8067b6a2e0d", + "sha256:184ead67248274f0e20b0cd6bb5f25209b2fad56e5373101cc0137c32c825c87", + "sha256:1c36b7ef47cfbc150314c2204cd73613d96d6d0982d41c7679b7cdcf43c0e979", + "sha256:2aea79734ac5ceeac1ec22b4af4efb4efd6a5ca3d73d77ec74ed782cf318f238", + "sha256:2e886611b100c8c93b753b457e645c5e4b8008ec443434d2a480e5a2bb3e6514", + "sha256:476b1f8216e59a3c2ffb71b8d7e1da60304da19f6000d422bacc371abb0fc43d", + "sha256:48104c883099c0e614c5c38f98c1d174a2c68f52f58b2a6e5a07b59df78262ab", + "sha256:4afd8002d9238e5e93acf1a8baa38b3ddf1f7f0ebef174374131ff0c6c2d7973", + "sha256:547b196a7177511da4f475fc81d0bb88a51a8d535c7444bbf2338b6dc82cb996", + "sha256:67f8564c534d75c1d613186939cee45a124d7d37e7aece83b17d18af665b0d7a", + "sha256:6e0d1231a626d07b23f6fe904caa44efb249da4222d8a16ab039fb2348722292", + "sha256:7e26712871ebaf55497a60f55483dc5e74326d1fb0bfceab86ebaeaa3a266733", + "sha256:7f1aeb72f14b9254296cdefa029c00d3c4550a26e1059084f2ee10d22086c2d0", + "sha256:8319a55de469d5af3517dfe1f6a77f248f6668c5a552396635ef900f058882ef", + "sha256:835bd35e14e4f36414e47c195e6645449a0a1c3fd5eeae4b7f22cb4c5e4f503a", + "sha256:89c1aa729953b5ac6ca3c82dcbd83e7cdecfa5cf9792c78c154a642e6e29303d", + "sha256:8a8addd41320637c1445fea0bae1fd9fe4888acc2cd79217ee33e5d1c83cfe01", + "sha256:8fbeeb2296bb9fe16071a674eadade7391be785ae0049610e64b60ead6abcdd7", + "sha256:a1f1cc11c9856bfa7f1ca55002c39070bde2a97ce48ef631468e99e2ac8e3fe6", + "sha256:ad5c3559e3cd64f746df43fa498038c91aa14f5d7615941ea5b106e435f3b892", + "sha256:b822bf7b764283b5015e3c49b7bb93f37fc03545f4abe26383771c6b1c813436", + "sha256:b84cef790cb93cec82a468b7d2447bf16e3056d2237b652e80f57d653b61da88", + "sha256:be9fa3fe94fc95e9bf84e84117a577c892906dd3cb0a95a7ae21e12a84777567", + "sha256:c53f1d2bd48f5f407b534732f5b3c6b800a58e70b53808637848d8a9ee127fe7", + "sha256:c588a0f824dc7158be9eec1ff465d1c868ad69a4dc518cd098cc11e4f7da09d9", + "sha256:c6da1af59841e6d43255d386a2c4bfb59c0a3b262bdb24325cc969d211be6070", + "sha256:c9a415f4f2764ab6c7d63ee6b86f02a46b4df9bc11b0de7ffef206908b7bf0b4", + "sha256:cdbb65c361ff790c424365a83a496fc8dd1983689a5fb7c6852a9a3ff1710c61", + "sha256:f04dcbf6af1868048a9b4754b1684c669252aa2419aa67266efbcaaead42ced7", + "sha256:f8c583c31c6e790dc003d9d574e3ed2c5b337947722965096c4d684e4f183570" ], - "markers": "python_full_version >= '3.5.3'", - "version": "==3.6.2" + "markers": "python_version >= '3.6'", + "version": "==3.7.2" }, "antlr4-python3-runtime": { "hashes": [ @@ -174,11 +195,11 @@ }, "colorama": { "hashes": [ - "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", - "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" + "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", + "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.3" + "version": "==0.4.4" }, "configparser": { "hashes": [ @@ -190,30 +211,30 @@ }, "cryptography": { "hashes": [ - "sha256:21b47c59fcb1c36f1113f3709d37935368e34815ea1d7073862e92f810dc7499", - "sha256:451cdf60be4dafb6a3b78802006a020e6cd709c22d240f94f7a0696240a17154", - "sha256:4549b137d8cbe3c2eadfa56c0c858b78acbeff956bd461e40000b2164d9167c6", - "sha256:48ee615a779ffa749d7d50c291761dc921d93d7cf203dca2db663b4f193f0e49", - "sha256:559d622aef2a2dff98a892eef321433ba5bc55b2485220a8ca289c1ecc2bd54f", - "sha256:5d52c72449bb02dd45a773a203196e6d4fae34e158769c896012401f33064396", - "sha256:65beb15e7f9c16e15934569d29fb4def74ea1469d8781f6b3507ab896d6d8719", - "sha256:680da076cad81cdf5ffcac50c477b6790be81768d30f9da9e01960c4b18a66db", - "sha256:762bc5a0df03c51ee3f09c621e1cee64e3a079a2b5020de82f1613873d79ee70", - "sha256:89aceb31cd5f9fc2449fe8cf3810797ca52b65f1489002d58fe190bfb265c536", - "sha256:983c0c3de4cb9fcba68fd3f45ed846eb86a2a8b8d8bc5bb18364c4d00b3c61fe", - "sha256:99d4984aabd4c7182050bca76176ce2dbc9fa9748afe583a7865c12954d714ba", - "sha256:9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d", - "sha256:a7597ffc67987b37b12e09c029bd1dc43965f75d328076ae85721b84046e9ca7", - "sha256:ab010e461bb6b444eaf7f8c813bb716be2d78ab786103f9608ffd37a4bd7d490", - "sha256:b12e715c10a13ca1bd27fbceed9adc8c5ff640f8e1f7ea76416352de703523c8", - "sha256:b2bded09c578d19e08bd2c5bb8fed7f103e089752c9cf7ca7ca7de522326e921", - "sha256:b372026ebf32fe2523159f27d9f0e9f485092e43b00a5adacf732192a70ba118", - "sha256:cb179acdd4ae1e4a5a160d80b87841b3d0e0be84af46c7bb2cd7ece57a39c4ba", - "sha256:e97a3b627e3cb63c415a16245d6cef2139cca18bb1183d1b9375a1c14e83f3b3", - "sha256:f0e099fc4cc697450c3dd4031791559692dd941a95254cb9aeded66a7aa8b9bc", - "sha256:f99317a0fa2e49917689b8cf977510addcfaaab769b3f899b9c481bbd76730c2" + "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538", + "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f", + "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77", + "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b", + "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33", + "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e", + "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb", + "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e", + "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7", + "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297", + "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d", + "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7", + "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b", + "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7", + "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4", + "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8", + "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b", + "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851", + "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13", + "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b", + "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3", + "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df" ], - "version": "==3.1.1" + "version": "==3.2.1" }, "decorator": { "hashes": [ @@ -320,10 +341,10 @@ }, "jbxapi": { "hashes": [ - "sha256:8458f01a9b4e4245d61f6fa75edef17e2992192975f746c51ed5392ba9aa7ce5" + "sha256:0605208a072ff5752754df0798f0de5acd8630e37237e04f816f1393c2c08b80" ], "index": "pypi", - "version": "==3.11.0" + "version": "==3.13.0" }, "json-log-formatter": { "hashes": [ @@ -359,40 +380,45 @@ }, "lxml": { "hashes": [ - "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f", - "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730", - "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f", - "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1", - "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3", - "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7", - "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a", - "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe", - "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1", - "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e", - "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d", - "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20", - "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae", - "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5", - "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba", - "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293", - "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a", - "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6", - "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88", - "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed", - "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843", - "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443", - "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0", - "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304", - "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258", - "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6", - "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1", - "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481", - "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef", - "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd", - "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee" + "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", + "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", + "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", + "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", + "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", + "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", + "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", + "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", + "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", + "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", + "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", + "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", + "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", + "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", + "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", + "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", + "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", + "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", + "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", + "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", + "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", + "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", + "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", + "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", + "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", + "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", + "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", + "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", + "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", + "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", + "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", + "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", + "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", + "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", + "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" ], "index": "pypi", - "version": "==4.5.2" + "version": "==4.6.1" }, "maclookup": { "hashes": [ @@ -402,12 +428,20 @@ "index": "pypi", "version": "==1.0.3" }, + "markdownify": { + "hashes": [ + "sha256:30be8340724e706c9e811c27fe8c1542cf74a15b46827924fff5c54b40dd9b0d", + "sha256:a69588194fd76634f0139d6801b820fd652dc5eeba9530e90d323dfdc0155252" + ], + "index": "pypi", + "version": "==0.5.3" + }, "maxminddb": { "hashes": [ - "sha256:b95d8ed21799e6604683669c7ed3c6a184fcd92434d5762dccdb139b4f29e597" + "sha256:47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc" ], "markers": "python_version >= '3.6'", - "version": "==2.0.2" + "version": "==2.0.3" }, "misp-modules": { "editable": true, @@ -415,26 +449,42 @@ }, "multidict": { "hashes": [ - "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a", - "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000", - "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2", - "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507", - "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5", - "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7", - "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d", - "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463", - "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19", - "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3", - "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b", - "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c", - "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87", - "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7", - "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430", - "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255", - "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d" + "sha256:02b2ea2bb1277a970d238c5c783023790ca94d386c657aeeb165259950951cc6", + "sha256:0ce1d956ecbf112d49915ebc2f29c03e35fe451fb5e9f491edf9a2f4395ee0af", + "sha256:0ffdb4b897b15df798c0a5939a0323ccf703f2bae551dfab4eb1af7fbab38ead", + "sha256:11dcf2366da487d5b9de1d4b2055308c7ed9bde1a52973d07a89b42252af9ebe", + "sha256:167bd8e6351b57525bbf2d524ca5a133834699a2fcb090aad0c330c6017f3f3e", + "sha256:1b324444299c3a49b601b1bf621fc21704e29066f6ac2b7d7e4034a4a18662a1", + "sha256:20eaf1c279c543e07c164e4ac02151488829177da06607efa7ccfecd71b21e79", + "sha256:2739d1d9237835122b27d88990849ecf41ef670e0fcb876159edd236ca9ef40f", + "sha256:28b5913e5b6fef273e5d4230b61f33c8a51c3ce5f44a88582dee6b5ca5c9977b", + "sha256:2b0cfc33f53e5c8226f7d7c4e126fa0780f970ef1e96f7c6353da7d01eafe490", + "sha256:32f0a904859a6274d7edcbb01752c8ae9c633fb7d1c131771ff5afd32eceee42", + "sha256:39713fa2c687e0d0e709ad751a8a709ac051fcdc7f2048f6fd09365dd03c83eb", + "sha256:4ef76ce695da72e176f6a51867afb3bf300ce16ba2597824caaef625af5906a9", + "sha256:5263359a03368985b5296b7a73363d761a269848081879ba04a6e4bfd0cf4a78", + "sha256:52b5b51281d760197ce3db063c166fdb626e01c8e428a325aa37198ce31c9565", + "sha256:5dd303b545b62f9d2b14f99fbdb84c109a20e64a57f6a192fe6aebcb6263b59d", + "sha256:60af726c19a899ed49bbb276e062f08b80222cb6b9feda44b59a128b5ff52966", + "sha256:60b12d14bc122ba2dae1e4460a891b3a96e73d815b4365675f6ec0a1725416a5", + "sha256:620c39b1270b68e194023ad471b6a54bdb517bb48515939c9829b56c783504a3", + "sha256:62f6e66931fb87e9016e7c1cc806ab4f3e39392fd502362df3cac888078b27cb", + "sha256:711289412b78cf41a21457f4c806890466013d62bf4296bd3d71fad73ff8a581", + "sha256:7561a804093ea4c879e06b5d3d18a64a0bc21004bade3540a4b31342b528d326", + "sha256:786ad04ad954afe9927a1b3049aa58722e182160fe2fcac7ad7f35c93595d4f6", + "sha256:79dc3e6e7ce853fb7ed17c134e01fcb0d0c826b33201aa2a910fb27ed75c2eb9", + "sha256:84e4943d8725659942e7401bdf31780acde9cfdaf6fe977ff1449fffafcd93a9", + "sha256:932964cf57c0e59d1f3fb63ff342440cf8aaa75bf0dbcbad902c084024975380", + "sha256:a5eca9ee72b372199c2b76672145e47d3c829889eefa2037b1f3018f54e5f67d", + "sha256:aad240c1429e386af38a2d6761032f0bec5177fed7c5f582c835c99fff135b5c", + "sha256:bbec545b8f82536bc50afa9abce832176ed250aa22bfff3e20b3463fb90b0b35", + "sha256:c339b7d73c0ea5c551025617bb8aa1c00a0111187b6545f48836343e6cfbe6a0", + "sha256:c692087913e12b801a759e25a626c3d311f416252dfba2ecdfd254583427949f", + "sha256:cda06c99cd6f4a36571bb38e560a6fcfb1f136521e57f612e0bc31957b1cd4bd", + "sha256:ec8bc0ab00c76c4260a201eaa58812ea8b1b7fde0ecf5f9c9365a182bd4691ed" ], "markers": "python_version >= '3.5'", - "version": "==4.7.6" + "version": "==5.0.0" }, "np": { "hashes": [ @@ -445,35 +495,43 @@ }, "numpy": { "hashes": [ - "sha256:04c7d4ebc5ff93d9822075ddb1751ff392a4375e5885299445fcebf877f179d5", - "sha256:0bfd85053d1e9f60234f28f63d4a5147ada7f432943c113a11afcf3e65d9d4c8", - "sha256:0c66da1d202c52051625e55a249da35b31f65a81cb56e4c69af0dfb8fb0125bf", - "sha256:0d310730e1e793527065ad7dde736197b705d0e4c9999775f212b03c44a8484c", - "sha256:1669ec8e42f169ff715a904c9b2105b6640f3f2a4c4c2cb4920ae8b2785dac65", - "sha256:2117536e968abb7357d34d754e3733b0d7113d4c9f1d921f21a3d96dec5ff716", - "sha256:3733640466733441295b0d6d3dcbf8e1ffa7e897d4d82903169529fd3386919a", - "sha256:4339741994c775396e1a274dba3609c69ab0f16056c1077f18979bec2a2c2e6e", - "sha256:51ee93e1fac3fe08ef54ff1c7f329db64d8a9c5557e6c8e908be9497ac76374b", - "sha256:54045b198aebf41bf6bf4088012777c1d11703bf74461d70cd350c0af2182e45", - "sha256:58d66a6b3b55178a1f8a5fe98df26ace76260a70de694d99577ddeab7eaa9a9d", - "sha256:59f3d687faea7a4f7f93bd9665e5b102f32f3fa28514f15b126f099b7997203d", - "sha256:62139af94728d22350a571b7c82795b9d59be77fc162414ada6c8b6a10ef5d02", - "sha256:7118f0a9f2f617f921ec7d278d981244ba83c85eea197be7c5a4f84af80a9c3c", - "sha256:7c6646314291d8f5ea900a7ea9c4261f834b5b62159ba2abe3836f4fa6705526", - "sha256:967c92435f0b3ba37a4257c48b8715b76741410467e2bdb1097e8391fccfae15", - "sha256:9a3001248b9231ed73894c773142658bab914645261275f675d86c290c37f66d", - "sha256:aba1d5daf1144b956bc87ffb87966791f5e9f3e1f6fab3d7f581db1f5b598f7a", - "sha256:addaa551b298052c16885fc70408d3848d4e2e7352de4e7a1e13e691abc734c1", - "sha256:b594f76771bc7fc8a044c5ba303427ee67c17a09b36e1fa32bde82f5c419d17a", - "sha256:c35a01777f81e7333bcf276b605f39c872e28295441c265cd0c860f4b40148c1", - "sha256:cebd4f4e64cfe87f2039e4725781f6326a61f095bc77b3716502bed812b385a9", - "sha256:d526fa58ae4aead839161535d59ea9565863bb0b0bdb3cc63214613fb16aced4", - "sha256:d7ac33585e1f09e7345aa902c281bd777fdb792432d27fca857f39b70e5dd31c", - "sha256:e6ddbdc5113628f15de7e4911c02aed74a4ccff531842c583e5032f6e5a179bd", - "sha256:eb25c381d168daf351147713f49c626030dcff7a393d5caa62515d415a6071d8" + "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7", + "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3", + "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268", + "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170", + "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f", + "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72", + "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996", + "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522", + "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed", + "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69", + "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d", + "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68", + "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98", + "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822", + "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d", + "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5", + "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6", + "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0", + "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add", + "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2", + "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9", + "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0", + "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2", + "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c", + "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931", + "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da", + "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e", + "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4", + "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535", + "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c", + "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772", + "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6", + "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f", + "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2" ], "markers": "python_version >= '3.6'", - "version": "==1.19.2" + "version": "==1.19.3" }, "oauth2": { "hashes": [ @@ -512,24 +570,29 @@ }, "pandas": { "hashes": [ - "sha256:206d7c3e5356dcadf082e64dc25c24bc8541718045826074f96346e9d6d05a20", - "sha256:24f61f40febe47edac271eda45d683e42838b7db2bd0f82574d9800259d2b182", + "sha256:ca71a5aa9eeb3ef5b31feca7d9b6369d6b3d0b2e9c85d7a89abe3ecb013f1e86", + "sha256:df43ea0e9fd9f9672b0de9cac26d01255ad50481994bf3cb4687c21eec2d7bbc", + "sha256:babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613", + "sha256:147162568b1242355290341baf281926cfac66ada07e634f3fc521ac967e4653", + "sha256:d6b1f9d506dc23da2915bcae5c5968990049c9cec44108bd9855d2c7c89d91dc", "sha256:3a038cd5da602b955d335aa80cbaa0e5774f68501ff47b9c21509906981478da", - "sha256:427be9938b2f79ab298de84f87693914cda238a27cf10580da96caf3dff64115", - "sha256:54f5f564058b0280d588c3758abde82e280702c440db5faf0c686b80336096f9", - "sha256:5a8a84b75ca3a29bb4263b35d5ed9fcaae2b062f014feed8c5daa897339c7d85", "sha256:84a4ffe668df357e31f98c829536e3a7142c3036c82f996e639f644c5d32eda1", "sha256:882012763668af54b48f1412bab95c5cc0a7ccce5a2a8221cfc3839a6e3394ef", - "sha256:920d30fdff65a079f071db635d282b4f583c2b26f2b58d5dca218aac7c59974d", - "sha256:a605054fbca71ed1d08bb2aef6f73c84a579bbac956bfe8f9718d5e84cb41248", + "sha256:d89dbc58aec1544722a8d5046f880b597c497ef8a82c5fe695b4b2effafac5ec", + "sha256:5a8a84b75ca3a29bb4263b35d5ed9fcaae2b062f014feed8c5daa897339c7d85", + "sha256:24f61f40febe47edac271eda45d683e42838b7db2bd0f82574d9800259d2b182", "sha256:b11b496c317dbe007898de699fd59eaf687d0fe8c1b7dad109db6010155d28ae", - "sha256:babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613", + "sha256:206d7c3e5356dcadf082e64dc25c24bc8541718045826074f96346e9d6d05a20", "sha256:c22e40f1b4d162ca18eb6b2c572e63eef220dbc9cc3de0241cefb77972621bb7", "sha256:ca31ac8578d48da354cf66a473d4d5ff99277ca71d321dc7ea4e6fad3c6bb0fd", - "sha256:ca71a5aa9eeb3ef5b31feca7d9b6369d6b3d0b2e9c85d7a89abe3ecb013f1e86", - "sha256:d6b1f9d506dc23da2915bcae5c5968990049c9cec44108bd9855d2c7c89d91dc", - "sha256:d89dbc58aec1544722a8d5046f880b597c497ef8a82c5fe695b4b2effafac5ec", - "sha256:df43ea0e9fd9f9672b0de9cac26d01255ad50481994bf3cb4687c21eec2d7bbc", + "sha256:a605054fbca71ed1d08bb2aef6f73c84a579bbac956bfe8f9718d5e84cb41248", + "sha256:f4cb8252ae71f093f4a6b847adf0bc9330f109c48f08363c2071f189f1c89c87", + "sha256:2999adc6736f8cb4c69d65a6e2b25a11bcb395da5b048342b8e4d6fe055e57ae", + "sha256:54f5f564058b0280d588c3758abde82e280702c440db5faf0c686b80336096f9", + "sha256:b026e913d88fad3a74eea8ed5a5f98e8823080ea02f8d9bb0ec19e92552daad6", + "sha256:11c284769f41e95f7d16a327eb555989c5f29418aad075fa80c97ef3aa8fb885", + "sha256:920d30fdff65a079f071db635d282b4f583c2b26f2b58d5dca218aac7c59974d", + "sha256:427be9938b2f79ab298de84f87693914cda238a27cf10580da96caf3dff64115", "sha256:fd6f05b6101d0e76f3e5c26a47be5be7be96ed84ef3981dc1852e76898e73594" ], "index": "pypi", @@ -561,37 +624,37 @@ }, "pillow": { "hashes": [ - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", + "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", + "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", + "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", + "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", + "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", + "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", + "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", + "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", + "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", + "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", + "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", + "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", + "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", + "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", + "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", + "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", + "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", + "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", + "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", + "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", + "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", + "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", + "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", + "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", + "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", + "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72" ], "index": "pypi", - "version": "==7.2.0" + "version": "==8.0.1" }, "progressbar2": { "hashes": [ @@ -602,20 +665,20 @@ }, "psutil": { "hashes": [ - "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8", - "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498", - "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6", - "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c", - "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195", - "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f", - "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb", - "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1", - "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf", - "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2", - "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818" + "sha256:01bc82813fbc3ea304914581954979e637bcc7084e59ac904d870d6eb8bb2bc7", + "sha256:1cd6a0c9fb35ece2ccf2d1dd733c1e165b342604c67454fd56a4c12e0a106787", + "sha256:2cb55ef9591b03ef0104bedf67cc4edb38a3edf015cf8cf24007b99cb8497542", + "sha256:56c85120fa173a5d2ad1d15a0c6e0ae62b388bfb956bb036ac231fbdaf9e4c22", + "sha256:5d9106ff5ec2712e2f659ebbd112967f44e7d33f40ba40530c485cc5904360b8", + "sha256:6a3e1fd2800ca45083d976b5478a2402dd62afdfb719b30ca46cd28bb25a2eb4", + "sha256:ade6af32eb80a536eff162d799e31b7ef92ddcda707c27bbd077238065018df4", + "sha256:af73f7bcebdc538eda9cc81d19db1db7bf26f103f91081d780bbacfcb620dee2", + "sha256:e02c31b2990dcd2431f4524b93491941df39f99619b0d312dfe1d4d530b08b4b", + "sha256:fa38ac15dbf161ab1e941ff4ce39abd64b53fec5ddf60c23290daed2bc7d1157", + "sha256:fbcac492cb082fa38d88587d75feb90785d05d7e12d4565cbf1ecc727aff71b7" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.7.2" + "version": "==5.7.3" }, "pybgpranking": { "editable": true, @@ -759,7 +822,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "bacd4c78cd83d3bf45dcf55cd9ad3514747ac985" + "ref": "deb9e06c726592c145e44b25fa6a05db56e3aa80" }, "pyonyphe": { "editable": true, @@ -926,49 +989,49 @@ }, "reportlab": { "hashes": [ - "sha256:0145233d3596fa5828972eb474b5a9f3fd5dea45d6f196fe006a7a7a461fcd03", - "sha256:04fd4a129393006c4ba9cd9fff56b78ad60fe6702326e9260f55d4abac9f1df2", - "sha256:067800caa12ea69e8df0a9206a7eda6697f91a33edb8413b778647d270bc9f34", - "sha256:106a61093cf6084fbcb1272768f090b06137027e09c5e53c573c6c7b90216066", - "sha256:13afbdca2b0844c19ee6804220bb96630f44ffa2571781de66a04e3f83609295", - "sha256:155887770694a1febb4b1bcd2e2856c931225fa1fe8c5ef6772fce47c07f6204", - "sha256:17c906bc410f5eef01795d709ad88663ab98447683d21b6e97bac9b366504a8a", - "sha256:1880282b9a278b4df5139b2083b9116388d9e1fb4a438c60b3cc4ad983da1bc5", - "sha256:2248f9c362f417d108329fdf5083ede1914757534f1b255d6c37a9a6d99c5efe", - "sha256:2dc571be9d2fec76f8bddb540581429eb16057ff9101767d8b15166ad1de70db", - "sha256:35dda0a1994a8fc009bf5826fe34dcdb15e561b05a5a01c506d949accfbdf027", - "sha256:3858534058ab99fbedb34ceae31f85bbadeeb8e4dbb78a58927599a6f0422617", - "sha256:4710d237fe9f729eacbbb7477d14eea00781704e0cdb83c789e610365e40627f", - "sha256:49e32586d3a814a5f77407c0590504a72743ca278518b3c0f90182430f2d87af", - "sha256:4cdb2ab88839f0d36364b71744b742e09699bde9b943aa35da26580831c3f106", - "sha256:5e995f77124933d3e16ddc09f95ab36793083a1cb08ed2557811f8cfb254434b", - "sha256:73bc92579692609837fb13f271f7436fdb7b6ddebb9e10185452d45814c365c3", - "sha256:7931097db5f18e3ac6909a223e94dd3ad0258541f9802effa5b8f519ef9278e4", - "sha256:7eb3d96adb309593bded364d25a32b80f9dc18b2f9a4b2001972194027a77eef", - "sha256:886bdc7c13e6c6513696eb044000491c787fd53a486aa3adea060d34aa3cd028", - "sha256:8c242a2be8d71ff18e11938cf45114d1144544984cd34fea0606f04144d62bea", - "sha256:8f2759d2a81ee992054e7a1123cadd6baff4edecc1249e503bb6decd6b55e8ee", - "sha256:9765c0eec5e6927aaccf6bd460fe24a014d35a3979f2c7507644fd5946775921", - "sha256:9c7173def03fd3048f07bce00d4ca4793efc37239811d9b3eb77edb561363cd2", - "sha256:a1d0e20cae86c6ba5e6626a9e07eca4d298341adfee778f87d5837bc76912135", - "sha256:a5398e7af6136c25a34569132e7e2646c72a2f89e53028ef109fb03b5a2923a6", - "sha256:a690fe672aa51ee3a6ff4c96d2f5d9744d3b6f27c999a795b9c513923f875bfc", - "sha256:b18ea3593d4edc7f05c510ab298d48548d9a4473a643f37661b1669365d7d33c", - "sha256:b727050ec5dfc4baeded07199d4640156f360ff4624b0194d8e91b234fc0c26b", - "sha256:be53e8423f35d3c80b0560aec034226fdab5623bb4d64b962c3f04b65980b3e0", - "sha256:c70e9c9cfdc0596c3912e0d147f42e83c7ac5642ac82d6fe05d85a6326bae14d", - "sha256:ce7c13eb469f864085a546881a3bc9b46e20a73dc1a43b9e84153833e628dee3", - "sha256:d6bd4d59f4b558165f05f9f7dfad37b9d788bcc05c0b37a6b0fcb6165d6893ec", - "sha256:d75114965cc84ee51aaf3d7eda90f3554f3ac67350ebacd1dbb9193a7a525e21", - "sha256:d78fdb967bd7652515d9a23ff3088e32e32ef96332737696e9eb0fda5602bf81", - "sha256:d930a3de0fa9711b9c960dee92ff2b30c3f69568f00f0244834fe28d5563ea9b", - "sha256:e32af1e47076a3fc77e6be5f7e2c8cbbc82fe493a5cd3f6190c0f8980c401e59", - "sha256:e50de7d196f2d3940f3fdea0f30bf67929686d57285b3779fb071d05a810d65f", - "sha256:e7b7e4a0ce0f455a4777528a8a316e87cc6cf887eaa2a4e6a0cc103f031c57c2", - "sha256:e8dd01462a1bb41b6806aa93a703100d3fbba760f8feca96fcec710db9384a25" + "sha256:00b9b3ffbd197b21cb076acc336993005b75d16b60f7a79a3c8faee926f890b7", + "sha256:0177b58d0ae81f6775b10e66f97bc7aa490659398e1f24401b6d1767803c4880", + "sha256:03c792a92ba21e75e05230ef1ce038025c23b124c706d7369dfa1475a0d24785", + "sha256:04044318273fa00487557f2e79bb6f8faa08185b8b1795cc29985ccb609c8680", + "sha256:217da82e7451e2b101a4bd72006a7e6c0d3203200cfb5c4d6a17b997b9ba73c6", + "sha256:226b5ef9af16aa8b3487513556ae7386239fe3ec8b121b1e23f45b850f0a10a8", + "sha256:24773aba8c74e1e023a1d3c3c60dbd6ef4a76472e38f13b5a214c8bb48db7aef", + "sha256:25eb9bb45e206b3a464f763d1231d70bb5f351c01d5ab94568e687fec4bd9eee", + "sha256:3d6d26294e8e3f6a639ee4a4b423d2cb0fa7de24c4cccea50a32d50d20db52ad", + "sha256:4987cca329df7f9bf4b6abea3e83c26a5a8edfe5b133344e24f146ddc8c09b9a", + "sha256:4b6a7e9a83e00cfe020c8e8bdd595384312228b24dcb40538d5cf00df15c5bff", + "sha256:531b70748dd89456c4e1d2132497bc8580ac74d7fcb790b8e2d1b20378655ba2", + "sha256:57abf06c045d16a85906fbdd8d826d7e334377bbb29b7442d249a95cf5f3a5c5", + "sha256:58877ed7390327bf4c41ca75473223866f7d8da0f8a606eb682127c8ac4af990", + "sha256:640d41838b1e663c5db53f3c32294cd742ac5cc4ba3098aeaad53297b7e1cc47", + "sha256:658471d5b06e121692449f44a4e39e3c7128fea757c4e9354b488f35ac3f82de", + "sha256:6f971a53e02682866886c451513143f46aed65704e46327bb6440604cd7cd7eb", + "sha256:78dcf1aff25ddf68b147e78b074bef1384e804dd54322eb1d1f1f680892f8788", + "sha256:793ed7edd50306cd05213ac012749dfe65768485bd493c3434936438d594a363", + "sha256:7a3512585308e5c73bf123457ccfc90acb99493df89fae6131caaec9ffe1e4ca", + "sha256:7ace84b3aae39b14ce7235d096bc81891f60b871b7edad2b656cb1729100e0f2", + "sha256:7e84d123ec98816fce5a97af2755d664519e7891e9793330ec271900acb2bfab", + "sha256:813c31d8b7f28ee2f38f238c3eb6afb02b81b00d749ab10e38b534843680aea7", + "sha256:8365efe779e43e8005eace19c11c36e6a4bbea86ddc868b8db122240391c1747", + "sha256:8412514dc0d1bf62c6b33a645b5a7c46933cc16f3678db5546d0ac4e27f3dbae", + "sha256:8d4ba2aea71ab6ec688b3f3416db0d457e7814a642433b7f407a3f29e054816d", + "sha256:99a7cdd8633a8717dd239917647b42d9a6b869a01c39019c7b0b08b963be2a7e", + "sha256:9d86fe83e9c4838e0048f14067869d1ca8722bb52545781db7a9d345939e77f0", + "sha256:a626a97ab135f2129d87c5f98b2aee45e0ef1652bc9afef92509a8f5a5f72e45", + "sha256:a921906c1deb199f7910163703e4073b52e8d7f00d56d4f6bbc255a6ca3cfb1d", + "sha256:b80840cc4fece1426d30070a9dad016d9589e8d82ebddfc9ed30004b44ba2803", + "sha256:c5318b4e23803c7c5f2b7384858b7b6be5faf51f63664c97f6bf8601cd248855", + "sha256:cd5546d840f639587f352d4c54ff35422cbeba81eb2c50d156cd733015ecc4b2", + "sha256:d445fc4ada6a24a90080f7379d169fba1072ba5a75179ce2f5c3280adf605b45", + "sha256:d56f150bb4b2d32596291aa98d3c6986721c5cf41b8f90346a84cee8b7fb35f2", + "sha256:d6e42636247e4c6d2db929b9db01d1af907f63aa74af8123cd699107df8a7b23", + "sha256:dcf732695b1325289a9a74b849179d8475db32a00803644a664c2172a603237e", + "sha256:e7b20927e5e11bad8bac5d5b6c286ce2cae2804073513aa67f20986bc4b3b4e0", + "sha256:f6295876665359790dcb7042a9221c60e1f89dee042f33414e3ce440772f7aa1", + "sha256:f8ec6637f56c293ac62c9a94daebb856c4ef9b97eae4cf7b4e518813e41c8c75" ], "index": "pypi", - "version": "==3.5.53" + "version": "==3.5.54" }, "requests": { "extras": [ @@ -990,10 +1053,10 @@ }, "shodan": { "hashes": [ - "sha256:d2d37d47dd084747df672e6d981f6d72d5d03f4ee12f0ce2170e618147578349" + "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" ], "index": "pypi", - "version": "==1.23.1" + "version": "==1.24.0" }, "sigmatools": { "hashes": [ @@ -1068,10 +1131,18 @@ }, "trustar": { "hashes": [ - "sha256:47c45674a4a310dc8d932035e0de112de55c1e899663865b996a6b6b2d79cbde" + "sha256:2618a377e3c000a41a47eb34b31ea694215eed4a1d2e3cfca1801ac6baebd958" ], "index": "pypi", - "version": "==0.3.33" + "version": "==0.3.34" + }, + "typing-extensions": { + "hashes": [ + "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", + "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", + "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" + ], + "version": "==3.7.4.3" }, "tzlocal": { "hashes": [ @@ -1088,11 +1159,11 @@ }, "url-normalize": { "hashes": [ - "sha256:1709cb4739e496f9f807a894e361915792f273538e250b1ab7da790544a665c3", - "sha256:1bd7085349dcdf06e52194d0f75ff99fff2eeed0da85a50e4cc2346452c1b8bc" + "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2", + "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.4.2" + "version": "==1.4.3" }, "urlarchiver": { "hashes": [ @@ -1103,11 +1174,11 @@ }, "urllib3": { "hashes": [ - "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", - "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" + "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", + "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.10" + "version": "==1.25.11" }, "uwhois": { "editable": true, @@ -1131,12 +1202,12 @@ }, "vulners": { "hashes": [ - "sha256:4e78fc7492d33a1e612e7d5046e51f4c272eb7febdfc0fc06061648d2153e75a", - "sha256:6b088b7c8da9bdcc16e8283afd4a8f804388f1432d12d17b29b770778113ec62", - "sha256:7964884c1f262004a950d5915d49520d22afa3ab175d473492e2dbcc6b5e0a9a" + "sha256:065aa63d5626d51cf45260bc6cc3a6ea682977689c036a6daba695905e881ba7", + "sha256:0e1356040f456f87841ccfe9f2f6ed36a256370606d530679d5d9993fe91386c", + "sha256:ab9ed8fbf1d3c80f0d066b13ac9d70d11dc9cb0b77568be65396117a4245e916" ], "index": "pypi", - "version": "==1.5.8" + "version": "==1.5.9" }, "wand": { "hashes": [ @@ -1169,10 +1240,10 @@ }, "xlsxwriter": { "hashes": [ - "sha256:99b665203d737db31378ec729c9990a004c1abae53a6fa211c104f8c2e36cffd", - "sha256:b89002dea57bb3d4c8207f3e28ef8244bfd9e936b85d74e7dd1f97e11bb70313" + "sha256:9b1ade2d1ba5d9b40a6d1de1d55ded4394ab8002718092ae80a08532c2add2e6", + "sha256:b807c2d3e379bf6a925f472955beef3e07495c1bac708640696876e68675b49b" ], - "version": "==1.3.6" + "version": "==1.3.7" }, "yara-python": { "hashes": [ @@ -1193,26 +1264,42 @@ }, "yarl": { "hashes": [ - "sha256:04a54f126a0732af75e5edc9addeaa2113e2ca7c6fce8974a63549a70a25e50e", - "sha256:3cc860d72ed989f3b1f3abbd6ecf38e412de722fb38b8f1b1a086315cf0d69c5", - "sha256:5d84cc36981eb5a8533be79d6c43454c8e6a39ee3118ceaadbd3c029ab2ee580", - "sha256:5e447e7f3780f44f890360ea973418025e8c0cdcd7d6a1b221d952600fd945dc", - "sha256:61d3ea3c175fe45f1498af868879c6ffeb989d4143ac542163c45538ba5ec21b", - "sha256:67c5ea0970da882eaf9efcf65b66792557c526f8e55f752194eff8ec722c75c2", - "sha256:6f6898429ec3c4cfbef12907047136fd7b9e81a6ee9f105b45505e633427330a", - "sha256:7ce35944e8e61927a8f4eb78f5bc5d1e6da6d40eadd77e3f79d4e9399e263921", - "sha256:b7c199d2cbaf892ba0f91ed36d12ff41ecd0dde46cbf64ff4bfe997a3ebc925e", - "sha256:c15d71a640fb1f8e98a1423f9c64d7f1f6a3a168f803042eaf3a5b5022fde0c1", - "sha256:c22607421f49c0cb6ff3ed593a49b6a99c6ffdeaaa6c944cdda83c2393c8864d", - "sha256:c604998ab8115db802cc55cb1b91619b2831a6128a62ca7eea577fc8ea4d3131", - "sha256:d088ea9319e49273f25b1c96a3763bf19a882cff774d1792ae6fba34bd40550a", - "sha256:db9eb8307219d7e09b33bcb43287222ef35cbcf1586ba9472b0a4b833666ada1", - "sha256:e31fef4e7b68184545c3d68baec7074532e077bd1906b040ecfba659737df188", - "sha256:e32f0fb443afcfe7f01f95172b66f279938fbc6bdaebe294b0ff6747fb6db020", - "sha256:fcbe419805c9b20db9a51d33b942feddbf6e7fb468cb20686fd7089d4164c12a" + "sha256:03b7a44384ad60be1b7be93c2a24dc74895f8d767ea0bce15b2f6fc7695a3843", + "sha256:076157404db9db4bb3fa9db22db319bbb36d075eeab19ba018ce20ae0cacf037", + "sha256:1c05ae3d5ea4287470046a2c2754f0a4c171b84ea72c8a691f776eb1753dfb91", + "sha256:2467baf8233f7c64048df37e11879c553943ffe7f373e689711ec2807ea13805", + "sha256:2bb2e21cf062dfbe985c3cd4618bae9f25271efcad9e7be1277861247eee9839", + "sha256:311effab3b3828ab34f0e661bb57ff422f67d5c33056298bda4c12195251f8dd", + "sha256:3526cb5905907f0e42bee7ef57ae4a5f02bc27dcac27859269e2bba0caa4c2b6", + "sha256:39b1e586f34b1d2512c9b39aa3cf24c870c972d525e36edc9ee19065db4737bb", + "sha256:4bed5cd7c8e69551eb19df15295ba90e62b9a6a1149c76eb4a9bab194402a156", + "sha256:51c6d3cf7a1f1fbe134bb92f33b7affd94d6de24cd64b466eb12de52120fb8c6", + "sha256:59f78b5da34ddcffb663b772f7619e296518712e022e57fc5d9f921818e2ab7c", + "sha256:6f29115b0c330da25a04f48612d75333bca04521181a666ca0b8761005a99150", + "sha256:73d4e1e1ef5e52d526c92f07d16329e1678612c6a81dd8101fdcae11a72de15c", + "sha256:9b48d31f8d881713fd461abfe7acbb4dcfeb47cec3056aa83f2fbcd2244577f7", + "sha256:a1fd575dd058e10ad4c35065e7c3007cc74d142f622b14e168d8a273a2fa8713", + "sha256:b3dd1052afd436ba737e61f5d3bed1f43a7f9a33fc58fbe4226eb919a7006019", + "sha256:b99c25ed5c355b35d1e6dae87ac7297a4844a57dc5766b173b88b6163a36eb0d", + "sha256:c056e86bff5a0b566e0d9fab4f67e83b12ae9cbcd250d334cbe2005bbe8c96f2", + "sha256:c45b49b59a5724869899798e1bbd447ac486215269511d3b76b4c235a1b766b6", + "sha256:cd623170c729a865037828e3f99f8ebdb22a467177a539680dfc5670b74c84e2", + "sha256:d25d3311794e6c71b608d7c47651c8f65eea5ab15358a27f29330b3475e8f8e5", + "sha256:d695439c201ed340745250f9eb4dfe8d32bf1e680c16477107b8f3ce4bff4fdb", + "sha256:d77f6c9133d2aabb290a7846aaa74ec14d7b5ab35b01591fac5a70c4a8c959a2", + "sha256:d894a2442d2cd20a3b0b0dce5a353d316c57d25a2b445e03f7eac90eee27b8af", + "sha256:db643ce2b58a4bd11a82348225c53c76ecdd82bb37cf4c085e6df1b676f4038c", + "sha256:e3a0c43a26dfed955b2a06fdc4d51d2c51bc2200aff8ce8faf14e676ea8c8862", + "sha256:e77bf79ad1ccae672eab22453838382fe9029fc27c8029e84913855512a587d8", + "sha256:f2f0174cb15435957d3b751093f89aede77df59a499ab7516bbb633b77ead13a", + "sha256:f3031c78edf10315abe232254e6a36b65afe65fded41ee54ed7976d0b2cdf0da", + "sha256:f4c007156732866aa4507d619fe6f8f2748caabed4f66b276ccd97c82572620c", + "sha256:f4f27ff3dd80bc7c402def211a47291ea123d59a23f59fe18fc0e81e3e71f385", + "sha256:f57744fc61e118b5d114ae8077d8eb9df4d2d2c11e2af194e21f0c11ed9dcf6c", + "sha256:f835015a825980b65356e9520979a1564c56efea7da7d4b68a14d4a07a3a7336" ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" + "markers": "python_version >= '3.6'", + "version": "==1.6.2" } }, "develop": { @@ -1240,12 +1327,12 @@ }, "codecov": { "hashes": [ - "sha256:24545847177a893716b3455ac5bfbafe0465f38d4eb86ea922c09adc7f327e65", - "sha256:355fc7e0c0b8a133045f0d6089bde351c845e7b52b99fec5903b4ea3ab5f6aab", - "sha256:7877f68effde3c2baadcff807a5d13f01019a337f9596eece0d64e57393adf3a" + "sha256:61bc71b5f58be8000bf9235aa9d0112f8fd3acca00aa02191bb81426d22a8584", + "sha256:a333626e6ff882db760ce71a1d84baf80ddff2cd459a3cc49b41fdac47d77ca5", + "sha256:d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33" ], "index": "pypi", - "version": "==2.1.9" + "version": "==2.1.10" }, "coverage": { "hashes": [ @@ -1305,10 +1392,10 @@ }, "iniconfig": { "hashes": [ - "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437", - "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69" + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" ], - "version": "==1.0.1" + "version": "==1.1.1" }, "mccabe": { "hashes": [ @@ -1376,11 +1463,11 @@ }, "pytest": { "hashes": [ - "sha256:7a8190790c17d79a11f847fba0b004ee9a8122582ebff4729a082c109e81a4c9", - "sha256:8f593023c1a0f916110285b6efd7f99db07d59546e3d8c36fc60e2ab05d3be92" + "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe", + "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e" ], "index": "pypi", - "version": "==6.1.1" + "version": "==6.1.2" }, "requests": { "extras": [ @@ -1410,11 +1497,11 @@ }, "urllib3": { "hashes": [ - "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", - "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" + "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", + "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.10" + "version": "==1.25.11" } } } From bb8c616b6d7d7e1edb00c1b8104ef60967b93a2c Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 29 Oct 2020 18:25:57 +0100 Subject: [PATCH 047/476] fix: Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 354100f..4bfe9ba 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [Greynoise](misp_modules/modules/expansion/greynoise.py) - a hover to get information from greynoise. * [hashdd](misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. * [hibp](misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? -* [html_to_markdown](misp_modules/modules/expansion/html_to_markdown) - Simple HTML to markdown converter +* [html_to_markdown](misp_modules/modules/expansion/html_to_markdown.py) - Simple HTML to markdown converter * [intel471](misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). * [IPASN](misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. * [iprep](misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. From 08d648e2f43c76a301d65d8b1ccf331d9a3e512e Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 29 Oct 2020 18:29:04 +0100 Subject: [PATCH 048/476] fix: [documentation] Updated links to the scripts, with the default branch no longer being master, but main --- doc/README.md | 206 +++++++++++++++++----------------- doc/generate_documentation.py | 2 +- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/doc/README.md b/doc/README.md index dc81b6b..f89a589 100644 --- a/doc/README.md +++ b/doc/README.md @@ -2,7 +2,7 @@ ## Expansion Modules -#### [apiosintds](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/apiosintds.py) +#### [apiosintds](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/apiosintds.py) On demand query API for OSINT.digitalside.it project. - **features**: @@ -22,7 +22,7 @@ On demand query API for OSINT.digitalside.it project. ----- -#### [apivoid](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/apivoid.py) +#### [apivoid](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/apivoid.py) @@ -42,7 +42,7 @@ Module to query APIVoid with some domain attributes. ----- -#### [assemblyline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/assemblyline_query.py) +#### [assemblyline_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/assemblyline_query.py) @@ -64,7 +64,7 @@ A module tu query the AssemblyLine API with a submission ID to get the submissio ----- -#### [assemblyline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/assemblyline_submit.py) +#### [assemblyline_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/assemblyline_submit.py) @@ -84,7 +84,7 @@ A module to submit samples and URLs to AssemblyLine for advanced analysis, and r ----- -#### [backscatter_io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/backscatter_io.py) +#### [backscatter_io](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/backscatter_io.py) @@ -104,7 +104,7 @@ Query backscatter.io (https://backscatter.io/). ----- -#### [bgpranking](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/bgpranking.py) +#### [bgpranking](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/bgpranking.py) Query BGP Ranking (https://bgpranking-ng.circl.lu/). - **features**: @@ -122,7 +122,7 @@ Query BGP Ranking (https://bgpranking-ng.circl.lu/). ----- -#### [btc_scam_check](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_scam_check.py) +#### [btc_scam_check](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/btc_scam_check.py) @@ -140,7 +140,7 @@ An expansion hover module to query a special dns blacklist to check if a bitcoin ----- -#### [btc_steroids](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_steroids.py) +#### [btc_steroids](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/btc_steroids.py) @@ -152,7 +152,7 @@ An expansion hover module to get a blockchain balance from a BTC address in MISP ----- -#### [censys_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/censys_enrich.py) +#### [censys_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/censys_enrich.py) An expansion module to enrich attributes in MISP by quering the censys.io API - **features**: @@ -168,7 +168,7 @@ An expansion module to enrich attributes in MISP by quering the censys.io API ----- -#### [circl_passivedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivedns.py) +#### [circl_passivedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/circl_passivedns.py) @@ -188,7 +188,7 @@ Module to access CIRCL Passive DNS. ----- -#### [circl_passivessl](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivessl.py) +#### [circl_passivessl](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/circl_passivessl.py) @@ -208,7 +208,7 @@ Modules to access CIRCL Passive SSL. ----- -#### [countrycode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/countrycode.py) +#### [countrycode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/countrycode.py) Module to expand country codes. - **features**: @@ -222,7 +222,7 @@ Module to expand country codes. ----- -#### [crowdstrike_falcon](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/crowdstrike_falcon.py) +#### [crowdstrike_falcon](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/crowdstrike_falcon.py) @@ -276,7 +276,7 @@ Module to query Crowdstrike Falcon. ----- -#### [cuckoo_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cuckoo_submit.py) +#### [cuckoo_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cuckoo_submit.py) @@ -295,7 +295,7 @@ An expansion module to submit files and URLs to Cuckoo Sandbox. ----- -#### [cve](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve.py) +#### [cve](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cve.py) @@ -311,7 +311,7 @@ An expansion hover module to expand information about CVE id. ----- -#### [cve_advanced](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve_advanced.py) +#### [cve_advanced](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cve_advanced.py) @@ -331,7 +331,7 @@ An expansion module to query the CIRCL CVE search API for more information about ----- -#### [cytomic_orion](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cytomic_orion.py) +#### [cytomic_orion](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cytomic_orion.py) @@ -349,7 +349,7 @@ An expansion module to enrich attributes in MISP by quering the Cytomic Orion AP ----- -#### [dbl_spamhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dbl_spamhaus.py) +#### [dbl_spamhaus](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/dbl_spamhaus.py) @@ -371,7 +371,7 @@ Module to check Spamhaus DBL for a domain name. ----- -#### [dns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dns.py) +#### [dns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/dns.py) A simple DNS expansion service to resolve IP address from domain MISP attributes. - **features**: @@ -389,7 +389,7 @@ A simple DNS expansion service to resolve IP address from domain MISP attributes ----- -#### [docx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/docx_enrich.py) +#### [docx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/docx_enrich.py) @@ -405,7 +405,7 @@ Module to extract freetext from a .docx document. ----- -#### [domaintools](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/domaintools.py) +#### [domaintools](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/domaintools.py) @@ -442,7 +442,7 @@ DomainTools MISP expansion module. ----- -#### [eql](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/eql.py) +#### [eql](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/eql.py) @@ -458,7 +458,7 @@ EQL query generation for a MISP attribute. ----- -#### [eupi](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/eupi.py) +#### [eupi](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/eupi.py) @@ -478,7 +478,7 @@ A module to query the Phishing Initiative service (https://phishing-initiative.l ----- -#### [farsight_passivedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/farsight_passivedns.py) +#### [farsight_passivedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/farsight_passivedns.py) @@ -496,7 +496,7 @@ Module to access Farsight DNSDB Passive DNS. ----- -#### [geoip_asn](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_asn.py) +#### [geoip_asn](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_asn.py) - **descrption**: @@ -514,7 +514,7 @@ Module to access Farsight DNSDB Passive DNS. ----- -#### [geoip_city](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_city.py) +#### [geoip_city](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_city.py) @@ -532,7 +532,7 @@ An expansion module to query a local copy of Maxmind's Geolite database with an ----- -#### [geoip_country](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_country.py) +#### [geoip_country](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_country.py) @@ -552,7 +552,7 @@ Module to query a local copy of Maxmind's Geolite database. ----- -#### [google_search](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/google_search.py) +#### [google_search](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/google_search.py) - **descrption**: @@ -570,7 +570,7 @@ Module to query a local copy of Maxmind's Geolite database. ----- -#### [greynoise](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/greynoise.py) +#### [greynoise](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/greynoise.py) @@ -588,7 +588,7 @@ Module to access GreyNoise.io API ----- -#### [hashdd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hashdd.py) +#### [hashdd](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hashdd.py) A hover module to check hashes against hashdd.com including NSLR dataset. - **features**: @@ -602,7 +602,7 @@ A hover module to check hashes against hashdd.com including NSLR dataset. ----- -#### [hibp](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hibp.py) +#### [hibp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hibp.py) @@ -618,7 +618,7 @@ Module to access haveibeenpwned.com API. ----- -#### [html_to_markdown](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/html_to_markdown.py) +#### [html_to_markdown](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/html_to_markdown.py) Expansion module to fetch the html content from an url and convert it into markdown. - **features**: @@ -632,7 +632,7 @@ Expansion module to fetch the html content from an url and convert it into markd ----- -#### [intel471](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intel471.py) +#### [intel471](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/intel471.py) - **descrption**: @@ -663,7 +663,7 @@ Expansion module to fetch the html content from an url and convert it into markd ----- -#### [intelmq_eventdb](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intelmq_eventdb.py) +#### [intelmq_eventdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/intelmq_eventdb.py) @@ -683,7 +683,7 @@ Module to access intelmqs eventdb. ----- -#### [ipasn](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ipasn.py) +#### [ipasn](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ipasn.py) Module to query an IP ASN history service (https://github.com/D4-project/IPASN-History). - **features**: @@ -699,7 +699,7 @@ Module to query an IP ASN history service (https://github.com/D4-project/IPASN-H ----- -#### [iprep](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/iprep.py) +#### [iprep](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/iprep.py) Module to query IPRep data for IP addresses. - **features**: @@ -715,7 +715,7 @@ Module to query IPRep data for IP addresses. ----- -#### [joesandbox_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) +#### [joesandbox_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/joesandbox_query.py) @@ -741,7 +741,7 @@ This url can by the way come from the result of the [joesandbox_submit expansion ----- -#### [joesandbox_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_submit.py) +#### [joesandbox_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/joesandbox_submit.py) @@ -761,7 +761,7 @@ A module to submit files or URLs to Joe Sandbox for an advanced analysis, and re ----- -#### [lastline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_query.py) +#### [lastline_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/lastline_query.py) @@ -780,7 +780,7 @@ The analysis link can also be retrieved from the output of the [lastline_submit] ----- -#### [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) +#### [lastline_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/lastline_submit.py) @@ -797,7 +797,7 @@ Module to submit a file or URL to Lastline. ----- -#### [macaddress_io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macaddress_io.py) +#### [macaddress_io](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/macaddress_io.py) @@ -820,7 +820,7 @@ MISP hover module for macaddress.io ----- -#### [macvendors](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macvendors.py) +#### [macvendors](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/macvendors.py) @@ -836,7 +836,7 @@ Module to access Macvendors API. ----- -#### [malwarebazaar](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/malwarebazaar.py) +#### [malwarebazaar](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/malwarebazaar.py) Query the MALWAREbazaar API to get additional information about the input hash attribute. - **features**: @@ -852,7 +852,7 @@ Query the MALWAREbazaar API to get additional information about the input hash a ----- -#### [ocr_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ocr_enrich.py) +#### [ocr_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ocr_enrich.py) Module to process some optical character recognition on pictures. - **features**: @@ -866,7 +866,7 @@ Module to process some optical character recognition on pictures. ----- -#### [ods_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ods_enrich.py) +#### [ods_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ods_enrich.py) @@ -882,7 +882,7 @@ Module to extract freetext from a .ods document. ----- -#### [odt_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/odt_enrich.py) +#### [odt_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/odt_enrich.py) @@ -898,7 +898,7 @@ Module to extract freetext from a .odt document. ----- -#### [onyphe](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe.py) +#### [onyphe](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/onyphe.py) @@ -916,7 +916,7 @@ Module to process a query on Onyphe. ----- -#### [onyphe_full](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe_full.py) +#### [onyphe_full](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/onyphe_full.py) @@ -936,7 +936,7 @@ Module to process a full query on Onyphe. ----- -#### [otx](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/otx.py) +#### [otx](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/otx.py) @@ -971,7 +971,7 @@ Module to get information from AlienVault OTX. ----- -#### [passivetotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/passivetotal.py) +#### [passivetotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivetotal.py) @@ -1021,7 +1021,7 @@ Module to get information from AlienVault OTX. ----- -#### [pdf_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pdf_enrich.py) +#### [pdf_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/pdf_enrich.py) @@ -1037,7 +1037,7 @@ Module to extract freetext from a PDF document. ----- -#### [pptx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pptx_enrich.py) +#### [pptx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/pptx_enrich.py) @@ -1053,7 +1053,7 @@ Module to extract freetext from a .pptx document. ----- -#### [qrcode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/qrcode.py) +#### [qrcode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qrcode.py) Module to decode QR codes. - **features**: @@ -1067,7 +1067,7 @@ Module to decode QR codes. ----- -#### [ransomcoindb](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ransomcoindb.py) +#### [ransomcoindb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ransomcoindb.py) - **descrption**: >Module to access the ransomcoinDB with a hash or btc address attribute and get the associated btc address of hashes. - **features**: @@ -1085,7 +1085,7 @@ Module to decode QR codes. ----- -#### [rbl](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/rbl.py) +#### [rbl](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/rbl.py) Module to check an IPv4 address against known RBLs. - **features**: @@ -1103,7 +1103,7 @@ Module to check an IPv4 address against known RBLs. ----- -#### [recordedfuture](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/recordedfuture.py) +#### [recordedfuture](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/recordedfuture.py) @@ -1121,7 +1121,7 @@ Module to enrich attributes with threat intelligence from Recorded Future. ----- -#### [reversedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/reversedns.py) +#### [reversedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/reversedns.py) Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes. - **features**: @@ -1139,7 +1139,7 @@ Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes ----- -#### [securitytrails](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/securitytrails.py) +#### [securitytrails](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/securitytrails.py) @@ -1172,7 +1172,7 @@ An expansion modules for SecurityTrails. ----- -#### [shodan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/shodan.py) +#### [shodan](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/shodan.py) @@ -1190,7 +1190,7 @@ Module to query on Shodan. ----- -#### [sigma_queries](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_queries.py) +#### [sigma_queries](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sigma_queries.py) @@ -1208,7 +1208,7 @@ An expansion hover module to display the result of sigma queries. ----- -#### [sigma_syntax_validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_syntax_validator.py) +#### [sigma_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sigma_syntax_validator.py) @@ -1228,7 +1228,7 @@ An expansion hover module to perform a syntax check on sigma rules. ----- -#### [sophoslabs_intelix](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sophoslabs_intelix.py) +#### [sophoslabs_intelix](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sophoslabs_intelix.py) @@ -1246,7 +1246,7 @@ An expansion module to query the Sophoslabs intelix API to get additional inform ----- -#### [sourcecache](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sourcecache.py) +#### [sourcecache](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sourcecache.py) Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page. - **features**: @@ -1262,7 +1262,7 @@ Module to cache web pages of analysis reports, OSINT sources. The module returns ----- -#### [stix2_pattern_syntax_validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) +#### [stix2_pattern_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) @@ -1282,7 +1282,7 @@ An expansion hover module to perform a syntax check on stix2 patterns. ----- -#### [threatcrowd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatcrowd.py) +#### [threatcrowd](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/threatcrowd.py) @@ -1319,7 +1319,7 @@ Module to get information from ThreatCrowd. ----- -#### [threatminer](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatminer.py) +#### [threatminer](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/threatminer.py) @@ -1359,7 +1359,7 @@ Module to get information from ThreatMiner. ----- -#### [trustar_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/trustar_enrich.py) +#### [trustar_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/trustar_enrich.py) @@ -1388,7 +1388,7 @@ Module to get enrich indicators with TruSTAR. ----- -#### [urlhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlhaus.py) +#### [urlhaus](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/urlhaus.py) @@ -1406,7 +1406,7 @@ Query of the URLhaus API to get additional information about the input attribute ----- -#### [urlscan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlscan.py) +#### [urlscan](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/urlscan.py) @@ -1426,7 +1426,7 @@ An expansion module to query urlscan.io. ----- -#### [virustotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal.py) +#### [virustotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/virustotal.py) @@ -1450,7 +1450,7 @@ Module to get advanced information from virustotal. ----- -#### [virustotal_public](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal_public.py) +#### [virustotal_public](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/virustotal_public.py) @@ -1474,7 +1474,7 @@ Module to get information from VirusTotal. ----- -#### [vmray_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vmray_submit.py) +#### [vmray_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vmray_submit.py) @@ -1499,7 +1499,7 @@ Module to submit a sample to VMRay. ----- -#### [vulndb](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulndb.py) +#### [vulndb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulndb.py) @@ -1519,7 +1519,7 @@ Module to query VulnDB (RiskBasedSecurity.com). ----- -#### [vulners](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulners.py) +#### [vulners](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulners.py) @@ -1539,7 +1539,7 @@ An expansion hover module to expand information about CVE id using Vulners API. ----- -#### [whois](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/whois.py) +#### [whois](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/whois.py) Module to query a local instance of uwhois (https://github.com/rafiot/uwhoisd). - **features**: @@ -1555,7 +1555,7 @@ Module to query a local instance of uwhois (https://github.com/rafiot/uwhoisd). ----- -#### [wiki](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/wiki.py) +#### [wiki](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/wiki.py) @@ -1573,7 +1573,7 @@ An expansion hover module to extract information from Wikidata to have additiona ----- -#### [xforceexchange](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xforceexchange.py) +#### [xforceexchange](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/xforceexchange.py) @@ -1597,7 +1597,7 @@ An expansion module for IBM X-Force Exchange. ----- -#### [xlsx_enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xlsx_enrich.py) +#### [xlsx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/xlsx_enrich.py) @@ -1613,7 +1613,7 @@ Module to extract freetext from a .xlsx document. ----- -#### [yara_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_query.py) +#### [yara_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yara_query.py) @@ -1632,7 +1632,7 @@ An expansion & hover module to translate any hash attribute into a yara rule. ----- -#### [yara_syntax_validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_syntax_validator.py) +#### [yara_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yara_syntax_validator.py) @@ -1652,7 +1652,7 @@ An expansion hover module to perform a syntax check on if yara rules are valid o ## Export Modules -#### [cef_export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cef_export.py) +#### [cef_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cef_export.py) Module to export a MISP event in CEF format. - **features**: @@ -1667,7 +1667,7 @@ Module to export a MISP event in CEF format. ----- -#### [cisco_firesight_manager_ACL_rule_export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cisco_firesight_manager_ACL_rule_export.py) +#### [cisco_firesight_manager_ACL_rule_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cisco_firesight_manager_ACL_rule_export.py) @@ -1683,7 +1683,7 @@ Module to export malicious network activity attributes to Cisco fireSIGHT manage ----- -#### [goamlexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/goamlexport.py) +#### [goamlexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/goamlexport.py) @@ -1718,7 +1718,7 @@ This module is used to export MISP events containing transaction objects into Go ----- -#### [liteexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/liteexport.py) +#### [liteexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/liteexport.py) Lite export of a MISP event. - **features**: @@ -1730,7 +1730,7 @@ Lite export of a MISP event. ----- -#### [mass_eql_export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/mass_eql_export.py) +#### [mass_eql_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/mass_eql_export.py) @@ -1746,7 +1746,7 @@ Mass EQL query export for a MISP event. ----- -#### [nexthinkexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/nexthinkexport.py) +#### [nexthinkexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/nexthinkexport.py) @@ -1762,7 +1762,7 @@ Nexthink NXQL query export module ----- -#### [osqueryexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/osqueryexport.py) +#### [osqueryexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/osqueryexport.py) @@ -1776,7 +1776,7 @@ OSQuery export of a MISP event. ----- -#### [pdfexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/pdfexport.py) +#### [pdfexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/pdfexport.py) Simple export of a MISP event to PDF. - **features**: @@ -1798,13 +1798,13 @@ Simple export of a MISP event to PDF. ----- -#### [testexport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/testexport.py) +#### [testexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/testexport.py) Skeleton export module. ----- -#### [threatStream_misp_export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threatStream_misp_export.py) +#### [threatStream_misp_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/threatStream_misp_export.py) @@ -1822,7 +1822,7 @@ Module to export a structured CSV file for uploading to threatStream. ----- -#### [threat_connect_export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threat_connect_export.py) +#### [threat_connect_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/threat_connect_export.py) @@ -1841,7 +1841,7 @@ Module to export a structured CSV file for uploading to ThreatConnect. ----- -#### [vt_graph](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/vt_graph.py) +#### [vt_graph](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/vt_graph.py) @@ -1863,7 +1863,7 @@ This module is used to create a VirusTotal Graph from a MISP event. ## Import Modules -#### [csvimport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/csvimport.py) +#### [csvimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/csvimport.py) Module to import MISP attributes from a csv file. - **features**: @@ -1883,7 +1883,7 @@ Module to import MISP attributes from a csv file. ----- -#### [cuckooimport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/cuckooimport.py) +#### [cuckooimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/cuckooimport.py) @@ -1899,7 +1899,7 @@ Module to import Cuckoo JSON. ----- -#### [email_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/email_import.py) +#### [email_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/email_import.py) Module to import emails in MISP. - **features**: @@ -1912,7 +1912,7 @@ Module to import emails in MISP. ----- -#### [goamlimport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/goamlimport.py) +#### [goamlimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/goamlimport.py) @@ -1930,7 +1930,7 @@ Module to import MISP objects about financial transactions from GoAML files. ----- -#### [joe_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/joe_import.py) +#### [joe_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/joe_import.py) @@ -1950,7 +1950,7 @@ A module to import data from a Joe Sandbox analysis json report. ----- -#### [lastline_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/lastline_import.py) +#### [lastline_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/lastline_import.py) @@ -1968,7 +1968,7 @@ Module to import and parse reports from Lastline analysis links. ----- -#### [mispjson](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/mispjson.py) +#### [mispjson](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/mispjson.py) Module to import MISP JSON format for merging MISP events. - **features**: @@ -1980,7 +1980,7 @@ Module to import MISP JSON format for merging MISP events. ----- -#### [ocr](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/ocr.py) +#### [ocr](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/ocr.py) Optical Character Recognition (OCR) module for MISP. - **features**: @@ -1992,7 +1992,7 @@ Optical Character Recognition (OCR) module for MISP. ----- -#### [openiocimport](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/openiocimport.py) +#### [openiocimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/openiocimport.py) Module to import OpenIOC packages. - **features**: @@ -2008,7 +2008,7 @@ Module to import OpenIOC packages. ----- -#### [threatanalyzer_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/threatanalyzer_import.py) +#### [threatanalyzer_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/threatanalyzer_import.py) Module to import ThreatAnalyzer archive.zip / analysis.json files. - **features**: @@ -2023,7 +2023,7 @@ Module to import ThreatAnalyzer archive.zip / analysis.json files. ----- -#### [vmray_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/vmray_import.py) +#### [vmray_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/vmray_import.py) diff --git a/doc/generate_documentation.py b/doc/generate_documentation.py index f86b5a7..e7defa1 100644 --- a/doc/generate_documentation.py +++ b/doc/generate_documentation.py @@ -5,7 +5,7 @@ import json module_types = ['expansion', 'export_mod', 'import_mod'] titles = ['Expansion Modules', 'Export Modules', 'Import Modules'] markdown = ["# MISP modules documentation\n"] -githublink = 'https://github.com/MISP/misp-modules/tree/master/misp_modules/modules' +githublink = 'https://github.com/MISP/misp-modules/tree/main/misp_modules/modules' def generate_doc(root_path): From 260bddb3cf4f8488521ee89cb2414eed48b97e1c Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 2 Nov 2020 19:03:26 +0100 Subject: [PATCH 049/476] chg: [cpe] Changed CVE-Search API default url --- misp_modules/modules/expansion/cpe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index 8ea0f65..cd5e5fe 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -12,7 +12,7 @@ moduleinfo = { 'module-type': ['expansion', 'hover'] } moduleconfig = ["custom_API_URL", "limit"] -cveapi_url = 'https://cve.circl.lu/api/cvefor/' +cveapi_url = 'https://cvepremium.circl.lu/api/cvefor/' class VulnerabilitiesParser(): From d9e576e6059cca1ae1a45041ea2cc6308a99f52d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 3 Nov 2020 19:30:09 +0100 Subject: [PATCH 050/476] chg: [farsight_passivedns] Rework of the module to return MISP objects - All the results are parsed as passive-dns MISP objects - More love to give to the parsing to add references between the passive-dns objects and the input attribute, depending on the type of the query (rrset or rdata), or the rrtype (to be determined) --- .../modules/expansion/farsight_passivedns.py | 133 ++++++++++++------ 1 file changed, 92 insertions(+), 41 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 5d32ea8..30a7e9c 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -1,15 +1,76 @@ import json -from ._dnsdb_query.dnsdb_query import DnsdbClient, QueryError - +from ._dnsdb_query.dnsdb_query import DEFAULT_DNSDB_SERVER, DnsdbClient, QueryError +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['hostname', 'domain', 'ip-src', 'ip-dst'], 'output': ['freetext']} -moduleinfo = {'version': '0.1', 'author': 'Christophe Vandeplas', 'description': 'Module to access Farsight DNSDB Passive DNS', 'module-type': ['expansion', 'hover']} -moduleconfig = ['apikey'] +mispattributes = { + 'input': ['hostname', 'domain', 'ip-src', 'ip-dst']#, + # 'format': 'misp_standard' +} +moduleinfo = { + 'version': '0.2', + 'author': 'Christophe Vandeplas', + 'description': 'Module to access Farsight DNSDB Passive DNS', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ['apikey', 'server', 'limit'] -server = 'https://api.dnsdb.info' +DEFAULT_LIMIT = 10 -# TODO return a MISP object with the different attributes + +class FarsightDnsdbParser(): + def __init__(self, attribute): + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.passivedns_mapping = { + 'bailiwick': {'type': 'text', 'object_relation': 'bailiwick'}, + 'count': {'type': 'counter', 'object_relation': 'count'}, + 'rdata': {'type': 'text', 'object_relation': 'rdata'}, + 'rrname': {'type': 'text', 'object_relation': 'rrname'}, + 'rrtype': {'type': 'text', 'object_relation': 'rrtype'}, + 'time_first': {'type': 'datetime', 'object_relation': 'time_first'}, + 'time_last': {'type': 'datetime', 'object_relation': 'time_last'}, + 'zone_time_first': {'type': 'datetime', 'object_relation': 'zone_time_first'}, + 'zone_time_last': {'type': 'datetime', 'object_relation': 'zone_time_last'} + } + + def parse_passivedns_results(self, query_response): + default_fields = ('count', 'rrname', 'rrname') + optional_fields = ( + 'bailiwick', + 'time_first', + 'time_last', + 'zone_time_first', + 'zone_time_last' + ) + for result in query_response: + passivedns_object = MISPObject('passive-dns') + for feature in default_fields: + passivedns_object.add_attribute(**self._parse_attribute(feature, result[feature])) + for feature in optional_fields: + if result.get(feature): + passivedns_object.add_attribute(**self._parse_attribute( + feature, + result[feature] + )) + if isinstance(result['rdata'], list): + for rdata in result['rdata']: + passivedns_object.add_attribute(**self._parse_attribute('rdata', rdata)) + else: + passivedns_object.add_attribute(**self._parse_attribute('rdata', result['rdata'])) + self.misp_event.add_object(passivedns_object) + + def get_results(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} + + def _parse_attribute(self, feature, value): + attribute = {'value': value} + attribute.update(self.passivedns_mapping[feature]) + return attribute def handler(q=False): @@ -19,56 +80,46 @@ def handler(q=False): if not request.get('config') or not request['config'].get('apikey'): misperrors['error'] = 'Farsight DNSDB apikey is missing' return misperrors - client = DnsdbClient(server, request['config']['apikey']) - if request.get('hostname'): - res = lookup_name(client, request['hostname']) - elif request.get('domain'): - res = lookup_name(client, request['domain']) - elif request.get('ip-src'): - res = lookup_ip(client, request['ip-src']) - elif request.get('ip-dst'): - res = lookup_ip(client, request['ip-dst']) - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors - - out = '' - for v in set(res): # uniquify entries - out = out + "{} ".format(v) - r = {'results': [{'types': mispattributes['output'], 'values': out}]} - return r + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attributes type'} + config = request['config'] + args = {'apikey': config['apikey']} + for feature, default in zip(('server', 'limit'), (DEFAULT_DNSDB_SERVER, DEFAULT_LIMIT)): + args[feature] = config[feature] if config.get(feature) else default + client = DnsdbClient(**args) + to_query = lookup_ip if attribute['type'] in ('ip-src', 'ip-dst') else lookup_name + response = to_query(client, attribute['value']) + if not response: + return {'error': f"Empty results on Farsight DNSDB for the queries {attribute['type']}: {attribute['value']}."} + parser = FarsightDnsdbParser(attribute) + parser.parse_passivedns_results(response) + return parser.get_results() def lookup_name(client, name): try: res = client.query_rrset(name) # RRSET = entries in the left-hand side of the domain name related labels - for item in res: - if item.get('rrtype') in ['A', 'AAAA', 'CNAME']: - for i in item.get('rdata'): - yield(i.rstrip('.')) - if item.get('rrtype') in ['SOA']: - for i in item.get('rdata'): - # grab email field and replace first dot by @ to convert to an email address - yield(i.split(' ')[1].rstrip('.').replace('.', '@', 1)) + response = list(res) except QueryError: - pass - + response = [] try: res = client.query_rdata_name(name) # RDATA = entries on the right-hand side of the domain name related labels - for item in res: - if item.get('rrtype') in ['A', 'AAAA', 'CNAME']: - yield(item.get('rrname').rstrip('.')) + response.extend(list(res)) except QueryError: pass + return response def lookup_ip(client, ip): try: res = client.query_rdata_ip(ip) - for item in res: - yield(item['rrname'].rstrip('.')) + response = list(res) except QueryError: - pass + response = [] + return response def introspection(): From 7c5465e02bec3ebd311c24c3aeb3583a28191ec7 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 4 Nov 2020 18:36:06 +0100 Subject: [PATCH 051/476] fix: [dnsdb] Avoiding AttributeError with the sys library, probably depending on the python version --- misp_modules/modules/expansion/_dnsdb_query/dnsdb_query.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/_dnsdb_query/dnsdb_query.py b/misp_modules/modules/expansion/_dnsdb_query/dnsdb_query.py index af3f204..5df1207 100755 --- a/misp_modules/modules/expansion/_dnsdb_query/dnsdb_query.py +++ b/misp_modules/modules/expansion/_dnsdb_query/dnsdb_query.py @@ -119,7 +119,10 @@ class DnsdbClient(object): break yield json.loads(line.decode('ascii')) except (HTTPError, URLError) as e: - raise QueryError(str(e), sys.exc_traceback) + try: + raise QueryError(str(e), sys.exc_traceback) + except AttributeError: + raise QueryError(str(e), sys.exc_info) def quote(path): From c0440a0d3304a3a945709175987886f3cbe98930 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 4 Nov 2020 18:37:57 +0100 Subject: [PATCH 052/476] chg: [farsight_passivedns] More context added to the results - References between the passive-dns objects and the initial attribute - Comment on object attributes mentioning whether the results come from an rrset or an rdata lookup --- .../modules/expansion/farsight_passivedns.py | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 30a7e9c..7dd47a5 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -35,6 +35,13 @@ class FarsightDnsdbParser(): 'zone_time_first': {'type': 'datetime', 'object_relation': 'zone_time_first'}, 'zone_time_last': {'type': 'datetime', 'object_relation': 'zone_time_last'} } + self.type_to_feature = { + 'domain': 'domain name', + 'hostname': 'hostname', + 'ip-src': 'IP address', + 'ip-dst': 'IP address' + } + self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): default_fields = ('count', 'rrname', 'rrname') @@ -45,30 +52,30 @@ class FarsightDnsdbParser(): 'zone_time_first', 'zone_time_last' ) - for result in query_response: - passivedns_object = MISPObject('passive-dns') - for feature in default_fields: - passivedns_object.add_attribute(**self._parse_attribute(feature, result[feature])) - for feature in optional_fields: - if result.get(feature): - passivedns_object.add_attribute(**self._parse_attribute( - feature, - result[feature] - )) - if isinstance(result['rdata'], list): - for rdata in result['rdata']: - passivedns_object.add_attribute(**self._parse_attribute('rdata', rdata)) - else: - passivedns_object.add_attribute(**self._parse_attribute('rdata', result['rdata'])) - self.misp_event.add_object(passivedns_object) + for query_type, results in query_response.items(): + comment = self.comment % (query_type, self.type_to_feature[self.attribute['type']], self.attribute['value']) + for result in results: + passivedns_object = MISPObject('passive-dns') + for feature in default_fields: + passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) + for feature in optional_fields: + if result.get(feature): + passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) + if isinstance(result['rdata'], list): + for rdata in result['rdata']: + passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) + else: + passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', result['rdata'])) + passivedns_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(passivedns_object) def get_results(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} return {'results': results} - def _parse_attribute(self, feature, value): - attribute = {'value': value} + def _parse_attribute(self, comment, feature, value): + attribute = {'value': value, 'comment': comment} attribute.update(self.passivedns_mapping[feature]) return attribute @@ -100,14 +107,15 @@ def handler(q=False): def lookup_name(client, name): + response = {} try: res = client.query_rrset(name) # RRSET = entries in the left-hand side of the domain name related labels - response = list(res) + response['rrset'] = list(res) except QueryError: - response = [] + pass try: res = client.query_rdata_name(name) # RDATA = entries on the right-hand side of the domain name related labels - response.extend(list(res)) + response['rdata'] = list(res) except QueryError: pass return response @@ -116,9 +124,9 @@ def lookup_name(client, name): def lookup_ip(client, ip): try: res = client.query_rdata_ip(ip) - response = list(res) + response = {'rdata': list(res)} except QueryError: - response = [] + response = {} return response From a357243d314ca3cb7a288e3e0ad441da7b793f62 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 5 Nov 2020 13:06:08 +0100 Subject: [PATCH 053/476] chg: [doc] Updated the farsight_passivedns module documentation --- doc/README.md | 11 ++++++++--- doc/expansion/farsight_passivedns.json | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/README.md b/doc/README.md index f2acc42..3b2bceb 100644 --- a/doc/README.md +++ b/doc/README.md @@ -505,13 +505,18 @@ A module to query the Phishing Initiative service (https://phishing-initiative.l Module to access Farsight DNSDB Passive DNS. - **features**: ->This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. The API returns then the result of the query with some information about the value queried. +>This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. +> The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. +> +>An API key is required to submit queries to the API. +> It is also possible to define a custom server URL, and to set a limit of results to get. +> This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). - **input**: >A domain, hostname or IP address MISP attribute. - **output**: ->Text containing information about the input, resulting from the query on the Farsight Passive DNS API. +>Passive-dns objects, resulting from the query on the Farsight Passive DNS API. - **references**: ->https://www.farsightsecurity.com/ +>https://www.farsightsecurity.com/, https://docs.dnsdb.info/dnsdb-api/ - **requirements**: >An access to the Farsight Passive DNS API (apikey) diff --git a/doc/expansion/farsight_passivedns.json b/doc/expansion/farsight_passivedns.json index 2c1bf05..2dbc64e 100644 --- a/doc/expansion/farsight_passivedns.json +++ b/doc/expansion/farsight_passivedns.json @@ -3,7 +3,7 @@ "logo": "logos/farsight.png", "requirements": ["An access to the Farsight Passive DNS API (apikey)"], "input": "A domain, hostname or IP address MISP attribute.", - "output": "Text containing information about the input, resulting from the query on the Farsight Passive DNS API.", - "references": ["https://www.farsightsecurity.com/"], - "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. The API returns then the result of the query with some information about the value queried." + "output": "Passive-dns objects, resulting from the query on the Farsight Passive DNS API.", + "references": ["https://www.farsightsecurity.com/", "https://docs.dnsdb.info/dnsdb-api/"], + "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API.\n The results of rdata and rrset lookups are then returned and parsed into passive-dns objects.\n\nAn API key is required to submit queries to the API.\n It is also possible to define a custom server URL, and to set a limit of results to get.\n This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit)." } From 87db6f04aa8c443bfae9dc68e521c836af4f119d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 5 Nov 2020 15:56:01 +0100 Subject: [PATCH 054/476] fix: [tests] Small fixes on the expansion tests --- tests/test_expansions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 1aa0f7a..eb29332 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -221,7 +221,7 @@ class TestExpansions(unittest.TestCase): try: self.assertIn(result, self.get_values(response)) except Exception: - self.assertTrue(self.get_errors(response).startwith('Something went wrong')) + self.assertTrue(self.get_errors(response).startswith('Something went wrong')) else: query = {"module": module_name, "ip-src": "8.8.8.8"} response = self.misp_modules_post(query) @@ -285,7 +285,7 @@ class TestExpansions(unittest.TestCase): encoded = b64encode(f.read()).decode() query = {"module": "ocr_enrich", "attachment": filename, "data": encoded} response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), 'Threat Sharing') + self.assertEqual(self.get_values(response).strip('\n'), 'Threat Sharing') def test_ods(self): filename = 'test.ods' From d9cfcf8f62fcf849557c4864d04596809ed792de Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 5 Nov 2020 17:51:41 +0100 Subject: [PATCH 055/476] fix: [farsight_passivedns] Uncommented mandatory field that was commented for tests --- misp_modules/modules/expansion/farsight_passivedns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 7dd47a5..a338bfb 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -5,8 +5,8 @@ from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = { - 'input': ['hostname', 'domain', 'ip-src', 'ip-dst']#, - # 'format': 'misp_standard' + 'input': ['hostname', 'domain', 'ip-src', 'ip-dst'], + 'format': 'misp_standard' } moduleinfo = { 'version': '0.2', From b98562a75eef61aabcc5aa84a00de21682bdc878 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 10 Nov 2020 17:53:47 +0100 Subject: [PATCH 056/476] chg: [cpe] Support of the new CVE-Search API --- misp_modules/modules/expansion/cpe.py | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index cd5e5fe..bf6f7b6 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -6,19 +6,18 @@ from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['cpe'], 'format': 'misp_standard'} moduleinfo = { - 'version': '1', + 'version': '2', 'author': 'Christian Studer', 'description': 'An expansion module to enrich a CPE attribute with its related vulnerabilities.', 'module-type': ['expansion', 'hover'] } moduleconfig = ["custom_API_URL", "limit"] -cveapi_url = 'https://cvepremium.circl.lu/api/cvefor/' +cveapi_url = 'https://cvepremium.circl.lu/api/query' class VulnerabilitiesParser(): - def __init__(self, attribute, api_url): + def __init__(self, attribute): self.attribute = attribute - self.api_url = api_url self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) self.vulnerability_mapping = { @@ -100,18 +99,27 @@ def handler(q=False): attribute = request['attribute'] if attribute.get('type') != 'cpe': return {'error': 'Wrong input attribute type.'} - api_url = check_url(request['config']['custom_API_URL']) if request['config'].get('custom_API_URL') else cveapi_url - url = f"{api_url}{attribute['value']}" + url = check_url(request['config']['custom_API_URL']) if request['config'].get('custom_API_URL') else cveapi_url + params = { + "retrieve": "cves", + "dict_filter": { + "vulnerable_configuration": attribute['value'] + } + } if request['config'].get('limit'): - url = f"{url}/{request['config']['limit']}" - response = requests.get(url) + params.update({ + "limit": int(request['config']['limit']), + "sort": "cvss", + "sort_dir": "DESC" + }) + response = requests.post(url, json=params) if response.status_code == 200: - vulnerabilities = response.json() + vulnerabilities = response.json()['data'] if not vulnerabilities: return {'error': 'No related vulnerability for this CPE.'} else: return {'error': 'API not accessible.'} - parser = VulnerabilitiesParser(attribute, api_url) + parser = VulnerabilitiesParser(attribute) parser.parse_vulnerabilities(vulnerabilities) return parser.get_result() From 0650126d6a8117efb03ff9ae2c3f21d1911a442d Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Tue, 10 Nov 2020 17:20:03 -0800 Subject: [PATCH 057/476] fixed typo causing firstSeen and lastSeen to not be pulled from enrichment data --- misp_modules/modules/expansion/trustar_enrich.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index ab472af..1724441 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -39,7 +39,7 @@ class TruSTARParser: # Relevant fields from each TruSTAR endpoint SUMMARY_FIELDS = ["severityLevel", "source", "score", "attributes"] - METADATA_FIELDS = ["sightings", "first_seen", "last_seen", "tags"] + METADATA_FIELDS = ["sightings", "firstSeen", "lastSeen", "tags"] REPORT_BASE_URL = "https://station.trustar.co/constellation/reports/{}" From fe010782f39ed71691c658a4012bdc5d029103b4 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 12 Nov 2020 16:01:14 +0100 Subject: [PATCH 058/476] chg: [farsight_passivedns] Now using the dnsdb2 python library - Also updated the results parsing to check in each returned result for every field if they are included, to avoid key errors if any field is missing --- .../modules/expansion/farsight_passivedns.py | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index a338bfb..4095211 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -1,5 +1,5 @@ +import dnsdb2 import json -from ._dnsdb_query.dnsdb_query import DEFAULT_DNSDB_SERVER, DnsdbClient, QueryError from . import check_input_attribute, standard_error_message from pymisp import MISPEvent, MISPObject @@ -9,13 +9,14 @@ mispattributes = { 'format': 'misp_standard' } moduleinfo = { - 'version': '0.2', + 'version': '0.3', 'author': 'Christophe Vandeplas', 'description': 'Module to access Farsight DNSDB Passive DNS', 'module-type': ['expansion', 'hover'] } moduleconfig = ['apikey', 'server', 'limit'] +DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 @@ -44,8 +45,10 @@ class FarsightDnsdbParser(): self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): - default_fields = ('count', 'rrname', 'rrname') - optional_fields = ( + lookup_fields = ( + 'count', + 'rrname', + 'rrname', 'bailiwick', 'time_first', 'time_last', @@ -56,16 +59,15 @@ class FarsightDnsdbParser(): comment = self.comment % (query_type, self.type_to_feature[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') - for feature in default_fields: - passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) - for feature in optional_fields: + for feature in lookup_fields: if result.get(feature): passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) - if isinstance(result['rdata'], list): - for rdata in result['rdata']: - passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) - else: - passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', result['rdata'])) + if result.get('rdata'): + if isinstance(result['rdata'], list): + for rdata in result['rdata']: + passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) + else: + passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', result['rdata'])) passivedns_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(passivedns_object) @@ -93,12 +95,21 @@ def handler(q=False): if attribute['type'] not in mispattributes['input']: return {'error': 'Unsupported attributes type'} config = request['config'] - args = {'apikey': config['apikey']} - for feature, default in zip(('server', 'limit'), (DEFAULT_DNSDB_SERVER, DEFAULT_LIMIT)): - args[feature] = config[feature] if config.get(feature) else default - client = DnsdbClient(**args) + if config.get('server') is None: + config['server'] = DEFAULT_DNSDB_SERVER + client_args = {feature: config[feature] for feature in ('apikey', 'server')} + client = dnsdb2.Client(**client_args) + if config.get('limit') is None: + config['limit'] = DEFAULT_LIMIT + lookup_args = { + 'limit': config['limit'], + 'offset': 0, + 'ignore_limited': True + } to_query = lookup_ip if attribute['type'] in ('ip-src', 'ip-dst') else lookup_name - response = to_query(client, attribute['value']) + response = to_query(client, attribute['value'], lookup_args) + if not isinstance(response, dict): + return {'error': response} if not response: return {'error': f"Empty results on Farsight DNSDB for the queries {attribute['type']}: {attribute['value']}."} parser = FarsightDnsdbParser(attribute) @@ -106,27 +117,29 @@ def handler(q=False): return parser.get_results() -def lookup_name(client, name): +def lookup_name(client, name, lookup_args): response = {} try: - res = client.query_rrset(name) # RRSET = entries in the left-hand side of the domain name related labels + # RRSET = entries in the left-hand side of the domain name related labels + res = client.lookup_rrset(name, **lookup_args) response['rrset'] = list(res) - except QueryError: - pass + except dnsdb2.DnsdbException as e: + return e try: - res = client.query_rdata_name(name) # RDATA = entries on the right-hand side of the domain name related labels + # RDATA = entries on the right-hand side of the domain name related labels + res = client.lookup_rdata_name(name, **lookup_args) response['rdata'] = list(res) - except QueryError: - pass + except dnsdb2.DnsdbException as e: + return e return response -def lookup_ip(client, ip): +def lookup_ip(client, ip, lookup_args): try: - res = client.query_rdata_ip(ip) + res = client.lookup_rdata_ip(ip, **lookup_args) response = {'rdata': list(res)} - except QueryError: - response = {} + except dnsdb2.DnsdbException as e: + return e return response From 3f863e4437032b60be51ba1ba7fb74aca321eeff Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 13 Nov 2020 15:28:10 +0100 Subject: [PATCH 059/476] fix: [farsight_passivedns] Fixed typo in the lookup fields --- misp_modules/modules/expansion/farsight_passivedns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 4095211..3e6ad76 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -48,7 +48,7 @@ class FarsightDnsdbParser(): lookup_fields = ( 'count', 'rrname', - 'rrname', + 'rrtype', 'bailiwick', 'time_first', 'time_last', From bd3fa3ea07d73b60519c5df2b85e7360518cc413 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 13 Nov 2020 15:46:41 +0100 Subject: [PATCH 060/476] chg: [cpe] Added default limit to the results - Results returned by CVE-search are sorted by cvss score and limited in number to avoid potential massive amount of data retuned back to MISP. - Users can overwrite the default limit with the configuration already present as optional, and can also set the limit to 0 to get the full list of results --- misp_modules/modules/expansion/cpe.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index bf6f7b6..83cbc46 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -13,6 +13,7 @@ moduleinfo = { } moduleconfig = ["custom_API_URL", "limit"] cveapi_url = 'https://cvepremium.circl.lu/api/query' +DEFAULT_LIMIT = 10 class VulnerabilitiesParser(): @@ -99,19 +100,18 @@ def handler(q=False): attribute = request['attribute'] if attribute.get('type') != 'cpe': return {'error': 'Wrong input attribute type.'} - url = check_url(request['config']['custom_API_URL']) if request['config'].get('custom_API_URL') else cveapi_url + config = request['config'] + url = check_url(config['custom_API_URL']) if config.get('custom_API_URL') else cveapi_url + limit = int(config['limit']) if config.get('limit') else DEFAULT_LIMIT params = { "retrieve": "cves", "dict_filter": { "vulnerable_configuration": attribute['value'] - } + }, + "limit": limit, + "sort": "cvss", + "sort_dir": "DESC" } - if request['config'].get('limit'): - params.update({ - "limit": int(request['config']['limit']), - "sort": "cvss", - "sort_dir": "DESC" - }) response = requests.post(url, json=params) if response.status_code == 200: vulnerabilities = response.json()['data'] From 32c0bf9ae28c3b0a5df16b458d5a0f6dd983491f Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 13 Nov 2020 15:49:58 +0100 Subject: [PATCH 061/476] fix: [cpe] Fixed typo in vulnerable-configuration object relation fields --- misp_modules/modules/expansion/cpe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/cpe.py b/misp_modules/modules/expansion/cpe.py index 83cbc46..600ff37 100644 --- a/misp_modules/modules/expansion/cpe.py +++ b/misp_modules/modules/expansion/cpe.py @@ -32,11 +32,11 @@ class VulnerabilitiesParser(): }, 'vulnerable_configuration': { 'type': 'cpe', - 'object_relation': 'vulnerable_configuration' + 'object_relation': 'vulnerable-configuration' }, 'vulnerable_configuration_cpe_2_2': { 'type': 'cpe', - 'object_relation': 'vulnerable_configuration' + 'object_relation': 'vulnerable-configuration' }, 'Modified': { 'type': 'datetime', From dfec0e5cf457a7b95eb6cdb60dd462501a31e59d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 13 Nov 2020 20:38:02 +0100 Subject: [PATCH 062/476] add: [farsight-passivedns] Optional feature to submit flex queries - The rrset and rdata queries remain the same but with the parameter `flex_queries`, users can also get the results of the flex rrnames & flex rdata regex queries about their domain, hostname or ip address - Results can thus include passive-dns objects containing the `raw_rdata` object_relation added with 0a3e948 --- .../modules/expansion/farsight_passivedns.py | 99 ++++++++++--------- 1 file changed, 53 insertions(+), 46 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 3e6ad76..b20aaff 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -9,12 +9,12 @@ mispattributes = { 'format': 'misp_standard' } moduleinfo = { - 'version': '0.3', + 'version': '0.4', 'author': 'Christophe Vandeplas', 'description': 'Module to access Farsight DNSDB Passive DNS', 'module-type': ['expansion', 'hover'] } -moduleconfig = ['apikey', 'server', 'limit'] +moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 @@ -28,6 +28,7 @@ class FarsightDnsdbParser(): self.passivedns_mapping = { 'bailiwick': {'type': 'text', 'object_relation': 'bailiwick'}, 'count': {'type': 'counter', 'object_relation': 'count'}, + 'raw_rdata': {'type': 'text', 'object_relation': 'raw_rdata'}, 'rdata': {'type': 'text', 'object_relation': 'rdata'}, 'rrname': {'type': 'text', 'object_relation': 'rrname'}, 'rrtype': {'type': 'text', 'object_relation': 'rrtype'}, @@ -45,29 +46,15 @@ class FarsightDnsdbParser(): self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): - lookup_fields = ( - 'count', - 'rrname', - 'rrtype', - 'bailiwick', - 'time_first', - 'time_last', - 'zone_time_first', - 'zone_time_last' - ) for query_type, results in query_response.items(): comment = self.comment % (query_type, self.type_to_feature[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') - for feature in lookup_fields: - if result.get(feature): - passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) - if result.get('rdata'): - if isinstance(result['rdata'], list): - for rdata in result['rdata']: - passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) - else: - passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', result['rdata'])) + if result.get('rdata') and isinstance(result['rdata'], list): + for rdata in result.pop('rdata'): + passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) + for feature, value in result.items(): + passivedns_object.add_attribute(**self._parse_attribute(comment, feature, value)) passivedns_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(passivedns_object) @@ -95,11 +82,12 @@ def handler(q=False): if attribute['type'] not in mispattributes['input']: return {'error': 'Unsupported attributes type'} config = request['config'] - if config.get('server') is None: + if not config.get('server'): config['server'] = DEFAULT_DNSDB_SERVER client_args = {feature: config[feature] for feature in ('apikey', 'server')} client = dnsdb2.Client(**client_args) - if config.get('limit') is None: + flex = add_flex_queries(config.get('flex_queries')) + if not config.get('limit'): config['limit'] = DEFAULT_LIMIT lookup_args = { 'limit': config['limit'], @@ -107,39 +95,58 @@ def handler(q=False): 'ignore_limited': True } to_query = lookup_ip if attribute['type'] in ('ip-src', 'ip-dst') else lookup_name - response = to_query(client, attribute['value'], lookup_args) - if not isinstance(response, dict): - return {'error': response} + try: + response = to_query(client, attribute['value'], lookup_args, flex) + except dnsdb2.DnsdbException as e: + return {'error': e.__str__()} if not response: - return {'error': f"Empty results on Farsight DNSDB for the queries {attribute['type']}: {attribute['value']}."} + return {'error': f"Empty results on Farsight DNSDB for the {self.type_to_feature[attribute['type']]}: {attribute['value']}."} parser = FarsightDnsdbParser(attribute) parser.parse_passivedns_results(response) return parser.get_results() -def lookup_name(client, name, lookup_args): +def add_flex_queries(flex): + if not flex: + return False + if flex in ('True', 'true', True, '1', 1): + return True + return False + + +def flex_queries(client, name, lookup_args): response = {} - try: - # RRSET = entries in the left-hand side of the domain name related labels - res = client.lookup_rrset(name, **lookup_args) - response['rrset'] = list(res) - except dnsdb2.DnsdbException as e: - return e - try: - # RDATA = entries on the right-hand side of the domain name related labels - res = client.lookup_rdata_name(name, **lookup_args) - response['rdata'] = list(res) - except dnsdb2.DnsdbException as e: - return e + rdata = list(client.flex_rdata_regex(name.replace('.', '\.'), **lookup_args)) + if rdata: + response['flex_rdata'] = rdata + rrnames = list(client.flex_rrnames_regex(name.replace('.', '\.'), **lookup_args)) + if rrnames: + response['flex_rrnames'] = rrnames return response -def lookup_ip(client, ip, lookup_args): - try: - res = client.lookup_rdata_ip(ip, **lookup_args) - response = {'rdata': list(res)} - except dnsdb2.DnsdbException as e: - return e +def lookup_name(client, name, lookup_args, flex): + response = {} + # RRSET = entries in the left-hand side of the domain name related labels + rrset_response = list(client.lookup_rrset(name, **lookup_args)) + if rrset_response: + response['rrset'] = rrset_response + # RDATA = entries on the right-hand side of the domain name related labels + rdata_response = client.lookup_rdata_name(name, **lookup_args) + if rdata_response: + response['rdata'] = rdata_response + if flex: + response.update(flex_queries(client, name, lookup_args)) + return response + + +def lookup_ip(client, ip, lookup_args, flex): + response = {} + res = list(client.lookup_rdata_ip(ip, **lookup_args)) + if res: + response['rdata'] = res + if flex: + response.update(flex_queries(client, ip, lookup_args)) return response From bedd6dcfd61c0f20eb00066b8072ff290cc8beb3 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 15 Nov 2020 19:23:47 +0100 Subject: [PATCH 063/476] chg: [documentation] Updated the farsight-passivedns documentation --- doc/README.md | 15 +++++++++------ doc/expansion/farsight_passivedns.json | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/doc/README.md b/doc/README.md index 3b2bceb..736c6f8 100644 --- a/doc/README.md +++ b/doc/README.md @@ -505,12 +505,15 @@ A module to query the Phishing Initiative service (https://phishing-initiative.l Module to access Farsight DNSDB Passive DNS. - **features**: ->This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. -> The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. +>This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. +>The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. > ->An API key is required to submit queries to the API. -> It is also possible to define a custom server URL, and to set a limit of results to get. -> This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). +>An API key is required to submit queries to the API. +>It is also possible to define a custom server URL, and to set a limit of results to get. +>This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). +> +>Additionally to the lookup queries, responses from flex queries can be returned with the results. +>To get this additional data with the results, there is a `flex_queries` configuration parameter to set to `true`. The module submit then regex queries to the API, using the domain, hostname or IP address as keyword for the search. Passive-dns objects are returned next to the ones resulting from the lookup queries. - **input**: >A domain, hostname or IP address MISP attribute. - **output**: @@ -518,7 +521,7 @@ Module to access Farsight DNSDB Passive DNS. - **references**: >https://www.farsightsecurity.com/, https://docs.dnsdb.info/dnsdb-api/ - **requirements**: ->An access to the Farsight Passive DNS API (apikey) +>An access to the Farsight Passive DNS API (apikey), The dnsdb2 python library ----- diff --git a/doc/expansion/farsight_passivedns.json b/doc/expansion/farsight_passivedns.json index 2dbc64e..fe241e6 100644 --- a/doc/expansion/farsight_passivedns.json +++ b/doc/expansion/farsight_passivedns.json @@ -1,9 +1,9 @@ { "description": "Module to access Farsight DNSDB Passive DNS.", "logo": "logos/farsight.png", - "requirements": ["An access to the Farsight Passive DNS API (apikey)"], + "requirements": ["An access to the Farsight Passive DNS API (apikey)", "The dnsdb2 python library"], "input": "A domain, hostname or IP address MISP attribute.", "output": "Passive-dns objects, resulting from the query on the Farsight Passive DNS API.", "references": ["https://www.farsightsecurity.com/", "https://docs.dnsdb.info/dnsdb-api/"], - "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API.\n The results of rdata and rrset lookups are then returned and parsed into passive-dns objects.\n\nAn API key is required to submit queries to the API.\n It is also possible to define a custom server URL, and to set a limit of results to get.\n This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit)." + "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. \nThe results of rdata and rrset lookups are then returned and parsed into passive-dns objects.\n\nAn API key is required to submit queries to the API. \nIt is also possible to define a custom server URL, and to set a limit of results to get. \nThis limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit).\n\nAdditionally to the lookup queries, responses from flex queries can be returned with the results. \nTo get this additional data with the results, there is a `flex_queries` configuration parameter to set to `true`. The module submit then regex queries to the API, using the domain, hostname or IP address as keyword for the search. Passive-dns objects are returned next to the ones resulting from the lookup queries." } From a36bd20f31f67114464546d56aae87272276bcd7 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 15 Nov 2020 19:27:21 +0100 Subject: [PATCH 064/476] fix: [documentation] Added missing cpe module documentation --- doc/expansion/cpe.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/expansion/cpe.json diff --git a/doc/expansion/cpe.json b/doc/expansion/cpe.json new file mode 100644 index 0000000..5927e5a --- /dev/null +++ b/doc/expansion/cpe.json @@ -0,0 +1,8 @@ +{ + "description": "An expansion module to query the CVE search API with a cpe code to get its related vulnerabilities.", + "logo": "logos/cpe.py", + "input": "CPE attribute.", + "output": "The vulnerabilities related to the CPE.", + "references": ["https://cve.circl.lu/api/"], + "features": "The module takes a cpe attribute as input and queries the CVE search API to get its related vulnerabilities. \nThe list of vulnerabilities is then parsed and returned as vulnerability objects.\n\nUsers can use their own CVE search API url by defining a value to the custom_API_URL parameter. If no custom API url is given, the default cve.circl.lu api url is used.\n\nIn order to limit the amount of data returned by CVE serach, users can also the limit parameter. With the limit set, the API returns only the requested number of vulnerabilities, sorted from the highest cvss score to the lowest one." +} From 7385e3c1c26e3a0873d5ddd24451d90182c01ed9 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 15 Nov 2020 19:52:34 +0100 Subject: [PATCH 065/476] chg: [pipenv] Updated Pipfile --- Pipfile | 1 + Pipfile.lock | 710 +++++++++++++++++++++++++++------------------------ 2 files changed, 383 insertions(+), 328 deletions(-) diff --git a/Pipfile b/Pipfile index a79e260..424c3f9 100644 --- a/Pipfile +++ b/Pipfile @@ -62,6 +62,7 @@ assemblyline_client = "*" vt-graph-api = "*" trustar = "*" markdownify = "==0.5.3" +dnsdb2 = "*" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index bc00dee..91e8276 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f707a3cd3025e6d0182d2a440138a9c3ab0810632aedc308274c6f9437489a87" + "sha256": "7e046d71662745bb27810c2b46c5cdd503d38368593e6fa3a11cd19eb0b1ddab" }, "pipfile-spec": 6, "requires": { @@ -93,11 +93,11 @@ }, "attrs": { "hashes": [ - "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", - "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" + "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", + "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.2.0" + "version": "==20.3.0" }, "backscatter": { "hashes": [ @@ -125,10 +125,10 @@ }, "certifi": { "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", + "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" ], - "version": "==2020.6.20" + "version": "==2020.11.8" }, "cffi": { "hashes": [ @@ -251,6 +251,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.2.10" }, + "dnsdb2": { + "hashes": [ + "sha256:1454a2980a24453c4076cfa57765632f690673ec9efc104a95c97e4adbe70b6c" + ], + "index": "pypi", + "version": "==1.1.1" + }, "dnspython": { "hashes": [ "sha256:044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7", @@ -380,42 +387,43 @@ }, "lxml": { "hashes": [ - "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", - "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", - "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", - "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", - "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", - "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", + "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", + "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", - "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", - "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", + "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", + "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", + "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", + "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f", + "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", + "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", + "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", + "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", + "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", + "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", + "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", + "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", + "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", + "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", + "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", + "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", + "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", + "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", + "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", + "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", + "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", + "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", + "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", + "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", + "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", + "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", + "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", - "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", - "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", - "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", - "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", - "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", - "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", - "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", - "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", - "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", - "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", - "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", - "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", - "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", - "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", - "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", - "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", - "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", - "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", - "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", - "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", - "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", - "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", - "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" + "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", + "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810" ], "index": "pypi", "version": "==4.6.1" @@ -449,42 +457,46 @@ }, "multidict": { "hashes": [ - "sha256:02b2ea2bb1277a970d238c5c783023790ca94d386c657aeeb165259950951cc6", - "sha256:0ce1d956ecbf112d49915ebc2f29c03e35fe451fb5e9f491edf9a2f4395ee0af", - "sha256:0ffdb4b897b15df798c0a5939a0323ccf703f2bae551dfab4eb1af7fbab38ead", - "sha256:11dcf2366da487d5b9de1d4b2055308c7ed9bde1a52973d07a89b42252af9ebe", - "sha256:167bd8e6351b57525bbf2d524ca5a133834699a2fcb090aad0c330c6017f3f3e", - "sha256:1b324444299c3a49b601b1bf621fc21704e29066f6ac2b7d7e4034a4a18662a1", - "sha256:20eaf1c279c543e07c164e4ac02151488829177da06607efa7ccfecd71b21e79", - "sha256:2739d1d9237835122b27d88990849ecf41ef670e0fcb876159edd236ca9ef40f", - "sha256:28b5913e5b6fef273e5d4230b61f33c8a51c3ce5f44a88582dee6b5ca5c9977b", - "sha256:2b0cfc33f53e5c8226f7d7c4e126fa0780f970ef1e96f7c6353da7d01eafe490", - "sha256:32f0a904859a6274d7edcbb01752c8ae9c633fb7d1c131771ff5afd32eceee42", - "sha256:39713fa2c687e0d0e709ad751a8a709ac051fcdc7f2048f6fd09365dd03c83eb", - "sha256:4ef76ce695da72e176f6a51867afb3bf300ce16ba2597824caaef625af5906a9", - "sha256:5263359a03368985b5296b7a73363d761a269848081879ba04a6e4bfd0cf4a78", - "sha256:52b5b51281d760197ce3db063c166fdb626e01c8e428a325aa37198ce31c9565", - "sha256:5dd303b545b62f9d2b14f99fbdb84c109a20e64a57f6a192fe6aebcb6263b59d", - "sha256:60af726c19a899ed49bbb276e062f08b80222cb6b9feda44b59a128b5ff52966", - "sha256:60b12d14bc122ba2dae1e4460a891b3a96e73d815b4365675f6ec0a1725416a5", - "sha256:620c39b1270b68e194023ad471b6a54bdb517bb48515939c9829b56c783504a3", - "sha256:62f6e66931fb87e9016e7c1cc806ab4f3e39392fd502362df3cac888078b27cb", - "sha256:711289412b78cf41a21457f4c806890466013d62bf4296bd3d71fad73ff8a581", - "sha256:7561a804093ea4c879e06b5d3d18a64a0bc21004bade3540a4b31342b528d326", - "sha256:786ad04ad954afe9927a1b3049aa58722e182160fe2fcac7ad7f35c93595d4f6", - "sha256:79dc3e6e7ce853fb7ed17c134e01fcb0d0c826b33201aa2a910fb27ed75c2eb9", - "sha256:84e4943d8725659942e7401bdf31780acde9cfdaf6fe977ff1449fffafcd93a9", - "sha256:932964cf57c0e59d1f3fb63ff342440cf8aaa75bf0dbcbad902c084024975380", - "sha256:a5eca9ee72b372199c2b76672145e47d3c829889eefa2037b1f3018f54e5f67d", - "sha256:aad240c1429e386af38a2d6761032f0bec5177fed7c5f582c835c99fff135b5c", - "sha256:bbec545b8f82536bc50afa9abce832176ed250aa22bfff3e20b3463fb90b0b35", - "sha256:c339b7d73c0ea5c551025617bb8aa1c00a0111187b6545f48836343e6cfbe6a0", - "sha256:c692087913e12b801a759e25a626c3d311f416252dfba2ecdfd254583427949f", - "sha256:cda06c99cd6f4a36571bb38e560a6fcfb1f136521e57f612e0bc31957b1cd4bd", - "sha256:ec8bc0ab00c76c4260a201eaa58812ea8b1b7fde0ecf5f9c9365a182bd4691ed" + "sha256:060d68ae3e674c913ec41a464916f12c4d7ff17a3a9ebbf37ba7f2c681c2b33e", + "sha256:06f39f0ddc308dab4e5fa282d145f90cd38d7ed75390fc83335636909a9ec191", + "sha256:17847fede1aafdb7e74e01bb34ab47a1a1ea726e8184c623c45d7e428d2d5d34", + "sha256:1cd102057b09223b919f9447c669cf2efabeefb42a42ae6233f25ffd7ee31a79", + "sha256:20cc9b2dd31761990abff7d0e63cd14dbfca4ebb52a77afc917b603473951a38", + "sha256:2576e30bbec004e863d87216bc34abe24962cc2e964613241a1c01c7681092ab", + "sha256:2ab9cad4c5ef5c41e1123ed1f89f555aabefb9391d4e01fd6182de970b7267ed", + "sha256:359ea00e1b53ceef282232308da9d9a3f60d645868a97f64df19485c7f9ef628", + "sha256:3e61cc244fd30bd9fdfae13bdd0c5ec65da51a86575ff1191255cae677045ffe", + "sha256:43c7a87d8c31913311a1ab24b138254a0ee89142983b327a2c2eab7a7d10fea9", + "sha256:4a3f19da871befa53b48dd81ee48542f519beffa13090dc135fffc18d8fe36db", + "sha256:4df708ef412fd9b59b7e6c77857e64c1f6b4c0116b751cb399384ec9a28baa66", + "sha256:59182e975b8c197d0146a003d0f0d5dc5487ce4899502061d8df585b0f51fba2", + "sha256:6128d2c0956fd60e39ec7d1c8f79426f0c915d36458df59ddd1f0cff0340305f", + "sha256:6168839491a533fa75f3f5d48acbb829475e6c7d9fa5c6e245153b5f79b986a3", + "sha256:62abab8088704121297d39c8f47156cb8fab1da731f513e59ba73946b22cf3d0", + "sha256:653b2bbb0bbf282c37279dd04f429947ac92713049e1efc615f68d4e64b1dbc2", + "sha256:6566749cd78cb37cbf8e8171b5cd2cbfc03c99f0891de12255cf17a11c07b1a3", + "sha256:76cbdb22f48de64811f9ce1dd4dee09665f84f32d6a26de249a50c1e90e244e0", + "sha256:8efcf070d60fd497db771429b1c769a3783e3a0dd96c78c027e676990176adc5", + "sha256:8fa4549f341a057feec4c3139056ba73e17ed03a506469f447797a51f85081b5", + "sha256:9380b3f2b00b23a4106ba9dd022df3e6e2e84e1788acdbdd27603b621b3288df", + "sha256:9ed9b280f7778ad6f71826b38a73c2fdca4077817c64bc1102fdada58e75c03c", + "sha256:a7b8b5bd16376c8ac2977748bd978a200326af5145d8d0e7f799e2b355d425b6", + "sha256:af271c2540d1cd2a137bef8d95a8052230aa1cda26dd3b2c73d858d89993d518", + "sha256:b561e76c9e21402d9a446cdae13398f9942388b9bff529f32dfa46220af54d00", + "sha256:b82400ef848bbac6b9035a105ac6acaa1fb3eea0d164e35bbb21619b88e49fed", + "sha256:b98af08d7bb37d3456a22f689819ea793e8d6961b9629322d7728c4039071641", + "sha256:c58e53e1c73109fdf4b759db9f2939325f510a8a5215135330fe6755921e4886", + "sha256:cbabfc12b401d074298bfda099c58dfa5348415ae2e4ec841290627cb7cb6b2e", + "sha256:d4a6fb98e9e9be3f7d70fd3e852369c00a027bd5ed0f3e8ade3821bcad257408", + "sha256:d99da85d6890267292065e654a329e1d2f483a5d2485e347383800e616a8c0b1", + "sha256:e58db0e0d60029915f7fc95a8683fa815e204f2e1990f1fb46a7778d57ca8c35", + "sha256:e5bf89fe57f702a046c7ec718fe330ed50efd4bcf74722940db2eb0919cddb1c", + "sha256:f612e8ef8408391a4a3366e3508bab8ef97b063b4918a317cb6e6de4415f01af", + "sha256:f65a2442c113afde52fb09f9a6276bbc31da71add99dc76c3adf6083234e07c6", + "sha256:fa0503947a99a1be94f799fac89d67a5e20c333e78ddae16e8534b151cdc588a" ], "markers": "python_version >= '3.5'", - "version": "==5.0.0" + "version": "==5.0.2" }, "np": { "hashes": [ @@ -495,43 +507,43 @@ }, "numpy": { "hashes": [ - "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7", - "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3", - "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268", - "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170", - "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f", - "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72", - "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996", - "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522", - "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed", - "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69", - "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d", - "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68", - "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98", - "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822", - "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d", - "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5", - "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6", - "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0", - "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add", - "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2", - "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9", - "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0", - "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2", - "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c", - "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931", - "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da", - "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e", - "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4", - "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535", - "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c", - "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772", - "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6", - "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f", - "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2" + "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", + "sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce", + "sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1", + "sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512", + "sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2", + "sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757", + "sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9", + "sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2", + "sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08", + "sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b", + "sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb", + "sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc", + "sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac", + "sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83", + "sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36", + "sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387", + "sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f", + "sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad", + "sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c", + "sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414", + "sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37", + "sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764", + "sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753", + "sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909", + "sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6", + "sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63", + "sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9", + "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949", + "sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab", + "sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c", + "sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3", + "sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893", + "sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15", + "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4" ], "markers": "python_version >= '3.6'", - "version": "==1.19.3" + "version": "==1.19.4" }, "oauth2": { "hashes": [ @@ -548,55 +560,60 @@ }, "opencv-python": { "hashes": [ - "sha256:16864152aa6ac346ef83588d6f4f5dc974d27851c034d6970fcb7b6a98bbd318", - "sha256:23dade76fe0194139112eea7ecdfa02ae09924b1d8d853f17f387a356519e484", - "sha256:27d5b83edd245a12dd6b8562569ad3f23e5ffe30cef8cfcc70756dd24b55d12f", - "sha256:2a2a7590b99d872b193cda0592b2c1cd6561159c31b361597c0e69e8926c8d16", - "sha256:46032d4648c74730115f8522effda8ac39bd0385f07edc7aab57b41cc7617933", - "sha256:4c195597d5286d1cc7259aeaeb7e6c1cde07fec9bddf26523eab1b15709291aa", - "sha256:69c971fefb633cfd334ed195d58e76e87f267649f98a2394f7400b178e918936", - "sha256:80b5b68e9c5dda29205ca112e6d5bd647b6b43cf917cfa5ce178d61675291bba", - "sha256:98676d349fdfc17dba9f23b87e9b6a639733d35f5f0ffcccb90e76c8200568f4", - "sha256:9df617736351100879b70d914366b9f9e38aa227885f2590b48badc4a233119d", - "sha256:b2147317b00b20e8d7e01201221af2b278aed449fa436316c42bc63f653e8245", - "sha256:d838ee4562f52793b1b10876e5067cae1a6bb1c3c575091644be9b88cf45d255", - "sha256:db74a92ef9c2a0810e1436d586b3b15d421a39b72f06263358f15c7a609498e0", - "sha256:e100a4ffdeed8c4afac6a5b3f6b4481efe0ad90e0a0ae2d129478abd4bd790bc", - "sha256:e87d88a820050c0e886c9add48eac2f80ff29207a98cca25869a6868c519daa4", - "sha256:fdf017c5b93d58ad77e2690e59322fd09414705c28d69b52fad4a19985422e6c" + "sha256:0548981fe189e0d57b9cc65066b66fd70d4bc84ea906f349a63d9098e1b911c6", + "sha256:117dbb2fd184de28d831f14c1da17864efcee7bb7895e43adf40f5e1da9137fb", + "sha256:135e05b69ab9665cbe2589f56e60895219bc2443a632bdc4bde72fb95eda1582", + "sha256:14df77490c8aedceae74e660564d48c04761658aecc93895ac5e974006a89606", + "sha256:17581c68400f828700e5c6b3b082f50c781bf74cb9a7b972a04f05d26c8e894a", + "sha256:4af0053c6a70f127a52c26b112341826d3dbfce6955beb9044d3eabd7e14d1cd", + "sha256:51baebb0f8f3cae4cccd30daf018a5bb75cb759d5658aea29100d34cd5cac106", + "sha256:6022609b67f9c0f14e6807e782660d1d1be94d4f0c7bc1794d7d8f600014acb2", + "sha256:68a9ec7e32f82cab267b6f757d9862a9a930371062739f9d00472e7c850c5854", + "sha256:6b1d85cbb64ce20ac5f79ad8e3e76a3dbff53d258c65f2fc0b9411321147a0be", + "sha256:6b6d23de6d5ddc55e865ac8532bf8062b26ba70305fa1c87c671717027dcd370", + "sha256:744e9ae2fb4c8574e6d4a762146b4d0984bdec60b98480fc54a363c03a07a1ac", + "sha256:7fe81d08df4eb5dc4c6aa5f09888b6fd390fce5fa7d5624a98cac890b9aa6181", + "sha256:8a8ebd7ceebc0be9c14ca3e25a1c4ae086016b469848258e998247f2fc855314", + "sha256:8aeda9b2c37bf91fa88d67f09b85f2250661eec43d72184ec544783de204e96a", + "sha256:9659e80059c9f39728c7dcc22032dff0d1d467f07b6cd8e036613393e4b7c71a", + "sha256:c1382209a771ca8a25fe89d4a2377875538c6ed3cf8745280e65636cbd0988f2", + "sha256:d80db278a07f51811dbf0f9c31ff7cd5b2501822fb7a7587e71f9ff27d5c04bd", + "sha256:db874c65654465ef71d6e8618bed8c725722bc90624132b9512bf061abb4eec0", + "sha256:e4c072cf4260063ebadc70e34d622fa1127a88e364475ed757709e249ebe990f", + "sha256:f69a56e958ecb549ba84e0497a438080932b4d52ded441cec04d80afde71dc0a" ], "index": "pypi", - "version": "==4.4.0.44" + "version": "==4.4.0.46" }, "pandas": { "hashes": [ - "sha256:ca71a5aa9eeb3ef5b31feca7d9b6369d6b3d0b2e9c85d7a89abe3ecb013f1e86", - "sha256:df43ea0e9fd9f9672b0de9cac26d01255ad50481994bf3cb4687c21eec2d7bbc", - "sha256:babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613", - "sha256:147162568b1242355290341baf281926cfac66ada07e634f3fc521ac967e4653", - "sha256:d6b1f9d506dc23da2915bcae5c5968990049c9cec44108bd9855d2c7c89d91dc", - "sha256:3a038cd5da602b955d335aa80cbaa0e5774f68501ff47b9c21509906981478da", - "sha256:84a4ffe668df357e31f98c829536e3a7142c3036c82f996e639f644c5d32eda1", - "sha256:882012763668af54b48f1412bab95c5cc0a7ccce5a2a8221cfc3839a6e3394ef", - "sha256:d89dbc58aec1544722a8d5046f880b597c497ef8a82c5fe695b4b2effafac5ec", - "sha256:5a8a84b75ca3a29bb4263b35d5ed9fcaae2b062f014feed8c5daa897339c7d85", - "sha256:24f61f40febe47edac271eda45d683e42838b7db2bd0f82574d9800259d2b182", - "sha256:b11b496c317dbe007898de699fd59eaf687d0fe8c1b7dad109db6010155d28ae", - "sha256:206d7c3e5356dcadf082e64dc25c24bc8541718045826074f96346e9d6d05a20", - "sha256:c22e40f1b4d162ca18eb6b2c572e63eef220dbc9cc3de0241cefb77972621bb7", - "sha256:ca31ac8578d48da354cf66a473d4d5ff99277ca71d321dc7ea4e6fad3c6bb0fd", - "sha256:a605054fbca71ed1d08bb2aef6f73c84a579bbac956bfe8f9718d5e84cb41248", - "sha256:f4cb8252ae71f093f4a6b847adf0bc9330f109c48f08363c2071f189f1c89c87", - "sha256:2999adc6736f8cb4c69d65a6e2b25a11bcb395da5b048342b8e4d6fe055e57ae", - "sha256:54f5f564058b0280d588c3758abde82e280702c440db5faf0c686b80336096f9", - "sha256:b026e913d88fad3a74eea8ed5a5f98e8823080ea02f8d9bb0ec19e92552daad6", - "sha256:11c284769f41e95f7d16a327eb555989c5f29418aad075fa80c97ef3aa8fb885", - "sha256:920d30fdff65a079f071db635d282b4f583c2b26f2b58d5dca218aac7c59974d", - "sha256:427be9938b2f79ab298de84f87693914cda238a27cf10580da96caf3dff64115", - "sha256:fd6f05b6101d0e76f3e5c26a47be5be7be96ed84ef3981dc1852e76898e73594" + "sha256:09e0503758ad61afe81c9069505f8cb8c1e36ea8cc1e6826a95823ef5b327daf", + "sha256:0a11a6290ef3667575cbd4785a1b62d658c25a2fd70a5adedba32e156a8f1773", + "sha256:0d9a38a59242a2f6298fff45d09768b78b6eb0c52af5919ea9e45965d7ba56d9", + "sha256:112c5ba0f9ea0f60b2cc38c25f87ca1d5ca10f71efbee8e0f1bee9cf584ed5d5", + "sha256:185cf8c8f38b169dbf7001e1a88c511f653fbb9dfa3e048f5e19c38049e991dc", + "sha256:3aa8e10768c730cc1b610aca688f588831fa70b65a26cb549fbb9f35049a05e0", + "sha256:41746d520f2b50409dffdba29a15c42caa7babae15616bcf80800d8cfcae3d3e", + "sha256:43cea38cbcadb900829858884f49745eb1f42f92609d368cabcc674b03e90efc", + "sha256:5378f58172bd63d8c16dd5d008d7dcdd55bf803fcdbe7da2dcb65dbbf322f05b", + "sha256:54404abb1cd3f89d01f1fb5350607815326790efb4789be60508f458cdd5ccbf", + "sha256:5dac3aeaac5feb1016e94bde851eb2012d1733a222b8afa788202b836c97dad5", + "sha256:5fdb2a61e477ce58d3f1fdf2470ee142d9f0dde4969032edaf0b8f1a9dafeaa2", + "sha256:6613c7815ee0b20222178ad32ec144061cb07e6a746970c9160af1ebe3ad43b4", + "sha256:6d2b5b58e7df46b2c010ec78d7fb9ab20abf1d306d0614d3432e7478993fbdb0", + "sha256:8a5d7e57b9df2c0a9a202840b2881bb1f7a648eba12dd2d919ac07a33a36a97f", + "sha256:8b4c2055ebd6e497e5ecc06efa5b8aa76f59d15233356eb10dad22a03b757805", + "sha256:a15653480e5b92ee376f8458197a58cca89a6e95d12cccb4c2d933df5cecc63f", + "sha256:a7d2547b601ecc9a53fd41561de49a43d2231728ad65c7713d6b616cd02ddbed", + "sha256:a979d0404b135c63954dea79e6246c45dd45371a88631cdbb4877d844e6de3b6", + "sha256:b1f8111635700de7ac350b639e7e452b06fc541a328cf6193cf8fc638804bab8", + "sha256:c5a3597880a7a29a31ebd39b73b2c824316ae63a05c3c8a5ce2aea3fc68afe35", + "sha256:c681e8fcc47a767bf868341d8f0d76923733cbdcabd6ec3a3560695c69f14a1e", + "sha256:cf135a08f306ebbcfea6da8bf775217613917be23e5074c69215b91e180caab4", + "sha256:e2b8557fe6d0a18db4d61c028c6af61bfed44ef90e419ed6fadbdc079eba141e" ], "index": "pypi", - "version": "==1.1.3" + "version": "==1.1.4" }, "pandas-ods-reader": { "hashes": [ @@ -696,85 +713,85 @@ }, "pycryptodome": { "hashes": [ - "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", - "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", - "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", - "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", - "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", - "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", - "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", - "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", - "sha256:663f8de2b3df2e744d6e1610506e0ea4e213bde906795953c1e82279c169f0a7", - "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", - "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", - "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", - "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", - "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", - "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", - "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", - "sha256:bcd5b8416e73e4b0d48afba3704d8c826414764dafaed7a1a93c442188d90ccc", - "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a", - "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", - "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", - "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", - "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", - "sha256:de6e1cd75677423ff64712c337521e62e3a7a4fc84caabbd93207752e831a85a", - "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", - "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", - "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", - "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", - "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94" + "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", + "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", + "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", + "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", + "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", + "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", + "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", + "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", + "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", + "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", + "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", + "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", + "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", + "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", + "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", + "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", + "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", + "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", + "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", + "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", + "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", + "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", + "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", + "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", + "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", + "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", + "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", + "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", + "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", + "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", + "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", + "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", + "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", + "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", + "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.8" + "version": "==3.9.9" }, "pycryptodomex": { "hashes": [ - "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f", - "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", - "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861", - "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", - "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", - "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", - "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", - "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", - "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", - "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9", - "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", - "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", - "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", - "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", - "sha256:85c108b42e47d4073344ff61d4e019f1d95bb7725ca0fe87d0a2deb237c10e49", - "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", - "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", - "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", - "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", - "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", - "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", - "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", - "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", - "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", - "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", - "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", - "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060", - "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594", - "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", - "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", - "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb" + "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", + "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", + "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", + "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", + "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", + "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", + "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", + "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", + "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", + "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", + "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", + "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", + "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", + "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", + "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", + "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", + "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", + "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", + "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", + "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", + "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", + "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", + "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", + "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", + "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", + "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", + "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", + "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", + "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", + "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", + "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", + "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", + "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", + "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", + "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.8" + "version": "==3.9.9" }, "pydeep": { "hashes": [ @@ -822,7 +839,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "deb9e06c726592c145e44b25fa6a05db56e3aa80" + "ref": "3b130bd9733f64e7684b9d93a898a4fcb647e17f" }, "pyonyphe": { "editable": true, @@ -989,60 +1006,60 @@ }, "reportlab": { "hashes": [ - "sha256:00b9b3ffbd197b21cb076acc336993005b75d16b60f7a79a3c8faee926f890b7", - "sha256:0177b58d0ae81f6775b10e66f97bc7aa490659398e1f24401b6d1767803c4880", - "sha256:03c792a92ba21e75e05230ef1ce038025c23b124c706d7369dfa1475a0d24785", - "sha256:04044318273fa00487557f2e79bb6f8faa08185b8b1795cc29985ccb609c8680", - "sha256:217da82e7451e2b101a4bd72006a7e6c0d3203200cfb5c4d6a17b997b9ba73c6", - "sha256:226b5ef9af16aa8b3487513556ae7386239fe3ec8b121b1e23f45b850f0a10a8", - "sha256:24773aba8c74e1e023a1d3c3c60dbd6ef4a76472e38f13b5a214c8bb48db7aef", - "sha256:25eb9bb45e206b3a464f763d1231d70bb5f351c01d5ab94568e687fec4bd9eee", - "sha256:3d6d26294e8e3f6a639ee4a4b423d2cb0fa7de24c4cccea50a32d50d20db52ad", - "sha256:4987cca329df7f9bf4b6abea3e83c26a5a8edfe5b133344e24f146ddc8c09b9a", - "sha256:4b6a7e9a83e00cfe020c8e8bdd595384312228b24dcb40538d5cf00df15c5bff", - "sha256:531b70748dd89456c4e1d2132497bc8580ac74d7fcb790b8e2d1b20378655ba2", - "sha256:57abf06c045d16a85906fbdd8d826d7e334377bbb29b7442d249a95cf5f3a5c5", - "sha256:58877ed7390327bf4c41ca75473223866f7d8da0f8a606eb682127c8ac4af990", - "sha256:640d41838b1e663c5db53f3c32294cd742ac5cc4ba3098aeaad53297b7e1cc47", - "sha256:658471d5b06e121692449f44a4e39e3c7128fea757c4e9354b488f35ac3f82de", - "sha256:6f971a53e02682866886c451513143f46aed65704e46327bb6440604cd7cd7eb", - "sha256:78dcf1aff25ddf68b147e78b074bef1384e804dd54322eb1d1f1f680892f8788", - "sha256:793ed7edd50306cd05213ac012749dfe65768485bd493c3434936438d594a363", - "sha256:7a3512585308e5c73bf123457ccfc90acb99493df89fae6131caaec9ffe1e4ca", - "sha256:7ace84b3aae39b14ce7235d096bc81891f60b871b7edad2b656cb1729100e0f2", - "sha256:7e84d123ec98816fce5a97af2755d664519e7891e9793330ec271900acb2bfab", - "sha256:813c31d8b7f28ee2f38f238c3eb6afb02b81b00d749ab10e38b534843680aea7", - "sha256:8365efe779e43e8005eace19c11c36e6a4bbea86ddc868b8db122240391c1747", - "sha256:8412514dc0d1bf62c6b33a645b5a7c46933cc16f3678db5546d0ac4e27f3dbae", - "sha256:8d4ba2aea71ab6ec688b3f3416db0d457e7814a642433b7f407a3f29e054816d", - "sha256:99a7cdd8633a8717dd239917647b42d9a6b869a01c39019c7b0b08b963be2a7e", - "sha256:9d86fe83e9c4838e0048f14067869d1ca8722bb52545781db7a9d345939e77f0", - "sha256:a626a97ab135f2129d87c5f98b2aee45e0ef1652bc9afef92509a8f5a5f72e45", - "sha256:a921906c1deb199f7910163703e4073b52e8d7f00d56d4f6bbc255a6ca3cfb1d", - "sha256:b80840cc4fece1426d30070a9dad016d9589e8d82ebddfc9ed30004b44ba2803", - "sha256:c5318b4e23803c7c5f2b7384858b7b6be5faf51f63664c97f6bf8601cd248855", - "sha256:cd5546d840f639587f352d4c54ff35422cbeba81eb2c50d156cd733015ecc4b2", - "sha256:d445fc4ada6a24a90080f7379d169fba1072ba5a75179ce2f5c3280adf605b45", - "sha256:d56f150bb4b2d32596291aa98d3c6986721c5cf41b8f90346a84cee8b7fb35f2", - "sha256:d6e42636247e4c6d2db929b9db01d1af907f63aa74af8123cd699107df8a7b23", - "sha256:dcf732695b1325289a9a74b849179d8475db32a00803644a664c2172a603237e", - "sha256:e7b20927e5e11bad8bac5d5b6c286ce2cae2804073513aa67f20986bc4b3b4e0", - "sha256:f6295876665359790dcb7042a9221c60e1f89dee042f33414e3ce440772f7aa1", - "sha256:f8ec6637f56c293ac62c9a94daebb856c4ef9b97eae4cf7b4e518813e41c8c75" + "sha256:06be7f04a631f02cd0202f7dee0d3e61dc265223f4ff861525ed7784b5552540", + "sha256:0a788a537c48915eda083485b59ac40ac012fa7c43070069bde6eb5ea588313c", + "sha256:1a7a38810e79653d0ea8e61db4f0517ac2a0e76edd2497cf6d4969dd3be30030", + "sha256:22301773db730545b44d4c77d8f29baf5683ccabec9883d978e8b8eda6d2175f", + "sha256:2906321b3d2779faafe47e2c13f9c69e1fb4ddb907f5a49cab3f9b0ea95df1f5", + "sha256:2d65f9cc5c0d3f63b5d024e6cf92234f1ab1f267cc9e5a847ab5d3efe1c3cf3e", + "sha256:2e012f7b845ef9f1f5bd63461d5201fa624b019a65ff5a93d0002b4f915bbc89", + "sha256:31ccfdbf5bb5ec85f0397661085ce4c9e52537ca0d2bf4220259666a4dcc55c2", + "sha256:3e10bd20c8ada9f7e1113157aa73b8e0048f2624e74794b73799c3deb13d7a3f", + "sha256:440d5f86c2b822abdb7981d691a78bdcf56f4710174830283034235ab2af2969", + "sha256:4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53", + "sha256:59659ee8897950fd1acd41a9cc61f4afdfda52dc2bb69a1924ce68089491849d", + "sha256:6216b11313467989ac9d9578ea3756d0af46e97184ee4e11a6b7ef652458f70d", + "sha256:6268a9a3d75e714b22beeb7687270956b06b232ccfdf37b1c6462961eab04457", + "sha256:6b226830f80df066d5986a3fdb3eb4d1b6320048f3d9ade539a6c03a5bc8b3ec", + "sha256:6e10eba6a0e330096f4200b18824b3194c399329b7830e34baee1c04ea07f99f", + "sha256:6e224c16c3d6fafdb2fb67b33c4b84d984ec34869834b3a137809f2fe5b84778", + "sha256:7da162fa677b90bd14f19b20ff80fec18c24a31ac44e5342ba49e198b13c4f92", + "sha256:8406e960a974a65b765c9ff74b269aa64718b4af1e8c511ebdbd9a5b44b0c7e6", + "sha256:8999bb075102d1b8ca4aada6ca14653d52bf02e37fd064e477eb180741f75077", + "sha256:8f6163729612e815b89649aed2e237505362a78014199f819fd92f9e5c96769b", + "sha256:9699fa8f0911ad56b46cc60bbaebe1557fd1c9e8da98185a7a1c0c40193eba48", + "sha256:9a53d76eec33abda11617aad1c9f5f4a2d906dd2f92a03a3f1ea370efbb52c95", + "sha256:9ed4d761b726ff411565eddb10cb37a6bca0ec873d9a18a83cf078f4502a2d94", + "sha256:a020d308e7c2de284d5407e3c6c13e3977a62b314f7bfe19bcc69677931da589", + "sha256:a2e6c15aecbe631245aab639751a58671312cced7e17de1ed9c45fb37036f6c9", + "sha256:b10cb48606d97b70edb094576e3d493d40467395e4fc267655135a2c92defbe8", + "sha256:b8d6e9df5181ed07b7ae145258eb69e686133afc97930af51a3c0c9d784d834d", + "sha256:bbb297754f5cf25eb8fcb817752984252a7feb0ca83e383718e4eec2fb67ea32", + "sha256:be90599e5e78c1ddfcfee8c752108def58b4c672ebcc4d3d9aa7fe65e7d3f16b", + "sha256:bfdfad9b8ae00bd0752b77f954c7405327fd99b2cc6d5e4273e65be61429d56a", + "sha256:c1e5ef5089e16b249388f65d8c8f8b74989e72eb8332060dc580a2ecb967cfc2", + "sha256:c5ed342e29a5fd7eeb0f2ccf7e5b946b5f750f05633b2d6a94b1c02094a77967", + "sha256:c7087a26b26aa82a3ba27e13e66f507cc697f9ceb4c046c0f758876b55f040a5", + "sha256:cf589e980d92b0bf343fa512b9d3ae9ed0469cbffd99cb270b6c83da143cb437", + "sha256:e6fb762e524a4fb118be9f44dbd9456cf80e42253ee8f1bdb0ea5c1f882d4ba8", + "sha256:f2fde5abb6f21c1eff5430f380cdbbee7fdeda6af935a83730ddce9f0c4e504e", + "sha256:f585b3bf7062c228306acd7f40b2ad915b32603228c19bb225952cc98fd2015a", + "sha256:f955a6366cf8e6729776c96e281bede468acd74f6eb49a5bbb048646adaa43d8", + "sha256:fe882fd348d8429debbdac4518d6a42888a7f4ad613dc596ce94788169caeb08" ], "index": "pypi", - "version": "==3.5.54" + "version": "==3.5.55" }, "requests": { "extras": [ "security" ], "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", + "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" ], "index": "pypi", - "version": "==2.24.0" + "version": "==2.25.0" }, "requests-cache": { "hashes": [ @@ -1116,18 +1133,50 @@ }, "tornado": { "hashes": [ - "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc", - "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52", - "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6", - "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d", - "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b", - "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673", - "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9", - "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a", - "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740" + "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", + "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", + "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", + "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", + "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", + "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", + "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", + "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", + "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", + "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", + "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", + "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", + "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", + "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", + "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", + "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", + "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", + "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", + "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", + "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", + "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", + "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", + "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", + "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", + "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", + "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", + "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", + "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", + "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", + "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", + "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", + "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", + "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", + "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", + "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", + "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", + "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", + "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", + "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", + "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", + "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" ], "markers": "python_version >= '3.5'", - "version": "==6.0.4" + "version": "==6.1" }, "trustar": { "hashes": [ @@ -1174,11 +1223,11 @@ }, "urllib3": { "hashes": [ - "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", - "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.11" + "version": "==1.26.2" }, "uwhois": { "editable": true, @@ -1264,59 +1313,63 @@ }, "yarl": { "hashes": [ - "sha256:03b7a44384ad60be1b7be93c2a24dc74895f8d767ea0bce15b2f6fc7695a3843", - "sha256:076157404db9db4bb3fa9db22db319bbb36d075eeab19ba018ce20ae0cacf037", - "sha256:1c05ae3d5ea4287470046a2c2754f0a4c171b84ea72c8a691f776eb1753dfb91", - "sha256:2467baf8233f7c64048df37e11879c553943ffe7f373e689711ec2807ea13805", - "sha256:2bb2e21cf062dfbe985c3cd4618bae9f25271efcad9e7be1277861247eee9839", - "sha256:311effab3b3828ab34f0e661bb57ff422f67d5c33056298bda4c12195251f8dd", - "sha256:3526cb5905907f0e42bee7ef57ae4a5f02bc27dcac27859269e2bba0caa4c2b6", - "sha256:39b1e586f34b1d2512c9b39aa3cf24c870c972d525e36edc9ee19065db4737bb", - "sha256:4bed5cd7c8e69551eb19df15295ba90e62b9a6a1149c76eb4a9bab194402a156", - "sha256:51c6d3cf7a1f1fbe134bb92f33b7affd94d6de24cd64b466eb12de52120fb8c6", - "sha256:59f78b5da34ddcffb663b772f7619e296518712e022e57fc5d9f921818e2ab7c", - "sha256:6f29115b0c330da25a04f48612d75333bca04521181a666ca0b8761005a99150", - "sha256:73d4e1e1ef5e52d526c92f07d16329e1678612c6a81dd8101fdcae11a72de15c", - "sha256:9b48d31f8d881713fd461abfe7acbb4dcfeb47cec3056aa83f2fbcd2244577f7", - "sha256:a1fd575dd058e10ad4c35065e7c3007cc74d142f622b14e168d8a273a2fa8713", - "sha256:b3dd1052afd436ba737e61f5d3bed1f43a7f9a33fc58fbe4226eb919a7006019", - "sha256:b99c25ed5c355b35d1e6dae87ac7297a4844a57dc5766b173b88b6163a36eb0d", - "sha256:c056e86bff5a0b566e0d9fab4f67e83b12ae9cbcd250d334cbe2005bbe8c96f2", - "sha256:c45b49b59a5724869899798e1bbd447ac486215269511d3b76b4c235a1b766b6", - "sha256:cd623170c729a865037828e3f99f8ebdb22a467177a539680dfc5670b74c84e2", - "sha256:d25d3311794e6c71b608d7c47651c8f65eea5ab15358a27f29330b3475e8f8e5", - "sha256:d695439c201ed340745250f9eb4dfe8d32bf1e680c16477107b8f3ce4bff4fdb", - "sha256:d77f6c9133d2aabb290a7846aaa74ec14d7b5ab35b01591fac5a70c4a8c959a2", - "sha256:d894a2442d2cd20a3b0b0dce5a353d316c57d25a2b445e03f7eac90eee27b8af", - "sha256:db643ce2b58a4bd11a82348225c53c76ecdd82bb37cf4c085e6df1b676f4038c", - "sha256:e3a0c43a26dfed955b2a06fdc4d51d2c51bc2200aff8ce8faf14e676ea8c8862", - "sha256:e77bf79ad1ccae672eab22453838382fe9029fc27c8029e84913855512a587d8", - "sha256:f2f0174cb15435957d3b751093f89aede77df59a499ab7516bbb633b77ead13a", - "sha256:f3031c78edf10315abe232254e6a36b65afe65fded41ee54ed7976d0b2cdf0da", - "sha256:f4c007156732866aa4507d619fe6f8f2748caabed4f66b276ccd97c82572620c", - "sha256:f4f27ff3dd80bc7c402def211a47291ea123d59a23f59fe18fc0e81e3e71f385", - "sha256:f57744fc61e118b5d114ae8077d8eb9df4d2d2c11e2af194e21f0c11ed9dcf6c", - "sha256:f835015a825980b65356e9520979a1564c56efea7da7d4b68a14d4a07a3a7336" + "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", + "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", + "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", + "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", + "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", + "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", + "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", + "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", + "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", + "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", + "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", + "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", + "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", + "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", + "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", + "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", + "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", + "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", + "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", + "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", + "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", + "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", + "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", + "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", + "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", + "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", + "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", + "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", + "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", + "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", + "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", + "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", + "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", + "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", + "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", + "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", + "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" ], "markers": "python_version >= '3.6'", - "version": "==1.6.2" + "version": "==1.6.3" } }, "develop": { "attrs": { "hashes": [ - "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", - "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" + "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", + "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.2.0" + "version": "==20.3.0" }, "certifi": { "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", + "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" ], - "version": "==2020.6.20" + "version": "==2020.11.8" }, "chardet": { "hashes": [ @@ -1474,11 +1527,11 @@ "security" ], "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", + "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" ], "index": "pypi", - "version": "==2.24.0" + "version": "==2.25.0" }, "six": { "hashes": [ @@ -1490,18 +1543,19 @@ }, "toml": { "hashes": [ - "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", - "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "version": "==0.10.1" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" }, "urllib3": { "hashes": [ - "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", - "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.11" + "version": "==1.26.2" } } } From d1ac0cffe072b5005a25be6d83df9dd2e6f2ede2 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 15 Nov 2020 20:11:08 +0100 Subject: [PATCH 066/476] fix: [farsight_passivedns] Fixed issue with variable name --- .../modules/expansion/farsight_passivedns.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index b20aaff..fbe7c35 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -19,6 +19,13 @@ moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 +TYPE_TO_FEATURE = { + "domain": "domain name", + "hostname": "hostname", + "ip-src": "IP address", + "ip-dst": "IP address" +} + class FarsightDnsdbParser(): def __init__(self, attribute): @@ -37,17 +44,11 @@ class FarsightDnsdbParser(): 'zone_time_first': {'type': 'datetime', 'object_relation': 'zone_time_first'}, 'zone_time_last': {'type': 'datetime', 'object_relation': 'zone_time_last'} } - self.type_to_feature = { - 'domain': 'domain name', - 'hostname': 'hostname', - 'ip-src': 'IP address', - 'ip-dst': 'IP address' - } self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): for query_type, results in query_response.items(): - comment = self.comment % (query_type, self.type_to_feature[self.attribute['type']], self.attribute['value']) + comment = self.comment % (query_type, TYPE_TO_FEATURE[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') if result.get('rdata') and isinstance(result['rdata'], list): @@ -100,7 +101,7 @@ def handler(q=False): except dnsdb2.DnsdbException as e: return {'error': e.__str__()} if not response: - return {'error': f"Empty results on Farsight DNSDB for the {self.type_to_feature[attribute['type']]}: {attribute['value']}."} + return {'error': f"Empty results on Farsight DNSDB for the {TYPE_TO_FEATURE[attribute['type']]}: {attribute['value']}."} parser = FarsightDnsdbParser(attribute) parser.parse_passivedns_results(response) return parser.get_results() From c1e52fdb12988065dda00cd79f8ac93a6fca95ec Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 15 Nov 2020 20:15:06 +0100 Subject: [PATCH 067/476] fix: [farsight_passivedns] Fixed pep8 backslash issue --- misp_modules/modules/expansion/farsight_passivedns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index fbe7c35..c41333b 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -117,10 +117,10 @@ def add_flex_queries(flex): def flex_queries(client, name, lookup_args): response = {} - rdata = list(client.flex_rdata_regex(name.replace('.', '\.'), **lookup_args)) + rdata = list(client.flex_rdata_regex(name.replace('.', '\\.'), **lookup_args)) if rdata: response['flex_rdata'] = rdata - rrnames = list(client.flex_rrnames_regex(name.replace('.', '\.'), **lookup_args)) + rrnames = list(client.flex_rrnames_regex(name.replace('.', '\\.'), **lookup_args)) if rrnames: response['flex_rrnames'] = rrnames return response From 0fcdfa6c533113ae73d8b455de00cb889c51772e Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 16 Nov 2020 18:25:59 +0100 Subject: [PATCH 068/476] fix: [tests] Less specific assertion for the rbl module test --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index eb29332..3d3d024 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -397,7 +397,7 @@ class TestExpansions(unittest.TestCase): query = {"module": "rbl", "ip-src": "8.8.8.8"} response = self.misp_modules_post(query) try: - self.assertTrue(self.get_values(response).startswith('8.8.8.8.query.senderbase.org: "0-0=1|1=GOOGLE')) + self.assertTrue(self.get_values(response).startswith('8.8.8.8.query.senderbase.org')) except Exception: self.assertEqual(self.get_errors(response), "No data found by querying known RBLs") From b29658dee61874cf9e30f5087d7f7e9ad52db273 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 17 Nov 2020 19:36:19 +0100 Subject: [PATCH 069/476] chg: [documentation] Cleaner documentation directories & auto-generation Including: - A move of the previous `doc` and `docs` directories to `documentation` - `documentation` is now the default directory - The documentation previously under `doc` is now in `documentation/website` - The mkdocs previously under `docs` is now in `documentation/mkdocs` - All single JSON documentation files have been JQed - Some small improvements to list fields displaying --- doc/expansion/greynoise.json | 9 -- doc/export_mod/cef_export.json | 8 -- doc/export_mod/goamlexport.json | 9 -- doc/export_mod/liteexport.json | 8 -- doc/export_mod/nexthinkexport.json | 9 -- doc/export_mod/osqueryexport.json | 9 -- doc/export_mod/pdfexport.json | 8 -- doc/export_mod/threatStream_misp_export.json | 9 -- doc/export_mod/threat_connect_export.json | 9 -- doc/generate_documentation.py | 65 --------- doc/import_mod/csvimport.json | 8 -- doc/import_mod/cuckooimport.json | 9 -- doc/import_mod/email_import.json | 8 -- doc/import_mod/goamlimport.json | 9 -- doc/import_mod/mispjson.json | 8 -- doc/import_mod/ocr.json | 8 -- doc/import_mod/openiocimport.json | 8 -- doc/import_mod/threatanalyzer_import.json | 8 -- doc/import_mod/vmray_import.json | 9 -- {doc => documentation}/README.md | 124 +++++++++++------- documentation/generate_documentation.py | 68 ++++++++++ {doc => documentation}/logos/apivoid.png | Bin {doc => documentation}/logos/assemblyline.png | Bin .../logos/backscatter_io.png | Bin {doc => documentation}/logos/bitcoin.png | Bin {doc => documentation}/logos/cisco.png | Bin {doc => documentation}/logos/crowdstrike.png | Bin {doc => documentation}/logos/cuckoo.png | Bin {doc => documentation}/logos/cve.png | Bin .../logos/cytomic_orion.png | Bin {doc => documentation}/logos/docx.png | Bin {doc => documentation}/logos/domaintools.png | Bin {doc => documentation}/logos/eql.png | Bin {doc => documentation}/logos/eupi.png | Bin {doc => documentation}/logos/farsight.png | Bin {doc => documentation}/logos/goAML.jpg | Bin {doc => documentation}/logos/google.png | Bin {doc => documentation}/logos/greynoise.png | Bin {doc => documentation}/logos/hibp.png | Bin {doc => documentation}/logos/intel471.png | Bin {doc => documentation}/logos/intelmq.png | Bin {doc => documentation}/logos/joesandbox.png | Bin {doc => documentation}/logos/lastline.png | Bin .../logos/macaddress_io.png | Bin {doc => documentation}/logos/macvendors.png | Bin {doc => documentation}/logos/maxmind.png | Bin {doc => documentation}/logos/nexthink.svg | 0 {doc => documentation}/logos/ods.png | Bin {doc => documentation}/logos/odt.png | Bin {doc => documentation}/logos/onyphe.jpg | Bin {doc => documentation}/logos/osquery.png | Bin {doc => documentation}/logos/otx.png | Bin {doc => documentation}/logos/passivedns.png | Bin {doc => documentation}/logos/passivessl.png | Bin {doc => documentation}/logos/passivetotal.png | Bin {doc => documentation}/logos/pdf.jpg | Bin {doc => documentation}/logos/pptx.png | Bin .../logos/recordedfuture.png | Bin .../logos/securitytrails.png | Bin {doc => documentation}/logos/shodan.png | Bin {doc => documentation}/logos/sigma.png | Bin .../logos/sophoslabs_intelix.svg | 0 {doc => documentation}/logos/spamhaus.jpg | Bin {doc => documentation}/logos/stix.png | Bin .../logos/threatconnect.png | Bin {doc => documentation}/logos/threatcrowd.png | Bin {doc => documentation}/logos/threatminer.png | Bin {doc => documentation}/logos/threatstream.png | Bin {doc => documentation}/logos/trustar.png | Bin {doc => documentation}/logos/urlhaus.png | Bin {doc => documentation}/logos/urlscan.jpg | Bin {doc => documentation}/logos/virustotal.png | Bin {doc => documentation}/logos/vmray.png | Bin {doc => documentation}/logos/vulndb.png | Bin {doc => documentation}/logos/vulners.png | Bin {doc => documentation}/logos/wikidata.png | Bin {doc => documentation}/logos/xforce.png | Bin {doc => documentation}/logos/xlsx.png | Bin {doc => documentation}/logos/yara.png | Bin .../mkdocs}/REQUIREMENTS.txt | 0 {docs => documentation/mkdocs}/contribute.md | 0 .../mkdocs}/img/favicon.ico | Bin {docs => documentation/mkdocs}/img/misp.png | Bin {docs => documentation/mkdocs}/index.md | 0 {docs => documentation/mkdocs}/install.md | 0 {docs => documentation/mkdocs}/license.md | 0 .../website}/expansion/apiosintds.json | 10 +- .../website}/expansion/apivoid.json | 12 +- .../expansion/assemblyline_query.json | 12 +- .../expansion/assemblyline_submit.json | 12 +- .../website}/expansion/backscatter_io.json | 12 +- .../website}/expansion/bgpranking.json | 10 +- .../website}/expansion/btc_scam_check.json | 14 +- .../website}/expansion/btc_steroids.json | 4 +- .../website}/expansion/censys_enrich.json | 10 +- .../website}/expansion/circl_passivedns.json | 14 +- .../website}/expansion/circl_passivessl.json | 13 +- .../website}/expansion/countrycode.json | 2 +- .../website}/expansion/cpe.json | 8 +- .../expansion/crowdstrike_falcon.json | 12 +- .../website}/expansion/cuckoo_submit.json | 13 +- .../website}/expansion/cve.json | 9 +- .../website}/expansion/cve_advanced.json | 9 +- .../website}/expansion/cytomic_orion.json | 13 +- .../website}/expansion/dbl_spamhaus.json | 12 +- .../website}/expansion/dns.json | 6 +- .../website}/expansion/docx_enrich.json | 8 +- .../website}/expansion/domaintools.json | 13 +- .../website}/expansion/eql.json | 8 +- .../website}/expansion/eupi.json | 13 +- .../expansion/farsight_passivedns.json | 13 +- .../website}/expansion/geoip_asn.json | 12 +- .../website}/expansion/geoip_city.json | 12 +- .../website}/expansion/geoip_country.json | 12 +- .../website}/expansion/google_search.json | 12 +- .../website/expansion/greynoise.json | 14 ++ .../website}/expansion/hashdd.json | 6 +- .../website}/expansion/hibp.json | 8 +- .../website}/expansion/html_to_markdown.json | 6 +- .../website}/expansion/intel471.json | 12 +- .../website}/expansion/intelmq_eventdb.json | 14 +- .../website}/expansion/ipasn.json | 10 +- .../website}/expansion/iprep.json | 10 +- .../website}/expansion/joesandbox_query.json | 13 +- .../website}/expansion/joesandbox_submit.json | 13 +- .../website}/expansion/lastline_query.json | 8 +- .../website}/expansion/lastline_submit.json | 8 +- .../website}/expansion/macaddress_io.json | 14 +- .../website}/expansion/macvendors.json | 9 +- .../website}/expansion/malwarebazaar.json | 6 +- .../website}/expansion/ocr_enrich.json | 6 +- .../website}/expansion/ods_enrich.json | 10 +- .../website}/expansion/odt_enrich.json | 8 +- .../website}/expansion/onyphe.json | 14 +- .../website}/expansion/onyphe_full.json | 14 +- .../website}/expansion/otx.json | 12 +- .../website}/expansion/passivetotal.json | 13 +- .../website}/expansion/pdf_enrich.json | 8 +- .../website}/expansion/pptx_enrich.json | 8 +- .../website}/expansion/qrcode.json | 8 +- .../website}/expansion/ransomcoindb.json | 10 +- .../website}/expansion/rbl.json | 10 +- .../website}/expansion/recordedfuture.json | 12 +- .../website}/expansion/reversedns.json | 6 +- .../website}/expansion/securitytrails.json | 13 +- .../website}/expansion/shodan.json | 13 +- .../website}/expansion/sigma_queries.json | 12 +- .../expansion/sigma_syntax_validator.json | 13 +- .../expansion/sophoslabs_intelix.json | 12 +- .../website}/expansion/sourcecache.json | 10 +- .../stix2_pattern_syntax_validator.json | 12 +- .../website}/expansion/threatcrowd.json | 8 +- .../website}/expansion/threatminer.json | 8 +- .../website}/expansion/trustar_enrich.json | 8 +- .../website}/expansion/urlhaus.json | 8 +- .../website}/expansion/urlscan.json | 12 +- .../website}/expansion/virustotal.json | 13 +- .../website}/expansion/virustotal_public.json | 13 +- .../website}/expansion/vmray_submit.json | 12 +- .../website}/expansion/vulndb.json | 12 +- .../website}/expansion/vulners.json | 13 +- .../website}/expansion/whois.json | 10 +- .../website}/expansion/wiki.json | 12 +- .../website}/expansion/xforceexchange.json | 12 +- .../website}/expansion/xlsx_enrich.json | 8 +- .../website}/expansion/yara_query.json | 13 +- .../expansion/yara_syntax_validator.json | 12 +- .../website/export_mod/cef_export.json | 10 ++ ...sco_firesight_manager_ACL_rule_export.json | 8 +- .../website/export_mod/goamlexport.json | 14 ++ .../website/export_mod/liteexport.json | 8 ++ .../website}/export_mod/mass_eql_export.json | 8 +- .../website/export_mod/nexthinkexport.json | 11 ++ .../website/export_mod/osqueryexport.json | 9 ++ .../website/export_mod/pdfexport.json | 13 ++ .../website}/export_mod/testexport.json | 2 +- .../export_mod/threatStream_misp_export.json | 14 ++ .../export_mod/threat_connect_export.json | 13 ++ .../website}/export_mod/vt_graph.json | 12 +- .../website/import_mod/csvimport.json | 13 ++ .../website/import_mod/cuckooimport.json | 12 ++ .../website/import_mod/email_import.json | 8 ++ .../website/import_mod/goamlimport.json | 11 ++ .../website}/import_mod/joe_import.json | 9 +- .../website}/import_mod/lastline_import.json | 8 +- .../website/import_mod/mispjson.json | 8 ++ documentation/website/import_mod/ocr.json | 8 ++ .../website/import_mod/openiocimport.json | 12 ++ .../import_mod/threatanalyzer_import.json | 10 ++ .../website/import_mod/vmray_import.json | 13 ++ 190 files changed, 945 insertions(+), 558 deletions(-) delete mode 100644 doc/expansion/greynoise.json delete mode 100644 doc/export_mod/cef_export.json delete mode 100644 doc/export_mod/goamlexport.json delete mode 100644 doc/export_mod/liteexport.json delete mode 100644 doc/export_mod/nexthinkexport.json delete mode 100644 doc/export_mod/osqueryexport.json delete mode 100644 doc/export_mod/pdfexport.json delete mode 100644 doc/export_mod/threatStream_misp_export.json delete mode 100644 doc/export_mod/threat_connect_export.json delete mode 100644 doc/generate_documentation.py delete mode 100644 doc/import_mod/csvimport.json delete mode 100644 doc/import_mod/cuckooimport.json delete mode 100644 doc/import_mod/email_import.json delete mode 100644 doc/import_mod/goamlimport.json delete mode 100644 doc/import_mod/mispjson.json delete mode 100644 doc/import_mod/ocr.json delete mode 100644 doc/import_mod/openiocimport.json delete mode 100644 doc/import_mod/threatanalyzer_import.json delete mode 100644 doc/import_mod/vmray_import.json rename {doc => documentation}/README.md (96%) create mode 100644 documentation/generate_documentation.py rename {doc => documentation}/logos/apivoid.png (100%) rename {doc => documentation}/logos/assemblyline.png (100%) rename {doc => documentation}/logos/backscatter_io.png (100%) rename {doc => documentation}/logos/bitcoin.png (100%) rename {doc => documentation}/logos/cisco.png (100%) rename {doc => documentation}/logos/crowdstrike.png (100%) rename {doc => documentation}/logos/cuckoo.png (100%) rename {doc => documentation}/logos/cve.png (100%) rename {doc => documentation}/logos/cytomic_orion.png (100%) rename {doc => documentation}/logos/docx.png (100%) rename {doc => documentation}/logos/domaintools.png (100%) rename {doc => documentation}/logos/eql.png (100%) rename {doc => documentation}/logos/eupi.png (100%) rename {doc => documentation}/logos/farsight.png (100%) rename {doc => documentation}/logos/goAML.jpg (100%) rename {doc => documentation}/logos/google.png (100%) rename {doc => documentation}/logos/greynoise.png (100%) rename {doc => documentation}/logos/hibp.png (100%) rename {doc => documentation}/logos/intel471.png (100%) rename {doc => documentation}/logos/intelmq.png (100%) rename {doc => documentation}/logos/joesandbox.png (100%) rename {doc => documentation}/logos/lastline.png (100%) rename {doc => documentation}/logos/macaddress_io.png (100%) rename {doc => documentation}/logos/macvendors.png (100%) rename {doc => documentation}/logos/maxmind.png (100%) rename {doc => documentation}/logos/nexthink.svg (100%) rename {doc => documentation}/logos/ods.png (100%) rename {doc => documentation}/logos/odt.png (100%) rename {doc => documentation}/logos/onyphe.jpg (100%) rename {doc => documentation}/logos/osquery.png (100%) rename {doc => documentation}/logos/otx.png (100%) rename {doc => documentation}/logos/passivedns.png (100%) rename {doc => documentation}/logos/passivessl.png (100%) rename {doc => documentation}/logos/passivetotal.png (100%) rename {doc => documentation}/logos/pdf.jpg (100%) rename {doc => documentation}/logos/pptx.png (100%) rename {doc => documentation}/logos/recordedfuture.png (100%) rename {doc => documentation}/logos/securitytrails.png (100%) rename {doc => documentation}/logos/shodan.png (100%) rename {doc => documentation}/logos/sigma.png (100%) rename {doc => documentation}/logos/sophoslabs_intelix.svg (100%) rename {doc => documentation}/logos/spamhaus.jpg (100%) rename {doc => documentation}/logos/stix.png (100%) rename {doc => documentation}/logos/threatconnect.png (100%) rename {doc => documentation}/logos/threatcrowd.png (100%) rename {doc => documentation}/logos/threatminer.png (100%) rename {doc => documentation}/logos/threatstream.png (100%) rename {doc => documentation}/logos/trustar.png (100%) rename {doc => documentation}/logos/urlhaus.png (100%) rename {doc => documentation}/logos/urlscan.jpg (100%) rename {doc => documentation}/logos/virustotal.png (100%) rename {doc => documentation}/logos/vmray.png (100%) rename {doc => documentation}/logos/vulndb.png (100%) rename {doc => documentation}/logos/vulners.png (100%) rename {doc => documentation}/logos/wikidata.png (100%) rename {doc => documentation}/logos/xforce.png (100%) rename {doc => documentation}/logos/xlsx.png (100%) rename {doc => documentation}/logos/yara.png (100%) rename {docs => documentation/mkdocs}/REQUIREMENTS.txt (100%) rename {docs => documentation/mkdocs}/contribute.md (100%) rename {docs => documentation/mkdocs}/img/favicon.ico (100%) rename {docs => documentation/mkdocs}/img/misp.png (100%) rename {docs => documentation/mkdocs}/index.md (100%) rename {docs => documentation/mkdocs}/install.md (100%) rename {docs => documentation/mkdocs}/license.md (100%) rename {doc => documentation/website}/expansion/apiosintds.json (76%) rename {doc => documentation/website}/expansion/apivoid.json (72%) rename {doc => documentation/website}/expansion/assemblyline_query.json (78%) rename {doc => documentation/website}/expansion/assemblyline_submit.json (72%) rename {doc => documentation/website}/expansion/backscatter_io.json (66%) rename {doc => documentation/website}/expansion/bgpranking.json (63%) rename {doc => documentation/website}/expansion/btc_scam_check.json (57%) rename {doc => documentation/website}/expansion/btc_steroids.json (88%) rename {doc => documentation/website}/expansion/censys_enrich.json (76%) rename {doc => documentation/website}/expansion/circl_passivedns.json (61%) rename {doc => documentation/website}/expansion/circl_passivessl.json (66%) rename {doc => documentation/website}/expansion/countrycode.json (99%) rename {doc => documentation/website}/expansion/cpe.json (90%) rename {doc => documentation/website}/expansion/crowdstrike_falcon.json (83%) rename {doc => documentation/website}/expansion/cuckoo_submit.json (62%) rename {doc => documentation/website}/expansion/cve.json (77%) rename {doc => documentation/website}/expansion/cve_advanced.json (87%) rename {doc => documentation/website}/expansion/cytomic_orion.json (62%) rename {doc => documentation/website}/expansion/dbl_spamhaus.json (76%) rename {doc => documentation/website}/expansion/dns.json (90%) rename {doc => documentation/website}/expansion/docx_enrich.json (82%) rename {doc => documentation/website}/expansion/domaintools.json (80%) rename {doc => documentation/website}/expansion/eql.json (77%) rename {doc => documentation/website}/expansion/eupi.json (71%) rename {doc => documentation/website}/expansion/farsight_passivedns.json (79%) rename {doc => documentation/website}/expansion/geoip_asn.json (72%) rename {doc => documentation/website}/expansion/geoip_city.json (74%) rename {doc => documentation/website}/expansion/geoip_country.json (72%) rename {doc => documentation/website}/expansion/google_search.json (64%) create mode 100644 documentation/website/expansion/greynoise.json rename {doc => documentation/website}/expansion/hashdd.json (86%) rename {doc => documentation/website}/expansion/hibp.json (83%) rename {doc => documentation/website}/expansion/html_to_markdown.json (84%) rename {doc => documentation/website}/expansion/intel471.json (79%) rename {doc => documentation/website}/expansion/intelmq_eventdb.json (57%) rename {doc => documentation/website}/expansion/ipasn.json (70%) rename {doc => documentation/website}/expansion/iprep.json (71%) rename {doc => documentation/website}/expansion/joesandbox_query.json (84%) rename {doc => documentation/website}/expansion/joesandbox_submit.json (77%) rename {doc => documentation/website}/expansion/lastline_query.json (89%) rename {doc => documentation/website}/expansion/lastline_submit.json (85%) rename {doc => documentation/website}/expansion/macaddress_io.json (60%) rename {doc => documentation/website}/expansion/macvendors.json (73%) rename {doc => documentation/website}/expansion/malwarebazaar.json (91%) rename {doc => documentation/website}/expansion/ocr_enrich.json (85%) rename {doc => documentation/website}/expansion/ods_enrich.json (65%) rename {doc => documentation/website}/expansion/odt_enrich.json (80%) rename {doc => documentation/website}/expansion/onyphe.json (61%) rename {doc => documentation/website}/expansion/onyphe_full.json (69%) rename {doc => documentation/website}/expansion/otx.json (77%) rename {doc => documentation/website}/expansion/passivetotal.json (82%) rename {doc => documentation/website}/expansion/pdf_enrich.json (76%) rename {doc => documentation/website}/expansion/pptx_enrich.json (77%) rename {doc => documentation/website}/expansion/qrcode.json (72%) rename {doc => documentation/website}/expansion/ransomcoindb.json (82%) rename {doc => documentation/website}/expansion/rbl.json (65%) rename {doc => documentation/website}/expansion/recordedfuture.json (85%) rename {doc => documentation/website}/expansion/reversedns.json (90%) rename {doc => documentation/website}/expansion/securitytrails.json (77%) rename {doc => documentation/website}/expansion/shodan.json (61%) rename {doc => documentation/website}/expansion/sigma_queries.json (69%) rename {doc => documentation/website}/expansion/sigma_syntax_validator.json (67%) rename {doc => documentation/website}/expansion/sophoslabs_intelix.json (70%) rename {doc => documentation/website}/expansion/sourcecache.json (67%) rename {doc => documentation/website}/expansion/stix2_pattern_syntax_validator.json (60%) rename {doc => documentation/website}/expansion/threatcrowd.json (87%) rename {doc => documentation/website}/expansion/threatminer.json (87%) rename {doc => documentation/website}/expansion/trustar_enrich.json (81%) rename {doc => documentation/website}/expansion/urlhaus.json (86%) rename {doc => documentation/website}/expansion/urlscan.json (73%) rename {doc => documentation/website}/expansion/virustotal.json (80%) rename {doc => documentation/website}/expansion/virustotal_public.json (78%) rename {doc => documentation/website}/expansion/vmray_submit.json (74%) rename {doc => documentation/website}/expansion/vulndb.json (71%) rename {doc => documentation/website}/expansion/vulners.json (69%) rename {doc => documentation/website}/expansion/whois.json (77%) rename {doc => documentation/website}/expansion/wiki.json (72%) rename {doc => documentation/website}/expansion/xforceexchange.json (73%) rename {doc => documentation/website}/expansion/xlsx_enrich.json (73%) rename {doc => documentation/website}/expansion/yara_query.json (77%) rename {doc => documentation/website}/expansion/yara_syntax_validator.json (70%) create mode 100644 documentation/website/export_mod/cef_export.json rename {doc => documentation/website}/export_mod/cisco_firesight_manager_ACL_rule_export.json (79%) create mode 100644 documentation/website/export_mod/goamlexport.json create mode 100644 documentation/website/export_mod/liteexport.json rename {doc => documentation/website}/export_mod/mass_eql_export.json (74%) create mode 100644 documentation/website/export_mod/nexthinkexport.json create mode 100644 documentation/website/export_mod/osqueryexport.json create mode 100644 documentation/website/export_mod/pdfexport.json rename {doc => documentation/website}/export_mod/testexport.json (95%) create mode 100644 documentation/website/export_mod/threatStream_misp_export.json create mode 100644 documentation/website/export_mod/threat_connect_export.json rename {doc => documentation/website}/export_mod/vt_graph.json (66%) create mode 100644 documentation/website/import_mod/csvimport.json create mode 100644 documentation/website/import_mod/cuckooimport.json create mode 100644 documentation/website/import_mod/email_import.json create mode 100644 documentation/website/import_mod/goamlimport.json rename {doc => documentation/website}/import_mod/joe_import.json (78%) rename {doc => documentation/website}/import_mod/lastline_import.json (86%) create mode 100644 documentation/website/import_mod/mispjson.json create mode 100644 documentation/website/import_mod/ocr.json create mode 100644 documentation/website/import_mod/openiocimport.json create mode 100644 documentation/website/import_mod/threatanalyzer_import.json create mode 100644 documentation/website/import_mod/vmray_import.json diff --git a/doc/expansion/greynoise.json b/doc/expansion/greynoise.json deleted file mode 100644 index 49ba481..0000000 --- a/doc/expansion/greynoise.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to access GreyNoise.io API", - "logo": "logos/greynoise.png", - "requirements": ["A Greynoise API key."], - "input": "An IP address.", - "output": "Additional information about the IP fetched from Greynoise API.", - "references": ["https://greynoise.io/", "https://github.com/GreyNoise-Intelligence/api.greynoise.io"], - "features": "The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text." -} diff --git a/doc/export_mod/cef_export.json b/doc/export_mod/cef_export.json deleted file mode 100644 index 84bba8e..0000000 --- a/doc/export_mod/cef_export.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to export a MISP event in CEF format.", - "requirements": [], - "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in Common Event Format.\nThus, there is no particular feature concerning MISP Events since any event can be exported. However, 4 configuration parameters recognized by CEF format are required and should be provided by users before exporting data: the device vendor, product and version, as well as the default severity of data.", - "references": ["https://community.softwaregrp.com/t5/ArcSight-Connectors/ArcSight-Common-Event-Format-CEF-Guide/ta-p/1589306?attachment-id=65537"], - "input": "MISP Event attributes", - "output": "Common Event Format file" -} diff --git a/doc/export_mod/goamlexport.json b/doc/export_mod/goamlexport.json deleted file mode 100644 index 57a1587..0000000 --- a/doc/export_mod/goamlexport.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "This module is used to export MISP events containing transaction objects into GoAML format.", - "logo": "logos/goAML.jpg", - "requirements": ["PyMISP","MISP objects"], - "features": "The module works as long as there is at least one transaction object in the Event.\n\nThen in order to have a valid GoAML document, please follow these guidelines:\n- For each transaction object, use either a bank-account, person, or legal-entity object to describe the origin of the transaction, and again one of them to describe the target of the transaction.\n- Create an object reference for both origin and target objects of the transaction.\n- A bank-account object needs a signatory, which is a person object, put as object reference of the bank-account.\n- A person can have an address, which is a geolocation object, put as object reference of the person.\n\nSupported relation types for object references that are recommended for each object are the folowing:\n- transaction:\n\t- 'from', 'from_my_client': Origin of the transaction - at least one of them is required.\n\t- 'to', 'to_my_client': Target of the transaction - at least one of them is required.\n\t- 'address': Location of the transaction - optional.\n- bank-account:\n\t- 'signatory': Signatory of a bank-account - the reference from bank-account to a signatory is required, but the relation-type is optional at the moment since this reference will always describe a signatory.\n\t- 'entity': Entity owning the bank account - optional.\n- person:\n\t- 'address': Address of a person - optional.", - "references": ["http://goaml.unodc.org/"], - "input": "MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target.", - "output": "GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities)." -} diff --git a/doc/export_mod/liteexport.json b/doc/export_mod/liteexport.json deleted file mode 100644 index 110577c..0000000 --- a/doc/export_mod/liteexport.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Lite export of a MISP event.", - "requirements": [], - "features": "This module is simply producing a json MISP event format file, but exporting only Attributes from the Event. Thus, MISP Events exported with this module should have attributes that are not internal references, otherwise the resulting event would be empty.", - "references": [], - "input": "MISP Event attributes", - "output": "Lite MISP Event" -} diff --git a/doc/export_mod/nexthinkexport.json b/doc/export_mod/nexthinkexport.json deleted file mode 100644 index 182448c..0000000 --- a/doc/export_mod/nexthinkexport.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Nexthink NXQL query export module", - "requirements": [], - "features": "This module export an event as Nexthink NXQL queries that can then be used in your own python3 tool or from wget/powershell", - "references": ["https://doc.nexthink.com/Documentation/Nexthink/latest/APIAndIntegrations/IntroducingtheWebAPIV2"], - "input": "MISP Event attributes", - "output": "Nexthink NXQL queries", - "logo": "logos/nexthink.svg" -} diff --git a/doc/export_mod/osqueryexport.json b/doc/export_mod/osqueryexport.json deleted file mode 100644 index 6543cb1..0000000 --- a/doc/export_mod/osqueryexport.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "OSQuery export of a MISP event.", - "requirements": [], - "features": "This module export an event as osquery queries that can be used in packs or in fleet management solution like Kolide.", - "references": [], - "input": "MISP Event attributes", - "output": "osquery SQL queries", - "logo": "logos/osquery.png" -} diff --git a/doc/export_mod/pdfexport.json b/doc/export_mod/pdfexport.json deleted file mode 100644 index f1654dc..0000000 --- a/doc/export_mod/pdfexport.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Simple export of a MISP event to PDF.", - "requirements": ["PyMISP", "reportlab"], - "features": "The module takes care of the PDF file building, and work with any MISP Event. Except the requirement of reportlab, used to create the file, there is no special feature concerning the Event. Some parameters can be given through the config dict. 'MISP_base_url_for_dynamic_link' is your MISP URL, to attach an hyperlink to your event on your MISP instance from the PDF. Keep it clear to avoid hyperlinks in the generated pdf.\n 'MISP_name_for_metadata' is your CERT or MISP instance name. Used as text in the PDF' metadata\n 'Activate_textual_description' is a boolean (True or void) to activate the textual description/header abstract of an event\n 'Activate_galaxy_description' is a boolean (True or void) to activate the description of event related galaxies.\n 'Activate_related_events' is a boolean (True or void) to activate the description of related event. Be aware this might leak information on confidential events linked to the current event !\n 'Activate_internationalization_fonts' is a boolean (True or void) to activate Noto fonts instead of default fonts (Helvetica). This allows the support of CJK alphabet. Be sure to have followed the procedure to download Noto fonts (~70Mo) in the right place (/tools/pdf_fonts/Noto_TTF), to allow PyMisp to find and use them during PDF generation.\n 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option ", - "references": ["https://acrobat.adobe.com/us/en/acrobat/about-adobe-pdf.html"], - "input": "MISP Event", - "output": "MISP Event in a PDF file." -} diff --git a/doc/export_mod/threatStream_misp_export.json b/doc/export_mod/threatStream_misp_export.json deleted file mode 100644 index 3fdc50a..0000000 --- a/doc/export_mod/threatStream_misp_export.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to export a structured CSV file for uploading to threatStream.", - "logo": "logos/threatstream.png", - "requirements": ["csv"], - "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatStream.", - "references": ["https://www.anomali.com/platform/threatstream", "https://github.com/threatstream"], - "input": "MISP Event attributes", - "output": "ThreatStream CSV format file" -} diff --git a/doc/export_mod/threat_connect_export.json b/doc/export_mod/threat_connect_export.json deleted file mode 100644 index 8d19572..0000000 --- a/doc/export_mod/threat_connect_export.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to export a structured CSV file for uploading to ThreatConnect.", - "logo": "logos/threatconnect.png", - "requirements": ["csv"], - "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatConnect.\nUsers should then provide, as module configuration, the source of data they export, because it is required by the output format.", - "references": ["https://www.threatconnect.com"], - "input": "MISP Event attributes", - "output": "ThreatConnect CSV format file" -} diff --git a/doc/generate_documentation.py b/doc/generate_documentation.py deleted file mode 100644 index e7defa1..0000000 --- a/doc/generate_documentation.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -import os -import json - -module_types = ['expansion', 'export_mod', 'import_mod'] -titles = ['Expansion Modules', 'Export Modules', 'Import Modules'] -markdown = ["# MISP modules documentation\n"] -githublink = 'https://github.com/MISP/misp-modules/tree/main/misp_modules/modules' - - -def generate_doc(root_path): - for _path, title in zip(module_types, titles): - markdown.append('\n## {}\n'.format(title)) - current_path = os.path.join(root_path, _path) - files = sorted(os.listdir(current_path)) - githubpath = '{}/{}'.format(githublink, _path) - for _file in files: - modulename = _file.split('.json')[0] - githubref = '{}/{}.py'.format(githubpath, modulename) - markdown.append('\n#### [{}]({})\n'.format(modulename, githubref)) - filename = os.path.join(current_path, _file) - with open(filename, 'rt') as f: - definition = json.loads(f.read()) - if 'logo' in definition: - markdown.append('\n\n'.format(definition.pop('logo'))) - if 'description' in definition: - markdown.append('\n{}\n'.format(definition.pop('description'))) - for field, value in sorted(definition.items()): - if value: - value = ', '.join(value) if isinstance(value, list) else '{}'.format(value.replace('\n', '\n>')) - markdown.append('- **{}**:\n>{}\n'.format(field, value)) - markdown.append('\n-----\n') - with open('README.md', 'w') as w: - w.write(''.join(markdown)) - -def generate_docs_for_mkdocs(root_path): - for _path, title in zip(module_types, titles): - markdown = [] - #markdown.append('## {}\n'.format(title)) - current_path = os.path.join(root_path, _path) - files = sorted(os.listdir(current_path)) - githubpath = '{}/{}'.format(githublink, _path) - for _file in files: - modulename = _file.split('.json')[0] - githubref = '{}/{}.py'.format(githubpath, modulename) - markdown.append('\n#### [{}]({})\n'.format(modulename, githubref)) - filename = os.path.join(current_path, _file) - with open(filename, 'rt') as f: - definition = json.loads(f.read()) - if 'logo' in definition: - markdown.append('\n\n'.format(definition.pop('logo'))) - if 'description' in definition: - markdown.append('\n{}\n'.format(definition.pop('description'))) - for field, value in sorted(definition.items()): - if value: - value = ', '.join(value) if isinstance(value, list) else '{}'.format(value.replace('\n', '\n>')) - markdown.append('- **{}**:\n>{}\n'.format(field, value)) - markdown.append('\n-----\n') - with open(root_path+"/../"+"/docs/"+_path+".md", 'w') as w: - w.write(''.join(markdown)) - -if __name__ == '__main__': - root_path = os.path.dirname(os.path.realpath(__file__)) - generate_doc(root_path) - generate_docs_for_mkdocs(root_path) diff --git a/doc/import_mod/csvimport.json b/doc/import_mod/csvimport.json deleted file mode 100644 index 66a10fd..0000000 --- a/doc/import_mod/csvimport.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to import MISP attributes from a csv file.", - "requirements": ["PyMISP"], - "features": "In order to parse data from a csv file, a header is required to let the module know which column is matching with known attribute fields / MISP types.\n\nThis header either comes from the csv file itself or is part of the configuration of the module and should be filled out in MISP plugin settings, each field separated by COMMAS. Fields that do not match with any type known in MISP or are not MISP attribute fields should be ignored in import, using a space or simply nothing between two separators (example: 'ip-src, , comment, ').\n\nIf the csv file already contains a header that does not start by a '#', you should tick the checkbox 'has_header' to avoid importing it and have potential issues. You can also redefine the header even if it is already contained in the file, by following the rules for headers explained earlier. One reason why you would redefine a header is for instance when you want to skip some fields, or some fields are not valid types.", - "references": ["https://tools.ietf.org/html/rfc4180", "https://tools.ietf.org/html/rfc7111"], - "input": "CSV format file.", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/cuckooimport.json b/doc/import_mod/cuckooimport.json deleted file mode 100644 index 8091d07..0000000 --- a/doc/import_mod/cuckooimport.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to import Cuckoo JSON.", - "logo": "logos/cuckoo.png", - "requirements": [], - "features": "The module simply imports MISP Attributes from a Cuckoo JSON format file. There is thus no special feature to make it work.", - "references": ["https://cuckoosandbox.org/", "https://github.com/cuckoosandbox/cuckoo"], - "input": "Cuckoo JSON file", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/email_import.json b/doc/import_mod/email_import.json deleted file mode 100644 index 1f53852..0000000 --- a/doc/import_mod/email_import.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to import emails in MISP.", - "requirements": [], - "features": "This module can be used to import e-mail text as well as attachments and urls.\n3 configuration parameters are then used to unzip attachments, guess zip attachment passwords, and extract urls: set each one of them to True or False to process or not the respective corresponding actions.", - "references": [], - "input": "E-mail file", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/goamlimport.json b/doc/import_mod/goamlimport.json deleted file mode 100644 index f2a1ec2..0000000 --- a/doc/import_mod/goamlimport.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to import MISP objects about financial transactions from GoAML files.", - "logo": "logos/goAML.jpg", - "requirements": ["PyMISP"], - "features": "Unlike the GoAML export module, there is here no special feature to import data from GoAML external files, since the module will import MISP Objects with their References on its own, as it is required for the export module to rebuild a valid GoAML document.", - "references": "http://goaml.unodc.org/", - "input": "GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities).", - "output": "MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target." -} diff --git a/doc/import_mod/mispjson.json b/doc/import_mod/mispjson.json deleted file mode 100644 index dd11405..0000000 --- a/doc/import_mod/mispjson.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to import MISP JSON format for merging MISP events.", - "requirements": [], - "features": "The module simply imports MISP Attributes from an other MISP Event in order to merge events together. There is thus no special feature to make it work.", - "references": [], - "input": "MISP Event", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/ocr.json b/doc/import_mod/ocr.json deleted file mode 100644 index 14bbf0b..0000000 --- a/doc/import_mod/ocr.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Optical Character Recognition (OCR) module for MISP.", - "requirements": [], - "features": "The module tries to recognize some text from an image and import the result as a freetext attribute, there is then no special feature asked to users to make it work.", - "references": [], - "input": "Image", - "output": "freetext MISP attribute" -} diff --git a/doc/import_mod/openiocimport.json b/doc/import_mod/openiocimport.json deleted file mode 100644 index e173392..0000000 --- a/doc/import_mod/openiocimport.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to import OpenIOC packages.", - "requirements": ["PyMISP"], - "features": "The module imports MISP Attributes from OpenIOC packages, there is then no special feature for users to make it work.", - "references": ["https://www.fireeye.com/blog/threat-research/2013/10/openioc-basics.html"], - "input": "OpenIOC packages", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/threatanalyzer_import.json b/doc/import_mod/threatanalyzer_import.json deleted file mode 100644 index 40e4436..0000000 --- a/doc/import_mod/threatanalyzer_import.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "description": "Module to import ThreatAnalyzer archive.zip / analysis.json files.", - "requirements": [], - "features": "The module imports MISP Attributes from a ThreatAnalyzer format file. This file can be either ZIP, or JSON format.\nThere is by the way no special feature for users to make the module work.", - "references": ["https://www.threattrack.com/malware-analysis.aspx"], - "input": "ThreatAnalyzer format file", - "output": "MISP Event attributes" -} diff --git a/doc/import_mod/vmray_import.json b/doc/import_mod/vmray_import.json deleted file mode 100644 index b7c0dad..0000000 --- a/doc/import_mod/vmray_import.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Module to import VMRay (VTI) results.", - "logo": "logos/vmray.png", - "requirements": ["vmray_rest_api"], - "features": "The module imports MISP Attributes from VMRay format, using the VMRay api.\nUsers should then provide as the module configuration the API Key as well as the server url in order to fetch their data to import.", - "references": ["https://www.vmray.com/"], - "input": "VMRay format", - "output": "MISP Event attributes" -} diff --git a/doc/README.md b/documentation/README.md similarity index 96% rename from doc/README.md rename to documentation/README.md index 3b2bceb..9a818db 100644 --- a/doc/README.md +++ b/documentation/README.md @@ -91,8 +91,6 @@ A module to submit samples and URLs to AssemblyLine for advanced analysis, and r Query backscatter.io (https://backscatter.io/). - **features**: >The module takes a source or destination IP address as input and displays the information known by backscatter.io. -> -> - **input**: >IP addresses. - **output**: @@ -109,8 +107,6 @@ Query backscatter.io (https://backscatter.io/). Query BGP Ranking (https://bgpranking-ng.circl.lu/). - **features**: >The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day. -> -> - **input**: >Autonomous system number. - **output**: @@ -182,9 +178,11 @@ Module to access CIRCL Passive DNS. - **ouput**: >Passive DNS objects related to the input attribute. - **references**: ->https://www.circl.lu/services/passive-dns/, https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/ +> - https://www.circl.lu/services/passive-dns/ +> - https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/ - **requirements**: ->pypdns: Passive DNS python library, A CIRCL passive DNS account with username & password +> - pypdns: Passive DNS python library +> - A CIRCL passive DNS account with username & password ----- @@ -204,7 +202,8 @@ Modules to access CIRCL Passive SSL. - **references**: >https://www.circl.lu/services/passive-ssl/ - **requirements**: ->pypssl: Passive SSL python library, A CIRCL passive SSL account with username & password +> - pypssl: Passive SSL python library +> - A CIRCL passive SSL account with username & password ----- @@ -222,9 +221,9 @@ Module to expand country codes. ----- -#### [cpe](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cpe.py) +#### [cpe](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cpe.py) - + An expansion module to query the CVE search API with a cpe code to get its related vulnerabilities. - **features**: @@ -310,7 +309,8 @@ An expansion module to submit files and URLs to Cuckoo Sandbox. - **output**: >A text field containing 'Cuckoo task id: ' - **references**: ->https://cuckoosandbox.org/, https://cuckoo.sh/docs/ +> - https://cuckoosandbox.org/ +> - https://cuckoo.sh/docs/ - **requirements**: >Access to a Cuckoo Sandbox API and an API key if the API requires it. (api_url and api_key) @@ -328,7 +328,8 @@ An expansion hover module to expand information about CVE id. - **output**: >Text giving information about the CVE related to the Vulnerability. - **references**: ->https://cve.circl.lu/, https://cve.mitre.org/ +> - https://cve.circl.lu/ +> - https://cve.mitre.org/ ----- @@ -348,7 +349,8 @@ An expansion module to query the CIRCL CVE search API for more information about - **output**: >Additional information about the vulnerability, such as its cvss score, some references, or the related weaknesses and attack patterns. - **references**: ->https://cve.circl.lu, https://cve/mitre.org/ +> - https://cve.circl.lu +> - https://cve/mitre.org/ ----- @@ -364,7 +366,8 @@ An expansion module to enrich attributes in MISP by quering the Cytomic Orion AP - **output**: >MISP objects with sightings of the hash in Cytomic Orion. Includes files and machines. - **references**: ->https://www.vanimpe.eu/2020/03/10/integrating-misp-and-cytomic-orion/, https://www.cytomicmodel.com/solutions/ +> - https://www.vanimpe.eu/2020/03/10/integrating-misp-and-cytomic-orion/ +> - https://www.cytomicmodel.com/solutions/ - **requirements**: >Access (license) to Cytomic Orion @@ -459,7 +462,8 @@ DomainTools MISP expansion module. - **references**: >https://www.domaintools.com/ - **requirements**: ->Domaintools python library, A Domaintools API access (username & apikey) +> - Domaintools python library +> - A Domaintools API access (username & apikey) ----- @@ -495,7 +499,8 @@ A module to query the Phishing Initiative service (https://phishing-initiative.l - **references**: >https://phishing-initiative.eu/?lang=en - **requirements**: ->pyeupi: eupi python library, An access to the Phishing Initiative API (apikey & url) +> - pyeupi: eupi python library +> - An access to the Phishing Initiative API (apikey & url) ----- @@ -516,7 +521,8 @@ Module to access Farsight DNSDB Passive DNS. - **output**: >Passive-dns objects, resulting from the query on the Farsight Passive DNS API. - **references**: ->https://www.farsightsecurity.com/, https://docs.dnsdb.info/dnsdb-api/ +> - https://www.farsightsecurity.com/ +> - https://docs.dnsdb.info/dnsdb-api/ - **requirements**: >An access to the Farsight Passive DNS API (apikey) @@ -608,7 +614,8 @@ Module to access GreyNoise.io API - **output**: >Additional information about the IP fetched from Greynoise API. - **references**: ->https://greynoise.io/, https://github.com/GreyNoise-Intelligence/api.greynoise.io +> - https://greynoise.io/ +> - https://github.com/GreyNoise-Intelligence/api.greynoise.io - **requirements**: >A Greynoise API key. @@ -703,9 +710,11 @@ Module to access intelmqs eventdb. - **output**: >Text giving information about the input using IntelMQ database. - **references**: ->https://github.com/certtools/intelmq, https://intelmq.readthedocs.io/en/latest/Developers-Guide/ +> - https://github.com/certtools/intelmq +> - https://intelmq.readthedocs.io/en/latest/Developers-Guide/ - **requirements**: ->psycopg2: Python library to support PostgreSQL, An access to the IntelMQ database (username, password, hostname and database reference) +> - psycopg2: Python library to support PostgreSQL +> - An access to the IntelMQ database (username, password, hostname and database reference) ----- @@ -761,7 +770,8 @@ This url can by the way come from the result of the [joesandbox_submit expansion - **output**: >MISP attributes & objects parsed from the analysis report. - **references**: ->https://www.joesecurity.org, https://www.joesandbox.com/ +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ - **requirements**: >jbxapi: Joe Sandbox API python3 library @@ -781,7 +791,8 @@ A module to submit files or URLs to Joe Sandbox for an advanced analysis, and re - **output**: >Link of the report generated in Joe Sandbox. - **references**: ->https://www.joesecurity.org, https://www.joesandbox.com/ +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ - **requirements**: >jbxapi: Joe Sandbox API python3 library @@ -840,9 +851,11 @@ MISP hover module for macaddress.io - **output**: >Text containing information on the MAC address fetched from a query on macaddress.io. - **references**: ->https://macaddress.io/, https://github.com/CodeLineFi/maclookup-python +> - https://macaddress.io/ +> - https://github.com/CodeLineFi/maclookup-python - **requirements**: ->maclookup: macaddress.io python library, An access to the macaddress.io API (apikey) +> - maclookup: macaddress.io python library +> - An access to the macaddress.io API (apikey) ----- @@ -858,7 +871,8 @@ Module to access Macvendors API. - **output**: >Additional information about the MAC address. - **references**: ->https://macvendors.com/, https://macvendors.com/api +> - https://macvendors.com/ +> - https://macvendors.com/api ----- @@ -904,7 +918,8 @@ Module to extract freetext from a .ods document. - **output**: >Text and freetext parsed from the document. - **requirements**: ->ezodf: Python package to create/manipulate OpenDocumentFormat files., pandas_ods_reader: Python library to read in ODS files. +> - ezodf: Python package to create/manipulate OpenDocumentFormat files. +> - pandas_ods_reader: Python library to read in ODS files. ----- @@ -936,9 +951,11 @@ Module to process a query on Onyphe. - **output**: >MISP attributes fetched from the Onyphe query. - **references**: ->https://www.onyphe.io/, https://github.com/sebdraven/pyonyphe +> - https://www.onyphe.io/ +> - https://github.com/sebdraven/pyonyphe - **requirements**: ->onyphe python library, An access to the Onyphe API (apikey) +> - onyphe python library +> - An access to the Onyphe API (apikey) ----- @@ -956,9 +973,11 @@ Module to process a full query on Onyphe. - **output**: >MISP attributes fetched from the Onyphe query. - **references**: ->https://www.onyphe.io/, https://github.com/sebdraven/pyonyphe +> - https://www.onyphe.io/ +> - https://github.com/sebdraven/pyonyphe - **requirements**: ->onyphe python library, An access to the Onyphe API (apikey) +> - onyphe python library +> - An access to the Onyphe API (apikey) ----- @@ -1043,7 +1062,8 @@ Module to get information from AlienVault OTX. - **references**: >https://www.passivetotal.org/register - **requirements**: ->Passivetotal python library, An access to the PassiveTotal API (apikey) +> - Passivetotal python library +> - An access to the PassiveTotal API (apikey) ----- @@ -1089,7 +1109,8 @@ Module to decode QR codes. - **output**: >The URL or bitcoin address the QR code is pointing to. - **requirements**: ->cv2: The OpenCV python library., pyzbar: Python library to read QR codes. +> - cv2: The OpenCV python library. +> - pyzbar: Python library to read QR codes. ----- @@ -1194,7 +1215,8 @@ An expansion modules for SecurityTrails. - **references**: >https://securitytrails.com/ - **requirements**: ->dnstrails python library, An access to the SecurityTrails API (apikey) +> - dnstrails python library +> - An access to the SecurityTrails API (apikey) ----- @@ -1212,7 +1234,8 @@ Module to query on Shodan. - **references**: >https://www.shodan.io/ - **requirements**: ->shodan python library, An access to the Shodan API (apikey) +> - shodan python library +> - An access to the Shodan API (apikey) ----- @@ -1250,7 +1273,8 @@ An expansion hover module to perform a syntax check on sigma rules. - **references**: >https://github.com/Neo23x0/sigma/wiki - **requirements**: ->Sigma python library, Yaml python library +> - Sigma python library +> - Yaml python library ----- @@ -1470,7 +1494,8 @@ Module to get advanced information from virustotal. - **output**: >MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute. - **references**: ->https://www.virustotal.com/, https://developers.virustotal.com/reference +> - https://www.virustotal.com/ +> - https://developers.virustotal.com/reference - **requirements**: >An access to the VirusTotal API (apikey), with a high request rate limit. @@ -1494,7 +1519,8 @@ Module to get information from VirusTotal. - **output**: >MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute. - **references**: ->https://www.virustotal.com, https://developers.virustotal.com/reference +> - https://www.virustotal.com +> - https://developers.virustotal.com/reference - **requirements**: >An access to the VirusTotal API (apikey) @@ -1561,7 +1587,8 @@ An expansion hover module to expand information about CVE id using Vulners API. - **references**: >https://vulners.com/ - **requirements**: ->Vulners python library, An access to the Vulners API +> - Vulners python library +> - An access to the Vulners API ----- @@ -1652,7 +1679,8 @@ An expansion & hover module to translate any hash attribute into a yara rule. - **output**: >YARA rule. - **references**: ->https://virustotal.github.io/yara/, https://github.com/virustotal/yara-python +> - https://virustotal.github.io/yara/ +> - https://github.com/virustotal/yara-python - **requirements**: >yara-python python library @@ -1740,7 +1768,8 @@ This module is used to export MISP events containing transaction objects into Go - **references**: >http://goaml.unodc.org/ - **requirements**: ->PyMISP, MISP objects +> - PyMISP +> - MISP objects ----- @@ -1820,7 +1849,8 @@ Simple export of a MISP event to PDF. - **references**: >https://acrobat.adobe.com/us/en/acrobat/about-adobe-pdf.html - **requirements**: ->PyMISP, reportlab +> - PyMISP +> - reportlab ----- @@ -1842,7 +1872,8 @@ Module to export a structured CSV file for uploading to threatStream. - **output**: >ThreatStream CSV format file - **references**: ->https://www.anomali.com/platform/threatstream, https://github.com/threatstream +> - https://www.anomali.com/platform/threatstream +> - https://github.com/threatstream - **requirements**: >csv @@ -1903,7 +1934,8 @@ Module to import MISP attributes from a csv file. - **output**: >MISP Event attributes - **references**: ->https://tools.ietf.org/html/rfc4180, https://tools.ietf.org/html/rfc7111 +> - https://tools.ietf.org/html/rfc4180 +> - https://tools.ietf.org/html/rfc7111 - **requirements**: >PyMISP @@ -1921,7 +1953,8 @@ Module to import Cuckoo JSON. - **output**: >MISP Event attributes - **references**: ->https://cuckoosandbox.org/, https://github.com/cuckoosandbox/cuckoo +> - https://cuckoosandbox.org/ +> - https://github.com/cuckoosandbox/cuckoo ----- @@ -1965,14 +1998,13 @@ A module to import data from a Joe Sandbox analysis json report. >Module using the new format of modules able to return attributes and objects. > >The module returns the same results as the expansion module [joesandbox_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) using the submission link of the analysis to get the json report. -> -> - **input**: >Json report of a Joe Sandbox analysis. - **output**: >MISP attributes & objects parsed from the analysis report. - **references**: ->https://www.joesecurity.org, https://www.joesandbox.com/ +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ ----- diff --git a/documentation/generate_documentation.py b/documentation/generate_documentation.py new file mode 100644 index 0000000..4081e50 --- /dev/null +++ b/documentation/generate_documentation.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import os +import json + +module_types = ['expansion', 'export_mod', 'import_mod'] +titles = ['Expansion Modules', 'Export Modules', 'Import Modules'] +githublink = 'https://github.com/MISP/misp-modules/tree/main/misp_modules/modules' + + +def generate_doc(module_type, root_path, logo_path='logos'): + markdown = [] + current_path = os.path.join(root_path, 'website', module_type) + files = sorted(os.listdir(current_path)) + githubpath = f'{githublink}/{module_type}' + for filename in files: + modulename = filename.split('.json')[0] + githubref = f'{githubpath}/{modulename}.py' + markdown.append(f'\n#### [{modulename}]({githubref})\n') + filename = os.path.join(current_path, filename) + with open(filename, 'rt') as f: + definition = json.loads(f.read()) + if 'logo' in definition: + logo = os.path.join(logo_path, definition.pop('logo')) + markdown.append(f"\n\n") + if 'description' in definition: + markdown.append(f"\n{definition.pop('description')}\n") + for field, value in sorted(definition.items()): + if not value: + continue + if isinstance(value, list): + markdown.append(handle_list(field, value)) + continue + markdown.append(get_single_value(field, value.replace('\n', '\n>'))) + markdown.append('\n-----\n') + return markdown + + +def get_single_value(field, value): + return f"- **{field}**:\n>{value}\n" + + +def handle_list(field, values): + if len(values) == 1: + return get_single_value(field, values[0]) + values = '\n> - '.join(values) + return f"- **{field}**:\n> - {values}\n" + + +def write_doc(root_path): + markdown = ["# MISP modules documentation\n"] + for _path, title in zip(module_types, titles): + markdown.append(f'\n## {title}\n') + markdown.extend(generate_doc(_path, root_path)) + with open('README.md', 'w') as w: + w.write(''.join(markdown)) + + +def write_docs_for_mkdocs(root_path): + for _path, title in zip(module_types, titles): + markdown = generate_doc(_path, root_path, logo_path='../logos') + with open(os.path.join(root_path, 'mkdocs', f'{_path}.md'), 'w') as w: + w.write(''.join(markdown)) + + +if __name__ == '__main__': + root_path = os.path.dirname(os.path.realpath(__file__)) + write_doc(root_path) + write_docs_for_mkdocs(root_path) diff --git a/doc/logos/apivoid.png b/documentation/logos/apivoid.png similarity index 100% rename from doc/logos/apivoid.png rename to documentation/logos/apivoid.png diff --git a/doc/logos/assemblyline.png b/documentation/logos/assemblyline.png similarity index 100% rename from doc/logos/assemblyline.png rename to documentation/logos/assemblyline.png diff --git a/doc/logos/backscatter_io.png b/documentation/logos/backscatter_io.png similarity index 100% rename from doc/logos/backscatter_io.png rename to documentation/logos/backscatter_io.png diff --git a/doc/logos/bitcoin.png b/documentation/logos/bitcoin.png similarity index 100% rename from doc/logos/bitcoin.png rename to documentation/logos/bitcoin.png diff --git a/doc/logos/cisco.png b/documentation/logos/cisco.png similarity index 100% rename from doc/logos/cisco.png rename to documentation/logos/cisco.png diff --git a/doc/logos/crowdstrike.png b/documentation/logos/crowdstrike.png similarity index 100% rename from doc/logos/crowdstrike.png rename to documentation/logos/crowdstrike.png diff --git a/doc/logos/cuckoo.png b/documentation/logos/cuckoo.png similarity index 100% rename from doc/logos/cuckoo.png rename to documentation/logos/cuckoo.png diff --git a/doc/logos/cve.png b/documentation/logos/cve.png similarity index 100% rename from doc/logos/cve.png rename to documentation/logos/cve.png diff --git a/doc/logos/cytomic_orion.png b/documentation/logos/cytomic_orion.png similarity index 100% rename from doc/logos/cytomic_orion.png rename to documentation/logos/cytomic_orion.png diff --git a/doc/logos/docx.png b/documentation/logos/docx.png similarity index 100% rename from doc/logos/docx.png rename to documentation/logos/docx.png diff --git a/doc/logos/domaintools.png b/documentation/logos/domaintools.png similarity index 100% rename from doc/logos/domaintools.png rename to documentation/logos/domaintools.png diff --git a/doc/logos/eql.png b/documentation/logos/eql.png similarity index 100% rename from doc/logos/eql.png rename to documentation/logos/eql.png diff --git a/doc/logos/eupi.png b/documentation/logos/eupi.png similarity index 100% rename from doc/logos/eupi.png rename to documentation/logos/eupi.png diff --git a/doc/logos/farsight.png b/documentation/logos/farsight.png similarity index 100% rename from doc/logos/farsight.png rename to documentation/logos/farsight.png diff --git a/doc/logos/goAML.jpg b/documentation/logos/goAML.jpg similarity index 100% rename from doc/logos/goAML.jpg rename to documentation/logos/goAML.jpg diff --git a/doc/logos/google.png b/documentation/logos/google.png similarity index 100% rename from doc/logos/google.png rename to documentation/logos/google.png diff --git a/doc/logos/greynoise.png b/documentation/logos/greynoise.png similarity index 100% rename from doc/logos/greynoise.png rename to documentation/logos/greynoise.png diff --git a/doc/logos/hibp.png b/documentation/logos/hibp.png similarity index 100% rename from doc/logos/hibp.png rename to documentation/logos/hibp.png diff --git a/doc/logos/intel471.png b/documentation/logos/intel471.png similarity index 100% rename from doc/logos/intel471.png rename to documentation/logos/intel471.png diff --git a/doc/logos/intelmq.png b/documentation/logos/intelmq.png similarity index 100% rename from doc/logos/intelmq.png rename to documentation/logos/intelmq.png diff --git a/doc/logos/joesandbox.png b/documentation/logos/joesandbox.png similarity index 100% rename from doc/logos/joesandbox.png rename to documentation/logos/joesandbox.png diff --git a/doc/logos/lastline.png b/documentation/logos/lastline.png similarity index 100% rename from doc/logos/lastline.png rename to documentation/logos/lastline.png diff --git a/doc/logos/macaddress_io.png b/documentation/logos/macaddress_io.png similarity index 100% rename from doc/logos/macaddress_io.png rename to documentation/logos/macaddress_io.png diff --git a/doc/logos/macvendors.png b/documentation/logos/macvendors.png similarity index 100% rename from doc/logos/macvendors.png rename to documentation/logos/macvendors.png diff --git a/doc/logos/maxmind.png b/documentation/logos/maxmind.png similarity index 100% rename from doc/logos/maxmind.png rename to documentation/logos/maxmind.png diff --git a/doc/logos/nexthink.svg b/documentation/logos/nexthink.svg similarity index 100% rename from doc/logos/nexthink.svg rename to documentation/logos/nexthink.svg diff --git a/doc/logos/ods.png b/documentation/logos/ods.png similarity index 100% rename from doc/logos/ods.png rename to documentation/logos/ods.png diff --git a/doc/logos/odt.png b/documentation/logos/odt.png similarity index 100% rename from doc/logos/odt.png rename to documentation/logos/odt.png diff --git a/doc/logos/onyphe.jpg b/documentation/logos/onyphe.jpg similarity index 100% rename from doc/logos/onyphe.jpg rename to documentation/logos/onyphe.jpg diff --git a/doc/logos/osquery.png b/documentation/logos/osquery.png similarity index 100% rename from doc/logos/osquery.png rename to documentation/logos/osquery.png diff --git a/doc/logos/otx.png b/documentation/logos/otx.png similarity index 100% rename from doc/logos/otx.png rename to documentation/logos/otx.png diff --git a/doc/logos/passivedns.png b/documentation/logos/passivedns.png similarity index 100% rename from doc/logos/passivedns.png rename to documentation/logos/passivedns.png diff --git a/doc/logos/passivessl.png b/documentation/logos/passivessl.png similarity index 100% rename from doc/logos/passivessl.png rename to documentation/logos/passivessl.png diff --git a/doc/logos/passivetotal.png b/documentation/logos/passivetotal.png similarity index 100% rename from doc/logos/passivetotal.png rename to documentation/logos/passivetotal.png diff --git a/doc/logos/pdf.jpg b/documentation/logos/pdf.jpg similarity index 100% rename from doc/logos/pdf.jpg rename to documentation/logos/pdf.jpg diff --git a/doc/logos/pptx.png b/documentation/logos/pptx.png similarity index 100% rename from doc/logos/pptx.png rename to documentation/logos/pptx.png diff --git a/doc/logos/recordedfuture.png b/documentation/logos/recordedfuture.png similarity index 100% rename from doc/logos/recordedfuture.png rename to documentation/logos/recordedfuture.png diff --git a/doc/logos/securitytrails.png b/documentation/logos/securitytrails.png similarity index 100% rename from doc/logos/securitytrails.png rename to documentation/logos/securitytrails.png diff --git a/doc/logos/shodan.png b/documentation/logos/shodan.png similarity index 100% rename from doc/logos/shodan.png rename to documentation/logos/shodan.png diff --git a/doc/logos/sigma.png b/documentation/logos/sigma.png similarity index 100% rename from doc/logos/sigma.png rename to documentation/logos/sigma.png diff --git a/doc/logos/sophoslabs_intelix.svg b/documentation/logos/sophoslabs_intelix.svg similarity index 100% rename from doc/logos/sophoslabs_intelix.svg rename to documentation/logos/sophoslabs_intelix.svg diff --git a/doc/logos/spamhaus.jpg b/documentation/logos/spamhaus.jpg similarity index 100% rename from doc/logos/spamhaus.jpg rename to documentation/logos/spamhaus.jpg diff --git a/doc/logos/stix.png b/documentation/logos/stix.png similarity index 100% rename from doc/logos/stix.png rename to documentation/logos/stix.png diff --git a/doc/logos/threatconnect.png b/documentation/logos/threatconnect.png similarity index 100% rename from doc/logos/threatconnect.png rename to documentation/logos/threatconnect.png diff --git a/doc/logos/threatcrowd.png b/documentation/logos/threatcrowd.png similarity index 100% rename from doc/logos/threatcrowd.png rename to documentation/logos/threatcrowd.png diff --git a/doc/logos/threatminer.png b/documentation/logos/threatminer.png similarity index 100% rename from doc/logos/threatminer.png rename to documentation/logos/threatminer.png diff --git a/doc/logos/threatstream.png b/documentation/logos/threatstream.png similarity index 100% rename from doc/logos/threatstream.png rename to documentation/logos/threatstream.png diff --git a/doc/logos/trustar.png b/documentation/logos/trustar.png similarity index 100% rename from doc/logos/trustar.png rename to documentation/logos/trustar.png diff --git a/doc/logos/urlhaus.png b/documentation/logos/urlhaus.png similarity index 100% rename from doc/logos/urlhaus.png rename to documentation/logos/urlhaus.png diff --git a/doc/logos/urlscan.jpg b/documentation/logos/urlscan.jpg similarity index 100% rename from doc/logos/urlscan.jpg rename to documentation/logos/urlscan.jpg diff --git a/doc/logos/virustotal.png b/documentation/logos/virustotal.png similarity index 100% rename from doc/logos/virustotal.png rename to documentation/logos/virustotal.png diff --git a/doc/logos/vmray.png b/documentation/logos/vmray.png similarity index 100% rename from doc/logos/vmray.png rename to documentation/logos/vmray.png diff --git a/doc/logos/vulndb.png b/documentation/logos/vulndb.png similarity index 100% rename from doc/logos/vulndb.png rename to documentation/logos/vulndb.png diff --git a/doc/logos/vulners.png b/documentation/logos/vulners.png similarity index 100% rename from doc/logos/vulners.png rename to documentation/logos/vulners.png diff --git a/doc/logos/wikidata.png b/documentation/logos/wikidata.png similarity index 100% rename from doc/logos/wikidata.png rename to documentation/logos/wikidata.png diff --git a/doc/logos/xforce.png b/documentation/logos/xforce.png similarity index 100% rename from doc/logos/xforce.png rename to documentation/logos/xforce.png diff --git a/doc/logos/xlsx.png b/documentation/logos/xlsx.png similarity index 100% rename from doc/logos/xlsx.png rename to documentation/logos/xlsx.png diff --git a/doc/logos/yara.png b/documentation/logos/yara.png similarity index 100% rename from doc/logos/yara.png rename to documentation/logos/yara.png diff --git a/docs/REQUIREMENTS.txt b/documentation/mkdocs/REQUIREMENTS.txt similarity index 100% rename from docs/REQUIREMENTS.txt rename to documentation/mkdocs/REQUIREMENTS.txt diff --git a/docs/contribute.md b/documentation/mkdocs/contribute.md similarity index 100% rename from docs/contribute.md rename to documentation/mkdocs/contribute.md diff --git a/docs/img/favicon.ico b/documentation/mkdocs/img/favicon.ico similarity index 100% rename from docs/img/favicon.ico rename to documentation/mkdocs/img/favicon.ico diff --git a/docs/img/misp.png b/documentation/mkdocs/img/misp.png similarity index 100% rename from docs/img/misp.png rename to documentation/mkdocs/img/misp.png diff --git a/docs/index.md b/documentation/mkdocs/index.md similarity index 100% rename from docs/index.md rename to documentation/mkdocs/index.md diff --git a/docs/install.md b/documentation/mkdocs/install.md similarity index 100% rename from docs/install.md rename to documentation/mkdocs/install.md diff --git a/docs/license.md b/documentation/mkdocs/license.md similarity index 100% rename from docs/license.md rename to documentation/mkdocs/license.md diff --git a/doc/expansion/apiosintds.json b/documentation/website/expansion/apiosintds.json similarity index 76% rename from doc/expansion/apiosintds.json rename to documentation/website/expansion/apiosintds.json index 81a1eec..8bdaf39 100644 --- a/doc/expansion/apiosintds.json +++ b/documentation/website/expansion/apiosintds.json @@ -1,8 +1,12 @@ { "description": "On demand query API for OSINT.digitalside.it project.", - "requirements": ["The apiosintDS python library to query the OSINT.digitalside.it API."], + "requirements": [ + "The apiosintDS python library to query the OSINT.digitalside.it API." + ], "input": "A domain, ip, url or hash attribute.", "output": "Hashes and urls resulting from the query to OSINT.digitalside.it", - "references": ["https://osint.digitalside.it/#About"], + "references": [ + "https://osint.digitalside.it/#About" + ], "features": "The module simply queries the API of OSINT.digitalside.it with a domain, ip, url or hash attribute.\n\nThe result of the query is then parsed to extract additional hashes or urls. A module parameters also allows to parse the hashes related to the urls.\n\nFurthermore, it is possible to cache the urls and hashes collected over the last 7 days by OSINT.digitalside.it" -} +} \ No newline at end of file diff --git a/doc/expansion/apivoid.json b/documentation/website/expansion/apivoid.json similarity index 72% rename from doc/expansion/apivoid.json rename to documentation/website/expansion/apivoid.json index 2173d5b..5962f57 100644 --- a/doc/expansion/apivoid.json +++ b/documentation/website/expansion/apivoid.json @@ -1,9 +1,13 @@ { "description": "Module to query APIVoid with some domain attributes.", - "logo": "logos/apivoid.png", - "requirements": ["A valid APIVoid API key with enough credits to proceed 2 queries"], + "logo": "apivoid.png", + "requirements": [ + "A valid APIVoid API key with enough credits to proceed 2 queries" + ], "input": "A domain attribute.", "output": "DNS records and SSL certificates related to the domain.", "features": "This module takes a domain name and queries API Void to get the related DNS records and the SSL certificates. It returns then those pieces of data as MISP objects that can be added to the event.\n\nTo make it work, a valid API key and enough credits to proceed 2 queries (0.06 + 0.07 credits) are required.", - "references": ["https://www.apivoid.com/"] -} + "references": [ + "https://www.apivoid.com/" + ] +} \ No newline at end of file diff --git a/doc/expansion/assemblyline_query.json b/documentation/website/expansion/assemblyline_query.json similarity index 78% rename from doc/expansion/assemblyline_query.json rename to documentation/website/expansion/assemblyline_query.json index 700bde0..4d54176 100644 --- a/doc/expansion/assemblyline_query.json +++ b/documentation/website/expansion/assemblyline_query.json @@ -1,9 +1,13 @@ { "description": "A module tu query the AssemblyLine API with a submission ID to get the submission report and parse it.", - "logo": "logos/assemblyline.png", - "requirements": ["assemblyline_client: Python library to query the AssemblyLine rest API."], + "logo": "assemblyline.png", + "requirements": [ + "assemblyline_client: Python library to query the AssemblyLine rest API." + ], "input": "Link of an AssemblyLine submission report.", "output": "MISP attributes & objects parsed from the AssemblyLine submission.", - "references": ["https://www.cyber.cg.ca/en/assemblyline"], + "references": [ + "https://www.cyber.cg.ca/en/assemblyline" + ], "features": "The module requires the address of the AssemblyLine server you want to query as well as your credentials used for this instance. Credentials include the used-ID and an API key or the password associated to the user-ID.\n\nThe submission ID extracted from the submission link is then used to query AssemblyLine and get the full submission report. This report is parsed to extract file objects and the associated IPs, domains or URLs the files are connecting to.\n\nSome more data may be parsed in the future." -} +} \ No newline at end of file diff --git a/doc/expansion/assemblyline_submit.json b/documentation/website/expansion/assemblyline_submit.json similarity index 72% rename from doc/expansion/assemblyline_submit.json rename to documentation/website/expansion/assemblyline_submit.json index 9fe9af6..8f147ca 100644 --- a/doc/expansion/assemblyline_submit.json +++ b/documentation/website/expansion/assemblyline_submit.json @@ -1,9 +1,13 @@ { "description": "A module to submit samples and URLs to AssemblyLine for advanced analysis, and return the link of the submission.", - "logo": "logos/assemblyline.png", - "requirements": ["assemblyline_client: Python library to query the AssemblyLine rest API."], + "logo": "assemblyline.png", + "requirements": [ + "assemblyline_client: Python library to query the AssemblyLine rest API." + ], "input": "Sample, or url to submit to AssemblyLine.", "output": "Link of the report generated in AssemblyLine.", - "references": ["https://www.cyber.gc.ca/en/assemblyline"], + "references": [ + "https://www.cyber.gc.ca/en/assemblyline" + ], "features": "The module requires the address of the AssemblyLine server you want to query as well as your credentials used for this instance. Credentials include the user-ID and an API key or the password associated to the user-ID.\n\nIf the sample or url is correctly submitted, you get then the link of the submission." -} +} \ No newline at end of file diff --git a/doc/expansion/backscatter_io.json b/documentation/website/expansion/backscatter_io.json similarity index 66% rename from doc/expansion/backscatter_io.json rename to documentation/website/expansion/backscatter_io.json index a8475c5..146e41c 100644 --- a/doc/expansion/backscatter_io.json +++ b/documentation/website/expansion/backscatter_io.json @@ -1,9 +1,13 @@ { "description": "Query backscatter.io (https://backscatter.io/).", - "requirements": ["backscatter python library"], - "features": "The module takes a source or destination IP address as input and displays the information known by backscatter.io.\n\n", - "logo": "logos/backscatter_io.png", - "references": ["https://pypi.org/project/backscatter/"], + "requirements": [ + "backscatter python library" + ], + "features": "The module takes a source or destination IP address as input and displays the information known by backscatter.io.", + "logo": "backscatter_io.png", + "references": [ + "https://pypi.org/project/backscatter/" + ], "input": "IP addresses.", "output": "Text containing a history of the IP addresses especially on scanning based on backscatter.io information ." } diff --git a/doc/expansion/bgpranking.json b/documentation/website/expansion/bgpranking.json similarity index 63% rename from doc/expansion/bgpranking.json rename to documentation/website/expansion/bgpranking.json index 4695aa1..5b0383e 100644 --- a/doc/expansion/bgpranking.json +++ b/documentation/website/expansion/bgpranking.json @@ -1,8 +1,12 @@ { "description": "Query BGP Ranking (https://bgpranking-ng.circl.lu/).", - "requirements": ["pybgpranking python library"], - "features": "The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day.\n\n", - "references": ["https://github.com/D4-project/BGP-Ranking/"], + "requirements": [ + "pybgpranking python library" + ], + "features": "The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day.", + "references": [ + "https://github.com/D4-project/BGP-Ranking/" + ], "input": "Autonomous system number.", "output": "An asn object with its related bgp-ranking object." } diff --git a/doc/expansion/btc_scam_check.json b/documentation/website/expansion/btc_scam_check.json similarity index 57% rename from doc/expansion/btc_scam_check.json rename to documentation/website/expansion/btc_scam_check.json index 44fce03..01fe8ff 100644 --- a/doc/expansion/btc_scam_check.json +++ b/documentation/website/expansion/btc_scam_check.json @@ -1,9 +1,13 @@ { "description": "An expansion hover module to query a special dns blacklist to check if a bitcoin address has been abused.", - "requirements": ["dnspython3: dns python library"], + "requirements": [ + "dnspython3: dns python library" + ], "features": "The module queries a dns blacklist directly with the bitcoin address and get a response if the address has been abused.", - "logo": "logos/bitcoin.png", + "logo": "bitcoin.png", "input": "btc address attribute.", - "output" : "Text to indicate if the BTC address has been abused.", - "references": ["https://btcblack.it/"] -} + "output": "Text to indicate if the BTC address has been abused.", + "references": [ + "https://btcblack.it/" + ] +} \ No newline at end of file diff --git a/doc/expansion/btc_steroids.json b/documentation/website/expansion/btc_steroids.json similarity index 88% rename from doc/expansion/btc_steroids.json rename to documentation/website/expansion/btc_steroids.json index fd264d8..b365d44 100644 --- a/doc/expansion/btc_steroids.json +++ b/documentation/website/expansion/btc_steroids.json @@ -1,6 +1,6 @@ { "description": "An expansion hover module to get a blockchain balance from a BTC address in MISP.", - "logo": "logos/bitcoin.png", + "logo": "bitcoin.png", "input": "btc address attribute.", "output": "Text to describe the blockchain balance and the transactions related to the btc address in input." -} +} \ No newline at end of file diff --git a/doc/expansion/censys_enrich.json b/documentation/website/expansion/censys_enrich.json similarity index 76% rename from doc/expansion/censys_enrich.json rename to documentation/website/expansion/censys_enrich.json index 83e6d5f..9f3a6f0 100644 --- a/doc/expansion/censys_enrich.json +++ b/documentation/website/expansion/censys_enrich.json @@ -1,8 +1,12 @@ { "description": "An expansion module to enrich attributes in MISP by quering the censys.io API", - "requirements": ["API credentials to censys.io"], + "requirements": [ + "API credentials to censys.io" + ], "input": "IP, domain or certificate fingerprint (md5, sha1 or sha256)", "output": "MISP objects retrieved from censys, including open ports, ASN, Location of the IP, x509 details", - "references": ["https://www.censys.io"], + "references": [ + "https://www.censys.io" + ], "features": "This module takes an IP, hostname or a certificate fingerprint and attempts to enrich it by querying the Censys API." -} +} \ No newline at end of file diff --git a/doc/expansion/circl_passivedns.json b/documentation/website/expansion/circl_passivedns.json similarity index 61% rename from doc/expansion/circl_passivedns.json rename to documentation/website/expansion/circl_passivedns.json index 024437c..b50136b 100644 --- a/doc/expansion/circl_passivedns.json +++ b/documentation/website/expansion/circl_passivedns.json @@ -1,9 +1,15 @@ { "description": "Module to access CIRCL Passive DNS.", - "logo": "logos/passivedns.png", - "requirements": ["pypdns: Passive DNS python library", "A CIRCL passive DNS account with username & password"], + "logo": "passivedns.png", + "requirements": [ + "pypdns: Passive DNS python library", + "A CIRCL passive DNS account with username & password" + ], "input": "Hostname, domain, or ip-address attribute.", "ouput": "Passive DNS objects related to the input attribute.", "features": "This module takes a hostname, domain or ip-address (ip-src or ip-dst) attribute as input, and queries the CIRCL Passive DNS REST API to get the asssociated passive dns entries and return them as MISP objects.\n\nTo make it work a username and a password are thus required to authenticate to the CIRCL Passive DNS API.", - "references": ["https://www.circl.lu/services/passive-dns/", "https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/"] -} + "references": [ + "https://www.circl.lu/services/passive-dns/", + "https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/" + ] +} \ No newline at end of file diff --git a/doc/expansion/circl_passivessl.json b/documentation/website/expansion/circl_passivessl.json similarity index 66% rename from doc/expansion/circl_passivessl.json rename to documentation/website/expansion/circl_passivessl.json index f9792e1..4010297 100644 --- a/doc/expansion/circl_passivessl.json +++ b/documentation/website/expansion/circl_passivessl.json @@ -1,9 +1,14 @@ { "description": "Modules to access CIRCL Passive SSL.", - "logo": "logos/passivessl.png", - "requirements": ["pypssl: Passive SSL python library", "A CIRCL passive SSL account with username & password"], + "logo": "passivessl.png", + "requirements": [ + "pypssl: Passive SSL python library", + "A CIRCL passive SSL account with username & password" + ], "input": "IP address attribute.", "output": "x509 certificate objects seen by the IP address(es).", "features": "This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the CIRCL Passive SSL REST API to gather the related certificates and return the corresponding MISP objects.\n\nTo make it work a username and a password are required to authenticate to the CIRCL Passive SSL API.", - "references": ["https://www.circl.lu/services/passive-ssl/"] -} + "references": [ + "https://www.circl.lu/services/passive-ssl/" + ] +} \ No newline at end of file diff --git a/doc/expansion/countrycode.json b/documentation/website/expansion/countrycode.json similarity index 99% rename from doc/expansion/countrycode.json rename to documentation/website/expansion/countrycode.json index c6214e5..110bdf7 100644 --- a/doc/expansion/countrycode.json +++ b/documentation/website/expansion/countrycode.json @@ -3,4 +3,4 @@ "input": "Hostname or domain attribute.", "output": "Text with the country code the input belongs to.", "features": "The module takes a domain or a hostname as input, and returns the country it belongs to.\n\nFor non country domains, a list of the most common possible extensions is used." -} +} \ No newline at end of file diff --git a/doc/expansion/cpe.json b/documentation/website/expansion/cpe.json similarity index 90% rename from doc/expansion/cpe.json rename to documentation/website/expansion/cpe.json index 5927e5a..0160d1c 100644 --- a/doc/expansion/cpe.json +++ b/documentation/website/expansion/cpe.json @@ -1,8 +1,10 @@ { "description": "An expansion module to query the CVE search API with a cpe code to get its related vulnerabilities.", - "logo": "logos/cpe.py", + "logo": "cve.png", "input": "CPE attribute.", "output": "The vulnerabilities related to the CPE.", - "references": ["https://cve.circl.lu/api/"], + "references": [ + "https://cve.circl.lu/api/" + ], "features": "The module takes a cpe attribute as input and queries the CVE search API to get its related vulnerabilities. \nThe list of vulnerabilities is then parsed and returned as vulnerability objects.\n\nUsers can use their own CVE search API url by defining a value to the custom_API_URL parameter. If no custom API url is given, the default cve.circl.lu api url is used.\n\nIn order to limit the amount of data returned by CVE serach, users can also the limit parameter. With the limit set, the API returns only the requested number of vulnerabilities, sorted from the highest cvss score to the lowest one." -} +} \ No newline at end of file diff --git a/doc/expansion/crowdstrike_falcon.json b/documentation/website/expansion/crowdstrike_falcon.json similarity index 83% rename from doc/expansion/crowdstrike_falcon.json rename to documentation/website/expansion/crowdstrike_falcon.json index 07e9dbd..a2408b9 100644 --- a/doc/expansion/crowdstrike_falcon.json +++ b/documentation/website/expansion/crowdstrike_falcon.json @@ -1,9 +1,13 @@ { "description": "Module to query Crowdstrike Falcon.", - "logo": "logos/crowdstrike.png", - "requirements": ["A CrowdStrike API access (API id & key)"], + "logo": "crowdstrike.png", + "requirements": [ + "A CrowdStrike API access (API id & key)" + ], "input": "A MISP attribute included in the following list:\n- domain\n- email-attachment\n- email-dst\n- email-reply-to\n- email-src\n- email-subject\n- filename\n- hostname\n- ip-src\n- ip-dst\n- md5\n- mutex\n- regkey\n- sha1\n- sha256\n- uri\n- url\n- user-agent\n- whois-registrant-email\n- x509-fingerprint-md5", "output": "MISP attributes mapped after the CrowdStrike API has been queried, included in the following list:\n- hostname\n- email-src\n- email-subject\n- filename\n- md5\n- sha1\n- sha256\n- ip-dst\n- ip-dst\n- mutex\n- regkey\n- url\n- user-agent\n- x509-fingerprint-md5", - "references": ["https://www.crowdstrike.com/products/crowdstrike-falcon-faq/"], + "references": [ + "https://www.crowdstrike.com/products/crowdstrike-falcon-faq/" + ], "features": "This module takes a MISP attribute as input to query a CrowdStrike Falcon API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes.\n\nPlease note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported." -} +} \ No newline at end of file diff --git a/doc/expansion/cuckoo_submit.json b/documentation/website/expansion/cuckoo_submit.json similarity index 62% rename from doc/expansion/cuckoo_submit.json rename to documentation/website/expansion/cuckoo_submit.json index 7fe8067..5c23218 100644 --- a/doc/expansion/cuckoo_submit.json +++ b/documentation/website/expansion/cuckoo_submit.json @@ -1,9 +1,14 @@ { "description": "An expansion module to submit files and URLs to Cuckoo Sandbox.", - "logo": "logos/cuckoo.png", - "requirements": ["Access to a Cuckoo Sandbox API and an API key if the API requires it. (api_url and api_key)"], + "logo": "cuckoo.png", + "requirements": [ + "Access to a Cuckoo Sandbox API and an API key if the API requires it. (api_url and api_key)" + ], "input": "A malware-sample or attachment for files. A url or domain for URLs.", "output": "A text field containing 'Cuckoo task id: '", - "references": ["https://cuckoosandbox.org/", "https://cuckoo.sh/docs/"], + "references": [ + "https://cuckoosandbox.org/", + "https://cuckoo.sh/docs/" + ], "features": "The module takes a malware-sample, attachment, url or domain and submits it to Cuckoo Sandbox.\n The returned task id can be used to retrieve results when the analysis completed." -} +} \ No newline at end of file diff --git a/doc/expansion/cve.json b/documentation/website/expansion/cve.json similarity index 77% rename from doc/expansion/cve.json rename to documentation/website/expansion/cve.json index 04f131f..04f5733 100644 --- a/doc/expansion/cve.json +++ b/documentation/website/expansion/cve.json @@ -1,8 +1,11 @@ { "description": "An expansion hover module to expand information about CVE id.", - "logo": "logos/cve.png", + "logo": "cve.png", "input": "Vulnerability attribute.", "output": "Text giving information about the CVE related to the Vulnerability.", - "references": ["https://cve.circl.lu/", "https://cve.mitre.org/"], + "references": [ + "https://cve.circl.lu/", + "https://cve.mitre.org/" + ], "features": "The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to get information about the vulnerability as it is described in the list of CVEs." -} +} \ No newline at end of file diff --git a/doc/expansion/cve_advanced.json b/documentation/website/expansion/cve_advanced.json similarity index 87% rename from doc/expansion/cve_advanced.json rename to documentation/website/expansion/cve_advanced.json index a4b2ac6..364fb32 100644 --- a/doc/expansion/cve_advanced.json +++ b/documentation/website/expansion/cve_advanced.json @@ -1,8 +1,11 @@ { "description": "An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE).", - "logo": "logos/cve.png", + "logo": "cve.png", "input": "Vulnerability attribute.", "output": "Additional information about the vulnerability, such as its cvss score, some references, or the related weaknesses and attack patterns.", - "references": ["https://cve.circl.lu", "https://cve/mitre.org/"], + "references": [ + "https://cve.circl.lu", + "https://cve/mitre.org/" + ], "features": "The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to gather additional information.\n\nThe result of the query is then parsed to return additional information about the vulnerability, like its cvss score or some references, as well as the potential related weaknesses and attack patterns.\n\nThe vulnerability additional data is returned in a vulnerability MISP object, and the related additional information are put into weakness and attack-pattern MISP objects." -} +} \ No newline at end of file diff --git a/doc/expansion/cytomic_orion.json b/documentation/website/expansion/cytomic_orion.json similarity index 62% rename from doc/expansion/cytomic_orion.json rename to documentation/website/expansion/cytomic_orion.json index 6f87657..8623670 100644 --- a/doc/expansion/cytomic_orion.json +++ b/documentation/website/expansion/cytomic_orion.json @@ -1,9 +1,14 @@ { "description": "An expansion module to enrich attributes in MISP by quering the Cytomic Orion API", - "logo": "logos/cytomic_orion.png", - "requirements": ["Access (license) to Cytomic Orion"], + "logo": "cytomic_orion.png", + "requirements": [ + "Access (license) to Cytomic Orion" + ], "input": "MD5, hash of the sample / malware to search for.", "output": "MISP objects with sightings of the hash in Cytomic Orion. Includes files and machines.", - "references": ["https://www.vanimpe.eu/2020/03/10/integrating-misp-and-cytomic-orion/", "https://www.cytomicmodel.com/solutions/"], + "references": [ + "https://www.vanimpe.eu/2020/03/10/integrating-misp-and-cytomic-orion/", + "https://www.cytomicmodel.com/solutions/" + ], "features": "This module takes an MD5 hash and searches for occurrences of this hash in the Cytomic Orion database. Returns observed files and machines." -} +} \ No newline at end of file diff --git a/doc/expansion/dbl_spamhaus.json b/documentation/website/expansion/dbl_spamhaus.json similarity index 76% rename from doc/expansion/dbl_spamhaus.json rename to documentation/website/expansion/dbl_spamhaus.json index ea73dcb..6a33c8e 100644 --- a/doc/expansion/dbl_spamhaus.json +++ b/documentation/website/expansion/dbl_spamhaus.json @@ -1,9 +1,13 @@ { "description": "Module to check Spamhaus DBL for a domain name.", - "logo": "logos/spamhaus.jpg", - "requirements": ["dnspython3: DNS python3 library"], + "logo": "spamhaus.jpg", + "requirements": [ + "dnspython3: DNS python3 library" + ], "input": "Domain or hostname attribute.", "output": "Information about the nature of the input.", - "references": ["https://www.spamhaus.org/faq/section/Spamhaus%20DBL"], + "references": [ + "https://www.spamhaus.org/faq/section/Spamhaus%20DBL" + ], "features": "This modules takes a domain or a hostname in input and queries the Domain Block List provided by Spamhaus to determine what kind of domain it is.\n\nDBL then returns a response code corresponding to a certain classification of the domain we display. If the queried domain is not in the list, it is also mentionned.\n\nPlease note that composite MISP attributes containing domain or hostname are supported as well." -} +} \ No newline at end of file diff --git a/doc/expansion/dns.json b/documentation/website/expansion/dns.json similarity index 90% rename from doc/expansion/dns.json rename to documentation/website/expansion/dns.json index dc43b64..a0fb4dd 100644 --- a/doc/expansion/dns.json +++ b/documentation/website/expansion/dns.json @@ -1,7 +1,9 @@ { "description": "A simple DNS expansion service to resolve IP address from domain MISP attributes.", - "requirements": ["dnspython3: DNS python3 library"], + "requirements": [ + "dnspython3: DNS python3 library" + ], "input": "Domain or hostname attribute.", "output": "IP address resolving the input.", "features": "The module takes a domain of hostname attribute as input, and tries to resolve it. If no error is encountered, the IP address that resolves the domain is returned, otherwise the origin of the error is displayed.\n\nThe address of the DNS resolver to use is also configurable, but if no configuration is set, we use the Google public DNS address (8.8.8.8).\n\nPlease note that composite MISP attributes containing domain or hostname are supported as well." -} +} \ No newline at end of file diff --git a/doc/expansion/docx_enrich.json b/documentation/website/expansion/docx_enrich.json similarity index 82% rename from doc/expansion/docx_enrich.json rename to documentation/website/expansion/docx_enrich.json index fccba57..55bd955 100644 --- a/doc/expansion/docx_enrich.json +++ b/documentation/website/expansion/docx_enrich.json @@ -1,9 +1,11 @@ { "description": "Module to extract freetext from a .docx document.", - "logo": "logos/docx.png", - "requirements": ["docx python library"], + "logo": "docx.png", + "requirements": [ + "docx python library" + ], "input": "Attachment attribute containing a .docx document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a .docx document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/domaintools.json b/documentation/website/expansion/domaintools.json similarity index 80% rename from doc/expansion/domaintools.json rename to documentation/website/expansion/domaintools.json index 849028c..99c916b 100644 --- a/doc/expansion/domaintools.json +++ b/documentation/website/expansion/domaintools.json @@ -1,9 +1,14 @@ { "description": "DomainTools MISP expansion module.", - "logo": "logos/domaintools.png", - "requirements": ["Domaintools python library", "A Domaintools API access (username & apikey)"], + "logo": "domaintools.png", + "requirements": [ + "Domaintools python library", + "A Domaintools API access (username & apikey)" + ], "input": "A MISP attribute included in the following list:\n- domain\n- hostname\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-name\n- whois-registrant-phone\n- ip-src\n- ip-dst", "output": "MISP attributes mapped after the Domaintools API has been queried, included in the following list:\n- whois-registrant-email\n- whois-registrant-phone\n- whois-registrant-name\n- whois-registrar\n- whois-creation-date\n- text\n- domain", - "references": ["https://www.domaintools.com/"], + "references": [ + "https://www.domaintools.com/" + ], "features": "This module takes a MISP attribute as input to query the Domaintools API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes.\n\nPlease note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported." -} +} \ No newline at end of file diff --git a/doc/expansion/eql.json b/documentation/website/expansion/eql.json similarity index 77% rename from doc/expansion/eql.json rename to documentation/website/expansion/eql.json index 1a32adf..4af9df4 100644 --- a/doc/expansion/eql.json +++ b/documentation/website/expansion/eql.json @@ -1,9 +1,11 @@ { "description": "EQL query generation for a MISP attribute.", - "logo": "logos/eql.png", + "logo": "eql.png", "requirements": [], "input": "A filename or ip attribute.", "output": "Attribute containing EQL for a network or file attribute.", - "references": ["https://eql.readthedocs.io/en/latest/"], + "references": [ + "https://eql.readthedocs.io/en/latest/" + ], "features": "This module adds a new attribute to a MISP event containing an EQL query for a network or file attribute." -} +} \ No newline at end of file diff --git a/doc/expansion/eupi.json b/documentation/website/expansion/eupi.json similarity index 71% rename from doc/expansion/eupi.json rename to documentation/website/expansion/eupi.json index 02a16fb..07eb59e 100644 --- a/doc/expansion/eupi.json +++ b/documentation/website/expansion/eupi.json @@ -1,9 +1,14 @@ { "description": "A module to query the Phishing Initiative service (https://phishing-initiative.lu).", - "logo": "logos/eupi.png", - "requirements": ["pyeupi: eupi python library", "An access to the Phishing Initiative API (apikey & url)"], + "logo": "eupi.png", + "requirements": [ + "pyeupi: eupi python library", + "An access to the Phishing Initiative API (apikey & url)" + ], "input": "A domain, hostname or url MISP attribute.", "output": "Text containing information about the input, resulting from the query on Phishing Initiative.", - "references": ["https://phishing-initiative.eu/?lang=en"], + "references": [ + "https://phishing-initiative.eu/?lang=en" + ], "features": "This module takes a domain, hostname or url MISP attribute as input to query the Phishing Initiative API. The API returns then the result of the query with some information about the value queried.\n\nPlease note that composite attributes containing domain or hostname are also supported." -} +} \ No newline at end of file diff --git a/doc/expansion/farsight_passivedns.json b/documentation/website/expansion/farsight_passivedns.json similarity index 79% rename from doc/expansion/farsight_passivedns.json rename to documentation/website/expansion/farsight_passivedns.json index 2dbc64e..ec33026 100644 --- a/doc/expansion/farsight_passivedns.json +++ b/documentation/website/expansion/farsight_passivedns.json @@ -1,9 +1,14 @@ { "description": "Module to access Farsight DNSDB Passive DNS.", - "logo": "logos/farsight.png", - "requirements": ["An access to the Farsight Passive DNS API (apikey)"], + "logo": "farsight.png", + "requirements": [ + "An access to the Farsight Passive DNS API (apikey)" + ], "input": "A domain, hostname or IP address MISP attribute.", "output": "Passive-dns objects, resulting from the query on the Farsight Passive DNS API.", - "references": ["https://www.farsightsecurity.com/", "https://docs.dnsdb.info/dnsdb-api/"], + "references": [ + "https://www.farsightsecurity.com/", + "https://docs.dnsdb.info/dnsdb-api/" + ], "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API.\n The results of rdata and rrset lookups are then returned and parsed into passive-dns objects.\n\nAn API key is required to submit queries to the API.\n It is also possible to define a custom server URL, and to set a limit of results to get.\n This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit)." -} +} \ No newline at end of file diff --git a/doc/expansion/geoip_asn.json b/documentation/website/expansion/geoip_asn.json similarity index 72% rename from doc/expansion/geoip_asn.json rename to documentation/website/expansion/geoip_asn.json index 98189c7..9a7b1dd 100644 --- a/doc/expansion/geoip_asn.json +++ b/documentation/website/expansion/geoip_asn.json @@ -1,9 +1,13 @@ { "descrption": "An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about its related AS number.", - "logo": "logos/maxmind.png", - "requirements": ["A local copy of Maxmind's Geolite database"], + "logo": "maxmind.png", + "requirements": [ + "A local copy of Maxmind's Geolite database" + ], "input": "An IP address MISP attribute.", "output": "Text containing information about the AS number of the IP address.", - "references": ["https://www.maxmind.com/en/home"], + "references": [ + "https://www.maxmind.com/en/home" + ], "features": "The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the related AS number." -} +} \ No newline at end of file diff --git a/doc/expansion/geoip_city.json b/documentation/website/expansion/geoip_city.json similarity index 74% rename from doc/expansion/geoip_city.json rename to documentation/website/expansion/geoip_city.json index bf6d8fa..24d286b 100644 --- a/doc/expansion/geoip_city.json +++ b/documentation/website/expansion/geoip_city.json @@ -1,9 +1,13 @@ { "description": "An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about the city where it is located.", - "logo": "logos/maxmind.png", - "requirements": ["A local copy of Maxmind's Geolite database"], + "logo": "maxmind.png", + "requirements": [ + "A local copy of Maxmind's Geolite database" + ], "input": "An IP address MISP attribute.", "output": "Text containing information about the city where the IP address is located.", - "references": ["https://www.maxmind.com/en/home"], + "references": [ + "https://www.maxmind.com/en/home" + ], "features": "The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the city where this IP address is located." -} +} \ No newline at end of file diff --git a/doc/expansion/geoip_country.json b/documentation/website/expansion/geoip_country.json similarity index 72% rename from doc/expansion/geoip_country.json rename to documentation/website/expansion/geoip_country.json index 9db49a2..ec84282 100644 --- a/doc/expansion/geoip_country.json +++ b/documentation/website/expansion/geoip_country.json @@ -1,9 +1,13 @@ { "description": "Module to query a local copy of Maxmind's Geolite database.", - "logo": "logos/maxmind.png", - "requirements": ["A local copy of Maxmind's Geolite database"], + "logo": "maxmind.png", + "requirements": [ + "A local copy of Maxmind's Geolite database" + ], "input": "An IP address MISP Attribute.", "output": "Text containing information about the location of the IP address.", - "references": ["https://www.maxmind.com/en/home"], + "references": [ + "https://www.maxmind.com/en/home" + ], "features": "This module takes an IP address MISP attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the location of this IP address.\n\nPlease note that composite attributes domain|ip are also supported." -} +} \ No newline at end of file diff --git a/doc/expansion/google_search.json b/documentation/website/expansion/google_search.json similarity index 64% rename from doc/expansion/google_search.json rename to documentation/website/expansion/google_search.json index a3caddf..8772d21 100644 --- a/doc/expansion/google_search.json +++ b/documentation/website/expansion/google_search.json @@ -1,9 +1,13 @@ { "descrption": "A hover module to get information about an url using a Google search.", - "logo": "logos/google.png", - "requirements": ["The python Google Search API library"], + "logo": "google.png", + "requirements": [ + "The python Google Search API library" + ], "input": "An url attribute.", "output": "Text containing the result of a Google search on the input url.", - "references": ["https://github.com/abenassi/Google-Search-API"], + "references": [ + "https://github.com/abenassi/Google-Search-API" + ], "features": "The module takes an url as input to query the Google search API. The result of the query is then return as raw text." -} +} \ No newline at end of file diff --git a/documentation/website/expansion/greynoise.json b/documentation/website/expansion/greynoise.json new file mode 100644 index 0000000..4c61727 --- /dev/null +++ b/documentation/website/expansion/greynoise.json @@ -0,0 +1,14 @@ +{ + "description": "Module to access GreyNoise.io API", + "logo": "greynoise.png", + "requirements": [ + "A Greynoise API key." + ], + "input": "An IP address.", + "output": "Additional information about the IP fetched from Greynoise API.", + "references": [ + "https://greynoise.io/", + "https://github.com/GreyNoise-Intelligence/api.greynoise.io" + ], + "features": "The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is \u201cInternet background noise\u201d, or has been observed scanning or attacking devices across the Internet. The result is returned as text." +} \ No newline at end of file diff --git a/doc/expansion/hashdd.json b/documentation/website/expansion/hashdd.json similarity index 86% rename from doc/expansion/hashdd.json rename to documentation/website/expansion/hashdd.json index d963820..2edc1d1 100644 --- a/doc/expansion/hashdd.json +++ b/documentation/website/expansion/hashdd.json @@ -2,6 +2,8 @@ "description": "A hover module to check hashes against hashdd.com including NSLR dataset.", "input": "A hash MISP attribute (md5).", "output": "Text describing the known level of the hash in the hashdd databases.", - "references": ["https://hashdd.com/"], + "references": [ + "https://hashdd.com/" + ], "features": "This module takes a hash attribute as input to check its known level, using the hashdd API. This information is then displayed." -} +} \ No newline at end of file diff --git a/doc/expansion/hibp.json b/documentation/website/expansion/hibp.json similarity index 83% rename from doc/expansion/hibp.json rename to documentation/website/expansion/hibp.json index 3c3ee54..a2b7b09 100644 --- a/doc/expansion/hibp.json +++ b/documentation/website/expansion/hibp.json @@ -1,9 +1,11 @@ { "description": "Module to access haveibeenpwned.com API.", - "logo": "logos/hibp.png", + "logo": "hibp.png", "requirements": [], "input": "An email address", "output": "Additional information about the email address.", - "references": ["https://haveibeenpwned.com/"], + "references": [ + "https://haveibeenpwned.com/" + ], "features": "The module takes an email address as input and queries haveibeenpwned.com API to find additional information about it. This additional information actually tells if any account using the email address has already been compromised in a data breach." -} +} \ No newline at end of file diff --git a/doc/expansion/html_to_markdown.json b/documentation/website/expansion/html_to_markdown.json similarity index 84% rename from doc/expansion/html_to_markdown.json rename to documentation/website/expansion/html_to_markdown.json index 45f6596..0864431 100644 --- a/doc/expansion/html_to_markdown.json +++ b/documentation/website/expansion/html_to_markdown.json @@ -2,6 +2,8 @@ "description": "Expansion module to fetch the html content from an url and convert it into markdown.", "input": "URL attribute.", "output": "Markdown content converted from the HTML fetched from the url.", - "requirements": ["The markdownify python library"], + "requirements": [ + "The markdownify python library" + ], "features": "The module take an URL as input and the HTML content is fetched from it. This content is then converted into markdown that is returned as text." -} +} \ No newline at end of file diff --git a/doc/expansion/intel471.json b/documentation/website/expansion/intel471.json similarity index 79% rename from doc/expansion/intel471.json rename to documentation/website/expansion/intel471.json index 72dbaba..8935276 100644 --- a/doc/expansion/intel471.json +++ b/documentation/website/expansion/intel471.json @@ -1,9 +1,13 @@ { "descrption": "An expansion module to query Intel471 in order to get additional information about a domain, ip address, email address, url or hash.", - "logo": "logos/intel471.png", - "requirements": ["The intel471 python library"], + "logo": "intel471.png", + "requirements": [ + "The intel471 python library" + ], "input": "A MISP attribute whose type is included in the following list:\n- hostname\n- domain\n- url\n- ip-src\n- ip-dst\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-name\n- md5\n- sha1\n- sha256", "output": "Freetext", - "references": ["https://public.intel471.com/"], + "references": [ + "https://public.intel471.com/" + ], "features": "The module uses the Intel471 python library to query the Intel471 API with the value of the input attribute. The result of the query is then returned as freetext so the Freetext import parses it." -} +} \ No newline at end of file diff --git a/doc/expansion/intelmq_eventdb.json b/documentation/website/expansion/intelmq_eventdb.json similarity index 57% rename from doc/expansion/intelmq_eventdb.json rename to documentation/website/expansion/intelmq_eventdb.json index bc48414..ce2b12a 100644 --- a/doc/expansion/intelmq_eventdb.json +++ b/documentation/website/expansion/intelmq_eventdb.json @@ -1,9 +1,15 @@ { "description": "Module to access intelmqs eventdb.", - "logo": "logos/intelmq.png", - "requirements": ["psycopg2: Python library to support PostgreSQL", "An access to the IntelMQ database (username, password, hostname and database reference)"], + "logo": "intelmq.png", + "requirements": [ + "psycopg2: Python library to support PostgreSQL", + "An access to the IntelMQ database (username, password, hostname and database reference)" + ], "input": "A hostname, domain, IP address or AS attribute.", "output": "Text giving information about the input using IntelMQ database.", - "references": ["https://github.com/certtools/intelmq", "https://intelmq.readthedocs.io/en/latest/Developers-Guide/"], + "references": [ + "https://github.com/certtools/intelmq", + "https://intelmq.readthedocs.io/en/latest/Developers-Guide/" + ], "features": "/!\\ EXPERIMENTAL MODULE, some features may not work /!\\\n\nThis module takes a domain, hostname, IP address or Autonomous system MISP attribute as input to query the IntelMQ database. The result of the query gives then additional information about the input." -} +} \ No newline at end of file diff --git a/doc/expansion/ipasn.json b/documentation/website/expansion/ipasn.json similarity index 70% rename from doc/expansion/ipasn.json rename to documentation/website/expansion/ipasn.json index 8caed92..5f30608 100644 --- a/doc/expansion/ipasn.json +++ b/documentation/website/expansion/ipasn.json @@ -1,8 +1,12 @@ { "description": "Module to query an IP ASN history service (https://github.com/D4-project/IPASN-History).", - "requirements": ["pyipasnhistory: Python library to access IPASN-history instance"], + "requirements": [ + "pyipasnhistory: Python library to access IPASN-history instance" + ], "input": "An IP address MISP attribute.", "output": "Asn object(s) objects related to the IP address used as input.", - "references": ["https://github.com/D4-project/IPASN-History"], + "references": [ + "https://github.com/D4-project/IPASN-History" + ], "features": "This module takes an IP address attribute as input and queries the CIRCL IPASN service. The result of the query is the latest asn related to the IP address, that is returned as a MISP object." -} +} \ No newline at end of file diff --git a/doc/expansion/iprep.json b/documentation/website/expansion/iprep.json similarity index 71% rename from doc/expansion/iprep.json rename to documentation/website/expansion/iprep.json index 95250e0..2e27304 100644 --- a/doc/expansion/iprep.json +++ b/documentation/website/expansion/iprep.json @@ -1,8 +1,12 @@ { "description": "Module to query IPRep data for IP addresses.", - "requirements": ["An access to the packetmail API (apikey)"], + "requirements": [ + "An access to the packetmail API (apikey)" + ], "input": "An IP address MISP attribute.", "output": "Text describing additional information about the input after a query on the IPRep API.", - "references": ["https://github.com/mahesh557/packetmail"], + "references": [ + "https://github.com/mahesh557/packetmail" + ], "features": "This module takes an IP address attribute as input and queries the database from packetmail.net to get some information about the reputation of the IP." -} +} \ No newline at end of file diff --git a/doc/expansion/joesandbox_query.json b/documentation/website/expansion/joesandbox_query.json similarity index 84% rename from doc/expansion/joesandbox_query.json rename to documentation/website/expansion/joesandbox_query.json index 1a94edb..12f2853 100644 --- a/doc/expansion/joesandbox_query.json +++ b/documentation/website/expansion/joesandbox_query.json @@ -1,9 +1,14 @@ { "description": "Query Joe Sandbox API with a submission url to get the json report and extract its data that is parsed and converted into MISP attributes and objects.\n\nThis url can by the way come from the result of the [joesandbox_submit expansion module](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_submit.py).", - "logo": "logos/joesandbox.png", - "requirements": ["jbxapi: Joe Sandbox API python3 library"], + "logo": "joesandbox.png", + "requirements": [ + "jbxapi: Joe Sandbox API python3 library" + ], "input": "Link of a Joe Sandbox sample or url submission.", "output": "MISP attributes & objects parsed from the analysis report.", - "references": ["https://www.joesecurity.org", "https://www.joesandbox.com/"], + "references": [ + "https://www.joesecurity.org", + "https://www.joesandbox.com/" + ], "features": "Module using the new format of modules able to return attributes and objects.\n\nThe module returns the same results as the import module [joe_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/joe_import.py) taking directly the json report as input.\n\nEven if the introspection will allow all kinds of links to call this module, obviously only the ones presenting a sample or url submission in the Joe Sandbox API will return results.\n\nTo make it work you will need to fill the 'apikey' configuration with your Joe Sandbox API key and provide a valid link as input." -} +} \ No newline at end of file diff --git a/doc/expansion/joesandbox_submit.json b/documentation/website/expansion/joesandbox_submit.json similarity index 77% rename from doc/expansion/joesandbox_submit.json rename to documentation/website/expansion/joesandbox_submit.json index ad59239..0ac454f 100644 --- a/doc/expansion/joesandbox_submit.json +++ b/documentation/website/expansion/joesandbox_submit.json @@ -1,9 +1,14 @@ { "description": "A module to submit files or URLs to Joe Sandbox for an advanced analysis, and return the link of the submission.", - "logo": "logos/joesandbox.png", - "requirements": ["jbxapi: Joe Sandbox API python3 library"], + "logo": "joesandbox.png", + "requirements": [ + "jbxapi: Joe Sandbox API python3 library" + ], "input": "Sample, url (or domain) to submit to Joe Sandbox for an advanced analysis.", "output": "Link of the report generated in Joe Sandbox.", - "references": ["https://www.joesecurity.org", "https://www.joesandbox.com/"], + "references": [ + "https://www.joesecurity.org", + "https://www.joesandbox.com/" + ], "features": "The module requires a Joe Sandbox API key to submit files or URL, and returns the link of the submitted analysis.\n\nIt is then possible, when the analysis is completed, to query the Joe Sandbox API to get the data related to the analysis, using the [joesandbox_query module](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) directly on this submission link." -} +} \ No newline at end of file diff --git a/doc/expansion/lastline_query.json b/documentation/website/expansion/lastline_query.json similarity index 89% rename from doc/expansion/lastline_query.json rename to documentation/website/expansion/lastline_query.json index 6165890..611b514 100644 --- a/doc/expansion/lastline_query.json +++ b/documentation/website/expansion/lastline_query.json @@ -1,9 +1,11 @@ { "description": "Query Lastline with an analysis link and parse the report into MISP attributes and objects.\nThe analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module.", - "logo": "logos/lastline.png", + "logo": "lastline.png", "requirements": [], "input": "Link to a Lastline analysis.", "output": "MISP attributes and objects parsed from the analysis report.", - "references": ["https://www.lastline.com"], + "references": [ + "https://www.lastline.com" + ], "features": "The module requires a Lastline Portal `username` and `password`.\nThe module uses the new format and it is able to return MISP attributes and objects.\nThe module returns the same results as the [lastline_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/lastline_import.py) import module." -} +} \ No newline at end of file diff --git a/doc/expansion/lastline_submit.json b/documentation/website/expansion/lastline_submit.json similarity index 85% rename from doc/expansion/lastline_submit.json rename to documentation/website/expansion/lastline_submit.json index d053f55..7c4387f 100644 --- a/doc/expansion/lastline_submit.json +++ b/documentation/website/expansion/lastline_submit.json @@ -1,9 +1,11 @@ { "description": "Module to submit a file or URL to Lastline.", - "logo": "logos/lastline.png", + "logo": "lastline.png", "requirements": [], "input": "File or URL to submit to Lastline.", "output": "Link to the report generated by Lastline.", - "references": ["https://www.lastline.com"], + "references": [ + "https://www.lastline.com" + ], "features": "The module requires a Lastline Analysis `api_token` and `key`.\nWhen the analysis is completed, it is possible to import the generated report by feeding the analysis link to the [lastline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_query.py) module." -} +} \ No newline at end of file diff --git a/doc/expansion/macaddress_io.json b/documentation/website/expansion/macaddress_io.json similarity index 60% rename from doc/expansion/macaddress_io.json rename to documentation/website/expansion/macaddress_io.json index 6bd2658..013564a 100644 --- a/doc/expansion/macaddress_io.json +++ b/documentation/website/expansion/macaddress_io.json @@ -1,9 +1,15 @@ { "description": "MISP hover module for macaddress.io", - "logo": "logos/macaddress_io.png", - "requirements": ["maclookup: macaddress.io python library", "An access to the macaddress.io API (apikey)"], + "logo": "macaddress_io.png", + "requirements": [ + "maclookup: macaddress.io python library", + "An access to the macaddress.io API (apikey)" + ], "input": "MAC address MISP attribute.", "output": "Text containing information on the MAC address fetched from a query on macaddress.io.", - "references": ["https://macaddress.io/", "https://github.com/CodeLineFi/maclookup-python"], + "references": [ + "https://macaddress.io/", + "https://github.com/CodeLineFi/maclookup-python" + ], "features": "This module takes a MAC address attribute as input and queries macaddress.io for additional information.\n\nThis information contains data about:\n- MAC address details\n- Vendor details\n- Block details" -} +} \ No newline at end of file diff --git a/doc/expansion/macvendors.json b/documentation/website/expansion/macvendors.json similarity index 73% rename from doc/expansion/macvendors.json rename to documentation/website/expansion/macvendors.json index cc10475..38c3588 100644 --- a/doc/expansion/macvendors.json +++ b/documentation/website/expansion/macvendors.json @@ -1,9 +1,12 @@ { "description": "Module to access Macvendors API.", - "logo": "logos/macvendors.png", + "logo": "macvendors.png", "requirements": [], "input": "A MAC address.", "output": "Additional information about the MAC address.", - "references": ["https://macvendors.com/", "https://macvendors.com/api"], + "references": [ + "https://macvendors.com/", + "https://macvendors.com/api" + ], "features": "The module takes a MAC address as input and queries macvendors.com for some information about it. The API returns the name of the vendor related to the address." -} +} \ No newline at end of file diff --git a/doc/expansion/malwarebazaar.json b/documentation/website/expansion/malwarebazaar.json similarity index 91% rename from doc/expansion/malwarebazaar.json rename to documentation/website/expansion/malwarebazaar.json index 2db6ad5..8c8228c 100644 --- a/doc/expansion/malwarebazaar.json +++ b/documentation/website/expansion/malwarebazaar.json @@ -3,6 +3,8 @@ "requirements": [], "input": "A hash attribute (md5, sha1 or sha256).", "output": "File object(s) related to the input attribute found on MALWAREbazaar databases.", - "references": ["https://bazaar.abuse.ch/"], + "references": [ + "https://bazaar.abuse.ch/" + ], "features": "The module takes a hash attribute as input and queries MALWAREbazaar's API to fetch additional data about it. The result, if the payload is known on the databases, is at least one file object describing the file the input hash is related to.\n\nThe module is using the new format of modules able to return object since the result is one or multiple MISP object(s)." -} +} \ No newline at end of file diff --git a/doc/expansion/ocr_enrich.json b/documentation/website/expansion/ocr_enrich.json similarity index 85% rename from doc/expansion/ocr_enrich.json rename to documentation/website/expansion/ocr_enrich.json index 8765b22..0e8f627 100644 --- a/doc/expansion/ocr_enrich.json +++ b/documentation/website/expansion/ocr_enrich.json @@ -1,8 +1,10 @@ { "description": "Module to process some optical character recognition on pictures.", - "requirements": ["cv2: The OpenCV python library."], + "requirements": [ + "cv2: The OpenCV python library." + ], "input": "A picture attachment.", "output": "Text and freetext fetched from the input picture.", "references": [], "features": "The module takes an attachment attributes as input and process some optical character recognition on it. The text found is then passed to the Freetext importer to extract potential IoCs." -} +} \ No newline at end of file diff --git a/doc/expansion/ods_enrich.json b/documentation/website/expansion/ods_enrich.json similarity index 65% rename from doc/expansion/ods_enrich.json rename to documentation/website/expansion/ods_enrich.json index dda4281..ade4105 100644 --- a/doc/expansion/ods_enrich.json +++ b/documentation/website/expansion/ods_enrich.json @@ -1,10 +1,12 @@ { "description": "Module to extract freetext from a .ods document.", - "logo": "logos/ods.png", - "requirements": ["ezodf: Python package to create/manipulate OpenDocumentFormat files.", - "pandas_ods_reader: Python library to read in ODS files."], + "logo": "ods.png", + "requirements": [ + "ezodf: Python package to create/manipulate OpenDocumentFormat files.", + "pandas_ods_reader: Python library to read in ODS files." + ], "input": "Attachment attribute containing a .ods document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a .ods document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/odt_enrich.json b/documentation/website/expansion/odt_enrich.json similarity index 80% rename from doc/expansion/odt_enrich.json rename to documentation/website/expansion/odt_enrich.json index e201c77..8922a9b 100644 --- a/doc/expansion/odt_enrich.json +++ b/documentation/website/expansion/odt_enrich.json @@ -1,9 +1,11 @@ { "description": "Module to extract freetext from a .odt document.", - "logo": "logos/odt.png", - "requirements": ["ODT reader python library."], + "logo": "odt.png", + "requirements": [ + "ODT reader python library." + ], "input": "Attachment attribute containing a .odt document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a .odt document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/onyphe.json b/documentation/website/expansion/onyphe.json similarity index 61% rename from doc/expansion/onyphe.json rename to documentation/website/expansion/onyphe.json index 04ebdd3..f38ea25 100644 --- a/doc/expansion/onyphe.json +++ b/documentation/website/expansion/onyphe.json @@ -1,9 +1,15 @@ { "description": "Module to process a query on Onyphe.", - "logo": "logos/onyphe.jpg", - "requirements": ["onyphe python library", "An access to the Onyphe API (apikey)"], + "logo": "onyphe.jpg", + "requirements": [ + "onyphe python library", + "An access to the Onyphe API (apikey)" + ], "input": "A domain, hostname or IP address MISP attribute.", "output": "MISP attributes fetched from the Onyphe query.", - "references": ["https://www.onyphe.io/", "https://github.com/sebdraven/pyonyphe"], + "references": [ + "https://www.onyphe.io/", + "https://github.com/sebdraven/pyonyphe" + ], "features": "This module takes a domain, hostname, or IP address attribute as input in order to query the Onyphe API. Data fetched from the query is then parsed and MISP attributes are extracted." -} +} \ No newline at end of file diff --git a/doc/expansion/onyphe_full.json b/documentation/website/expansion/onyphe_full.json similarity index 69% rename from doc/expansion/onyphe_full.json rename to documentation/website/expansion/onyphe_full.json index 4b722fa..e1a040a 100644 --- a/doc/expansion/onyphe_full.json +++ b/documentation/website/expansion/onyphe_full.json @@ -1,9 +1,15 @@ { "description": "Module to process a full query on Onyphe.", - "logo": "logos/onyphe.jpg", - "requirements": ["onyphe python library", "An access to the Onyphe API (apikey)"], + "logo": "onyphe.jpg", + "requirements": [ + "onyphe python library", + "An access to the Onyphe API (apikey)" + ], "input": "A domain, hostname or IP address MISP attribute.", "output": "MISP attributes fetched from the Onyphe query.", - "references": ["https://www.onyphe.io/", "https://github.com/sebdraven/pyonyphe"], + "references": [ + "https://www.onyphe.io/", + "https://github.com/sebdraven/pyonyphe" + ], "features": "This module takes a domain, hostname, or IP address attribute as input in order to query the Onyphe API. Data fetched from the query is then parsed and MISP attributes are extracted.\n\nThe parsing is here more advanced than the one on onyphe module, and is returning more attributes, since more fields of the query result are watched and parsed." -} +} \ No newline at end of file diff --git a/doc/expansion/otx.json b/documentation/website/expansion/otx.json similarity index 77% rename from doc/expansion/otx.json rename to documentation/website/expansion/otx.json index c6032cc..a17e2ff 100644 --- a/doc/expansion/otx.json +++ b/documentation/website/expansion/otx.json @@ -1,9 +1,13 @@ { "description": "Module to get information from AlienVault OTX.", - "logo": "logos/otx.png", - "requirements": ["An access to the OTX API (apikey)"], + "logo": "otx.png", + "requirements": [ + "An access to the OTX API (apikey)" + ], "input": "A MISP attribute included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- md5\n- sha1\n- sha256\n- sha512", "output": "MISP attributes mapped from the result of the query on OTX, included in the following list:\n- domain\n- ip-src\n- ip-dst\n- text\n- md5\n- sha1\n- sha256\n- sha512\n- email", - "references": ["https://www.alienvault.com/open-threat-exchange"], + "references": [ + "https://www.alienvault.com/open-threat-exchange" + ], "features": "This module takes a MISP attribute as input to query the OTX Alienvault API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/passivetotal.json b/documentation/website/expansion/passivetotal.json similarity index 82% rename from doc/expansion/passivetotal.json rename to documentation/website/expansion/passivetotal.json index ef8b044..26835d5 100644 --- a/doc/expansion/passivetotal.json +++ b/documentation/website/expansion/passivetotal.json @@ -1,9 +1,14 @@ { "description": "", - "logo": "logos/passivetotal.png", - "requirements": ["Passivetotal python library", "An access to the PassiveTotal API (apikey)"], + "logo": "passivetotal.png", + "requirements": [ + "Passivetotal python library", + "An access to the PassiveTotal API (apikey)" + ], "input": "A MISP attribute included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- x509-fingerprint-sha1\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-phone\n- text\n- whois-registrant-name\n- whois-registrar\n- whois-creation-date", "output": "MISP attributes mapped from the result of the query on PassiveTotal, included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- x509-fingerprint-sha1\n- email-src\n- email-dst\n- target-email\n- whois-registrant-email\n- whois-registrant-phone\n- text\n- whois-registrant-name\n- whois-registrar\n- whois-creation-date\n- md5\n- sha1\n- sha256\n- link", - "references": ["https://www.passivetotal.org/register"], + "references": [ + "https://www.passivetotal.org/register" + ], "features": "The PassiveTotal MISP expansion module brings the datasets derived from Internet scanning directly into your MISP instance. This module supports passive DNS, historic SSL, WHOIS, and host attributes. In order to use the module, you must have a valid PassiveTotal account username and API key. Registration is free and can be done by visiting https://www.passivetotal.org/register" -} +} \ No newline at end of file diff --git a/doc/expansion/pdf_enrich.json b/documentation/website/expansion/pdf_enrich.json similarity index 76% rename from doc/expansion/pdf_enrich.json rename to documentation/website/expansion/pdf_enrich.json index 5b3f0a8..a17ef51 100644 --- a/doc/expansion/pdf_enrich.json +++ b/documentation/website/expansion/pdf_enrich.json @@ -1,9 +1,11 @@ { "description": "Module to extract freetext from a PDF document.", - "logo": "logos/pdf.jpg", - "requirements": ["pdftotext: Python library to extract text from PDF."], + "logo": "pdf.jpg", + "requirements": [ + "pdftotext: Python library to extract text from PDF." + ], "input": "Attachment attribute containing a PDF document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a PDF document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/pptx_enrich.json b/documentation/website/expansion/pptx_enrich.json similarity index 77% rename from doc/expansion/pptx_enrich.json rename to documentation/website/expansion/pptx_enrich.json index aff0d8d..664c70a 100644 --- a/doc/expansion/pptx_enrich.json +++ b/documentation/website/expansion/pptx_enrich.json @@ -1,9 +1,11 @@ { "description": "Module to extract freetext from a .pptx document.", - "logo": "logos/pptx.png", - "requirements": ["pptx: Python library to read PowerPoint files."], + "logo": "pptx.png", + "requirements": [ + "pptx: Python library to read PowerPoint files." + ], "input": "Attachment attribute containing a .pptx document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a .pptx document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/qrcode.json b/documentation/website/expansion/qrcode.json similarity index 72% rename from doc/expansion/qrcode.json rename to documentation/website/expansion/qrcode.json index 38ed77c..f585511 100644 --- a/doc/expansion/qrcode.json +++ b/documentation/website/expansion/qrcode.json @@ -1,9 +1,11 @@ { "description": "Module to decode QR codes.", - "requirements": ["cv2: The OpenCV python library.", - "pyzbar: Python library to read QR codes."], + "requirements": [ + "cv2: The OpenCV python library.", + "pyzbar: Python library to read QR codes." + ], "input": "A QR code stored as attachment attribute.", "output": "The URL or bitcoin address the QR code is pointing to.", "references": [], "features": "The module reads the QR code and returns the related address, which can be an URL or a bitcoin address." -} +} \ No newline at end of file diff --git a/doc/expansion/ransomcoindb.json b/documentation/website/expansion/ransomcoindb.json similarity index 82% rename from doc/expansion/ransomcoindb.json rename to documentation/website/expansion/ransomcoindb.json index bc4e2ab..26c3c55 100644 --- a/doc/expansion/ransomcoindb.json +++ b/documentation/website/expansion/ransomcoindb.json @@ -1,8 +1,12 @@ { "descrption": "Module to access the ransomcoinDB with a hash or btc address attribute and get the associated btc address of hashes.", - "requirements": ["A ransomcoinDB API key."], + "requirements": [ + "A ransomcoinDB API key." + ], "input": "A hash (md5, sha1 or sha256) or btc attribute.", "output": "Hashes associated to a btc address or btc addresses associated to a hash.", - "references": ["https://ransomcoindb.concinnity-risks.com"], + "references": [ + "https://ransomcoindb.concinnity-risks.com" + ], "features": "The module takes either a hash attribute or a btc attribute as input to query the ransomcoinDB API for some additional data.\n\nIf the input is a btc address, we will get the associated hashes returned in a file MISP object. If we query ransomcoinDB with a hash, the response contains the associated btc addresses returned as single MISP btc attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/rbl.json b/documentation/website/expansion/rbl.json similarity index 65% rename from doc/expansion/rbl.json rename to documentation/website/expansion/rbl.json index 9700eca..942daa7 100644 --- a/doc/expansion/rbl.json +++ b/documentation/website/expansion/rbl.json @@ -1,8 +1,12 @@ { "description": "Module to check an IPv4 address against known RBLs.", - "requirements": ["dnspython3: DNS python3 library"], + "requirements": [ + "dnspython3: DNS python3 library" + ], "input": "IP address attribute.", "output": "Text with additional data from Real-time Blackhost Lists about the IP address.", - "references": ["[RBLs list](https://github.com/MISP/misp-modules/blob/8817de476572a10a9c9d03258ec81ca70f3d926d/misp_modules/modules/expansion/rbl.py#L20)"], + "references": [ + "[RBLs list](https://github.com/MISP/misp-modules/blob/8817de476572a10a9c9d03258ec81ca70f3d926d/misp_modules/modules/expansion/rbl.py#L20)" + ], "features": "This module takes an IP address attribute as input and queries multiple know Real-time Blackhost Lists to check if they have already seen this IP address.\n\nWe display then all the information we get from those different sources." -} +} \ No newline at end of file diff --git a/doc/expansion/recordedfuture.json b/documentation/website/expansion/recordedfuture.json similarity index 85% rename from doc/expansion/recordedfuture.json rename to documentation/website/expansion/recordedfuture.json index 2fec7eb..91cf23e 100644 --- a/doc/expansion/recordedfuture.json +++ b/documentation/website/expansion/recordedfuture.json @@ -1,9 +1,13 @@ { "description": "Module to enrich attributes with threat intelligence from Recorded Future.", - "logo": "logos/recordedfuture.png", - "requirements": ["A Recorded Future API token."], + "logo": "recordedfuture.png", + "requirements": [ + "A Recorded Future API token." + ], "input": "A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness.", "output": "A MISP object containing a copy of the enriched attribute with added tags from Recorded Future and a list of new attributes related to the enriched attribute.", - "references": ["https://www.recordedfuture.com/"], + "references": [ + "https://www.recordedfuture.com/" + ], "features": "Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future is matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object also includes a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/reversedns.json b/documentation/website/expansion/reversedns.json similarity index 90% rename from doc/expansion/reversedns.json rename to documentation/website/expansion/reversedns.json index 6934462..cdd3419 100644 --- a/doc/expansion/reversedns.json +++ b/documentation/website/expansion/reversedns.json @@ -1,7 +1,9 @@ { "description": "Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes.", - "requirements": ["DNS python library"], + "requirements": [ + "DNS python library" + ], "input": "An IP address attribute.", "output": "Hostname attribute the input is resolved into.", "features": "The module takes an IP address as input and tries to find the hostname this IP address is resolved into.\n\nThe address of the DNS resolver to use is also configurable, but if no configuration is set, we use the Google public DNS address (8.8.8.8).\n\nPlease note that composite MISP attributes containing IP addresses are supported as well." -} +} \ No newline at end of file diff --git a/doc/expansion/securitytrails.json b/documentation/website/expansion/securitytrails.json similarity index 77% rename from doc/expansion/securitytrails.json rename to documentation/website/expansion/securitytrails.json index 8541e4e..97f81b4 100644 --- a/doc/expansion/securitytrails.json +++ b/documentation/website/expansion/securitytrails.json @@ -1,9 +1,14 @@ { "description": "An expansion modules for SecurityTrails.", - "logo": "logos/securitytrails.png", - "requirements": ["dnstrails python library", "An access to the SecurityTrails API (apikey)"], + "logo": "securitytrails.png", + "requirements": [ + "dnstrails python library", + "An access to the SecurityTrails API (apikey)" + ], "input": "A domain, hostname or IP address attribute.", "output": "MISP attributes resulting from the query on SecurityTrails API, included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- dns-soa-email\n- whois-registrant-email\n- whois-registrant-phone\n- whois-registrant-name\n- whois-registrar\n- whois-creation-date\n- domain", - "references": ["https://securitytrails.com/"], + "references": [ + "https://securitytrails.com/" + ], "features": "The module takes a domain, hostname or IP address attribute as input and queries the SecurityTrails API with it.\n\nMultiple parsing operations are then processed on the result of the query to extract a much information as possible.\n\nFrom this data extracted are then mapped MISP attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/shodan.json b/documentation/website/expansion/shodan.json similarity index 61% rename from doc/expansion/shodan.json rename to documentation/website/expansion/shodan.json index 57241f0..703a084 100644 --- a/doc/expansion/shodan.json +++ b/documentation/website/expansion/shodan.json @@ -1,9 +1,14 @@ { "description": "Module to query on Shodan.", - "logo": "logos/shodan.png", - "requirements": ["shodan python library", "An access to the Shodan API (apikey)"], + "logo": "shodan.png", + "requirements": [ + "shodan python library", + "An access to the Shodan API (apikey)" + ], "input": "An IP address MISP attribute.", "output": "Text with additional data about the input, resulting from the query on Shodan.", - "references": ["https://www.shodan.io/"], + "references": [ + "https://www.shodan.io/" + ], "features": "The module takes an IP address as input and queries the Shodan API to get some additional data about it." -} +} \ No newline at end of file diff --git a/doc/expansion/sigma_queries.json b/documentation/website/expansion/sigma_queries.json similarity index 69% rename from doc/expansion/sigma_queries.json rename to documentation/website/expansion/sigma_queries.json index f127ba4..c967112 100644 --- a/doc/expansion/sigma_queries.json +++ b/documentation/website/expansion/sigma_queries.json @@ -1,9 +1,13 @@ { "description": "An expansion hover module to display the result of sigma queries.", - "logo": "logos/sigma.png", - "requirements": ["Sigma python library"], + "logo": "sigma.png", + "requirements": [ + "Sigma python library" + ], "input": "A Sigma attribute.", "output": "Text displaying results of queries on the Sigma attribute.", - "references": ["https://github.com/Neo23x0/sigma/wiki"], + "references": [ + "https://github.com/Neo23x0/sigma/wiki" + ], "features": "This module takes a Sigma rule attribute as input and tries all the different queries available to convert it into different formats recognized by SIEMs." -} +} \ No newline at end of file diff --git a/doc/expansion/sigma_syntax_validator.json b/documentation/website/expansion/sigma_syntax_validator.json similarity index 67% rename from doc/expansion/sigma_syntax_validator.json rename to documentation/website/expansion/sigma_syntax_validator.json index 8e17ae0..b90c931 100644 --- a/doc/expansion/sigma_syntax_validator.json +++ b/documentation/website/expansion/sigma_syntax_validator.json @@ -1,9 +1,14 @@ { "description": "An expansion hover module to perform a syntax check on sigma rules.", - "logo": "logos/sigma.png", - "requirements": ["Sigma python library", "Yaml python library"], + "logo": "sigma.png", + "requirements": [ + "Sigma python library", + "Yaml python library" + ], "input": "A Sigma attribute.", "output": "Text describing the validity of the Sigma rule.", - "references": ["https://github.com/Neo23x0/sigma/wiki"], + "references": [ + "https://github.com/Neo23x0/sigma/wiki" + ], "features": "This module takes a Sigma rule attribute as input and performs a syntax check on it.\n\nIt displays then that the rule is valid if it is the case, and the error related to the rule otherwise." -} +} \ No newline at end of file diff --git a/doc/expansion/sophoslabs_intelix.json b/documentation/website/expansion/sophoslabs_intelix.json similarity index 70% rename from doc/expansion/sophoslabs_intelix.json rename to documentation/website/expansion/sophoslabs_intelix.json index 18dd7c1..8871192 100644 --- a/doc/expansion/sophoslabs_intelix.json +++ b/documentation/website/expansion/sophoslabs_intelix.json @@ -1,9 +1,13 @@ { "description": "An expansion module to query the Sophoslabs intelix API to get additional information about an ip address, url, domain or sha256 attribute.", - "logo": "logos/sophoslabs_intelix.svg", - "requirements": ["A client_id and client_secret pair to authenticate to the SophosLabs Intelix API"], + "logo": "sophoslabs_intelix.svg", + "requirements": [ + "A client_id and client_secret pair to authenticate to the SophosLabs Intelix API" + ], "input": "An ip address, url, domain or sha256 attribute.", "output": "SophosLabs Intelix report and lookup objects", - "references": ["https://aws.amazon.com/marketplace/pp/B07SLZPMCS"], + "references": [ + "https://aws.amazon.com/marketplace/pp/B07SLZPMCS" + ], "features": "The module takes an ip address, url, domain or sha256 attribute and queries the SophosLabs Intelix API with the attribute value. The result of this query is a SophosLabs Intelix hash report, or an ip or url lookup, that is then parsed and returned in a MISP object." -} +} \ No newline at end of file diff --git a/doc/expansion/sourcecache.json b/documentation/website/expansion/sourcecache.json similarity index 67% rename from doc/expansion/sourcecache.json rename to documentation/website/expansion/sourcecache.json index ab4669c..4340f2c 100644 --- a/doc/expansion/sourcecache.json +++ b/documentation/website/expansion/sourcecache.json @@ -1,8 +1,12 @@ { "description": "Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page.", - "requirements": ["urlarchiver: python library to fetch and archive URL on the file-system"], + "requirements": [ + "urlarchiver: python library to fetch and archive URL on the file-system" + ], "input": "A link or url attribute.", "output": "A malware-sample attribute describing the cached page.", - "references": ["https://github.com/adulau/url_archiver"], + "references": [ + "https://github.com/adulau/url_archiver" + ], "features": "This module takes a link or url attribute as input and caches the related web page. It returns then a link of the cached page." -} +} \ No newline at end of file diff --git a/doc/expansion/stix2_pattern_syntax_validator.json b/documentation/website/expansion/stix2_pattern_syntax_validator.json similarity index 60% rename from doc/expansion/stix2_pattern_syntax_validator.json rename to documentation/website/expansion/stix2_pattern_syntax_validator.json index 2ea43b5..0ac079d 100644 --- a/doc/expansion/stix2_pattern_syntax_validator.json +++ b/documentation/website/expansion/stix2_pattern_syntax_validator.json @@ -1,9 +1,13 @@ { "description": "An expansion hover module to perform a syntax check on stix2 patterns.", - "logo": "logos/stix.png", - "requirements": ["stix2patterns python library"], + "logo": "stix.png", + "requirements": [ + "stix2patterns python library" + ], "input": "A STIX2 pattern attribute.", "output": "Text describing the validity of the STIX2 pattern.", - "references": ["[STIX2.0 patterning specifications](http://docs.oasis-open.org/cti/stix/v2.0/cs01/part5-stix-patterning/stix-v2.0-cs01-part5-stix-patterning.html)"], + "references": [ + "[STIX2.0 patterning specifications](http://docs.oasis-open.org/cti/stix/v2.0/cs01/part5-stix-patterning/stix-v2.0-cs01-part5-stix-patterning.html)" + ], "features": "This module takes a STIX2 pattern attribute as input and performs a syntax check on it.\n\nIt displays then that the rule is valid if it is the case, and the error related to the rule otherwise." -} +} \ No newline at end of file diff --git a/doc/expansion/threatcrowd.json b/documentation/website/expansion/threatcrowd.json similarity index 87% rename from doc/expansion/threatcrowd.json rename to documentation/website/expansion/threatcrowd.json index 99725b8..e279ece 100644 --- a/doc/expansion/threatcrowd.json +++ b/documentation/website/expansion/threatcrowd.json @@ -1,8 +1,10 @@ { "description": "Module to get information from ThreatCrowd.", - "logo": "logos/threatcrowd.png", + "logo": "threatcrowd.png", "input": "A MISP attribute included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- md5\n- sha1\n- sha256\n- sha512\n- whois-registrant-email", "output": "MISP attributes mapped from the result of the query on ThreatCrowd, included in the following list:\n- domain\n- ip-src\n- ip-dst\n- text\n- md5\n- sha1\n- sha256\n- sha512\n- hostname\n- whois-registrant-email", - "references": ["https://www.threatcrowd.org/"], + "references": [ + "https://www.threatcrowd.org/" + ], "features": "This module takes a MISP attribute as input and queries ThreatCrowd with it.\n\nThe result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute." -} +} \ No newline at end of file diff --git a/doc/expansion/threatminer.json b/documentation/website/expansion/threatminer.json similarity index 87% rename from doc/expansion/threatminer.json rename to documentation/website/expansion/threatminer.json index d2f26bd..0b0d641 100644 --- a/doc/expansion/threatminer.json +++ b/documentation/website/expansion/threatminer.json @@ -1,8 +1,10 @@ { "description": "Module to get information from ThreatMiner.", - "logo": "logos/threatminer.png", + "logo": "threatminer.png", "input": "A MISP attribute included in the following list:\n- hostname\n- domain\n- ip-src\n- ip-dst\n- md5\n- sha1\n- sha256\n- sha512", "output": "MISP attributes mapped from the result of the query on ThreatMiner, included in the following list:\n- domain\n- ip-src\n- ip-dst\n- text\n- md5\n- sha1\n- sha256\n- sha512\n- ssdeep\n- authentihash\n- filename\n- whois-registrant-email\n- url\n- link", - "references": ["https://www.threatminer.org/"], + "references": [ + "https://www.threatminer.org/" + ], "features": "This module takes a MISP attribute as input and queries ThreatMiner with it.\n\nThe result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute." -} +} \ No newline at end of file diff --git a/doc/expansion/trustar_enrich.json b/documentation/website/expansion/trustar_enrich.json similarity index 81% rename from doc/expansion/trustar_enrich.json rename to documentation/website/expansion/trustar_enrich.json index 294419d..415f52d 100644 --- a/doc/expansion/trustar_enrich.json +++ b/documentation/website/expansion/trustar_enrich.json @@ -1,8 +1,10 @@ { "description": "Module to get enrich indicators with TruSTAR.", - "logo": "logos/trustar.png", + "logo": "trustar.png", "input": "Any of the following MISP attributes:\n- btc\n- domain\n- email-src\n- filename\n- hostname\n- ip-src\n- ip-dst\n- md5\n- sha1\n- sha256\n- url", "output": "MISP attributes enriched with indicator summary data from the TruSTAR API. Data includes a severity level score and additional source and scoring info.", - "references": ["https://docs.trustar.co/api/v13/indicators/get_indicator_summaries.html"], + "references": [ + "https://docs.trustar.co/api/v13/indicators/get_indicator_summaries.html" + ], "features": "This module enriches MISP attributes with scoring and metadata from TruSTAR.\n\nThe TruSTAR indicator summary is appended to the attributes along with links to any associated reports." -} +} \ No newline at end of file diff --git a/doc/expansion/urlhaus.json b/documentation/website/expansion/urlhaus.json similarity index 86% rename from doc/expansion/urlhaus.json rename to documentation/website/expansion/urlhaus.json index 8e5cef3..cd59661 100644 --- a/doc/expansion/urlhaus.json +++ b/documentation/website/expansion/urlhaus.json @@ -1,9 +1,11 @@ { "description": "Query of the URLhaus API to get additional information about the input attribute.", - "logo": "logos/urlhaus.png", + "logo": "urlhaus.png", "requirements": [], "input": "A domain, hostname, url, ip, md5 or sha256 attribute.", "output": "MISP attributes & objects fetched from the result of the URLhaus API query.", - "references": ["https://urlhaus.abuse.ch/"], + "references": [ + "https://urlhaus.abuse.ch/" + ], "features": "Module using the new format of modules able to return attributes and objects.\n\nThe module takes one of the attribute type specified as input, and query the URLhaus API with it. If any result is returned by the API, attributes and objects are created accordingly." -} +} \ No newline at end of file diff --git a/doc/expansion/urlscan.json b/documentation/website/expansion/urlscan.json similarity index 73% rename from doc/expansion/urlscan.json rename to documentation/website/expansion/urlscan.json index d847761..3aab2ab 100644 --- a/doc/expansion/urlscan.json +++ b/documentation/website/expansion/urlscan.json @@ -1,9 +1,13 @@ { "description": "An expansion module to query urlscan.io.", - "logo": "logos/urlscan.jpg", - "requirements": ["An access to the urlscan.io API"], + "logo": "urlscan.jpg", + "requirements": [ + "An access to the urlscan.io API" + ], "input": "A domain, hostname or url attribute.", "output": "MISP attributes mapped from the result of the query on urlscan.io.", - "references": ["https://urlscan.io/"], + "references": [ + "https://urlscan.io/" + ], "features": "This module takes a MISP attribute as input and queries urlscan.io with it.\n\nThe result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute." -} +} \ No newline at end of file diff --git a/doc/expansion/virustotal.json b/documentation/website/expansion/virustotal.json similarity index 80% rename from doc/expansion/virustotal.json rename to documentation/website/expansion/virustotal.json index 31fd6ac..85c036f 100644 --- a/doc/expansion/virustotal.json +++ b/documentation/website/expansion/virustotal.json @@ -1,9 +1,14 @@ { "description": "Module to get advanced information from virustotal.", - "logo": "logos/virustotal.png", - "requirements": ["An access to the VirusTotal API (apikey), with a high request rate limit."], + "logo": "virustotal.png", + "requirements": [ + "An access to the VirusTotal API (apikey), with a high request rate limit." + ], "input": "A domain, hash (md5, sha1, sha256 or sha512), hostname or IP address attribute.", "output": "MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute.", - "references": ["https://www.virustotal.com/", "https://developers.virustotal.com/reference"], + "references": [ + "https://www.virustotal.com/", + "https://developers.virustotal.com/reference" + ], "features": "New format of modules able to return attributes and objects.\n\nA module to take a MISP attribute as input and query the VirusTotal API to get additional data about it.\n\nCompared to the [standard VirusTotal expansion module](https://github.com/MISP/misp-modules/blob/master/misp_modules/modules/expansion/virustotal_public.py), this module is made for advanced parsing of VirusTotal report, with a recursive analysis of the elements found after the first request.\n\nThus, it requires a higher request rate limit to avoid the API to return a 204 error (Request rate limit exceeded), and the data parsed from the different requests are returned as MISP attributes and objects, with the corresponding relations between each one of them." -} +} \ No newline at end of file diff --git a/doc/expansion/virustotal_public.json b/documentation/website/expansion/virustotal_public.json similarity index 78% rename from doc/expansion/virustotal_public.json rename to documentation/website/expansion/virustotal_public.json index 242c734..2b9df12 100644 --- a/doc/expansion/virustotal_public.json +++ b/documentation/website/expansion/virustotal_public.json @@ -1,9 +1,14 @@ { "description": "Module to get information from VirusTotal.", - "logo": "logos/virustotal.png", - "requirements": ["An access to the VirusTotal API (apikey)"], + "logo": "virustotal.png", + "requirements": [ + "An access to the VirusTotal API (apikey)" + ], "input": "A domain, hostname, ip, url or hash (md5, sha1, sha256 or sha512) attribute.", "output": "MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute.", - "references": ["https://www.virustotal.com", "https://developers.virustotal.com/reference"], + "references": [ + "https://www.virustotal.com", + "https://developers.virustotal.com/reference" + ], "features": "New format of modules able to return attributes and objects.\n\nA module to take a MISP attribute as input and query the VirusTotal API to get additional data about it.\n\nCompared to the [more advanced VirusTotal expansion module](https://github.com/MISP/misp-modules/blob/master/misp_modules/modules/expansion/virustotal.py), this module is made for VirusTotal users who have a low request rate limit.\n\nThus, it only queries the API once and returns the results that is parsed into MISP attributes and objects." -} +} \ No newline at end of file diff --git a/doc/expansion/vmray_submit.json b/documentation/website/expansion/vmray_submit.json similarity index 74% rename from doc/expansion/vmray_submit.json rename to documentation/website/expansion/vmray_submit.json index ea6cf3f..2b38792 100644 --- a/doc/expansion/vmray_submit.json +++ b/documentation/website/expansion/vmray_submit.json @@ -1,9 +1,13 @@ { "description": "Module to submit a sample to VMRay.", - "logo": "logos/vmray.png", - "requirements": ["An access to the VMRay API (apikey & url)"], + "logo": "vmray.png", + "requirements": [ + "An access to the VMRay API (apikey & url)" + ], "input": "An attachment or malware-sample attribute.", "output": "MISP attributes mapped from the result of the query on VMRay API, included in the following list:\n- text\n- sha1\n- sha256\n- md5\n- link", - "references": ["https://www.vmray.com/"], + "references": [ + "https://www.vmray.com/" + ], "features": "This module takes an attachment or malware-sample attribute as input to query the VMRay API.\n\nThe sample contained within the attribute in then enriched with data from VMRay mapped into MISP attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/vulndb.json b/documentation/website/expansion/vulndb.json similarity index 71% rename from doc/expansion/vulndb.json rename to documentation/website/expansion/vulndb.json index 330a3eb..e1dd869 100644 --- a/doc/expansion/vulndb.json +++ b/documentation/website/expansion/vulndb.json @@ -1,9 +1,13 @@ { "description": "Module to query VulnDB (RiskBasedSecurity.com).", - "logo": "logos/vulndb.png", - "requirements": ["An access to the VulnDB API (apikey, apisecret)"], + "logo": "vulndb.png", + "requirements": [ + "An access to the VulnDB API (apikey, apisecret)" + ], "input": "A vulnerability attribute.", "output": "Additional data enriching the CVE input, fetched from VulnDB.", - "references": ["https://vulndb.cyberriskanalytics.com/"], + "references": [ + "https://vulndb.cyberriskanalytics.com/" + ], "features": "This module takes a vulnerability attribute as input and queries VulnDB in order to get some additional data about it.\n\nThe API gives the result of the query which can be displayed in the screen, and/or mapped into MISP attributes to add in the event." -} +} \ No newline at end of file diff --git a/doc/expansion/vulners.json b/documentation/website/expansion/vulners.json similarity index 69% rename from doc/expansion/vulners.json rename to documentation/website/expansion/vulners.json index f3f3026..ab5a778 100644 --- a/doc/expansion/vulners.json +++ b/documentation/website/expansion/vulners.json @@ -1,9 +1,14 @@ { "description": "An expansion hover module to expand information about CVE id using Vulners API.", - "logo": "logos/vulners.png", - "requirements": ["Vulners python library", "An access to the Vulners API"], + "logo": "vulners.png", + "requirements": [ + "Vulners python library", + "An access to the Vulners API" + ], "input": "A vulnerability attribute.", "output": "Text giving additional information about the CVE in input.", - "references": ["https://vulners.com/"], + "references": [ + "https://vulners.com/" + ], "features": "This module takes a vulnerability attribute as input and queries the Vulners API in order to get some additional data about it.\n\nThe API then returns details about the vulnerability." -} +} \ No newline at end of file diff --git a/doc/expansion/whois.json b/documentation/website/expansion/whois.json similarity index 77% rename from doc/expansion/whois.json rename to documentation/website/expansion/whois.json index 938bad5..bba0828 100644 --- a/doc/expansion/whois.json +++ b/documentation/website/expansion/whois.json @@ -1,8 +1,12 @@ { "description": "Module to query a local instance of uwhois (https://github.com/rafiot/uwhoisd).", - "requirements": ["uwhois: A whois python library"], + "requirements": [ + "uwhois: A whois python library" + ], "input": "A domain or IP address attribute.", "output": "Text describing the result of a whois request for the input value.", - "references": ["https://github.com/rafiot/uwhoisd"], + "references": [ + "https://github.com/rafiot/uwhoisd" + ], "features": "This module takes a domain or IP address attribute as input and queries a 'Univseral Whois proxy server' to get the correct details of the Whois query on the input value (check the references for more details about this whois server)." -} +} \ No newline at end of file diff --git a/doc/expansion/wiki.json b/documentation/website/expansion/wiki.json similarity index 72% rename from doc/expansion/wiki.json rename to documentation/website/expansion/wiki.json index d6de62b..36bb009 100644 --- a/doc/expansion/wiki.json +++ b/documentation/website/expansion/wiki.json @@ -1,9 +1,13 @@ { "description": "An expansion hover module to extract information from Wikidata to have additional information about particular term for analysis.", - "logo": "logos/wikidata.png", - "requirements": ["SPARQLWrapper python library"], + "logo": "wikidata.png", + "requirements": [ + "SPARQLWrapper python library" + ], "input": "Text attribute.", "output": "Text attribute.", - "references": ["https://www.wikidata.org"], + "references": [ + "https://www.wikidata.org" + ], "features": "This module takes a text attribute as input and queries the Wikidata API. If the text attribute is clear enough to define a specific term, the API returns a wikidata link in response." -} +} \ No newline at end of file diff --git a/doc/expansion/xforceexchange.json b/documentation/website/expansion/xforceexchange.json similarity index 73% rename from doc/expansion/xforceexchange.json rename to documentation/website/expansion/xforceexchange.json index bbe3c86..fe6fcbb 100644 --- a/doc/expansion/xforceexchange.json +++ b/documentation/website/expansion/xforceexchange.json @@ -1,9 +1,13 @@ { "description": "An expansion module for IBM X-Force Exchange.", - "logo": "logos/xforce.png", - "requirements": ["An access to the X-Force API (apikey)"], + "logo": "xforce.png", + "requirements": [ + "An access to the X-Force API (apikey)" + ], "input": "A MISP attribute included in the following list:\n- ip-src\n- ip-dst\n- vulnerability\n- md5\n- sha1\n- sha256", "output": "MISP attributes mapped from the result of the query on X-Force Exchange.", - "references": ["https://exchange.xforce.ibmcloud.com/"], + "references": [ + "https://exchange.xforce.ibmcloud.com/" + ], "features": "This module takes a MISP attribute as input to query the X-Force API. The API returns then additional information known in their threats data, that is mapped into MISP attributes." -} +} \ No newline at end of file diff --git a/doc/expansion/xlsx_enrich.json b/documentation/website/expansion/xlsx_enrich.json similarity index 73% rename from doc/expansion/xlsx_enrich.json rename to documentation/website/expansion/xlsx_enrich.json index c41f17c..dff623d 100644 --- a/doc/expansion/xlsx_enrich.json +++ b/documentation/website/expansion/xlsx_enrich.json @@ -1,9 +1,11 @@ { "description": "Module to extract freetext from a .xlsx document.", - "logo": "logos/xlsx.png", - "requirements": ["pandas: Python library to perform data analysis, time series and statistics."], + "logo": "xlsx.png", + "requirements": [ + "pandas: Python library to perform data analysis, time series and statistics." + ], "input": "Attachment attribute containing a .xlsx document.", "output": "Text and freetext parsed from the document.", "references": [], "features": "The module reads the text contained in a .xlsx document. The result is passed to the freetext import parser so IoCs can be extracted out of it." -} +} \ No newline at end of file diff --git a/doc/expansion/yara_query.json b/documentation/website/expansion/yara_query.json similarity index 77% rename from doc/expansion/yara_query.json rename to documentation/website/expansion/yara_query.json index 408353d..453e599 100644 --- a/doc/expansion/yara_query.json +++ b/documentation/website/expansion/yara_query.json @@ -1,9 +1,14 @@ { "description": "An expansion & hover module to translate any hash attribute into a yara rule.", - "logo": "logos/yara.png", - "requirements": ["yara-python python library"], + "logo": "yara.png", + "requirements": [ + "yara-python python library" + ], "features": "The module takes a hash attribute (md5, sha1, sha256, imphash) as input, and is returning a YARA rule from it. This YARA rule is also validated using the same method as in 'yara_syntax_validator' module.\nBoth hover and expansion functionalities are supported with this module, where the hover part is displaying the resulting YARA rule and the expansion part allows you to add the rule as a new attribute, as usual with expansion modules.", "input": "MISP Hash attribute (md5, sha1, sha256, imphash, or any of the composite attribute with filename and one of the previous hash type).", "output": "YARA rule.", - "references": ["https://virustotal.github.io/yara/", "https://github.com/virustotal/yara-python"] -} + "references": [ + "https://virustotal.github.io/yara/", + "https://github.com/virustotal/yara-python" + ] +} \ No newline at end of file diff --git a/doc/expansion/yara_syntax_validator.json b/documentation/website/expansion/yara_syntax_validator.json similarity index 70% rename from doc/expansion/yara_syntax_validator.json rename to documentation/website/expansion/yara_syntax_validator.json index 93a96ee..72550b2 100644 --- a/doc/expansion/yara_syntax_validator.json +++ b/documentation/website/expansion/yara_syntax_validator.json @@ -1,9 +1,13 @@ { "description": "An expansion hover module to perform a syntax check on if yara rules are valid or not.", - "logo": "logos/yara.png", - "requirements": ["yara_python python library"], + "logo": "yara.png", + "requirements": [ + "yara_python python library" + ], "input": "YARA rule attribute.", "output": "Text to inform users if their rule is valid.", - "references": ["http://virustotal.github.io/yara/"], + "references": [ + "http://virustotal.github.io/yara/" + ], "features": "This modules simply takes a YARA rule as input, and checks its syntax. It returns then a confirmation if the syntax is valid, otherwise the syntax error is displayed." -} +} \ No newline at end of file diff --git a/documentation/website/export_mod/cef_export.json b/documentation/website/export_mod/cef_export.json new file mode 100644 index 0000000..cd247a7 --- /dev/null +++ b/documentation/website/export_mod/cef_export.json @@ -0,0 +1,10 @@ +{ + "description": "Module to export a MISP event in CEF format.", + "requirements": [], + "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in Common Event Format.\nThus, there is no particular feature concerning MISP Events since any event can be exported. However, 4 configuration parameters recognized by CEF format are required and should be provided by users before exporting data: the device vendor, product and version, as well as the default severity of data.", + "references": [ + "https://community.softwaregrp.com/t5/ArcSight-Connectors/ArcSight-Common-Event-Format-CEF-Guide/ta-p/1589306?attachment-id=65537" + ], + "input": "MISP Event attributes", + "output": "Common Event Format file" +} \ No newline at end of file diff --git a/doc/export_mod/cisco_firesight_manager_ACL_rule_export.json b/documentation/website/export_mod/cisco_firesight_manager_ACL_rule_export.json similarity index 79% rename from doc/export_mod/cisco_firesight_manager_ACL_rule_export.json rename to documentation/website/export_mod/cisco_firesight_manager_ACL_rule_export.json index 6d1d0dd..b9c72f9 100644 --- a/doc/export_mod/cisco_firesight_manager_ACL_rule_export.json +++ b/documentation/website/export_mod/cisco_firesight_manager_ACL_rule_export.json @@ -1,9 +1,11 @@ { "description": "Module to export malicious network activity attributes to Cisco fireSIGHT manager block rules.", - "logo": "logos/cisco.png", - "requirements": ["Firesight manager console credentials"], + "logo": "cisco.png", + "requirements": [ + "Firesight manager console credentials" + ], "input": "Network activity attributes (IPs, URLs).", "output": "Cisco fireSIGHT manager block rules.", "references": [], "features": "The module goes through the attributes to find all the network activity ones in order to create block rules for the Cisco fireSIGHT manager." -} +} \ No newline at end of file diff --git a/documentation/website/export_mod/goamlexport.json b/documentation/website/export_mod/goamlexport.json new file mode 100644 index 0000000..aaab295 --- /dev/null +++ b/documentation/website/export_mod/goamlexport.json @@ -0,0 +1,14 @@ +{ + "description": "This module is used to export MISP events containing transaction objects into GoAML format.", + "logo": "goAML.jpg", + "requirements": [ + "PyMISP", + "MISP objects" + ], + "features": "The module works as long as there is at least one transaction object in the Event.\n\nThen in order to have a valid GoAML document, please follow these guidelines:\n- For each transaction object, use either a bank-account, person, or legal-entity object to describe the origin of the transaction, and again one of them to describe the target of the transaction.\n- Create an object reference for both origin and target objects of the transaction.\n- A bank-account object needs a signatory, which is a person object, put as object reference of the bank-account.\n- A person can have an address, which is a geolocation object, put as object reference of the person.\n\nSupported relation types for object references that are recommended for each object are the folowing:\n- transaction:\n\t- 'from', 'from_my_client': Origin of the transaction - at least one of them is required.\n\t- 'to', 'to_my_client': Target of the transaction - at least one of them is required.\n\t- 'address': Location of the transaction - optional.\n- bank-account:\n\t- 'signatory': Signatory of a bank-account - the reference from bank-account to a signatory is required, but the relation-type is optional at the moment since this reference will always describe a signatory.\n\t- 'entity': Entity owning the bank account - optional.\n- person:\n\t- 'address': Address of a person - optional.", + "references": [ + "http://goaml.unodc.org/" + ], + "input": "MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target.", + "output": "GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities)." +} \ No newline at end of file diff --git a/documentation/website/export_mod/liteexport.json b/documentation/website/export_mod/liteexport.json new file mode 100644 index 0000000..1f91039 --- /dev/null +++ b/documentation/website/export_mod/liteexport.json @@ -0,0 +1,8 @@ +{ + "description": "Lite export of a MISP event.", + "requirements": [], + "features": "This module is simply producing a json MISP event format file, but exporting only Attributes from the Event. Thus, MISP Events exported with this module should have attributes that are not internal references, otherwise the resulting event would be empty.", + "references": [], + "input": "MISP Event attributes", + "output": "Lite MISP Event" +} \ No newline at end of file diff --git a/doc/export_mod/mass_eql_export.json b/documentation/website/export_mod/mass_eql_export.json similarity index 74% rename from doc/export_mod/mass_eql_export.json rename to documentation/website/export_mod/mass_eql_export.json index 5eadd23..30b12a9 100644 --- a/doc/export_mod/mass_eql_export.json +++ b/documentation/website/export_mod/mass_eql_export.json @@ -1,9 +1,11 @@ { "description": "Mass EQL query export for a MISP event.", - "logo": "logos/eql.png", + "logo": "eql.png", "requirements": [], "features": "This module produces EQL queries for all relevant attributes in a MISP event.", - "references": ["https://eql.readthedocs.io/en/latest/"], + "references": [ + "https://eql.readthedocs.io/en/latest/" + ], "input": "MISP Event attributes", "output": "Text file containing one or more EQL queries" - } +} \ No newline at end of file diff --git a/documentation/website/export_mod/nexthinkexport.json b/documentation/website/export_mod/nexthinkexport.json new file mode 100644 index 0000000..0c06f9e --- /dev/null +++ b/documentation/website/export_mod/nexthinkexport.json @@ -0,0 +1,11 @@ +{ + "description": "Nexthink NXQL query export module", + "requirements": [], + "features": "This module export an event as Nexthink NXQL queries that can then be used in your own python3 tool or from wget/powershell", + "references": [ + "https://doc.nexthink.com/Documentation/Nexthink/latest/APIAndIntegrations/IntroducingtheWebAPIV2" + ], + "input": "MISP Event attributes", + "output": "Nexthink NXQL queries", + "logo": "nexthink.svg" +} \ No newline at end of file diff --git a/documentation/website/export_mod/osqueryexport.json b/documentation/website/export_mod/osqueryexport.json new file mode 100644 index 0000000..5b563c0 --- /dev/null +++ b/documentation/website/export_mod/osqueryexport.json @@ -0,0 +1,9 @@ +{ + "description": "OSQuery export of a MISP event.", + "requirements": [], + "features": "This module export an event as osquery queries that can be used in packs or in fleet management solution like Kolide.", + "references": [], + "input": "MISP Event attributes", + "output": "osquery SQL queries", + "logo": "osquery.png" +} \ No newline at end of file diff --git a/documentation/website/export_mod/pdfexport.json b/documentation/website/export_mod/pdfexport.json new file mode 100644 index 0000000..b23c681 --- /dev/null +++ b/documentation/website/export_mod/pdfexport.json @@ -0,0 +1,13 @@ +{ + "description": "Simple export of a MISP event to PDF.", + "requirements": [ + "PyMISP", + "reportlab" + ], + "features": "The module takes care of the PDF file building, and work with any MISP Event. Except the requirement of reportlab, used to create the file, there is no special feature concerning the Event. Some parameters can be given through the config dict. 'MISP_base_url_for_dynamic_link' is your MISP URL, to attach an hyperlink to your event on your MISP instance from the PDF. Keep it clear to avoid hyperlinks in the generated pdf.\n 'MISP_name_for_metadata' is your CERT or MISP instance name. Used as text in the PDF' metadata\n 'Activate_textual_description' is a boolean (True or void) to activate the textual description/header abstract of an event\n 'Activate_galaxy_description' is a boolean (True or void) to activate the description of event related galaxies.\n 'Activate_related_events' is a boolean (True or void) to activate the description of related event. Be aware this might leak information on confidential events linked to the current event !\n 'Activate_internationalization_fonts' is a boolean (True or void) to activate Noto fonts instead of default fonts (Helvetica). This allows the support of CJK alphabet. Be sure to have followed the procedure to download Noto fonts (~70Mo) in the right place (/tools/pdf_fonts/Noto_TTF), to allow PyMisp to find and use them during PDF generation.\n 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option ", + "references": [ + "https://acrobat.adobe.com/us/en/acrobat/about-adobe-pdf.html" + ], + "input": "MISP Event", + "output": "MISP Event in a PDF file." +} \ No newline at end of file diff --git a/doc/export_mod/testexport.json b/documentation/website/export_mod/testexport.json similarity index 95% rename from doc/export_mod/testexport.json rename to documentation/website/export_mod/testexport.json index 213ea92..884ccbe 100644 --- a/doc/export_mod/testexport.json +++ b/documentation/website/export_mod/testexport.json @@ -1,3 +1,3 @@ { "description": "Skeleton export module." -} +} \ No newline at end of file diff --git a/documentation/website/export_mod/threatStream_misp_export.json b/documentation/website/export_mod/threatStream_misp_export.json new file mode 100644 index 0000000..b096f41 --- /dev/null +++ b/documentation/website/export_mod/threatStream_misp_export.json @@ -0,0 +1,14 @@ +{ + "description": "Module to export a structured CSV file for uploading to threatStream.", + "logo": "threatstream.png", + "requirements": [ + "csv" + ], + "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatStream.", + "references": [ + "https://www.anomali.com/platform/threatstream", + "https://github.com/threatstream" + ], + "input": "MISP Event attributes", + "output": "ThreatStream CSV format file" +} \ No newline at end of file diff --git a/documentation/website/export_mod/threat_connect_export.json b/documentation/website/export_mod/threat_connect_export.json new file mode 100644 index 0000000..23708dd --- /dev/null +++ b/documentation/website/export_mod/threat_connect_export.json @@ -0,0 +1,13 @@ +{ + "description": "Module to export a structured CSV file for uploading to ThreatConnect.", + "logo": "threatconnect.png", + "requirements": [ + "csv" + ], + "features": "The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatConnect.\nUsers should then provide, as module configuration, the source of data they export, because it is required by the output format.", + "references": [ + "https://www.threatconnect.com" + ], + "input": "MISP Event attributes", + "output": "ThreatConnect CSV format file" +} \ No newline at end of file diff --git a/doc/export_mod/vt_graph.json b/documentation/website/export_mod/vt_graph.json similarity index 66% rename from doc/export_mod/vt_graph.json rename to documentation/website/export_mod/vt_graph.json index e317730..993c791 100644 --- a/doc/export_mod/vt_graph.json +++ b/documentation/website/export_mod/vt_graph.json @@ -1,9 +1,13 @@ { "description": "This module is used to create a VirusTotal Graph from a MISP event.", - "logo": "logos/virustotal.png", - "requirements": ["vt_graph_api, the python library to query the VirusTotal graph API"], + "logo": "virustotal.png", + "requirements": [ + "vt_graph_api, the python library to query the VirusTotal graph API" + ], "features": "The module takes the MISP event as input and queries the VirusTotal Graph API to create a new graph out of the event.\n\nOnce the graph is ready, we get the url of it, which is returned so we can view it on VirusTotal.", - "references": ["https://www.virustotal.com/gui/graph-overview"], + "references": [ + "https://www.virustotal.com/gui/graph-overview" + ], "input": "A MISP event.", "output": "Link of the VirusTotal Graph created for the event." -} +} \ No newline at end of file diff --git a/documentation/website/import_mod/csvimport.json b/documentation/website/import_mod/csvimport.json new file mode 100644 index 0000000..61bc6cc --- /dev/null +++ b/documentation/website/import_mod/csvimport.json @@ -0,0 +1,13 @@ +{ + "description": "Module to import MISP attributes from a csv file.", + "requirements": [ + "PyMISP" + ], + "features": "In order to parse data from a csv file, a header is required to let the module know which column is matching with known attribute fields / MISP types.\n\nThis header either comes from the csv file itself or is part of the configuration of the module and should be filled out in MISP plugin settings, each field separated by COMMAS. Fields that do not match with any type known in MISP or are not MISP attribute fields should be ignored in import, using a space or simply nothing between two separators (example: 'ip-src, , comment, ').\n\nIf the csv file already contains a header that does not start by a '#', you should tick the checkbox 'has_header' to avoid importing it and have potential issues. You can also redefine the header even if it is already contained in the file, by following the rules for headers explained earlier. One reason why you would redefine a header is for instance when you want to skip some fields, or some fields are not valid types.", + "references": [ + "https://tools.ietf.org/html/rfc4180", + "https://tools.ietf.org/html/rfc7111" + ], + "input": "CSV format file.", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/cuckooimport.json b/documentation/website/import_mod/cuckooimport.json new file mode 100644 index 0000000..2e51ea8 --- /dev/null +++ b/documentation/website/import_mod/cuckooimport.json @@ -0,0 +1,12 @@ +{ + "description": "Module to import Cuckoo JSON.", + "logo": "cuckoo.png", + "requirements": [], + "features": "The module simply imports MISP Attributes from a Cuckoo JSON format file. There is thus no special feature to make it work.", + "references": [ + "https://cuckoosandbox.org/", + "https://github.com/cuckoosandbox/cuckoo" + ], + "input": "Cuckoo JSON file", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/email_import.json b/documentation/website/import_mod/email_import.json new file mode 100644 index 0000000..95ec3c7 --- /dev/null +++ b/documentation/website/import_mod/email_import.json @@ -0,0 +1,8 @@ +{ + "description": "Module to import emails in MISP.", + "requirements": [], + "features": "This module can be used to import e-mail text as well as attachments and urls.\n3 configuration parameters are then used to unzip attachments, guess zip attachment passwords, and extract urls: set each one of them to True or False to process or not the respective corresponding actions.", + "references": [], + "input": "E-mail file", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/goamlimport.json b/documentation/website/import_mod/goamlimport.json new file mode 100644 index 0000000..e8f12cf --- /dev/null +++ b/documentation/website/import_mod/goamlimport.json @@ -0,0 +1,11 @@ +{ + "description": "Module to import MISP objects about financial transactions from GoAML files.", + "logo": "goAML.jpg", + "requirements": [ + "PyMISP" + ], + "features": "Unlike the GoAML export module, there is here no special feature to import data from GoAML external files, since the module will import MISP Objects with their References on its own, as it is required for the export module to rebuild a valid GoAML document.", + "references": "http://goaml.unodc.org/", + "input": "GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities).", + "output": "MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target." +} \ No newline at end of file diff --git a/doc/import_mod/joe_import.json b/documentation/website/import_mod/joe_import.json similarity index 78% rename from doc/import_mod/joe_import.json rename to documentation/website/import_mod/joe_import.json index ceba4ab..f60d1dd 100644 --- a/doc/import_mod/joe_import.json +++ b/documentation/website/import_mod/joe_import.json @@ -1,9 +1,12 @@ { "description": "A module to import data from a Joe Sandbox analysis json report.", - "logo": "logos/joesandbox.png", + "logo": "joesandbox.png", "requirements": [], "input": "Json report of a Joe Sandbox analysis.", "output": "MISP attributes & objects parsed from the analysis report.", - "references": ["https://www.joesecurity.org", "https://www.joesandbox.com/"], - "features": "Module using the new format of modules able to return attributes and objects.\n\nThe module returns the same results as the expansion module [joesandbox_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) using the submission link of the analysis to get the json report.\n\n" + "references": [ + "https://www.joesecurity.org", + "https://www.joesandbox.com/" + ], + "features": "Module using the new format of modules able to return attributes and objects.\n\nThe module returns the same results as the expansion module [joesandbox_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) using the submission link of the analysis to get the json report." } diff --git a/doc/import_mod/lastline_import.json b/documentation/website/import_mod/lastline_import.json similarity index 86% rename from doc/import_mod/lastline_import.json rename to documentation/website/import_mod/lastline_import.json index 99414e0..d89a433 100644 --- a/doc/import_mod/lastline_import.json +++ b/documentation/website/import_mod/lastline_import.json @@ -1,9 +1,11 @@ { "description": "Module to import and parse reports from Lastline analysis links.", - "logo": "logos/lastline.png", + "logo": "lastline.png", "requirements": [], "input": "Link to a Lastline analysis.", "output": "MISP attributes and objects parsed from the analysis report.", - "references": ["https://www.lastline.com"], + "references": [ + "https://www.lastline.com" + ], "features": "The module requires a Lastline Portal `username` and `password`.\nThe module uses the new format and it is able to return MISP attributes and objects.\nThe module returns the same results as the [lastline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_query.py) expansion module." -} +} \ No newline at end of file diff --git a/documentation/website/import_mod/mispjson.json b/documentation/website/import_mod/mispjson.json new file mode 100644 index 0000000..7ba47bd --- /dev/null +++ b/documentation/website/import_mod/mispjson.json @@ -0,0 +1,8 @@ +{ + "description": "Module to import MISP JSON format for merging MISP events.", + "requirements": [], + "features": "The module simply imports MISP Attributes from an other MISP Event in order to merge events together. There is thus no special feature to make it work.", + "references": [], + "input": "MISP Event", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/ocr.json b/documentation/website/import_mod/ocr.json new file mode 100644 index 0000000..a33c7e2 --- /dev/null +++ b/documentation/website/import_mod/ocr.json @@ -0,0 +1,8 @@ +{ + "description": "Optical Character Recognition (OCR) module for MISP.", + "requirements": [], + "features": "The module tries to recognize some text from an image and import the result as a freetext attribute, there is then no special feature asked to users to make it work.", + "references": [], + "input": "Image", + "output": "freetext MISP attribute" +} \ No newline at end of file diff --git a/documentation/website/import_mod/openiocimport.json b/documentation/website/import_mod/openiocimport.json new file mode 100644 index 0000000..3e00baf --- /dev/null +++ b/documentation/website/import_mod/openiocimport.json @@ -0,0 +1,12 @@ +{ + "description": "Module to import OpenIOC packages.", + "requirements": [ + "PyMISP" + ], + "features": "The module imports MISP Attributes from OpenIOC packages, there is then no special feature for users to make it work.", + "references": [ + "https://www.fireeye.com/blog/threat-research/2013/10/openioc-basics.html" + ], + "input": "OpenIOC packages", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/threatanalyzer_import.json b/documentation/website/import_mod/threatanalyzer_import.json new file mode 100644 index 0000000..5866e09 --- /dev/null +++ b/documentation/website/import_mod/threatanalyzer_import.json @@ -0,0 +1,10 @@ +{ + "description": "Module to import ThreatAnalyzer archive.zip / analysis.json files.", + "requirements": [], + "features": "The module imports MISP Attributes from a ThreatAnalyzer format file. This file can be either ZIP, or JSON format.\nThere is by the way no special feature for users to make the module work.", + "references": [ + "https://www.threattrack.com/malware-analysis.aspx" + ], + "input": "ThreatAnalyzer format file", + "output": "MISP Event attributes" +} \ No newline at end of file diff --git a/documentation/website/import_mod/vmray_import.json b/documentation/website/import_mod/vmray_import.json new file mode 100644 index 0000000..c80b237 --- /dev/null +++ b/documentation/website/import_mod/vmray_import.json @@ -0,0 +1,13 @@ +{ + "description": "Module to import VMRay (VTI) results.", + "logo": "vmray.png", + "requirements": [ + "vmray_rest_api" + ], + "features": "The module imports MISP Attributes from VMRay format, using the VMRay api.\nUsers should then provide as the module configuration the API Key as well as the server url in order to fetch their data to import.", + "references": [ + "https://www.vmray.com/" + ], + "input": "VMRay format", + "output": "MISP Event attributes" +} \ No newline at end of file From 6a83d171b999ba2eae82f9cf7ec47be77e0ef336 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 18 Nov 2020 11:43:33 +0100 Subject: [PATCH 070/476] chg: [pipenv] Updated lock Pipfile --- Pipfile.lock | 800 +++++++++++++++++++++++++++------------------------ 1 file changed, 427 insertions(+), 373 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index f862610..dbca0ce 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "41a685412700814c27cc8835a0a650a5f44dab172239cd06a7cb02f201a63e73" + "sha256": "1500257feb23545cff1594b4e16711ddb190a202858fcb95b469aa951a4b6b8c" }, "pipfile-spec": 6, "requires": { @@ -93,11 +93,11 @@ }, "attrs": { "hashes": [ - "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", - "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" + "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", + "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.2.0" + "version": "==20.3.0" }, "backscatter": { "hashes": [ @@ -125,10 +125,10 @@ }, "certifi": { "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", + "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" ], - "version": "==2020.6.20" + "version": "==2020.11.8" }, "cffi": { "hashes": [ @@ -380,42 +380,43 @@ }, "lxml": { "hashes": [ - "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", - "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", - "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", - "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", - "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", - "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", - "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", - "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", - "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", - "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", + "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", + "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", + "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", + "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", + "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", - "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", - "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", - "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", - "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", - "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", - "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", - "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", - "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", - "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", - "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", - "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", - "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", - "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", + "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", + "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", + "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", + "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", + "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f", + "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", + "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", - "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", + "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", - "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", + "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", - "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", + "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", + "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", - "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" + "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", + "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", + "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", + "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", + "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", + "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", + "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", + "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", + "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", + "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311" ], "index": "pypi", "version": "==4.6.1" @@ -449,42 +450,46 @@ }, "multidict": { "hashes": [ - "sha256:02b2ea2bb1277a970d238c5c783023790ca94d386c657aeeb165259950951cc6", - "sha256:0ce1d956ecbf112d49915ebc2f29c03e35fe451fb5e9f491edf9a2f4395ee0af", - "sha256:0ffdb4b897b15df798c0a5939a0323ccf703f2bae551dfab4eb1af7fbab38ead", - "sha256:11dcf2366da487d5b9de1d4b2055308c7ed9bde1a52973d07a89b42252af9ebe", - "sha256:167bd8e6351b57525bbf2d524ca5a133834699a2fcb090aad0c330c6017f3f3e", - "sha256:1b324444299c3a49b601b1bf621fc21704e29066f6ac2b7d7e4034a4a18662a1", - "sha256:20eaf1c279c543e07c164e4ac02151488829177da06607efa7ccfecd71b21e79", - "sha256:2739d1d9237835122b27d88990849ecf41ef670e0fcb876159edd236ca9ef40f", - "sha256:28b5913e5b6fef273e5d4230b61f33c8a51c3ce5f44a88582dee6b5ca5c9977b", - "sha256:2b0cfc33f53e5c8226f7d7c4e126fa0780f970ef1e96f7c6353da7d01eafe490", - "sha256:32f0a904859a6274d7edcbb01752c8ae9c633fb7d1c131771ff5afd32eceee42", - "sha256:39713fa2c687e0d0e709ad751a8a709ac051fcdc7f2048f6fd09365dd03c83eb", - "sha256:4ef76ce695da72e176f6a51867afb3bf300ce16ba2597824caaef625af5906a9", - "sha256:5263359a03368985b5296b7a73363d761a269848081879ba04a6e4bfd0cf4a78", - "sha256:52b5b51281d760197ce3db063c166fdb626e01c8e428a325aa37198ce31c9565", - "sha256:5dd303b545b62f9d2b14f99fbdb84c109a20e64a57f6a192fe6aebcb6263b59d", - "sha256:60af726c19a899ed49bbb276e062f08b80222cb6b9feda44b59a128b5ff52966", - "sha256:60b12d14bc122ba2dae1e4460a891b3a96e73d815b4365675f6ec0a1725416a5", - "sha256:620c39b1270b68e194023ad471b6a54bdb517bb48515939c9829b56c783504a3", - "sha256:62f6e66931fb87e9016e7c1cc806ab4f3e39392fd502362df3cac888078b27cb", - "sha256:711289412b78cf41a21457f4c806890466013d62bf4296bd3d71fad73ff8a581", - "sha256:7561a804093ea4c879e06b5d3d18a64a0bc21004bade3540a4b31342b528d326", - "sha256:786ad04ad954afe9927a1b3049aa58722e182160fe2fcac7ad7f35c93595d4f6", - "sha256:79dc3e6e7ce853fb7ed17c134e01fcb0d0c826b33201aa2a910fb27ed75c2eb9", - "sha256:84e4943d8725659942e7401bdf31780acde9cfdaf6fe977ff1449fffafcd93a9", - "sha256:932964cf57c0e59d1f3fb63ff342440cf8aaa75bf0dbcbad902c084024975380", - "sha256:a5eca9ee72b372199c2b76672145e47d3c829889eefa2037b1f3018f54e5f67d", - "sha256:aad240c1429e386af38a2d6761032f0bec5177fed7c5f582c835c99fff135b5c", - "sha256:bbec545b8f82536bc50afa9abce832176ed250aa22bfff3e20b3463fb90b0b35", - "sha256:c339b7d73c0ea5c551025617bb8aa1c00a0111187b6545f48836343e6cfbe6a0", - "sha256:c692087913e12b801a759e25a626c3d311f416252dfba2ecdfd254583427949f", - "sha256:cda06c99cd6f4a36571bb38e560a6fcfb1f136521e57f612e0bc31957b1cd4bd", - "sha256:ec8bc0ab00c76c4260a201eaa58812ea8b1b7fde0ecf5f9c9365a182bd4691ed" + "sha256:060d68ae3e674c913ec41a464916f12c4d7ff17a3a9ebbf37ba7f2c681c2b33e", + "sha256:06f39f0ddc308dab4e5fa282d145f90cd38d7ed75390fc83335636909a9ec191", + "sha256:17847fede1aafdb7e74e01bb34ab47a1a1ea726e8184c623c45d7e428d2d5d34", + "sha256:1cd102057b09223b919f9447c669cf2efabeefb42a42ae6233f25ffd7ee31a79", + "sha256:20cc9b2dd31761990abff7d0e63cd14dbfca4ebb52a77afc917b603473951a38", + "sha256:2576e30bbec004e863d87216bc34abe24962cc2e964613241a1c01c7681092ab", + "sha256:2ab9cad4c5ef5c41e1123ed1f89f555aabefb9391d4e01fd6182de970b7267ed", + "sha256:359ea00e1b53ceef282232308da9d9a3f60d645868a97f64df19485c7f9ef628", + "sha256:3e61cc244fd30bd9fdfae13bdd0c5ec65da51a86575ff1191255cae677045ffe", + "sha256:43c7a87d8c31913311a1ab24b138254a0ee89142983b327a2c2eab7a7d10fea9", + "sha256:4a3f19da871befa53b48dd81ee48542f519beffa13090dc135fffc18d8fe36db", + "sha256:4df708ef412fd9b59b7e6c77857e64c1f6b4c0116b751cb399384ec9a28baa66", + "sha256:59182e975b8c197d0146a003d0f0d5dc5487ce4899502061d8df585b0f51fba2", + "sha256:6128d2c0956fd60e39ec7d1c8f79426f0c915d36458df59ddd1f0cff0340305f", + "sha256:6168839491a533fa75f3f5d48acbb829475e6c7d9fa5c6e245153b5f79b986a3", + "sha256:62abab8088704121297d39c8f47156cb8fab1da731f513e59ba73946b22cf3d0", + "sha256:653b2bbb0bbf282c37279dd04f429947ac92713049e1efc615f68d4e64b1dbc2", + "sha256:6566749cd78cb37cbf8e8171b5cd2cbfc03c99f0891de12255cf17a11c07b1a3", + "sha256:76cbdb22f48de64811f9ce1dd4dee09665f84f32d6a26de249a50c1e90e244e0", + "sha256:8efcf070d60fd497db771429b1c769a3783e3a0dd96c78c027e676990176adc5", + "sha256:8fa4549f341a057feec4c3139056ba73e17ed03a506469f447797a51f85081b5", + "sha256:9380b3f2b00b23a4106ba9dd022df3e6e2e84e1788acdbdd27603b621b3288df", + "sha256:9ed9b280f7778ad6f71826b38a73c2fdca4077817c64bc1102fdada58e75c03c", + "sha256:a7b8b5bd16376c8ac2977748bd978a200326af5145d8d0e7f799e2b355d425b6", + "sha256:af271c2540d1cd2a137bef8d95a8052230aa1cda26dd3b2c73d858d89993d518", + "sha256:b561e76c9e21402d9a446cdae13398f9942388b9bff529f32dfa46220af54d00", + "sha256:b82400ef848bbac6b9035a105ac6acaa1fb3eea0d164e35bbb21619b88e49fed", + "sha256:b98af08d7bb37d3456a22f689819ea793e8d6961b9629322d7728c4039071641", + "sha256:c58e53e1c73109fdf4b759db9f2939325f510a8a5215135330fe6755921e4886", + "sha256:cbabfc12b401d074298bfda099c58dfa5348415ae2e4ec841290627cb7cb6b2e", + "sha256:d4a6fb98e9e9be3f7d70fd3e852369c00a027bd5ed0f3e8ade3821bcad257408", + "sha256:d99da85d6890267292065e654a329e1d2f483a5d2485e347383800e616a8c0b1", + "sha256:e58db0e0d60029915f7fc95a8683fa815e204f2e1990f1fb46a7778d57ca8c35", + "sha256:e5bf89fe57f702a046c7ec718fe330ed50efd4bcf74722940db2eb0919cddb1c", + "sha256:f612e8ef8408391a4a3366e3508bab8ef97b063b4918a317cb6e6de4415f01af", + "sha256:f65a2442c113afde52fb09f9a6276bbc31da71add99dc76c3adf6083234e07c6", + "sha256:fa0503947a99a1be94f799fac89d67a5e20c333e78ddae16e8534b151cdc588a" ], "markers": "python_version >= '3.5'", - "version": "==5.0.0" + "version": "==5.0.2" }, "np": { "hashes": [ @@ -495,43 +500,43 @@ }, "numpy": { "hashes": [ - "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7", - "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3", - "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268", - "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170", - "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f", - "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72", - "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996", - "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522", - "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed", - "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69", - "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d", - "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68", - "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98", - "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822", - "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d", - "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5", - "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6", - "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0", - "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add", - "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2", - "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9", - "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0", - "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2", - "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c", - "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931", - "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da", - "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e", - "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4", - "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535", - "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c", - "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772", - "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6", - "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f", - "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2" + "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", + "sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce", + "sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1", + "sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512", + "sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2", + "sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757", + "sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9", + "sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2", + "sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08", + "sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b", + "sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb", + "sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc", + "sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac", + "sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83", + "sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36", + "sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387", + "sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f", + "sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad", + "sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c", + "sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414", + "sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37", + "sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764", + "sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753", + "sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909", + "sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6", + "sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63", + "sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9", + "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949", + "sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab", + "sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c", + "sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3", + "sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893", + "sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15", + "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4" ], "markers": "python_version >= '3.6'", - "version": "==1.19.3" + "version": "==1.19.4" }, "oauth2": { "hashes": [ @@ -548,55 +553,60 @@ }, "opencv-python": { "hashes": [ - "sha256:16864152aa6ac346ef83588d6f4f5dc974d27851c034d6970fcb7b6a98bbd318", - "sha256:23dade76fe0194139112eea7ecdfa02ae09924b1d8d853f17f387a356519e484", - "sha256:27d5b83edd245a12dd6b8562569ad3f23e5ffe30cef8cfcc70756dd24b55d12f", - "sha256:2a2a7590b99d872b193cda0592b2c1cd6561159c31b361597c0e69e8926c8d16", - "sha256:46032d4648c74730115f8522effda8ac39bd0385f07edc7aab57b41cc7617933", - "sha256:4c195597d5286d1cc7259aeaeb7e6c1cde07fec9bddf26523eab1b15709291aa", - "sha256:69c971fefb633cfd334ed195d58e76e87f267649f98a2394f7400b178e918936", - "sha256:80b5b68e9c5dda29205ca112e6d5bd647b6b43cf917cfa5ce178d61675291bba", - "sha256:98676d349fdfc17dba9f23b87e9b6a639733d35f5f0ffcccb90e76c8200568f4", - "sha256:9df617736351100879b70d914366b9f9e38aa227885f2590b48badc4a233119d", - "sha256:b2147317b00b20e8d7e01201221af2b278aed449fa436316c42bc63f653e8245", - "sha256:d838ee4562f52793b1b10876e5067cae1a6bb1c3c575091644be9b88cf45d255", - "sha256:db74a92ef9c2a0810e1436d586b3b15d421a39b72f06263358f15c7a609498e0", - "sha256:e100a4ffdeed8c4afac6a5b3f6b4481efe0ad90e0a0ae2d129478abd4bd790bc", - "sha256:e87d88a820050c0e886c9add48eac2f80ff29207a98cca25869a6868c519daa4", - "sha256:fdf017c5b93d58ad77e2690e59322fd09414705c28d69b52fad4a19985422e6c" + "sha256:0548981fe189e0d57b9cc65066b66fd70d4bc84ea906f349a63d9098e1b911c6", + "sha256:117dbb2fd184de28d831f14c1da17864efcee7bb7895e43adf40f5e1da9137fb", + "sha256:135e05b69ab9665cbe2589f56e60895219bc2443a632bdc4bde72fb95eda1582", + "sha256:14df77490c8aedceae74e660564d48c04761658aecc93895ac5e974006a89606", + "sha256:17581c68400f828700e5c6b3b082f50c781bf74cb9a7b972a04f05d26c8e894a", + "sha256:4af0053c6a70f127a52c26b112341826d3dbfce6955beb9044d3eabd7e14d1cd", + "sha256:51baebb0f8f3cae4cccd30daf018a5bb75cb759d5658aea29100d34cd5cac106", + "sha256:6022609b67f9c0f14e6807e782660d1d1be94d4f0c7bc1794d7d8f600014acb2", + "sha256:68a9ec7e32f82cab267b6f757d9862a9a930371062739f9d00472e7c850c5854", + "sha256:6b1d85cbb64ce20ac5f79ad8e3e76a3dbff53d258c65f2fc0b9411321147a0be", + "sha256:6b6d23de6d5ddc55e865ac8532bf8062b26ba70305fa1c87c671717027dcd370", + "sha256:744e9ae2fb4c8574e6d4a762146b4d0984bdec60b98480fc54a363c03a07a1ac", + "sha256:7fe81d08df4eb5dc4c6aa5f09888b6fd390fce5fa7d5624a98cac890b9aa6181", + "sha256:8a8ebd7ceebc0be9c14ca3e25a1c4ae086016b469848258e998247f2fc855314", + "sha256:8aeda9b2c37bf91fa88d67f09b85f2250661eec43d72184ec544783de204e96a", + "sha256:9659e80059c9f39728c7dcc22032dff0d1d467f07b6cd8e036613393e4b7c71a", + "sha256:c1382209a771ca8a25fe89d4a2377875538c6ed3cf8745280e65636cbd0988f2", + "sha256:d80db278a07f51811dbf0f9c31ff7cd5b2501822fb7a7587e71f9ff27d5c04bd", + "sha256:db874c65654465ef71d6e8618bed8c725722bc90624132b9512bf061abb4eec0", + "sha256:e4c072cf4260063ebadc70e34d622fa1127a88e364475ed757709e249ebe990f", + "sha256:f69a56e958ecb549ba84e0497a438080932b4d52ded441cec04d80afde71dc0a" ], "index": "pypi", - "version": "==4.4.0.44" + "version": "==4.4.0.46" }, "pandas": { "hashes": [ - "sha256:ca71a5aa9eeb3ef5b31feca7d9b6369d6b3d0b2e9c85d7a89abe3ecb013f1e86", - "sha256:df43ea0e9fd9f9672b0de9cac26d01255ad50481994bf3cb4687c21eec2d7bbc", - "sha256:babbeda2f83b0686c9ad38d93b10516e68cdcd5771007eb80a763e98aaf44613", - "sha256:147162568b1242355290341baf281926cfac66ada07e634f3fc521ac967e4653", - "sha256:d6b1f9d506dc23da2915bcae5c5968990049c9cec44108bd9855d2c7c89d91dc", - "sha256:3a038cd5da602b955d335aa80cbaa0e5774f68501ff47b9c21509906981478da", - "sha256:84a4ffe668df357e31f98c829536e3a7142c3036c82f996e639f644c5d32eda1", - "sha256:882012763668af54b48f1412bab95c5cc0a7ccce5a2a8221cfc3839a6e3394ef", - "sha256:d89dbc58aec1544722a8d5046f880b597c497ef8a82c5fe695b4b2effafac5ec", - "sha256:5a8a84b75ca3a29bb4263b35d5ed9fcaae2b062f014feed8c5daa897339c7d85", - "sha256:24f61f40febe47edac271eda45d683e42838b7db2bd0f82574d9800259d2b182", - "sha256:b11b496c317dbe007898de699fd59eaf687d0fe8c1b7dad109db6010155d28ae", - "sha256:206d7c3e5356dcadf082e64dc25c24bc8541718045826074f96346e9d6d05a20", - "sha256:c22e40f1b4d162ca18eb6b2c572e63eef220dbc9cc3de0241cefb77972621bb7", - "sha256:ca31ac8578d48da354cf66a473d4d5ff99277ca71d321dc7ea4e6fad3c6bb0fd", - "sha256:a605054fbca71ed1d08bb2aef6f73c84a579bbac956bfe8f9718d5e84cb41248", - "sha256:f4cb8252ae71f093f4a6b847adf0bc9330f109c48f08363c2071f189f1c89c87", - "sha256:2999adc6736f8cb4c69d65a6e2b25a11bcb395da5b048342b8e4d6fe055e57ae", - "sha256:54f5f564058b0280d588c3758abde82e280702c440db5faf0c686b80336096f9", - "sha256:b026e913d88fad3a74eea8ed5a5f98e8823080ea02f8d9bb0ec19e92552daad6", - "sha256:11c284769f41e95f7d16a327eb555989c5f29418aad075fa80c97ef3aa8fb885", - "sha256:920d30fdff65a079f071db635d282b4f583c2b26f2b58d5dca218aac7c59974d", - "sha256:427be9938b2f79ab298de84f87693914cda238a27cf10580da96caf3dff64115", - "sha256:fd6f05b6101d0e76f3e5c26a47be5be7be96ed84ef3981dc1852e76898e73594" + "sha256:09e0503758ad61afe81c9069505f8cb8c1e36ea8cc1e6826a95823ef5b327daf", + "sha256:0a11a6290ef3667575cbd4785a1b62d658c25a2fd70a5adedba32e156a8f1773", + "sha256:0d9a38a59242a2f6298fff45d09768b78b6eb0c52af5919ea9e45965d7ba56d9", + "sha256:112c5ba0f9ea0f60b2cc38c25f87ca1d5ca10f71efbee8e0f1bee9cf584ed5d5", + "sha256:185cf8c8f38b169dbf7001e1a88c511f653fbb9dfa3e048f5e19c38049e991dc", + "sha256:3aa8e10768c730cc1b610aca688f588831fa70b65a26cb549fbb9f35049a05e0", + "sha256:41746d520f2b50409dffdba29a15c42caa7babae15616bcf80800d8cfcae3d3e", + "sha256:43cea38cbcadb900829858884f49745eb1f42f92609d368cabcc674b03e90efc", + "sha256:5378f58172bd63d8c16dd5d008d7dcdd55bf803fcdbe7da2dcb65dbbf322f05b", + "sha256:54404abb1cd3f89d01f1fb5350607815326790efb4789be60508f458cdd5ccbf", + "sha256:5dac3aeaac5feb1016e94bde851eb2012d1733a222b8afa788202b836c97dad5", + "sha256:5fdb2a61e477ce58d3f1fdf2470ee142d9f0dde4969032edaf0b8f1a9dafeaa2", + "sha256:6613c7815ee0b20222178ad32ec144061cb07e6a746970c9160af1ebe3ad43b4", + "sha256:6d2b5b58e7df46b2c010ec78d7fb9ab20abf1d306d0614d3432e7478993fbdb0", + "sha256:8a5d7e57b9df2c0a9a202840b2881bb1f7a648eba12dd2d919ac07a33a36a97f", + "sha256:8b4c2055ebd6e497e5ecc06efa5b8aa76f59d15233356eb10dad22a03b757805", + "sha256:a15653480e5b92ee376f8458197a58cca89a6e95d12cccb4c2d933df5cecc63f", + "sha256:a7d2547b601ecc9a53fd41561de49a43d2231728ad65c7713d6b616cd02ddbed", + "sha256:a979d0404b135c63954dea79e6246c45dd45371a88631cdbb4877d844e6de3b6", + "sha256:b1f8111635700de7ac350b639e7e452b06fc541a328cf6193cf8fc638804bab8", + "sha256:c5a3597880a7a29a31ebd39b73b2c824316ae63a05c3c8a5ce2aea3fc68afe35", + "sha256:c681e8fcc47a767bf868341d8f0d76923733cbdcabd6ec3a3560695c69f14a1e", + "sha256:cf135a08f306ebbcfea6da8bf775217613917be23e5074c69215b91e180caab4", + "sha256:e2b8557fe6d0a18db4d61c028c6af61bfed44ef90e419ed6fadbdc079eba141e" ], "index": "pypi", - "version": "==1.1.3" + "version": "==1.1.4" }, "pandas-ods-reader": { "hashes": [ @@ -624,41 +634,61 @@ }, "pillow": { "hashes": [ - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", + "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", + "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", + "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", + "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", + "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", + "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", + "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", + "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", + "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", + "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", + "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", + "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", + "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", + "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", + "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", + "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", + "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", + "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792" ], "index": "pypi", "version": "==8.0.1" @@ -703,98 +733,85 @@ }, "pycryptodome": { "hashes": [ - "sha256:02e51e1d5828d58f154896ddfd003e2e7584869c275e5acbe290443575370fba", - "sha256:03d5cca8618620f45fd40f827423f82b86b3a202c8d44108601b0f5f56b04299", - "sha256:0e24171cf01021bc5dc17d6a9d4f33a048f09d62cc3f62541e95ef104588bda4", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", - "sha256:1e655746f539421d923fd48df8f6f40b3443d80b75532501c0085b64afed9df5", - "sha256:2b998dc45ef5f4e5cf5248a6edfcd8d8e9fb5e35df8e4259b13a1b10eda7b16b", - "sha256:360955eece2cd0fa694a708d10303c6abd7b39614fa2547b6bd245da76198beb", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:54bdedd28476dea8a3cd86cb67c0df1f0e3d71cae8022354b0f879c41a3d27b2", - "sha256:55eb61aca2c883db770999f50d091ff7c14016f2769ad7bca3d9b75d1d7c1b68", - "sha256:6276478ada411aca97c0d5104916354b3d740d368407912722bd4d11aa9ee4c2", - "sha256:663f8de2b3df2e744d6e1610506e0ea4e213bde906795953c1e82279c169f0a7", - "sha256:67dcad1b8b201308586a8ca2ffe89df1e4f731d5a4cdd0610cc4ea790351c739", - "sha256:39ef9fb52d6ec7728fce1f1693cb99d60ce302aeebd59bcedea70ca3203fda60", - "sha256:fbe65d5cfe04ff2f7684160d50f5118bdefb01e3af4718eeb618bfed40f19d94", - "sha256:b56638d58a3a4be13229c6a815cd448f9e3ce40c00880a5398471b42ee86f50e", - "sha256:709b9f144d23e290b9863121d1ace14a72e01f66ea9c903fbdc690520dfdfcf0", - "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", - "sha256:9f62d21bc693f3d7d444f17ed2ad7a913b4c37c15cd807895d013c39c0517dfd", - "sha256:a207231a52426de3ff20f5608f0687261a3329d97a036c51f7d4c606a6f30c23", - "sha256:87006cf0d81505408f1ae4f55cf8a5d95a8e029a4793360720ae17c6500f7ecc", - "sha256:8063a712fba642f78d3c506b0896846601b6de7f5c3d534e388ad0cc07f5a149", - "sha256:4350a42028240c344ee855f032c7d4ad6ff4f813bfbe7121547b7dc579ecc876", - "sha256:f78a68c2c820e4731e510a2df3eef0322f24fde1781ced970bf497b6c7d92982", - "sha256:abc2e126c9490e58a36a0f83516479e781d83adfb134576a5cbe5c6af2a3e93c", - "sha256:dd302b6ae3965afeb5ef1b0d92486f986c0e65183cd7835973f0b593800590e6", - "sha256:50348edd283afdccddc0938cdc674484533912ba8a99a27c7bfebb75030aa856", - "sha256:c8bf40cf6e281a4378e25846924327e728a887e8bf0ee83b2604a0f4b61692e8", - "sha256:cecbf67e81d6144a50dc615629772859463b2e4f815d0c082fa421db362f040e", - "sha256:d8074c8448cfd0705dfa71ca333277fce9786d0b9cac75d120545de6253f996a", - "sha256:80d57177a0b7c14d4594c62bbb47fe2f6309ad3b0a34348a291d570925c97a82", - "sha256:132a56abba24e2e06a479d8e5db7a48271a73a215f605017bbd476d31f8e71c1", - "sha256:ef39c98d9b8c0736d91937d193653e47c3b19ddf4fc3bccdc5e09aaa4b0c5d21", - "sha256:f2e045224074d5664dc9cbabbf4f4d4d46f1ee90f24780e3a9a668fd096ff17f", - "sha256:f521178e5a991ffd04182ed08f552daca1affcb826aeda0e1945cd989a9d4345", - "sha256:bec2bcdf7c9ce7f04d718e51887f3b05dc5c1cfaf5d2c2e9065ecddd1b2f6c9a" + "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", + "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", + "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", + "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", + "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", + "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", + "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", + "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", + "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", + "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", + "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", + "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", + "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", + "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", + "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", + "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", + "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", + "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", + "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", + "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", + "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", + "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", + "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", + "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", + "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", + "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", + "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", + "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", + "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", + "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", + "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", + "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", + "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", + "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", + "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.8" + "version": "==3.9.9" }, "pycryptodomex": { "hashes": [ - "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", - "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa", - "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6", - "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", - "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", - "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", - "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422", - "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", - "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", - "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e", - "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214", - "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", - "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda", - "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32", - "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11", - "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", - "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f", - "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9", - "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68", - "sha256:85c108b42e47d4073344ff61d4e019f1d95bb7725ca0fe87d0a2deb237c10e49", - "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259", - "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48", - "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2", - "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3", - "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", - "sha256:c315262e26d54a9684e323e37ac9254f481d57fcc4fd94002992460898ef5c04", - "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00", - "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34", - "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489", - "sha256:ddb1ae2891c8cb83a25da87a3e00111a9654fc5f0b70f18879c41aece45d6182", - "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060", - "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb", - "sha256:3b23d63030819b7d9ac7db9360305fd1241e6870ca5b7e8d59fee4db4674a490", - "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c", - "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be", - "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677", - "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46", - "sha256:f5bd6891380e0fb5467251daf22525644fdf6afd9ae8bc2fe065c78ea1882e0d", - "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb" + "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", + "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", + "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", + "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", + "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", + "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", + "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", + "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", + "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", + "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", + "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", + "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", + "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", + "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", + "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", + "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", + "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", + "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", + "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", + "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", + "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", + "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", + "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", + "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", + "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", + "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", + "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", + "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", + "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", + "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", + "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", + "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", + "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", + "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", + "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.8" + "version": "==3.9.9" }, "pydeep": { "hashes": [ @@ -842,7 +859,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "deb9e06c726592c145e44b25fa6a05db56e3aa80" + "ref": "02eff91c1efaf9406164cd4d2ba0bc2036a9e67e" }, "pyonyphe": { "editable": true, @@ -1009,60 +1026,60 @@ }, "reportlab": { "hashes": [ - "sha256:00b9b3ffbd197b21cb076acc336993005b75d16b60f7a79a3c8faee926f890b7", - "sha256:0177b58d0ae81f6775b10e66f97bc7aa490659398e1f24401b6d1767803c4880", - "sha256:03c792a92ba21e75e05230ef1ce038025c23b124c706d7369dfa1475a0d24785", - "sha256:04044318273fa00487557f2e79bb6f8faa08185b8b1795cc29985ccb609c8680", - "sha256:217da82e7451e2b101a4bd72006a7e6c0d3203200cfb5c4d6a17b997b9ba73c6", - "sha256:226b5ef9af16aa8b3487513556ae7386239fe3ec8b121b1e23f45b850f0a10a8", - "sha256:24773aba8c74e1e023a1d3c3c60dbd6ef4a76472e38f13b5a214c8bb48db7aef", - "sha256:25eb9bb45e206b3a464f763d1231d70bb5f351c01d5ab94568e687fec4bd9eee", - "sha256:3d6d26294e8e3f6a639ee4a4b423d2cb0fa7de24c4cccea50a32d50d20db52ad", - "sha256:4987cca329df7f9bf4b6abea3e83c26a5a8edfe5b133344e24f146ddc8c09b9a", - "sha256:4b6a7e9a83e00cfe020c8e8bdd595384312228b24dcb40538d5cf00df15c5bff", - "sha256:531b70748dd89456c4e1d2132497bc8580ac74d7fcb790b8e2d1b20378655ba2", - "sha256:57abf06c045d16a85906fbdd8d826d7e334377bbb29b7442d249a95cf5f3a5c5", - "sha256:58877ed7390327bf4c41ca75473223866f7d8da0f8a606eb682127c8ac4af990", - "sha256:640d41838b1e663c5db53f3c32294cd742ac5cc4ba3098aeaad53297b7e1cc47", - "sha256:658471d5b06e121692449f44a4e39e3c7128fea757c4e9354b488f35ac3f82de", - "sha256:6f971a53e02682866886c451513143f46aed65704e46327bb6440604cd7cd7eb", - "sha256:78dcf1aff25ddf68b147e78b074bef1384e804dd54322eb1d1f1f680892f8788", - "sha256:793ed7edd50306cd05213ac012749dfe65768485bd493c3434936438d594a363", - "sha256:7a3512585308e5c73bf123457ccfc90acb99493df89fae6131caaec9ffe1e4ca", - "sha256:7ace84b3aae39b14ce7235d096bc81891f60b871b7edad2b656cb1729100e0f2", - "sha256:7e84d123ec98816fce5a97af2755d664519e7891e9793330ec271900acb2bfab", - "sha256:813c31d8b7f28ee2f38f238c3eb6afb02b81b00d749ab10e38b534843680aea7", - "sha256:8365efe779e43e8005eace19c11c36e6a4bbea86ddc868b8db122240391c1747", - "sha256:8412514dc0d1bf62c6b33a645b5a7c46933cc16f3678db5546d0ac4e27f3dbae", - "sha256:8d4ba2aea71ab6ec688b3f3416db0d457e7814a642433b7f407a3f29e054816d", - "sha256:99a7cdd8633a8717dd239917647b42d9a6b869a01c39019c7b0b08b963be2a7e", - "sha256:9d86fe83e9c4838e0048f14067869d1ca8722bb52545781db7a9d345939e77f0", - "sha256:a626a97ab135f2129d87c5f98b2aee45e0ef1652bc9afef92509a8f5a5f72e45", - "sha256:a921906c1deb199f7910163703e4073b52e8d7f00d56d4f6bbc255a6ca3cfb1d", - "sha256:b80840cc4fece1426d30070a9dad016d9589e8d82ebddfc9ed30004b44ba2803", - "sha256:c5318b4e23803c7c5f2b7384858b7b6be5faf51f63664c97f6bf8601cd248855", - "sha256:cd5546d840f639587f352d4c54ff35422cbeba81eb2c50d156cd733015ecc4b2", - "sha256:d445fc4ada6a24a90080f7379d169fba1072ba5a75179ce2f5c3280adf605b45", - "sha256:d56f150bb4b2d32596291aa98d3c6986721c5cf41b8f90346a84cee8b7fb35f2", - "sha256:d6e42636247e4c6d2db929b9db01d1af907f63aa74af8123cd699107df8a7b23", - "sha256:dcf732695b1325289a9a74b849179d8475db32a00803644a664c2172a603237e", - "sha256:e7b20927e5e11bad8bac5d5b6c286ce2cae2804073513aa67f20986bc4b3b4e0", - "sha256:f6295876665359790dcb7042a9221c60e1f89dee042f33414e3ce440772f7aa1", - "sha256:f8ec6637f56c293ac62c9a94daebb856c4ef9b97eae4cf7b4e518813e41c8c75" + "sha256:06be7f04a631f02cd0202f7dee0d3e61dc265223f4ff861525ed7784b5552540", + "sha256:0a788a537c48915eda083485b59ac40ac012fa7c43070069bde6eb5ea588313c", + "sha256:1a7a38810e79653d0ea8e61db4f0517ac2a0e76edd2497cf6d4969dd3be30030", + "sha256:22301773db730545b44d4c77d8f29baf5683ccabec9883d978e8b8eda6d2175f", + "sha256:2906321b3d2779faafe47e2c13f9c69e1fb4ddb907f5a49cab3f9b0ea95df1f5", + "sha256:2d65f9cc5c0d3f63b5d024e6cf92234f1ab1f267cc9e5a847ab5d3efe1c3cf3e", + "sha256:2e012f7b845ef9f1f5bd63461d5201fa624b019a65ff5a93d0002b4f915bbc89", + "sha256:31ccfdbf5bb5ec85f0397661085ce4c9e52537ca0d2bf4220259666a4dcc55c2", + "sha256:3e10bd20c8ada9f7e1113157aa73b8e0048f2624e74794b73799c3deb13d7a3f", + "sha256:440d5f86c2b822abdb7981d691a78bdcf56f4710174830283034235ab2af2969", + "sha256:4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53", + "sha256:59659ee8897950fd1acd41a9cc61f4afdfda52dc2bb69a1924ce68089491849d", + "sha256:6216b11313467989ac9d9578ea3756d0af46e97184ee4e11a6b7ef652458f70d", + "sha256:6268a9a3d75e714b22beeb7687270956b06b232ccfdf37b1c6462961eab04457", + "sha256:6b226830f80df066d5986a3fdb3eb4d1b6320048f3d9ade539a6c03a5bc8b3ec", + "sha256:6e10eba6a0e330096f4200b18824b3194c399329b7830e34baee1c04ea07f99f", + "sha256:6e224c16c3d6fafdb2fb67b33c4b84d984ec34869834b3a137809f2fe5b84778", + "sha256:7da162fa677b90bd14f19b20ff80fec18c24a31ac44e5342ba49e198b13c4f92", + "sha256:8406e960a974a65b765c9ff74b269aa64718b4af1e8c511ebdbd9a5b44b0c7e6", + "sha256:8999bb075102d1b8ca4aada6ca14653d52bf02e37fd064e477eb180741f75077", + "sha256:8f6163729612e815b89649aed2e237505362a78014199f819fd92f9e5c96769b", + "sha256:9699fa8f0911ad56b46cc60bbaebe1557fd1c9e8da98185a7a1c0c40193eba48", + "sha256:9a53d76eec33abda11617aad1c9f5f4a2d906dd2f92a03a3f1ea370efbb52c95", + "sha256:9ed4d761b726ff411565eddb10cb37a6bca0ec873d9a18a83cf078f4502a2d94", + "sha256:a020d308e7c2de284d5407e3c6c13e3977a62b314f7bfe19bcc69677931da589", + "sha256:a2e6c15aecbe631245aab639751a58671312cced7e17de1ed9c45fb37036f6c9", + "sha256:b10cb48606d97b70edb094576e3d493d40467395e4fc267655135a2c92defbe8", + "sha256:b8d6e9df5181ed07b7ae145258eb69e686133afc97930af51a3c0c9d784d834d", + "sha256:bbb297754f5cf25eb8fcb817752984252a7feb0ca83e383718e4eec2fb67ea32", + "sha256:be90599e5e78c1ddfcfee8c752108def58b4c672ebcc4d3d9aa7fe65e7d3f16b", + "sha256:bfdfad9b8ae00bd0752b77f954c7405327fd99b2cc6d5e4273e65be61429d56a", + "sha256:c1e5ef5089e16b249388f65d8c8f8b74989e72eb8332060dc580a2ecb967cfc2", + "sha256:c5ed342e29a5fd7eeb0f2ccf7e5b946b5f750f05633b2d6a94b1c02094a77967", + "sha256:c7087a26b26aa82a3ba27e13e66f507cc697f9ceb4c046c0f758876b55f040a5", + "sha256:cf589e980d92b0bf343fa512b9d3ae9ed0469cbffd99cb270b6c83da143cb437", + "sha256:e6fb762e524a4fb118be9f44dbd9456cf80e42253ee8f1bdb0ea5c1f882d4ba8", + "sha256:f2fde5abb6f21c1eff5430f380cdbbee7fdeda6af935a83730ddce9f0c4e504e", + "sha256:f585b3bf7062c228306acd7f40b2ad915b32603228c19bb225952cc98fd2015a", + "sha256:f955a6366cf8e6729776c96e281bede468acd74f6eb49a5bbb048646adaa43d8", + "sha256:fe882fd348d8429debbdac4518d6a42888a7f4ad613dc596ce94788169caeb08" ], "index": "pypi", - "version": "==3.5.54" + "version": "==3.5.55" }, "requests": { "extras": [ "security" ], "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", + "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" ], "index": "pypi", - "version": "==2.24.0" + "version": "==2.25.0" }, "requests-cache": { "hashes": [ @@ -1096,11 +1113,11 @@ }, "socialscan": { "hashes": [ - "sha256:688ef0ae170f3270f541c0fdfaa859bad1fe56955c692fdd3b312deed8a16362", - "sha256:6db737865f08f5a6745fb8ccd001ef13856b19b887da1c8dcd480544a3d47e92" + "sha256:3d0ca2b27d53fa4552312e07f60d3a3f513f7791a5f2bce16d3e0e3f295cd037", + "sha256:871cbc50f577b29f5f55d9c3ec5798d3abef31663f7cbe4d5c47bd5c380f6bae" ], "index": "pypi", - "version": "==1.3.0" + "version": "==1.4.1" }, "socketio-client": { "hashes": [ @@ -1144,26 +1161,58 @@ }, "tornado": { "hashes": [ - "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc", - "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52", - "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6", - "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d", - "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b", - "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673", - "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9", - "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a", - "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740" + "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", + "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", + "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", + "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", + "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", + "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", + "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", + "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", + "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", + "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", + "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", + "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", + "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", + "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", + "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", + "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", + "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", + "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", + "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", + "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", + "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", + "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", + "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", + "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", + "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", + "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", + "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", + "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", + "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", + "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", + "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", + "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", + "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", + "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", + "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", + "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", + "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", + "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", + "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", + "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", + "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" ], "markers": "python_version >= '3.5'", - "version": "==6.0.4" + "version": "==6.1" }, "tqdm": { "hashes": [ - "sha256:2dd75fdb764f673b8187643496fcfbeac38348015b665878e582b152f3391cdb", - "sha256:93b7a6a9129fce904f6df4cf3ae7ff431d779be681a95c3344c26f3e6c09abfa" + "sha256:18d6a615aedd09ec8456d9524489dab330af4bd5c2a14a76eb3f9a0e14471afe", + "sha256:80d9d5165d678dbd027dd102dfb99f71bf05f333b61fb761dbba13b4ab719ead" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.50.0" + "version": "==4.52.0" }, "trustar": { "hashes": [ @@ -1210,11 +1259,11 @@ }, "urllib3": { "hashes": [ - "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", - "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.11" + "version": "==1.26.2" }, "uwhois": { "editable": true, @@ -1300,59 +1349,63 @@ }, "yarl": { "hashes": [ - "sha256:03b7a44384ad60be1b7be93c2a24dc74895f8d767ea0bce15b2f6fc7695a3843", - "sha256:076157404db9db4bb3fa9db22db319bbb36d075eeab19ba018ce20ae0cacf037", - "sha256:1c05ae3d5ea4287470046a2c2754f0a4c171b84ea72c8a691f776eb1753dfb91", - "sha256:2467baf8233f7c64048df37e11879c553943ffe7f373e689711ec2807ea13805", - "sha256:2bb2e21cf062dfbe985c3cd4618bae9f25271efcad9e7be1277861247eee9839", - "sha256:311effab3b3828ab34f0e661bb57ff422f67d5c33056298bda4c12195251f8dd", - "sha256:3526cb5905907f0e42bee7ef57ae4a5f02bc27dcac27859269e2bba0caa4c2b6", - "sha256:39b1e586f34b1d2512c9b39aa3cf24c870c972d525e36edc9ee19065db4737bb", - "sha256:4bed5cd7c8e69551eb19df15295ba90e62b9a6a1149c76eb4a9bab194402a156", - "sha256:51c6d3cf7a1f1fbe134bb92f33b7affd94d6de24cd64b466eb12de52120fb8c6", - "sha256:59f78b5da34ddcffb663b772f7619e296518712e022e57fc5d9f921818e2ab7c", - "sha256:6f29115b0c330da25a04f48612d75333bca04521181a666ca0b8761005a99150", - "sha256:73d4e1e1ef5e52d526c92f07d16329e1678612c6a81dd8101fdcae11a72de15c", - "sha256:9b48d31f8d881713fd461abfe7acbb4dcfeb47cec3056aa83f2fbcd2244577f7", - "sha256:a1fd575dd058e10ad4c35065e7c3007cc74d142f622b14e168d8a273a2fa8713", - "sha256:b3dd1052afd436ba737e61f5d3bed1f43a7f9a33fc58fbe4226eb919a7006019", - "sha256:b99c25ed5c355b35d1e6dae87ac7297a4844a57dc5766b173b88b6163a36eb0d", - "sha256:c056e86bff5a0b566e0d9fab4f67e83b12ae9cbcd250d334cbe2005bbe8c96f2", - "sha256:c45b49b59a5724869899798e1bbd447ac486215269511d3b76b4c235a1b766b6", - "sha256:cd623170c729a865037828e3f99f8ebdb22a467177a539680dfc5670b74c84e2", - "sha256:d25d3311794e6c71b608d7c47651c8f65eea5ab15358a27f29330b3475e8f8e5", - "sha256:d695439c201ed340745250f9eb4dfe8d32bf1e680c16477107b8f3ce4bff4fdb", - "sha256:d77f6c9133d2aabb290a7846aaa74ec14d7b5ab35b01591fac5a70c4a8c959a2", - "sha256:d894a2442d2cd20a3b0b0dce5a353d316c57d25a2b445e03f7eac90eee27b8af", - "sha256:db643ce2b58a4bd11a82348225c53c76ecdd82bb37cf4c085e6df1b676f4038c", - "sha256:e3a0c43a26dfed955b2a06fdc4d51d2c51bc2200aff8ce8faf14e676ea8c8862", - "sha256:e77bf79ad1ccae672eab22453838382fe9029fc27c8029e84913855512a587d8", - "sha256:f2f0174cb15435957d3b751093f89aede77df59a499ab7516bbb633b77ead13a", - "sha256:f3031c78edf10315abe232254e6a36b65afe65fded41ee54ed7976d0b2cdf0da", - "sha256:f4c007156732866aa4507d619fe6f8f2748caabed4f66b276ccd97c82572620c", - "sha256:f4f27ff3dd80bc7c402def211a47291ea123d59a23f59fe18fc0e81e3e71f385", - "sha256:f57744fc61e118b5d114ae8077d8eb9df4d2d2c11e2af194e21f0c11ed9dcf6c", - "sha256:f835015a825980b65356e9520979a1564c56efea7da7d4b68a14d4a07a3a7336" + "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", + "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", + "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", + "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", + "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", + "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", + "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", + "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", + "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", + "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", + "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", + "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", + "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", + "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", + "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", + "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", + "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", + "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", + "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", + "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", + "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", + "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", + "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", + "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", + "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", + "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", + "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", + "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", + "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", + "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", + "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", + "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", + "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", + "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", + "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", + "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", + "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" ], "markers": "python_version >= '3.6'", - "version": "==1.6.2" + "version": "==1.6.3" } }, "develop": { "attrs": { "hashes": [ - "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", - "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" + "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", + "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.2.0" + "version": "==20.3.0" }, "certifi": { "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", + "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" ], - "version": "==2020.6.20" + "version": "==2020.11.8" }, "chardet": { "hashes": [ @@ -1510,11 +1563,11 @@ "security" ], "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", + "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" ], "index": "pypi", - "version": "==2.24.0" + "version": "==2.25.0" }, "six": { "hashes": [ @@ -1526,18 +1579,19 @@ }, "toml": { "hashes": [ - "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", - "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "version": "==0.10.1" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" }, "urllib3": { "hashes": [ - "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2", - "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.25.11" + "version": "==1.26.2" } } } From 88ed6a8b19d267c34bfc4ecd1b8ecf515a1244d3 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 18 Nov 2020 11:53:57 +0100 Subject: [PATCH 071/476] fix: [pipenv] Removed duplicated dnsdb2 entry that I missed while merging conflict --- Pipfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Pipfile b/Pipfile index e77ae22..0fb76c7 100644 --- a/Pipfile +++ b/Pipfile @@ -62,7 +62,6 @@ assemblyline_client = "*" vt-graph-api = "*" trustar = "*" markdownify = "==0.5.3" -dnsdb2 = "*" socialscan = "*" dnsdb2 = "*" From 6e93622174225051afb444f98dfdfd53f6bab28f Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 18 Nov 2020 12:03:21 +0100 Subject: [PATCH 072/476] chg: [pipenv] Updated lock Pipfile again --- Pipfile.lock | 162 +++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index cde6dac..6a66e91 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1500257feb23545cff1594b4e16711ddb190a202858fcb95b469aa951a4b6b8c" + "sha256": "439defa3328b70c49d0cd4a6e0a50d9931a66426769b7dfdf2059f66f208e3f8" }, "pipfile-spec": 6, "requires": { @@ -387,43 +387,43 @@ }, "lxml": { "hashes": [ - "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", - "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", - "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", - "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", + "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", + "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", + "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", - "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", + "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", + "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", + "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", + "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", + "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", + "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", + "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", + "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", - "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", - "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", - "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", - "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", - "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", - "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f", - "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", - "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", - "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", - "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", - "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", - "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", - "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", - "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", - "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", - "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", - "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", + "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", - "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", - "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", - "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", - "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", - "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", + "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", + "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", + "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", + "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", + "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", + "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", + "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", + "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", + "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", + "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", + "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", + "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", + "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", + "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", - "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", - "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311" + "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", + "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" ], "index": "pypi", "version": "==4.6.1" @@ -641,61 +641,61 @@ }, "pillow": { "hashes": [ - "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", - "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", - "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", - "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", - "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", - "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", - "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", - "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", - "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", - "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", - "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", + "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", + "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", + "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", + "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", + "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", + "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", + "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792" + "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", + "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", + "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", + "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", + "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", + "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", + "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", + "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", + "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", + "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", + "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", + "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", + "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", + "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38" ], "index": "pypi", "version": "==8.0.1" From 451531326d18a4b092a15778598529ad77f91043 Mon Sep 17 00:00:00 2001 From: milkmix Date: Fri, 20 Nov 2020 16:29:08 +0100 Subject: [PATCH 073/476] initial work on Defender for Endpoint export module --- misp_modules/modules/export_mod/__init__.py | 2 +- .../export_mod/defender_endpoint_export.py | 99 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100755 misp_modules/modules/export_mod/defender_endpoint_export.py diff --git a/misp_modules/modules/export_mod/__init__.py b/misp_modules/modules/export_mod/__init__.py index 1b0e1d0..79605e2 100644 --- a/misp_modules/modules/export_mod/__init__.py +++ b/misp_modules/modules/export_mod/__init__.py @@ -1,2 +1,2 @@ __all__ = ['cef_export', 'mass_eql_export', 'liteexport', 'goamlexport', 'threat_connect_export', 'pdfexport', - 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph'] + 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint'] diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py new file mode 100755 index 0000000..a1426db --- /dev/null +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -0,0 +1,99 @@ +""" +Export module for coverting MISP events into Defender for Endpoint KQL queries. +Config['Period'] : allows to define period over witch to look for IOC from now (15m, 1d, 2w, 30d, ...) +""" + +import base64 +import json + +misperrors = {"error": "Error"} + +types_to_use = ['sha1', 'md5', 'domain', 'ip'] + +userConfig = { + +} + +moduleconfig = ["Period"] +inputSource = ['event'] + +outputFileExtension = 'kql' +responseType = 'application/txt' + +moduleinfo = {'version': '1.0', 'author': 'Julien Bachmann, Hacknowledge', + 'description': 'Defender for Endpoint KQL hunting query export module', + 'module-type': ['export']} + +def handle_sha1(value, period): + query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) + where SHA1 == {value} or InitiatingProcessSHA1 == {value}""" + return query.replace('\n', ' ') + +def handle_md5(value, period): + query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) + where MD5 == {value} or InitiatingProcessMD5 == {value}""" + return query.replace('\n', ' ') + +def handle_domain(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteUrl contains {value}""" + return query.replace('\n', ' ') + +def handle_ip(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteIP == {value}""" + return query.replace('\n', ' ') + + +handlers = { + 'sha1': handle_sha1, + 'md5': handle_md5, + 'domain': handle_domain, + 'ip': handle_ip +} + + +def handler(q=False): + if q is False: + return False + r = {'results': []} + request = json.loads(q) + config = request.get("config", {"Period": ""}) + output = '' + + for event in request["data"]: + for attribute in event["Attribute"]: + if attribute['type'] in types_to_use: + output = output + handlers[attribute['type']](attribute['value'], config['Period']) + '\n' + r = {"response": [], "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8')} + return r + + +def introspection(): + modulesetup = {} + try: + responseType + modulesetup['responseType'] = responseType + except NameError: + pass + try: + userConfig + modulesetup['userConfig'] = userConfig + except NameError: + pass + try: + outputFileExtension + modulesetup['outputFileExtension'] = outputFileExtension + except NameError: + pass + try: + inputSource + modulesetup['inputSource'] = inputSource + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 71d2aeaacd9b7b3f2413fb73862a53ce2e61501b Mon Sep 17 00:00:00 2001 From: milkmix Date: Fri, 20 Nov 2020 16:31:48 +0100 Subject: [PATCH 074/476] typo in python src name --- misp_modules/modules/export_mod/__init__.py | 2 +- misp_modules/modules/export_mod/defender_endpoint_export.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/export_mod/__init__.py b/misp_modules/modules/export_mod/__init__.py index 79605e2..5b69d02 100644 --- a/misp_modules/modules/export_mod/__init__.py +++ b/misp_modules/modules/export_mod/__init__.py @@ -1,2 +1,2 @@ __all__ = ['cef_export', 'mass_eql_export', 'liteexport', 'goamlexport', 'threat_connect_export', 'pdfexport', - 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint'] + 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint_export'] diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py index a1426db..35b6564 100755 --- a/misp_modules/modules/export_mod/defender_endpoint_export.py +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -1,6 +1,6 @@ """ Export module for coverting MISP events into Defender for Endpoint KQL queries. -Config['Period'] : allows to define period over witch to look for IOC from now (15m, 1d, 2w, 30d, ...) +Config['Period'] : allows to define period over witch to look for IOC from now """ import base64 From 30d9ae6032d833962428b1a4aa3e03e2219a7286 Mon Sep 17 00:00:00 2001 From: milkmix Date: Fri, 20 Nov 2020 18:56:28 +0100 Subject: [PATCH 075/476] added URL support --- .../modules/export_mod/defender_endpoint_export.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py index 35b6564..a4a0ba8 100755 --- a/misp_modules/modules/export_mod/defender_endpoint_export.py +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -8,7 +8,7 @@ import json misperrors = {"error": "Error"} -types_to_use = ['sha1', 'md5', 'domain', 'ip'] +types_to_use = ['sha1', 'md5', 'domain', 'ip', 'url'] userConfig = { @@ -44,12 +44,17 @@ def handle_ip(value, period): where RemoteIP == {value}""" return query.replace('\n', ' ') +def handle_url(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteUrl startswith {value}""" + return query.replace('\n', ' ') handlers = { 'sha1': handle_sha1, 'md5': handle_md5, 'domain': handle_domain, - 'ip': handle_ip + 'ip': handle_ip, + 'url': handle_url } From 47980ef2ebc191d537d89c4bb4671d774028ba19 Mon Sep 17 00:00:00 2001 From: milkmix Date: Sat, 21 Nov 2020 08:52:18 +0100 Subject: [PATCH 076/476] added missing quotes --- .../modules/export_mod/defender_endpoint_export.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py index a4a0ba8..a70bbb0 100755 --- a/misp_modules/modules/export_mod/defender_endpoint_export.py +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -26,27 +26,27 @@ moduleinfo = {'version': '1.0', 'author': 'Julien Bachmann, Hacknowledge', def handle_sha1(value, period): query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) - where SHA1 == {value} or InitiatingProcessSHA1 == {value}""" + where SHA1 == '{value}' or InitiatingProcessSHA1 == '{value}'""" return query.replace('\n', ' ') def handle_md5(value, period): query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) - where MD5 == {value} or InitiatingProcessMD5 == {value}""" + where MD5 == '{value}' or InitiatingProcessMD5 == '{value}'""" return query.replace('\n', ' ') def handle_domain(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) - where RemoteUrl contains {value}""" + where RemoteUrl contains '{value}'""" return query.replace('\n', ' ') def handle_ip(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) - where RemoteIP == {value}""" + where RemoteIP == '{value}'""" return query.replace('\n', ' ') def handle_url(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) - where RemoteUrl startswith {value}""" + where RemoteUrl startswith '{value}'""" return query.replace('\n', ' ') handlers = { From 6b9d30c6cea68a35ebfc366d32def92ef38bc9ae Mon Sep 17 00:00:00 2001 From: milkmix Date: Mon, 23 Nov 2020 15:09:31 +0100 Subject: [PATCH 077/476] added documentation --- documentation/logos/defender_endpoing.png | Bin 0 -> 663462 bytes .../export_mod/defender_endpoint_export.json | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 documentation/logos/defender_endpoing.png create mode 100644 documentation/website/export_mod/defender_endpoint_export.json diff --git a/documentation/logos/defender_endpoing.png b/documentation/logos/defender_endpoing.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7aced968ec5d429cd20a469d8bd6684f98083 GIT binary patch literal 663462 zcmeEP1$-1o7oWJh8^lO(m*Q^4ic3pzE5+$YDPE*NTci{(ltL*|pcE)A*5XcZNkS4x zAV!S1=bH&E++FT=Z{_ZG@80}=$?nd)dGqE!b8p{{yjk&4&(3z%-qr{qyRKb2^g+lt z1RAAK}_%FHP<#!s2*-?e>v z|EbfbjGgfL7=*rz*w%MkzrIQCE%TzY+jU#M@W*ab`nXy8_i6X-Lf5q+)dQ>?KU^O0 zOSoI_b50#Qn)+PbvD{?Us)gUV^{#2V()x+Ti-4W07VlcV@_NzpIlCr4I-M7PtMsqO ztr8AoZ996~;;g0ZhAs_yH(F@BuU#dlXN#{~y!`w{?KX?7gQp@#%cG+MW|RaOq5SzR zTGR+UYw<5K`trVwB|6(<>)E=#-;_Bdx7+-Q(ZVH0XJ@Ycpqu4FSJdXKRqcL5Z8{k( z+_ovCFWO;>hTj-9G7f!I3k?rl5Pu&n+?Kz2juHC!#{f5@9cz)l%b4XI(D>%)!0iDm zJEB2#k?YuQ7n`CdwNTxz1IKnjhyO-r!yIjnAWK_RxA*d;)sX2NH2i8%(3fb*X5`u_ zb6|_tH4Zr@RL4kdKGNbuaMO;9KDMki&0^rd+Lfw?b@iy>+IWQVh%IeupP#+itNx;f z4$rb~BD7W1}~~VbWvy1{AcHHW_RE1d;15gB_p54ukKv@w@q2G z-~GUgT}Pf6RNXbMxAU}B9kzUzReyKjigrI#yHw>~+347qnnfn9Vj7{tpS3cYv$odW zp`%Q4yM;Oqnt3)h524IcQ_el8YH6}?{Nm@gXO*S5F6q3Z3R*a}>krcq`m{rE?S9vf zw!UJCP=_6hsvmCalYP#!=2>&!b7oJ^*%S|Nyrf<5#q;eP+gXoZ=sSIQwF6(btGevg zVZZ9b>pW=V*YIrb@ypgtwXc1?|3CIEr#cjlu-tyG>gh#RrfsiUx{L^jSZ*|O<)ENd zmL8jz<_DbXV(R>Du>ZB?uDt`ht!>n$UZ0iy{QGzD%WOH_xal{abUL}V`BhZ^>*8gn zJJ0uU-b*^|w7D~SX1y(|-FIxgGyRx%%kLWhl5pqu@eUEITeZJZ z_iUo4MT3i<*R6f|Lc2ddsA;us)Qvv_57_>G+57N-116_d99h5KH-oy=40`0e z+NF-;oaOB=HVJlK(Y}7@i8aPu|NOPzJ?DF!?oI9!lvH!y)`nfYgVtS(7(MZbMbjT^ z`q#L+^u@Lp7hW`Y;qxLO^JD96Bil^-HNS6c)jroh`_Sv9(dr@X4*qhy&mXQ>+gGy_ZXiy;g7_bC!M0!SL(U( z&cJ&&k~$}DOf<=!Wox(0ZSj@m5HOZlBeI z4Zru_zwM(}eSP|l+t+;WH~Yu!ozk!Muk#0&tS}#Zq5Fki?SJjPYj~R^H)Z@rdNxt=JQ*_?kDPv`DEh$4I4KM`n}8Vy?^ig>P+K9se88lcBbR0 z!9|Pg+g|xF^pnue<5q{6ZA<7I-ZyHG^&a;gEt};Ws=a^WZl7OHb(rUuA zynFNRS8mo9^0dK(pvAVLzp{o_8sG zLsFe_gKj(Ce$pWBxXX=d7bk4%yY+tOaUSDN%vhYY{M!}XzP?d=W2@R*eJ)2`J@ewj znK{#jKL6@o&bF;bx1LYk8~I0CKX2YMWZ6DlV#+?gS+du35@@{LJpV!x& z7;|8LulBtbjr%JhsLrT5YX=^DeE9F(v-anWNcU)!+iLpHajoK7G>NVsJ$Ts7CTIV? z`uB}q7p80wf}pa|WnY!uMSB)jF&byGVo}>g9~&3te>FGYzg4Z9MUKfm5}w-j zyB#Omy0u;X^}(-So;w&Y{%Xpag8_L7o5I$HO|W13(fq_mcPvK4kNEb&eB02a-z*)t zto5p?%LjSit+%n!th-O!&xq+z*kMD5=&j@G^=kS@tq&VjZ?(VnXDuR{oNRcq_2t@Q z2j6@+XxpH!pLg?ZTD$t8#*;t)H>Nl>>zmkZu{LpYJT}$2I&|vnU&793FWuw5ueNi| zW*gdcU*7YBA2ZrIR^RLXU6o9iSyfh9&pz*Weq3OkyN&NIf71Sw>XmwCcB$Uus~=L< zo^CWd_)>%2HD8`s61s2A>F##jqqa8N?!M)J{*&srY<8yJ;vd$onbvN9K#z6D$0d)8 zAN#)>2gWQtQhI6fw}02EwBF*{#G`8tm<_IFeZ1XoiT#FDeO%q*$ha{B$NqO~#r38e ze&1f>R_e{8*CW?7`6>P9vQ+2u&d+~1zI$1>fwlYw#h*FwS<@perp=DDj&n1sv21|( zffoO)JYId$!(P9q4%~QX{+W=kdQ4pO>ACA)pZm*b;wzi})-RXNd-e2j>d;<;>I{zg zYeeC)Z9c8sR;)ba8tJjoZNZbOPrrQW^Uaj&|80Ky`!}+`QU4wf$37fW)V1hnUh6|E_9x|U zD4I0%V9!a@Qm>fYGbynMvOoU##Dj-^_gePrv-(kuSDo#zRQ|VgTl%b8c8%@&fB)0v z*r2H$X1_?vvx>>9WY;X>f8WhH@Z92l<^TDO^Q-e&yDgbpI&JN{rRd|4AD`@Xv(?>4 z$E>adWd1WV^GM`Nmx2Eb-10}WVUv<)CbuYEcfZ$_Q$L;Ba_Gb- z6Hlalb>^=*WAl=Hwl@ij%04suwR_p4hufRBj5?F`)s(zTc{wreQS+yVmW16n6+SC8 z?cnKNr-x;?No^b6KI)r?tv@b(`Xv47g3r#*+L3klY3DrirHgNuuFYBP(B5qI=G8Zr z*)4mu{exCbo5r@DUXoP2r~U2Gw?npjl=XThhdjG zA#2yWT|2bx_oWf4RPFgAqp~tg3PBD5W4R}IC`SN5QPL3r6eXaTDv8r-RGqak*B&Mn zG?p#2cv)2=*=KFv>rBy_e)WV=!;fg-@Z;9LUX%15lu-u~*8dXr`ZKDcTl;vTq4gc8 z$MS23pJLI)XZVBrZP0el(OOSY>=~6EO;PyFAgbOYl zT83=qN63*%3KZEMLDfPXFeqB;nzbkdS(sL|9;hB9G$C1>WBAlJp@ON4u{TOi*v zl=UF)+$-j+2!BNyUNMW#r0~kGi_97arJB2iF6zarOpX71MmKUqpB+wQ6tY0(jg((p ziX0a5`^hmDNJF6UoKd7M!=ZJc_3`o>0srZ|r^xma*?K7hgrwh@98gZydP{8i^~~r>-O6tS z{HGC6p3e%x)9?sU#uZz;q7)C2D)tZo>&(bXBcS*=n58k6{FcB1fAo<*DiA=d=E)mt zR2u%NP`4VrY6KKniBoe+${!z150s5odQS%k$#7~^rSg1K4;0$Gr-afND3riH%bu2( z73_l7x~K?5uaH>vKdRC#1Q1IVKN*V8#qs{-w^T2= zH#LBMFow#=;i^$ksNT};=NIopQ~cP?UmU^+2nFVofkzKPCM6C)U&p(Is=7N@M>&s z-4>f-Z!4>;wtI)H3_1mc62x<9WK2pwMl4sY*ePPEth#alC`yn5 zP?UfIOC*(nLgJviC_x550Z^16pd?D?Gh&K1evOBtwrg?f=kRScJy8T zG@YrIx-xOK4vJ#WkR3yyKvMWr*2)S%s%&!A3Mg)iBjeKZN_=GtRtAP_I=NQ>2PMu4 zwsW;H)%cjC;Gih>1jULff}uE)y?c;1>R-!VE}J4avWc4biD?Ctq`AS!!O}#wF6F~* zauEs--*t0Glbbm!#NvV8-(I3WAHDA^k^)7sN08d3<`g5Zx6_6dYD*I#J8(;pt-G9# zzBrz&k?{tNzmhHHKEd;%R8_cLWq)F$8abeiA9*29JNcf+jkEGx8n)mTF@pNr|o;eLCIVgQvOM?YHSTXPrJt(pQlI7DRP!*R=lf9<{gwVZy+uJAwo<6_I z`-K~_j0CvXNKYYhQN4xQ+C?p1QzldEi{ zsEU$!xF&_m8iKhUidY&S!(9at0DMVn|%1{*~ z@v;>s&m@d&=v4Itn{9l4m#SVR>?R`u zFQk;>MD_K?HVvPq-l(YCYNKwJd`;3rf85{OWS0CW^( zs6bo=1fZi-fCM6xAt0IsD$0b@RNRL@#~nNwnS+n0VIP|KS^axyLgn`Cb4ojh!5Fh< zbDm`3^>?;HHdJ9XVRDUv>H&_Rlc)r0OAb zeeF1s=qR`2^QuOr76m^_E~x$>sj$Ym=-f8g2bRiCprl`vM=6^(kfl8rorBKD59*xuI6E#LTpaf^0c_`Vr5d^<9gMwJE=$~wr5Fn6lzqP z4S3^lL$B@Op)w2Ie66ZXy9RorfwkqgmnhO^6_jFE7VLbaNmcArqhQs^jp_to>pg?u=|p5!$i@XW8$4j4Wo5Cu4^_JF9# z9XXn+wB$R=jK7i)`Gtxpgnl1gK^$ePa4HaqI70FRZf0+nUyB%Hy%0_E8s(FE_Gs0` zG{G99ZJ-tUXQc8EDs|TSDig#Ve?`d#*@KH@`0>*S3CMa^h{i z_Ga^mT%^b!B;Qel!dFwBgvi%9MDPJ&p{lJmA4znSwn5g%WNUOGCRg?mRdVFF-=}Mc zjo_~vIRW+HK@#IA1ZTxTH^s3OuHz)VtJ|WzLwr~@rK$r$lrd5K+EEq)a9Cq*iI* zV}UMD@K+07rt?x%G0_)oLh2`}juM?(=pFKX^h?=>5$Y90cq(p|=Gs9BFU3w`zc3sX z%Ip%xCx~3fN2@d;v{DFCdi9_{7xQ>Lv-?aISjBg~Vgt$2(%s8;64F7)D~9fnAv#`) zG7Q3Q*JL{h$t$H!LgbZ{Mj--|fL}qxK#}|A+Mz+2c?nx&RqJ!9&8=>?C@?K#SwH+y3ik*bW zE!mDjgr9pNdG7LaX^Y7{6<&T7j9jechs;%dI;(R+8O4|Gs;ET>t&&cnbtk%XGP6yS zbVs2otN1lU;uWmWbaSAT5`dh|;ERde;T%C#E$T0P)WhFJ3G zMMoiEDzjT^dYGe|lL9JW&9}o4t>tDTKc7m*SSYVbvIR=@RU=yma<4ZXg{qh`?b5um zB|0;v;z~5O9Y)zJhI}DeD>-pgUpfedtKM}Ks$$AI3`tY=N+R*9I*qc4XsR>Y0Z>la&SHw2)@`t)#zXl+{;NoWXPySpZaN8Ce>-dwtg)%Ia>A z9Yq$1+G}I3JxVHQEE}hI?`3EDG;Vfq6~%Z%dN%luqS)9I|4jVe+{CDGb$5^1ifM-Y z3?0RgTc1VUB{h4@qFz8MFapp~1O`-Z**)G-br`&V^tO40s~D&h;jq+OPS8p8wrPc{ z7<3Zhu+&>l&`I>RX@#p8bQ0mP)LTx_N%Xd9g{v5J65+7aTTb$e_Vl)z$}4u{QC6ou zzrH-7JoSC-=}~@7+XUHMeIH|3cLq6_#%CP?tRc|z9|-Oo6?TPjt+F9?7K5-!lCz5K z-)axJZG&7p2+2qIwb=Ch6dxW^$*cFT8@g8u-MU8E229K^2?j_`h)L-{3Tva=nV{<)oq4Gtqs`60rO1AV-NoYg^hab20^_ui9LQih= zrjx9{k~VV6(d2DR?V@V$1yerR^qbhLaEr~cvQZW8Cw$=a-MXG0UsOntV1(#9NnA#e zYjj#+;N#@N>Jcf0Rj$P5HM{X5zahq&m3=Xzr4w4(*FP} zuvSS+B@n+9habs#bfS_}U9-DawLSJhCCh96PG--nOpS9h@=F|tHE`UoDuWo}Mc+y2 zYzlP%9Mi}Ft?T8flyuSQS7_;fsY=siBUSC>qG)#AevQT)Or#!JU&a2Vq_>?UZ*hpq zb5Q1=N=D1iviCyF)LBUH7=0iC{dy;pRY!qN!V0d6#Oi7ie1tk$(7~-D1DTkeVHs#N zk6%2+N}bL^(H^{?iH75jQ&d95RJ=kbsfY=y7{yNVU}^vgc2#}kgfiwU&ZeMwr&5$9 z@ruj&Iux0ikPm5gLGcSo?43k%b2n@{NXU0l=vjIZyB1_YZ8QJPSN4Z^^YP(N{aECb z7OCVq2@||a|4l)Q&IqqH=*m4Fp7YLqLCQk>{DiIEXvHG{?nd~!6Gs$i%cgy13iPSUB0jn>YGS9J>H%S_D; z$f@d-Vu}}iC;6nV{VrL+_TQ7AJhR|1EH2BBx~J13fh#K>Doo`wgsbQ~$>6#Uhh-aL z?n(L4)E|3!$R=~XSEWUEhP~#@Q&~o`UPU2j?RBb9uG){H?<9&fiOrB#{dmESA_?nf zIxRBh5chQ=M370%oaE#gbudBh`S&5-{pBJ=_#nAXq6rLDX_5ZBU+^yO`)=}@j?DAO zhTb*p|B-zbUvC~SXlLR=KJ&*+xA4?(ohz|#@D)-Fv@XG*iCX#pQTsp|+-tyZx$WdHU z4U+k~iTom{mh7TvyqAhsP}cCuCij%lsZ;QXhVu4^;#qBH$5d*h4j(blNJf(=1M5tr z{FuYjFM^bjagO8KL7c3ZVZ}QHZ*mq)%Ndz#qh*2UiW}3|agA(xw_oH3yDB-#AIB+6 z%XF`(MYwhlQclv`5V_)-ZFna4j34Aa=@k>j_AIGRvhgF&X^H?UzU#@+oO}bH4&rE8 z5z?@D`A=WG&xW1V%(p^3^H;19Plj5^F83=`eAg?U-Kvf}vRZ^s2O(u8&y&|8WK+4+ zgXB7ivR`4U!pthyEew1+2zE75p+6{k9SENh=u?46qXlhP!%O zK`AZ5w}TJ?#x;?j@wHzl|Cvr`f?Ukw$yG{0lAT1EHc?dTx2FU$wgWZ(CPW8Oro9S_ zHO$?~0g7bh&vq6@f^-lsTN6~@M}7fyy|pnF$`rfjfC>W3 zL`b%ikUAvK4X&^lq|O@o^{CZ6EKo}&uC1~Pcn;aV1@ZZ8`5EY9JQV!+RiO;T2!*_O6<#M#<3S8>ZlcuEmU$doq*&Wx^vtj#D3M7S1G_BykjA5o!zhtmTaREU&N zgy`L2se`5LoDM~=%*&$H+$Tt=c{XJoMA_?3%C8v;OG#@IsuIc?LRo|5;hACwB_pB~ zA9b(lc90{V`p7MoQkTEj==7qK5K!+-_LnyfaGbJ^@(PcL4rIBOglaSkJZG+M2XVDA zdG=vdyML*?QoicN>xOE8-n(AxIr=zz5cN!5mA!h>@F=b4Qu$?&6uq+RCcHjmq{8$+ zp;Oioadft_u^eT5r4XlAorD068$Ko_r^H_od}SSl(3sDW8*Wj|R{pF^dyoVb9Rw+R z{V8QEkx0FH-B5TZ&Z!b$ZemoyNh@j4h*$Enu_O=a08?8i9|$FLF^1kj2u6CRNl2wg zuwM|7lv`9laLD5Ul()f zUP3`LsU0<#S(@98!(RCD(p0y~X+zt5a{1W7`q~aPCLPG_8wLhr($zBbrlaPx4aw}uN zsDp|7WI8~ z0fAl*ra|)xg8+0AVQ|!IF3?Hzx_O1E9CQ+4aMWuq&`I>Vd4;JQbP{23)N?Lp%G$wq zu%5RuR1Xl)76S0v(H7EB4j`cC2!Jxt^9F|M0Rq}W0F;TgkcM&q0X;_ml!=}RMpK)j54vOkhX5!O@wJJd5{*2N zuzqLQ>(2yb%7K|bKCKm>p;(JUR>&d|1VEWcq@mb|Iq68!w;Qjf&t#KF%e2|pkyK?v za3rN=Tywl!@-JSF7Y_X@#D{4za6JwP5Ll2Kh`1swO6%rvrGzfq)(P2|$O_Pcu5usdvTX(E59 zrck8-A4UW~nJ_}cOrVbUSY|H#DL$%hi}nujVaI{YY`O*US%piFqdSDqP^34aVVs!YgBe_;n# z^hGOYWTeIni?ZtAm91#nF;0V_%Gj}r6GFMj7I-Eq2d%`1Tb+x^la1zm56Xl$gs=jZ zKZMNZG$|`1)Xf~V^0!8vLab5eDz?bnl;5XWuruMKM{W#t?uEeHF**; zi_oLwLbUl>20HRswWR~fgnyH;+K0ivIK$+?<=jy=NNMu3g^e8Q(5}Clf!C#EydyQk zTTPD+_e1T1Y~IBQdE;eohR7dLD0Iq1$TAI;7bp{nwfx#kY3PgNy7^?$1XM-%K(j8} z<0`NwgS)Hn;I1*x!QBdsAwpvafHKh-wA>iy<6qYgm($Ry3+X5=uY?;DJ;=2ITQB5K zSr}5s4t?It88!5^QkJYV&eKkF3-pv0Xn>KROmy7n^G?1(E6%0rSPE$s{~MmdCVz^d zaA{S=D0tQ)0^l4;i(o4&Dwo*#5C8!^Kme499yB6U0T2)a0-#KE+zKw%@GY;6CP>UO z-0>%E;7iJYF%xYet)iUTUKT1+#1kF=RWM?!^!o39fu~|~L{o{>TyC2TMNpLAo?308pS(Is96p7Wm zaFm{>o7pMs>x34^65WVJE0ew@f-(`HMMpGp*ha_ZJG=mmF7&8I|5l~TtBEu&io{}W zIKm$9brzhgU?5v(;J+;xl!*W>5bA0XOULG?8_HL5Qh9dt_o8lfe&wo2bSXG-LrE8Y zz5SXl8FdJ@p|vb&GehD#1VEX*gM#;s>Mf}ZtnDo5e+&%S1xuEqA|aJOHL4OV24fB; z(x(42(yuoy0VJx00LqbCn)MKR$MM9Ja8K4zfk&qhFDH4)Sr$|UTC=!B#FaeZ_ zFgTWTVfyx7cZGf+c6b9v0i|JPrD;W?NhLyRm-99Kg1YWI;%Grw+rxbnEdeC5LI9Kr zE4Y}6`_;1BK}Y4eB$6%}X=@w3CKZXMl?VZFSbckh4@g&uWocO%I{h?PWjaZi*wlGD zEdeC5LI9KrE4Y}6_YU?MK}VI5UyAlKc!uBBPqUvpno=a>2dt^j8AVLD_N5>AwVp>m zHgkKje-%ZZ@XQYZ7=Y!6pVHjdVsmRZ-xPaSY2w?+yu~53-sW3xevYoh3hRNLP99}x zZ3C^)KO^a( zlnB9yxI%EXQN1*ZjMdmNOg+c^FUZZ$(JX}yb4cTc0F0S%!%eMROm9H^b%6Z7c}mMG zcX3r@uEhniv)eeUR3y}xh&DfIC~%(7qE{q@j!BVx+1hy?C=v=$;jdts2#={8$Jq2D z_rPzXXcw4NaWO;prv=L8Q+xh@t?m7lt4vR}GeU z9SdCubu|xrI6bfd9Sx)r1QwPp-~$9`6h7#wnfGKwcB>C}yf{Zk?v2l5h{msAx-j-& zJlYYanS+A2<7uRi>pI94Uxw``OD&GB$`$_hfoa5*kTGc!D>I{%tVN-2%J@T^a0q}h z5e`dQPW$e@?)mY)gg@zs%I>&2LX{NF05fh5GM~C*&%FxrtF)?&44vl?0F=C<35N z1cj5CnK}b0gv+aWRgj$p{UG^AJLAytaPB?{?@tLpA@~$^u_zHzZ*@Lvnr?W8ZpYI* zcJ;vvN}j`l5(25#0w@!$K`mbp)7&wk9^2Rf{m_$sNi0zWWa%l}5dB3U!YjCRJ|;rR zJshu*-@>r8mC!Pcj}V$+^&K{B>*qC*+(XbF0-#K^hjoRL%;r4F!n)x7U_}LrHxcT5 z_N+LYg65r4Zw-Z~tqDrZ7RO;SWWi0r68faS2(?TFrj0$6L{@X3AiOG6l;OcNJXYgs z!6@6p)34C-vuTWU%_>`+JU^~-XGTIG&?o|+Of(8FJLa|4MBjLvT-cB)m$Q{Iil3w2 z&R5&{Pf(#+YKo~;{^^gV2clpXb4Es~xh2SF8U6BLib>|e5EE;2V=eDGph}0UECQfR zWYG}Gy*h)lMAWuH*68mMericwYjqR~PbpH1R%jyP$%xJY2~{2$OjdWjK0YI4?;k^b z2UB_Bs(S=LndrU^luEGnQrg%VeVWM<|y9#pkd^W4+S{1W88M7_@$B5%fmDrUA8CYs%)L<)ky2?0ddCd@|=Gv8Ld2*hCXlRgij0ekWEtSp7@}=7MHIU z?OUSkS97blIa!;q%EYDspw$clpiDG_tJb)V_&s6cuG_E2vn?QG?uBXR{2_HD^P@W30QbGWfiIiGPO^44QI+qaP$9>86;~URXNhyFs6THkCm}qD6#-BtVr?0L1Ct<%!*67?u-Rj`|e z;UO_uV3zPzuoreKulo3K9{eGzxDWtkBCht(nlzssPW*n$^^EC47g)o?;`-ew0ZoMF z3;e{704Njjw~@vr%qb`}4*D)CDuv}#GZD@*|hzJ2tCL(GK5CssBG6JAXq}+NSyO0R1 zHk%47{dofl8ihB6zyJ^c1l}Tm{a{TiTxAB!PM}8s0)T)Z2!M?u2#ml45C8-~nLr-^ z1ONd+5CCN&2#ml45C8-~nLr-^1ONd+5CCN&2#ml45C8-~nLr-^1ONd+5CCN&2#ml4 z5C8-~nLr-^1ONd+5CCN&2#ml45C8-~nLr-^1ONd+5CCN&2#ml45C8-~nLr-^1ONd+ z5CCN&2#ml45C8-~nLr-^1ONd+5HJ;l3owy90U&#+wG6Pi$tDlb z>MsJIO!T*HX=|2|S7N!~bjqR)SJOYkzHMx2i5U`2j8WznEuFtz(%F3p11TiyF#_Nm zNsk*>v1&wt^#1kb9~WYByC|j!`TSw1?f%~ed3|haVNxt4U*IKf1VEXHyL|+a?p$*IlS9FB0v3t1$F04NiQH5eOl6Ece&E3Jr%qiZe1o+3~Z3z1(a~vvnl{ zl&d)eK$&O`Tb*#u%r7x_Ssa-v0&7HN{rlCj+p%}B&j^(SkRV9}K$%Fg*^~=C`e4Gk z9k*V8t~^zAvDr61uiU7fx78ETNd^LOLI9KrC)mW5={z1_ZO3zfwUVP5n(%=m8c@p) z`8b#{RpRI{h@4kzN&nvz19~^1LdQRi#6`bPxb#BAvFXAZcVup>K`V z(GT(O+P*@f8WF7mtkC`;KFHC^L=9?Yk}cQL(d47a%!EoP>UvvVy!p9*OC?DVB@qNb znMkCeWW~G?lhcq)^>S4rOFO%w87*C8SqgfeS5%7Xu8l#@GuSUPspDmN`PL-==7I_Y z%(Q|4C=;!~EKDKOjwOAw?sEE`YM1tYGyE6`1lwL^kTR z^Cf4l?SgEM?CkF~%+ua9gEJGzsBr{9nP?nhb_Lu^$PfAY-_&`BAC_;rA%dYIkk z*W0g$zRWBRQ9ma$Wdk1zbZLS=Goh9#((_7CW8pn@l;JAHI9lL!E zeXSlSC4xw;AOOll0GK0E3M!@Kl(@diE^*DsFLBJsFLg}LE_P4MD)GWf!uxr8k$+@r zA^FbWZD}xxYmWDU$Kp>KJ~K2iX@%%oTpo%_D?+8E2$|r?o*-v))Vz`v^2JlgLWBp2 z`KZy4&k_646!lAYvNCy5&E5PFmOa|f!6eSb#x%vz(m2D>(&XLeQfXP4v9-BzZs!o& z^XhX3N@WOuGEs&Ki@0BIWegZ~FmWG?EE*v-!d&qz2&(R3!J7ZRd#};-W69`MPKnxi z1Ds6J#@=2Ck7uZzM;T#wasg`a<1>WEYIPP`2U;ILGrCeYoe7{P1>^S^1Sun6WoCqK zeD05eUCdckBO$XGHQ5k@u=T_$A4MFKUW~eIk1Ky{iY*rWV??GVM5VC{q3#wa`|D7Y zkEfG6{1l6BzT`Ki!mf0n77_taCPJdAMP41NSff9N`XWS%;#hXe~( zV)Kyo{BTs+(G)$N9>hthSehB5i*Ltx{&Lx;;4n8M9P$RHb^?v_s^NghLNA z(Ud=v(5qY>eg{#4!Ic&PP$snS=svM&B}=rnrw6L-X~{{LLi~2G^6gWUkj?FLhD)K3 zUlk(DdEqG3)eI|@Ku(qlRc@ae_K5tEKvvd%cRmfRxs---G^iA*vf;`O0Z=CF@X|PS zhhS?orMVO8ScTujPjN{Zsq6lPbZiK?{=a0V=yTM{bezMOsJS|WSPdBungPUx0`F#;qsJG+u z5g8{Mc_6VuIz$MI04Nh-@vOkDhPyesg?~Vr4rENE`l=|DBI2h^4Av+ zwEi~88yR7rju51c04Ng;w;$W7TXn_x_IxUubK;e{@Jd zTuBJrfQNPv0A-?Kobf&#BOeH&905=!%5l+I?4{?qh#^xdenDEpvz;D@S7HDs~fOcvm zy;4A#Xt>R=Com0{0PG0@ukk=P1l=M4Jzcl>L+OBk-XH+VL~oiBDgp@T76DKuy2T$# z2L$v60Z=9yZc4If4T9zou(N=!ta+5_OMn)j$A>Xh*3-E%;-qYW&U8@59OB*~V8dgT z@jE7P!wUgeXTl3UgpZUkes^qwGFDQbWe9dLLl36~Dytf89NE05&ERGOYfQ9>x3aRp zGEs&Ki#U5r<4ij8*Vxa9lmiz<(*Etf8g15_tG`)o%Bb&UfimIQ!Y)>(X>=?iQ;X=5 zMV;0*(2BKuCD`r##pijf^FapbBLK>TXB$>>GE1goLC&Y43jxl;oRCLX2G_KIMpj~- zHT3&v)_EXT86!rDj#aEr z(GeYaoJE(6dRDWeP1jZ;7pvsUf24nakGAmD_i{j)2++dV%sxiPX5U?UWkTGo>pFC* z!hTk1!eQ|r;+xBG-l40F$unJJuP^0;G7+F9U2IHgNBE-B=-1VMSe5>pUjPvqSsWea z$4H|{u>Iz1#VD;mxAdo<4cmR2Ud9m(9Dmlj(0W=RY#r9qhGkQ&t|9El9B$)rAabTB zmoVd45=zbyW*6kt7S6OHY`;mn850eyZ~rST14vXG0Z=AtLq$)B4;IcSE-iCZMfD0h zH*vF74Y#eiG0HBaU*M*SH{bZfpZc<9QP0~Fkw3O!!0wlVDH2k44~Fq3qV(uOb$1Kc zQA7t2i!}JmVF4B$>97V4JL%HDzd%3hF}n@@8~Db-N~o4_1(u z9sy7$^!TWqI-!ZQ7_$kAloJx*n zkK}}e2VMw(GT{Z^`^BeI9(w;O(^@#MVFU^YSR-ImR!08~&zd7- zK&D?kA+KkZOG`st&CuPcfwV}O&!JtmLYr5p#DXQEYO&I$A|Z-)T`&4sFH43a1&fze z)&8O$wUCrH5m+V~Xus(#oLAAY4Nsw8Z$k2_GcG_^2H&)9Rn^=4r%gpd>cpf-)?cCD zwt!i{Cl24vp&~yh6BWSliC+1k`vRu?Or1V#GQH)(#Gh~ap--4M|7ly11URbRC`r|K z#$WW#n&1RN_%0(rdh@fAn)~%{7qoqjkf-5%! zK$&pEO|4wk=EkLFCPo=_#LqK|Q3->ylepPc=vWAr_GN1qrMz^hNGds)B1bC|rE*b` z!}rHiw<@oHe(F0=Wg;Z-MPOkWHGc^jg)f#2`7e&E)SQ6?RbLfNOM*2M!rx7_G<*{` zeB_~&#l$}owX#lLY2i3B@(bo~y}b<1OI)l?VpZ{nc;OHLWg;AwN;x&~wR(gTXje-S z6D60yqx7W-{z~}^6*;P5#dZ8sjwYd>ZqT0>AyoOw_zbUakC+Z*{_tn!0h2qE{p%>> z4{^dG0LnyIJe6|$eTa8|r3o^Tfh(hAo|NCN@1@*&P)@CW>~DiA&Ic1kvgsP_XPWv2 zaHQPQmwtRm zY3!tt)oguh%CA%tgCe;-DS)wM0#`6A;9HaY8!$2g0znV}Wg-ZS%uEh^%xs<1Tunc{ zLrO_o5W-v-3yPB?<=4)OL6OvOH%B!*>9+?*rxl{aZ2Hr@h*eU<0}jVw(H(e^f->O+ zpZb|Us=;iX5N@k3q|!3Az)RV_Y%SbDJFNrX@9GnSA|aK(JtdG91Cm&M6|>@fG%cV8 zBO@RX3;|Fkf@IzfL%1Ihn&CwF9F%6|dM&Ce^p6GtqH(Bq7u0yDbQJwBfH#sUzFA|aO6Z-ag0WK{Ox@^z%LXt_ADm%-M; zgn1vaTrPOvivTDSz6i3+Pda(qAo@dg2+I!JnAcA<$7f{rsHW1Zn@Y(n&5RInI4c%K zLIllP#O&Jbo3kmXptwwBy{LpMpZT|??%}FE1VEW+59@a&of=iC$GZobn}8KhX;R-L z9mJlD>@4s%3yTmjBT!U|B<6q2t6cMnO3|Xz^n=p`f^|JTMzDYaNCiXyl!<^~vSD>% zq%Y$#`-H3#wB=C``6Z2!Xpn7Uq&M#=Nb059a@U`9QvygDsn{=6Ym!4p1k z+M$vOBxn=?P$n9MS2gqY!M2yZ>`WO=kI6@pQC0!HuL4p^wi=%alr(!8&fK8rG<_Y0 zm&*^XJ*9 z{JFqGTtTxo#2Xj4GAx%T1s;8zg|5WrGnPH2x$`ozRhy9z2sDNOC=-oAs~+Q%BmEdZ zcL*nS#!rX?6h1RN>PgI>%HPQpT~=e`VrD@J>c5+LsR;4)@O?M;Is7F94tx**Wx@wN z0rIvBwz*u}%i=N8mE@^|JR7MbBW@QDu-JDsJwSsSB>nam!Kh=A^k8NUL{>yfuO zl-}W_&T4B|1%omXL3@Wy3Lw@A?M6T%=5Khc37T$ zKD}$$BkYV;9hMrUY2;^x!qprcCf=bVQ;QhoF*ZV(*C+b7W+Vgxtswx)L~Bqp7c{Vr z!;yADHbUDXtWW?niowdlArr|_6J3xjTU5I1}GEum}wK5d%FcM|vGmoJV ze(4KBQKt}Vby>5f!!8!el@?j^qE7hiaDv(v$?ygaKMt+$ct9P#K%;#G;4?@2n5$i4 zQdY6O&o@uib`Sq}dO-PZV08*O6Pbg$?qJ@TtPU@VW>PaJ^nEw=on8~q@=Ok)Dc+6! ztp2?`p>lib8Lr|(0F;UN+C)yG2Z{N?b$@skDHloeaP(7O)G_3}D@GbpREix9*)I%7 zh3XkKDp?UnORwfuL3l<=C5>W2)$gOwvvl=bjs!WI-NUm%brgBPv$zm|&m3{JM+IqW zdRjg`J<6|Xg#;B5J$Al8Gyh6bkt!c;jOSOgzpjd=Fq~K}pG*E}W=m&Ou%s$0MPf5Q zTx~_-W@GXU6p1|MVtoS3M64~NAQ#^7)}i;Vm!}k>RX$dAHA8o%sy`)64gqudIs%n2 z`yMJU)5*#hC45x{5rw2~NX{-sm6k`TOOA*lNtjb5KOq^$b_> zBLK=o{B0yB;eSy%A9UOncSSCe;o)z5HcnfaBP|%n%aiM`jYbcW3*|_=RkcBX4E2+X zQ|BS{yC_7CKvg${xSEGOnjQ#;XQ>OANa#SBh@>Idh;b)AziPuDpFL)ir;)D(x-j0K zO&0VTPd7LI@maZZrYCq6Et>&WQcz?{A*!_|hE3L*7c(meVK;9IvBE!g{3#Y)c$UYC@w67sOTPWkeIBb! zKr9*rK$(c9DYyw@`qh&xoRgKG`mUkmo5hz~feg7W;Bz|gw-^Ie#pFLf^=aR&s@=a8 zQy@kv2!Jw?N=wnmX*)msReo`qD-DU#Bz(*us_kW|G>vU!K3>=Fi+3Pq7pgfY^uB=X zxG#hJyzI>~-bcZm6cGSrBE?oyBJ&3up8a?8MSdG4NwiU(wk9YVfBG1co?-*mw?h_@pCAKPyXPiW^j$xM*YNQEAxz zc(m^x`O0D+S_fJm#|~G(RT_KfM4JPYiD;XKn_#c9i*3D@Jx##5S&gGmr7h{?ie|Q= zHx{NJOF|p2a{nqhHq5temr&cYRGDzq4+KD&=tnzNs0Ci&aW^WhsCI<}H6u2B9zC|_;?hOk8P$q`e z-b!n`_EOr|8Gj{jR+>m3nT?gm3{WEUAQ?(3C=)|zX*KG(;%v&~IVV%rszI8)XOQ>c z{<6v;^fCLc$Wg@{w1Cap% zQ6kVc=YTahBM@cNfKY${AOHve0)T*FA^@K{hS}~=Yd`=H00aO5KtPlTfMFuaW&xo9 z0YCr{00aO5!$bfK6T@tGs5Kw}2mk_r03aYr1i&y6WwU@#fB+x>2mk_rfMFs4hKXUe zJJcEw00aO5KmZUBB?4fWh_YEgC_n%Z00aO5K)^5&0K>#E+Z}2R2mk_r03ZMeh!O!X zOhnl%AQT_~2mk_r03cwP2!LT?nC%X=1_S^BKmZT`1Vo7d7$%}@77z*$00aO5KmZUh zOa#C%G0b*{S_1-r03ZMe00N>!01OjRHVX&^2mk_r03ZMe7$yQ>m>6ceL#+V;KmZT` z1ONe1A^?VoD4PX@0t5g7KmZT`1Pl`aQ^Tw_)EW=~1SkYja*AzlyvT2OJua{DwYdBy z|3&AvD=H~-q|!Bb&2H#xd9!1%^{E#A))$-jSzULuGRfCqdB7SF00bm}fKgdlnFPcH z5di@}fDZ!C(h5C~J<0BV5BXYLAg>h!bDmJHkRI@$WHN@t)i;Zb6 zABK<@5C8aa%BfP zn?=uP>HPh;CQdswSPrlT1ONdoAOMDm7C?p~00E&9_~ll{fSJc%eV?9J;wv<7J>ZvJ z&)f3On(ppXn)_Ra=|O#<3V?t?ApnMnK{Yp2R>}yRh{$d=`e5R=gskFVDc3{WvU}Q@ zK3(6_V`8rwb|8~&KFw)1?vKRHG3iA$wN|Je7vyAR z@?u$M*V$tlJN>H1)r6`60+L1m3=>H=9|*6H2yD5Q{^`6^DT`BcODc(_ex}&tQGl~K z@~|~Q-gc(tf7TYp2rooM4wlBq7GGsUX=xcs&M8INg{3GL|HWq&qnEFXP<&h?+-EuY`B^+A?#&-eJq?-M?{>gjL{dZozb|)PRPbw ze!4|eK(P=8JBLHNZofv$&!(c-jA9l!d68yUb~K9}|AFJi5e*!6xZ1$f4=*$!Gax{N z02n4T;6M@}zy^UA8AYzx2`$o1sanlGT+4zLsHC-7KEbW`aaOz`zgy>%_ns+)%2E_oq51 zWfyzmv3}1NuZw--UKjb|MG2L$QxN~?w4y)~kFgMy#lh4zZZ;-pQAbxaynzEUCguqQ zRtP*xFG7n>ze0QOW+4fjUz+XbVD=)&#q25BGE~{o^tr#2*|W+{X0aZ&rios5ris?( z##&nr%nE2A1_XE_0EP)q03kbn1c;CIQP{01<|HXYfq%{EIS|`pNF94Lzr8EMFC=;hGDqt`>*HreSL((x8;}D6f+JumI7eUz2yjEd;EfVuhzzJ@ zhrVd#jB0vXazl|tF0#etpNMR<8*g(t_9UB=;lWfKKH?bNe34)NxAn&B3gqs16bK&| zTs{g^OAB?D6@Xy8cZkossQAnxv>7i@`3dh&PR)hEhE(Y^{y;oBG#wjf z!|OXDb5re2S$W%=;i)pW@;^$J`*>7^tW(*4Hxs35&yfmMJX`?*gG4~{+Rz|jg-Qbg z@(2VtnW9hXIh6ltYg#5DvlxAIHU+;}Gel#E$fKhCDH^W@`TWnM@;^cmB+h$Jyxc!z^_AX)Y=#mcWXYchbWRARvAOz%UVi z8-aupLcq_#6m_d=i~7{GLoNKRw7N(&uc#D{Jfxvj7t%zt3q^>gi%Kg(qYfmN{}F!G z+|03|;)?oXjJ0j3kn+jC?4j7mB!9Aj>;l4`^w1e>telC;L09k^ogxnFa%6eJJs@C+ z2!LT?h^-EF=8OPY2U5$!0x#mULT!RjMk z6Ds3lybyQjzIgoih9enKnc2#v+)&Ww)Q@6)$WEz-zE|0$`XJcKbu^-y%Q^jv#!5F4;j+(*y4!@wP;@JuS+2 z!x)i75d>n0{D#+ue1i=UGKv7<4FUv<35OHQ|459hwK1C5)ESM(>vvqVuy#k?b}+%y zP<3#>B7Y+q(&r+hFJvn2DLyQSY;%5|QG{N+E9}sv5-WZ9+$WRbp=_8q% z*@oALtie+=hBP9g6bu%TDR@WCqBAMweKOLCt)75{i84Q;)ifxm`fL8Vab zNv28;Jjg2lqj-ATnV`{)9nt7UPUVIy6%SWH01(hU0$`Zvz70SEo(M?MC@H~C%#LE; zA><49LQF1C1Ry(G1md$w(AQ^D%m1jnWUb1`MvmocRmi9t1V8`~&(dSHP^y3k z6yQ%{3o>3W;&A18Zn@*G{r5BR_EHfGYQUnAwJLK?yej{rU~t6KfBmr2yFqxXa*N7% zmz9>cD^qg76%a5a1i&ycq}JBcx@HxK$1q9CD#ku8vd|yc$Hjk9xd^XUg&<)BGV)8Y zLHWA;PqrFlDu`?g?}^v0v8mL zQBV#bpfLo%Fwq#az*ve1q~(^NOL*Gl^7A}&=~*rc!+s_TbvgC2uxx=8aWr_Dqwqdo z@<)bSlm#7;BZ)G!esE@AH^5D#kwN&!foTLn4deeMtd0YgPV+{*?HwN;?rT0pCD!^DtVAL%W|1F5GHXxCqA^?Vop|-q;>TPdfoXJO= zLLQqK$g#r^00A)}z^6}U7Qp%xF|{Sg!VLlNW5NwL$R!{G_?&lMpLy|_#hj0cb+dsH z6Cs*1)YS|v?d*oy2iqWPv-idxIkB)vKt$=2i0hTj zwQkXAg1n~WXoJnCEu&=h#WXbL5V2bgBZRu~ z>x(gI{C*3Dfil!m>0$nmPibV^2G`I^3yUSV$|k0K+A>P|?|y-{-+V2ms%u3S?9>O<^5kxqTz`?T6*-|0 zKtR(7fMKF(gn_?W2sHAwysj3Z3Zje8b5*1;NBiJau+`nnnF$S;LR&^j`>nC)$m1M? zM7m8NztzN7o^vVD3OrdO(8$;7CeFlpd(PP??uH2w zwrf>e)-oGP25lH6#2Z_KA7ao&o-bD^w@H@}8(!j{i{bYh7}3D~XI=t8W#kqd{o1ZUj_6uw>FHD{Nhp+`h7HdkZjl=?7gaU z?}L}|h+$44cMogMRwl6n>o^?I({2pak{AMDm`JR_^jX{v!Pckv)bH36&I2w88%4<9 ziJylnKC+83uQrU54D7nse?=6Ed(GWbo*1!XD^u$LE97R&-I2-PJo-M7bxdQ2t!!lm zdO$!^2!LUtDP(~!YXtC6_CKsM$z<4fFH7c${q3;&4(v1OX^wxj;6d$WW)bpV8HLjG zc%7G|7cDTXfg`Va9D2yzD8~h7k7?xi6E6WEGaw)!0$`X32qv)Nhd|TH)^|MZOgTF> zIr=yo4`*|K$&G5n@8!U+_TtHXd3+_*T*Et+!e14j;BTW*9vtw3-47e1!FB98cL1^@ zEsBSCwGP2Hr~RGH4ab!oXQUycwh#crL|aHhIcgy=pqAZ!wFp%Z{d9w~7uoV-iu={% zKF_a0BuPaRqojeaX8pQc!!Od>Yo8&!-W38yV8REEyiPm(^$x$S)x#Uu{{jsG2#5&* zqp~v44q|E$Lzm^&i@fShHazF-(@{SdR#vGE1dhVJsCCWTT}lXt`Vc;1~y9gxIyRIMw-Yc6@!GT z`@Ht9$llU~dSre5`DO-6%;tV_-=I47dwm_vQdk!Z82|wdBLIeph5-il+z^=7!f7?P zoNsc?{U@1EcC@;?CnEFz`Wp1fD3O{$Li&`Cy$PD##+7sTB5MN|p5|p!WY22tyn?d; zkP#5jAOc{RXb@ar%^iW6EnU8|G&SO^c^|(jLfd%m&{=@LX!SAZi%}v)gM{i&oBQxv zZ~DXKbdH$|kKobanVWJ6CHOq5h*#gZLAR6w(PyOsRF5mDG zXvXnml*_|c{a0;WQHYCvxr8M{LHDKvNO}%O%2o;K&mY&dN1dv0pD!d1d*+;Y#pkDy z{dGszd3+c^UO+&T2!M5>NpyiXF9hbab6w?RW%7b6lYH#KYs!%%uG!1;?HTODE5DdB zmm4LM15k)Wk5iVqK|=b1gQXGL)Z3F+x0rq`3E?w_IEUd49Cp<3u!!c&05Sps8b$yN z6Ac3l?D-+Eva8z{d^qg7or(V8u^P6PmnB-*LHhGLQZ`CT@uG^szlnSAueyD7&tP9< zLH6Wu4CnDN!oP%Na?FjeH#d~|O=q{+oEbnyKtKx!aQ}s9K{zM^5E#+Wac@Ik%d>ot z7`i{6_mobn0O>k7k*ZNb43g0Y;*r(72z2NX_pMfZ`i_u!XS8ra*atjkmIRLxzsGaV zPcq`gQ;YD4fzk()7YdMB>zkBZa0LX!iU1fUVr?0as{#UnE2AF9W)xMgkia71EFL}h0Drx54SVmsMxX9W z;F?`;@(Jn3USACos&Cd~^qqS#Yx1IQ)5k6u_GOtiRQ1o#PiLwS=-QAtHQ8EfI{^etoV7amn z5B2G-Og@MM1jLE}7$#zE8IVgU0`uFut!x=!{g2W_H6tTZicmj%^emsSx`!tkTF;&j z3rXcQH$~|2G=4r%48A0 z0hr2>N=t#9?-0n!FEOpWBIiH7axx0b1EsO^EH!+iV8$_Dp4C`A1`nCA42EWq5O^kGqvU&@ zM#;J89MpL`XNSk-t>kHE`t-%@;3_Pe49EciQ6K<@i71)@gy4d}FSjxVj5?UOk4s+J zJZpQnqj61~WTRN$Pdk=~)?dkBolndeoUDvd_>4f-TY?SIAR+DeMJs2tw6i;}CcT%C zkFdebi-)lh%Eav!8sKc6$cqtV1_X43fXTvz3w2a96blIOL!hp=<->yF(vnNh^V;#@ z^iM<%o~AHG^}M-n>Fg3>OWb{*RR~qf-4{$O?_ooITGZSVX z{AAzt)MLqL(>48?$5Iz{vWNP@xXOt5oaYm;lOEJ!Q!L_Xn4sBhoaZd=A}sS) zb2CS`u&YuNyi$QK7`j11upx_Zhymwr%YJ3BEVieg=AiC7_^oy&{J_1dEUIuXbp*gL zk$MY){Bj7?UK4ZeQF1|JxkwHVlbSlBZ+UL9C@n2RZMHr~S7Y-zNTA&;^}Q|7r3sb) z-`<(WM^R*P{N=vMeUW594#fjhgdoTnLF5JjIYfaF1qDCg0wmhty6e@eZ_VeEU#hF#BYQp# zVB~-x`4ddL2v<7%5@U520cQkbb@AtCb7{i%wCa0vFW5K86>&pCCz@Ly^*}&v1RzY* zHX`sxHUUxMq;Crk+Bzy+wmpJAp%E=JT>Apr;z6%Gnq5<@`Lf>=*yJGwBLg+KK+FZ`+0n{r(hJrSEg z=Tl3iqB=eIzR!cUKY#m-5CqB1!}3^|3mq9RUz}>oDycQg%9og1adQJ^+)Zll`z{Mz z{Dv7-Q3V84PXNM1^+N;)eU33Z6QN^IGY>|<{Cfa$ZM0v5|Q z1Op(TQUVYrDjgWOC62({eHnkBe<IQ5GGbINN`a;flU|k`aicRbv?5rd&;8;`=fQ5tvm5>mY<=U|IwPcCqsS*YiWTC zs}KGXRuCkHp{-!EBryVJNpx&_q{}CXbS6put}M1$O8f12O{d2-?&l4AjZzS(KLj95 z>d#oBCwC$6Q(9>g7VG46nXXD+QhL@7-&DI}bU5{B?s1n^@BTQiM0aED$uF7ZcYj&N z8&jU}rG>qM2!g~g#5UosbTCFku1@j=C;xQA7dw~h47X)Usjr(u(#6S*TZT4pvdu_# zroh6x^@0F|Nxc|GbfUHd3QH^PTQC3P+;7?Ct!i86PVe=*--9-f3?sWc#Q(Tcef?)U zE)~$T>yw47L(sR&uV3rvOYigywCPB#w=$9LT^#Lb-#86Du93gvhTEJHpC&9CZrgCz zZ%(|@xSQlF&LCh51RzXoVU*Fw+X%#LOI`l?*}O@&Jusud)yaNh)f zOA4_CyZS}AR)_#wNJ{_c79hlWQeOFubwk;LqW#Y3;y0V6ES@jKIT!%}DcTz+T+XnqRJ}sr)xyYA&E45n z=?K~JX{4s!*qu&GkLF0Xvd%1^Y(D#>^km0-+|S4|gvuabr34^MtaRYuwip80MHTKW z-~8EYdF3rcSafnA+B+_S+H2fJn4=%Bmr%D)6DhAmWs%v0^v?1|TCjk52VT@rpohF1 zHyxNVz+y^s`eW^N!W%f!Ube8cnZL7;u2izj z%ELD#(~e8>Be?$Mkd}Q`nuqu#LWT!MR6$^F)f_o~K%K~;hr0EO0LuW_r2UGkCko3d zgG6;~UXK8p(M4XmVtrpWT*#wwTT+QdlEqOA0)g)KOeJdQAwi3Pc$1qh=F^zXsU&I$ z_|}`#6C1T{?B{&F7G1(CAW-iKK$z6~Aw~yHB_J|nEN`1{{oqq5k4K2v`oV2Npl}Mt z4?a!81xfP&G1DZxr7Kxw)OBSdWfqB>yPDYE_q}EPf@c`-37&v}?Gb=5vAr=zk845T z$F!1W9b*%}Wl2ut$9ny%J&lj!ja0r3*&j_&$F9p-8u>*s6_tzn|6P=4bz_HTUfel0 zg2H7cH`4dMh$Xt|8F!6N3y78`+2yk&CtqpQuBpFsid2R(2!Oz!1RzZCO8|j85O{r8 z`n>m#X8(=7B4qmxZ>n8{EB$v&1bMm0kLD%0et|{x>c9FLrE10fH!si$B@S_tsuP~#+KJRb` zyES#EZKJ}-UC=&bsnb8CmfYBH{6~)E(-})Xh&c1q$R7>}5w;Io@`;PMsXNnY#YwR< zB+NcO+enac1_2WYK$w^S3$KEJL_k}rbL<(HwCB5P#Zgk3sPm(tE)+i|oB{+z0+alz zWGQbK9Ll7BvRM>s*>3z$ursZFHjEw&agn+q>|D+uM6(EKW{gCswFv!M?0z7JZPMCVdU4Lz1s#@CVTkB;aOL1GQXMAeY3k=hu>(V>t3qOg(>nBfA&uCOLb(dW_z(AXyv))R_h4~TlEjS+EP;S+ z5`ZwV&2dMs6(Vrpinc?))yeT?x+*^b zn@#fA{alQ+RA5F(YKecYnZ|b5to$xdDiV4Q^l(UE36grW3~{|8)G&;JfDIFXFtOpm zN7t1j5Pzwl`>+iuo0JkL4P5LfZfGd=ZQ-R@C(b4n(}b_C(}h$qpFH^X-jNSCpm(1R zqF^s^LFNnrIDM^{hOvY;DFw>Jb%7u;L>*-yAcg>hi5QNs0s;mJ>||SvM{G>pSX3@9 z|IV!qb-Bll);!x#(LeUddF3?Y>vY=ugK5FW+@0)bCW|vNrK7*l?a;R};P-hYI-0Qk zI&J?+{9;zAJ&ljk|Mo;j^u#9{i3rXhAf5n(iFl^42m-eeIB~V;k-n>wb}F$3MQV(P zX`9yBkLGj_AVdwnZMQn@>t;_&`UKI) zN4#%+WHtAEB`Zr@MDMUEk`jfp7CP8d{*vB7Qzv!sTV*wX;3x>xBLWa6^=L5B73(B0 zZ-2(?EPniKHXER*K;d-w%Gr5O1=9FPAF}65QdNAU8|T#bW4dqucnzeez7mWK(>_yC47p$`ODtQI0JvgMe8C zipnbOU)_^r6LoWxK*2SNq+jx_!qx~J;y!la9k&YG}&Z3p4a;aG1 zMXNWrTz#kQ(!~A9>LH<{!+o4Gt4nbK0wADT0uUyu9U3?W0)`3X73-W|+nK&}jfFq; z=zAjxmC>!e$-}uus1%k}(z0XOwETDuIdr&t$Wr;eD{xc2FLJ$5hd6EwX=pi6>zCQu6mK)_lE zK$uv|NWo7K5JZ5*4!L*Qu8c*N2#0U3%RH6utSJ8lEcn?5b8Vm=2!Mcf5`ZwV&T)g+ zARvrD+?m{wEVjr@OUFvl?*I>Y#?m7%ifQAs%EQIJ?zZ#jJB4cy0D(Fo0AW%m*wH8m zsFOf`iOxCpWX^=8$8uiFEYvkt$V+W=f9ESxJNYh&iS%8kP#Z7{0w7?e1RzYTbl~7N z2v~wZVQHoPsx!GU%Z}wtW-}@p)}}eTeY8(D^Ef!YlkcML%{`A=!f&*pP6BhQ=BU## zc%?o9P$%je6LCE`geW(zeS0JqH00009sH0T56L0SFV73n0T2KI5C8!X00Gqy zfG|c0T8e-fx!V=Gc4RBngaprA^>$_UE>9BK>!3m00cmwUK4;Ysn^4c o&Vc|3fB*=9fOQeDBdV%$IpxxCZODr=x$C`p^zZ&<)R?#a53HPCg#Z8m literal 0 HcmV?d00001 diff --git a/documentation/website/export_mod/defender_endpoint_export.json b/documentation/website/export_mod/defender_endpoint_export.json new file mode 100644 index 0000000..ee45766 --- /dev/null +++ b/documentation/website/export_mod/defender_endpoint_export.json @@ -0,0 +1,11 @@ +{ + "description": "Defender for Endpoint KQL hunting query export module", + "requirements": [], + "features": "This module export an event as Defender for Endpoint KQL queries that can then be used in your own python3 or Powershell tool. If you are using Microsoft Sentinel, you can directly connect your MISP instance to Sentinel and then create queries using the `ThreatIntelligenceIndicator` table to match events against imported IOC.", + "references": [ + "https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/advanced-hunting-schema-reference" + ], + "input": "MISP Event attributes", + "output": "Defender for Endpoint KQL queries", + "logo": "defender_endpoint.png" +} \ No newline at end of file From 2544218899b347fa055f19b47071bceca937f717 Mon Sep 17 00:00:00 2001 From: milkmix Date: Mon, 23 Nov 2020 16:28:23 +0100 Subject: [PATCH 078/476] fixed error reported by LGTM analysis --- misp_modules/modules/export_mod/defender_endpoint_export.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py index a70bbb0..eea929c 100755 --- a/misp_modules/modules/export_mod/defender_endpoint_export.py +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -61,7 +61,6 @@ handlers = { def handler(q=False): if q is False: return False - r = {'results': []} request = json.loads(q) config = request.get("config", {"Period": ""}) output = '' @@ -73,7 +72,6 @@ def handler(q=False): r = {"response": [], "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8')} return r - def introspection(): modulesetup = {} try: From ed5a43222264e17aa69de4a6b06de5fce7d945b7 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 27 Nov 2020 20:45:52 +0100 Subject: [PATCH 079/476] chg: [pipenv] Enable email extras for PyMISP --- Pipfile | 22 +-- Pipfile.lock | 460 ++++++++++++++++++++++++++++++++------------------- REQUIREMENTS | 78 +++++---- 3 files changed, 344 insertions(+), 216 deletions(-) diff --git a/Pipfile b/Pipfile index 0fb76c7..f5b7e6c 100644 --- a/Pipfile +++ b/Pipfile @@ -11,16 +11,16 @@ flake8 = "*" [packages] dnspython = "*" -requests = {extras = ["security"],version = "*"} +requests = { extras = ["security"], version = "*" } urlarchiver = "*" passivetotal = "*" pypdns = "*" pypssl = "*" pyeupi = "*" -uwhois = {editable = true,git = "https://github.com/Rafiot/uwhoisd.git",ref = "testing",subdirectory = "client"} -pymisp = {editable = true,extras = ["fileobjects,openioc,pdfexport"],git = "https://github.com/MISP/PyMISP.git"} -pyonyphe = {editable = true,git = "https://github.com/sebdraven/pyonyphe"} -pydnstrails = {editable = true,git = "https://github.com/sebdraven/pydnstrails"} +uwhois = { editable = true, git = "https://github.com/Rafiot/uwhoisd.git", ref = "testing", subdirectory = "client" } +pymisp = { editable = true, extras = ["fileobjects,openioc,pdfexport,email"], git = "https://github.com/MISP/PyMISP.git" } +pyonyphe = { editable = true, git = "https://github.com/sebdraven/pyonyphe" } +pydnstrails = { editable = true, git = "https://github.com/sebdraven/pydnstrails" } pytesseract = "*" pygeoip = "*" beautifulsoup4 = "*" @@ -32,20 +32,20 @@ maclookup = "*" vulners = "*" blockchain = "*" reportlab = "*" -pyintel471 = {editable = true,git = "https://github.com/MISP/PyIntel471.git"} +pyintel471 = { editable = true, git = "https://github.com/MISP/PyIntel471.git" } shodan = "*" Pillow = "*" Wand = "*" SPARQLWrapper = "*" domaintools_api = "*" -misp-modules = {editable = true,path = "."} -pybgpranking = {editable = true,git = "https://github.com/D4-project/BGP-Ranking.git/",subdirectory = "client"} -pyipasnhistory = {editable = true,git = "https://github.com/D4-project/IPASN-History.git/",subdirectory = "client"} +misp-modules = { editable = true, path = "." } +pybgpranking = { editable = true, git = "https://github.com/D4-project/BGP-Ranking.git/", subdirectory = "client" } +pyipasnhistory = { editable = true, git = "https://github.com/D4-project/IPASN-History.git/", subdirectory = "client" } backscatter = "*" pyzbar = "*" opencv-python = "*" np = "*" -ODTReader = {editable = true,git = "https://github.com/cartertemm/ODTReader.git/"} +ODTReader = { editable = true, git = "https://github.com/cartertemm/ODTReader.git/" } python-pptx = "*" python-docx = "*" ezodf = "*" @@ -54,7 +54,7 @@ pandas_ods_reader = "*" pdftotext = "*" lxml = "*" xlrd = "*" -idna-ssl = {markers = "python_version < '3.7'"} +idna-ssl = { markers = "python_version < '3.7'" } jbxapi = "*" geoip2 = "*" apiosintDS = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 6a66e91..bd42879 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "439defa3328b70c49d0cd4a6e0a50d9931a66426769b7dfdf2059f66f208e3f8" + "sha256": "470b724579b091b5dfb8d755f57b1e5d5b9ba946c04df7ce4e637a03326e5d46" }, "pipfile-spec": 6, "requires": { @@ -18,42 +18,46 @@ "default": { "aiohttp": { "hashes": [ - "sha256:027be45c4b37e21be81d07ae5242361d73eebad1562c033f80032f955f34df82", - "sha256:06efdb01ab71ec20786b592d510d1d354fbe0b2e4449ee47067b9ca65d45a006", - "sha256:0989ff15834a4503056d103077ec3652f9ea5699835e1ceaee46b91cf59830bf", - "sha256:11e087c316e933f1f52f3d4a09ce13f15ad966fc43df47f44ca4e8067b6a2e0d", - "sha256:184ead67248274f0e20b0cd6bb5f25209b2fad56e5373101cc0137c32c825c87", - "sha256:1c36b7ef47cfbc150314c2204cd73613d96d6d0982d41c7679b7cdcf43c0e979", - "sha256:2aea79734ac5ceeac1ec22b4af4efb4efd6a5ca3d73d77ec74ed782cf318f238", - "sha256:2e886611b100c8c93b753b457e645c5e4b8008ec443434d2a480e5a2bb3e6514", - "sha256:476b1f8216e59a3c2ffb71b8d7e1da60304da19f6000d422bacc371abb0fc43d", - "sha256:48104c883099c0e614c5c38f98c1d174a2c68f52f58b2a6e5a07b59df78262ab", - "sha256:4afd8002d9238e5e93acf1a8baa38b3ddf1f7f0ebef174374131ff0c6c2d7973", - "sha256:547b196a7177511da4f475fc81d0bb88a51a8d535c7444bbf2338b6dc82cb996", - "sha256:67f8564c534d75c1d613186939cee45a124d7d37e7aece83b17d18af665b0d7a", - "sha256:6e0d1231a626d07b23f6fe904caa44efb249da4222d8a16ab039fb2348722292", - "sha256:7e26712871ebaf55497a60f55483dc5e74326d1fb0bfceab86ebaeaa3a266733", - "sha256:7f1aeb72f14b9254296cdefa029c00d3c4550a26e1059084f2ee10d22086c2d0", - "sha256:8319a55de469d5af3517dfe1f6a77f248f6668c5a552396635ef900f058882ef", - "sha256:835bd35e14e4f36414e47c195e6645449a0a1c3fd5eeae4b7f22cb4c5e4f503a", - "sha256:89c1aa729953b5ac6ca3c82dcbd83e7cdecfa5cf9792c78c154a642e6e29303d", - "sha256:8a8addd41320637c1445fea0bae1fd9fe4888acc2cd79217ee33e5d1c83cfe01", - "sha256:8fbeeb2296bb9fe16071a674eadade7391be785ae0049610e64b60ead6abcdd7", - "sha256:a1f1cc11c9856bfa7f1ca55002c39070bde2a97ce48ef631468e99e2ac8e3fe6", - "sha256:ad5c3559e3cd64f746df43fa498038c91aa14f5d7615941ea5b106e435f3b892", - "sha256:b822bf7b764283b5015e3c49b7bb93f37fc03545f4abe26383771c6b1c813436", - "sha256:b84cef790cb93cec82a468b7d2447bf16e3056d2237b652e80f57d653b61da88", - "sha256:be9fa3fe94fc95e9bf84e84117a577c892906dd3cb0a95a7ae21e12a84777567", - "sha256:c53f1d2bd48f5f407b534732f5b3c6b800a58e70b53808637848d8a9ee127fe7", - "sha256:c588a0f824dc7158be9eec1ff465d1c868ad69a4dc518cd098cc11e4f7da09d9", - "sha256:c6da1af59841e6d43255d386a2c4bfb59c0a3b262bdb24325cc969d211be6070", - "sha256:c9a415f4f2764ab6c7d63ee6b86f02a46b4df9bc11b0de7ffef206908b7bf0b4", - "sha256:cdbb65c361ff790c424365a83a496fc8dd1983689a5fb7c6852a9a3ff1710c61", - "sha256:f04dcbf6af1868048a9b4754b1684c669252aa2419aa67266efbcaaead42ced7", - "sha256:f8c583c31c6e790dc003d9d574e3ed2c5b337947722965096c4d684e4f183570" + "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9", + "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f", + "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f", + "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005", + "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a", + "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e", + "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd", + "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a", + "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656", + "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0", + "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6", + "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a", + "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c", + "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b", + "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957", + "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9", + "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001", + "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e", + "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60", + "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564", + "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45", + "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a", + "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13", + "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f", + "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4", + "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f", + "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235", + "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914", + "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3", + "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3", + "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150", + "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e", + "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347", + "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b", + "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7", + "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245", + "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1" ], "markers": "python_version >= '3.6'", - "version": "==3.7.2" + "version": "==3.7.3" }, "antlr4-python3-runtime": { "hashes": [ @@ -132,44 +136,42 @@ }, "cffi": { "hashes": [ - "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d", - "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b", - "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4", - "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f", - "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3", - "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579", - "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537", - "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e", - "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05", - "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171", - "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca", - "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522", - "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c", - "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc", - "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d", - "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808", - "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828", - "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869", - "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d", - "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9", - "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0", - "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc", - "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15", - "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c", - "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a", - "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3", - "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1", - "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768", - "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d", - "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b", - "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e", - "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d", - "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730", - "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394", - "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1", - "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591" + "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", + "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", + "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", + "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", + "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", + "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", + "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", + "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", + "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", + "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", + "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", + "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", + "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", + "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", + "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", + "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", + "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", + "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", + "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", + "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", + "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", + "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", + "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", + "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", + "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", + "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", + "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", + "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", + "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", + "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", + "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", + "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", + "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", + "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" ], - "version": "==1.14.3" + "version": "==1.14.4" }, "chardet": { "hashes": [ @@ -236,6 +238,14 @@ ], "version": "==3.2.1" }, + "dataclasses": { + "hashes": [ + "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", + "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" + ], + "markers": "python_version < '3.7'", + "version": "==0.8" + }, "decorator": { "hashes": [ "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", @@ -336,9 +346,25 @@ "hashes": [ "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" ], + "index": "pypi", "markers": "python_version < '3.7'", "version": "==1.1.0" }, + "importlib": { + "hashes": [ + "sha256:b6ee7066fea66e35f8d0acee24d98006de1a0a8a94a8ce6efe73a9a23c8d9826" + ], + "markers": "python_version < '3.8'", + "version": "==1.0.4" + }, + "importlib-metadata": { + "hashes": [ + "sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175", + "sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099" + ], + "markers": "python_version < '3.8'", + "version": "==3.1.0" + }, "isodate": { "hashes": [ "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", @@ -348,10 +374,10 @@ }, "jbxapi": { "hashes": [ - "sha256:0605208a072ff5752754df0798f0de5acd8630e37237e04f816f1393c2c08b80" + "sha256:7cebd7ea73838ffd9e77b6a3bac6e4e1263b8cb4678b0579361b9257db684893" ], "index": "pypi", - "version": "==3.13.0" + "version": "==3.14.0" }, "json-log-formatter": { "hashes": [ @@ -387,46 +413,46 @@ }, "lxml": { "hashes": [ - "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", - "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", - "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", - "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", - "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", - "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", - "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", - "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", - "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", - "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311", - "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", - "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", - "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", - "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", - "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", - "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", - "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", - "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", - "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", - "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", - "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", - "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", - "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", - "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", - "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", - "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", - "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", - "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", - "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", - "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", - "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", - "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", - "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", - "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", - "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", - "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", - "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f" + "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", + "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", + "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", + "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", + "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", + "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", + "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", + "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", + "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", + "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", + "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", + "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", + "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", + "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", + "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", + "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", + "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", + "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", + "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", + "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", + "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", + "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", + "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", + "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", + "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", + "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", + "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", + "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", + "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", + "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", + "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", + "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", + "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", + "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", + "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", + "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", + "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" ], "index": "pypi", - "version": "==4.6.1" + "version": "==4.6.2" }, "maclookup": { "hashes": [ @@ -436,6 +462,13 @@ "index": "pypi", "version": "==1.0.3" }, + "mail-parser": { + "hashes": [ + "sha256:08925a64ed5f535051a25cf54b48f7ced918093e85691f4eba08933e3c7d6934", + "sha256:7577b8479e801be7b42fa7a2f6f66bda845c44c3b61ed0002771a82b3e410387" + ], + "version": "==3.14.0" + }, "markdownify": { "hashes": [ "sha256:30be8340724e706c9e811c27fe8c1542cf74a15b46827924fff5c54b40dd9b0d", @@ -641,61 +674,61 @@ }, "pillow": { "hashes": [ - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", - "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", - "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", - "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", - "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", - "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", - "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", - "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", - "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", - "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", - "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", - "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", - "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", - "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", - "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", - "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", - "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", + "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", + "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", + "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", + "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", + "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", + "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", + "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", + "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", + "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", + "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", + "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", + "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", + "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", + "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", + "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38" + "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", + "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", + "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", + "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", + "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", + "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", + "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", + "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", + "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", + "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", + "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", + "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", + "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", + "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", + "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", + "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", + "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", + "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", + "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", + "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", + "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", + "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", + "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", + "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", + "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", + "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", + "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", + "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", + "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", + "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", + "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", + "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", + "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", + "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", + "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", + "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", + "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" ], "index": "pypi", "version": "==8.0.1" @@ -861,12 +894,13 @@ "pymisp": { "editable": true, "extras": [ + "email", "fileobjects", "openioc", "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "02eff91c1efaf9406164cd4d2ba0bc2036a9e67e" + "ref": "fe91e10cedb4660b58dcc0db7833c46a5b0efeb9" }, "pyonyphe": { "editable": true, @@ -988,11 +1022,13 @@ "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e", "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a", "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" @@ -1110,6 +1146,57 @@ "index": "pypi", "version": "==0.18.1" }, + "simplejson": { + "hashes": [ + "sha256:034550078a11664d77bc1a8364c90bb7eef0e44c2dbb1fd0a4d92e3997088667", + "sha256:05b43d568300c1cd43f95ff4bfcff984bc658aa001be91efb3bb21df9d6288d3", + "sha256:0dd9d9c738cb008bfc0862c9b8fa6743495c03a0ed543884bf92fb7d30f8d043", + "sha256:10fc250c3edea4abc15d930d77274ddb8df4803453dde7ad50c2f5565a18a4bb", + "sha256:2862beabfb9097a745a961426fe7daf66e1714151da8bb9a0c430dde3d59c7c0", + "sha256:292c2e3f53be314cc59853bd20a35bf1f965f3bc121e007ab6fd526ed412a85d", + "sha256:2d3eab2c3fe52007d703a26f71cf649a8c771fcdd949a3ae73041ba6797cfcf8", + "sha256:2e7b57c2c146f8e4dadf84977a83f7ee50da17c8861fd7faf694d55e3274784f", + "sha256:311f5dc2af07361725033b13cc3d0351de3da8bede3397d45650784c3f21fbcf", + "sha256:344e2d920a7f27b4023c087ab539877a1e39ce8e3e90b867e0bfa97829824748", + "sha256:3fabde09af43e0cbdee407555383063f8b45bfb52c361bc5da83fcffdb4fd278", + "sha256:42b8b8dd0799f78e067e2aaae97e60d58a8f63582939af60abce4c48631a0aa4", + "sha256:4b3442249d5e3893b90cb9f72c7d6ce4d2ea144d2c0d9f75b9ae1e5460f3121a", + "sha256:55d65f9cc1b733d85ef95ab11f559cce55c7649a2160da2ac7a078534da676c8", + "sha256:5c659a0efc80aaaba57fcd878855c8534ecb655a28ac8508885c50648e6e659d", + "sha256:72d8a3ffca19a901002d6b068cf746be85747571c6a7ba12cbcf427bfb4ed971", + "sha256:75ecc79f26d99222a084fbdd1ce5aad3ac3a8bd535cd9059528452da38b68841", + "sha256:76ac9605bf2f6d9b56abf6f9da9047a8782574ad3531c82eae774947ae99cc3f", + "sha256:7d276f69bfc8c7ba6c717ba8deaf28f9d3c8450ff0aa8713f5a3280e232be16b", + "sha256:7f10f8ba9c1b1430addc7dd385fc322e221559d3ae49b812aebf57470ce8de45", + "sha256:8042040af86a494a23c189b5aa0ea9433769cc029707833f261a79c98e3375f9", + "sha256:813846738277729d7db71b82176204abc7fdae2f566e2d9fcf874f9b6472e3e6", + "sha256:845a14f6deb124a3bcb98a62def067a67462a000e0508f256f9c18eff5847efc", + "sha256:869a183c8e44bc03be1b2bbcc9ec4338e37fa8557fc506bf6115887c1d3bb956", + "sha256:8acf76443cfb5c949b6e781c154278c059b09ac717d2757a830c869ba000cf8d", + "sha256:8f713ea65958ef40049b6c45c40c206ab363db9591ff5a49d89b448933fa5746", + "sha256:934115642c8ba9659b402c8bdbdedb48651fb94b576e3b3efd1ccb079609b04a", + "sha256:9551f23e09300a9a528f7af20e35c9f79686d46d646152a0c8fc41d2d074d9b0", + "sha256:9a2b7543559f8a1c9ed72724b549d8cc3515da7daf3e79813a15bdc4a769de25", + "sha256:a55c76254d7cf8d4494bc508e7abb993a82a192d0db4552421e5139235604625", + "sha256:ad8f41c2357b73bc9e8606d2fa226233bf4d55d85a8982ecdfd55823a6959995", + "sha256:af4868da7dd53296cd7630687161d53a7ebe2e63814234631445697bd7c29f46", + "sha256:afebfc3dd3520d37056f641969ce320b071bc7a0800639c71877b90d053e087f", + "sha256:b59aa298137ca74a744c1e6e22cfc0bf9dca3a2f41f51bc92eb05695155d905a", + "sha256:bc00d1210567a4cdd215ac6e17dc00cb9893ee521cee701adfd0fa43f7c73139", + "sha256:c1cb29b1fced01f97e6d5631c3edc2dadb424d1f4421dad079cb13fc97acb42f", + "sha256:c94dc64b1a389a416fc4218cd4799aa3756f25940cae33530a4f7f2f54f166da", + "sha256:ceaa28a5bce8a46a130cd223e895080e258a88d51bf6e8de2fc54a6ef7e38c34", + "sha256:cff6453e25204d3369c47b97dd34783ca820611bd334779d22192da23784194b", + "sha256:d0b64409df09edb4c365d95004775c988259efe9be39697d7315c42b7a5e7e94", + "sha256:d4813b30cb62d3b63ccc60dd12f2121780c7a3068db692daeb90f989877aaf04", + "sha256:da3c55cdc66cfc3fffb607db49a42448785ea2732f055ac1549b69dcb392663b", + "sha256:e058c7656c44fb494a11443191e381355388443d543f6fc1a245d5d238544396", + "sha256:fed0f22bf1313ff79c7fc318f7199d6c2f96d4de3234b2f12a1eab350e597c06", + "sha256:ffd4e4877a78c84d693e491b223385e0271278f5f4e1476a4962dca6824ecfeb" + ], + "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==3.17.2" + }, "six": { "hashes": [ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", @@ -1137,7 +1224,7 @@ "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" ], - "markers": "python_version >= '3.0'", + "markers": "python_version >= '3'", "version": "==2.0.1" }, "sparqlwrapper": { @@ -1215,11 +1302,11 @@ }, "tqdm": { "hashes": [ - "sha256:18d6a615aedd09ec8456d9524489dab330af4bd5c2a14a76eb3f9a0e14471afe", - "sha256:80d9d5165d678dbd027dd102dfb99f71bf05f333b61fb761dbba13b4ab719ead" + "sha256:5c0d04e06ccc0da1bd3fa5ae4550effcce42fcad947b4a6cafa77bdc9b09ff22", + "sha256:9e7b8ab0ecbdbf0595adadd5f0ebbb9e69010e0bd48bbb0c15e550bf2a5292df" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.52.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==4.54.0" }, "trustar": { "hashes": [ @@ -1234,6 +1321,7 @@ "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" ], + "markers": "python_version < '3.8'", "version": "==3.7.4.3" }, "tzlocal": { @@ -1303,11 +1391,11 @@ }, "wand": { "hashes": [ - "sha256:566b3d049858efa879096a7ab2e0516d67a240e6c3ffd7a267298c41e81c14b7", - "sha256:d21429288fe0de63d829dbbfb26736ebaed9fd0792c2a0dc5943c5cab803a708" + "sha256:6aeb0183d94762b37a8cdee97174f38ae21e626d44f62f1e2f0ab48a35026e98", + "sha256:eb49a51937d8d9e71ae03e34a845499f9b45ecb5ce0d8744e4c166bc733076eb" ], "index": "pypi", - "version": "==0.6.3" + "version": "==0.6.4" }, "websocket-client": { "hashes": [ @@ -1396,6 +1484,14 @@ ], "markers": "python_version >= '3.6'", "version": "==1.6.3" + }, + "zipp": { + "hashes": [ + "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", + "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb" + ], + "markers": "python_version >= '3.6'", + "version": "==3.4.0" } }, "develop": { @@ -1486,6 +1582,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, + "importlib-metadata": { + "hashes": [ + "sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175", + "sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099" + ], + "markers": "python_version < '3.8'", + "version": "==3.1.0" + }, "iniconfig": { "hashes": [ "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", @@ -1599,6 +1703,14 @@ ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", "version": "==1.26.2" + }, + "zipp": { + "hashes": [ + "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", + "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb" + ], + "markers": "python_version >= '3.6'", + "version": "==3.4.0" } } } diff --git a/REQUIREMENTS b/REQUIREMENTS index f6362b5..f577937 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -1,34 +1,42 @@ +# +# These requirements were autogenerated by pipenv +# To regenerate from the project's Pipfile, run: +# +# pipenv lock --requirements +# + -i https://pypi.org/simple -e . -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client -e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/MISP/PyMISP.git@bacd4c78cd83d3bf45dcf55cd9ad3514747ac985#egg=pymisp[fileobjects,openioc,pdfexport] +-e git+https://github.com/MISP/PyMISP.git@fe91e10cedb4660b58dcc0db7833c46a5b0efeb9#egg=pymisp[email,fileobjects,openioc,pdfexport] -e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -aiohttp==3.6.2; python_full_version >= '3.5.3' +aiohttp==3.7.3; python_version >= '3.6' antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 argparse==1.4.0 assemblyline-client==4.0.1 async-timeout==3.0.1; python_full_version >= '3.5.3' -attrs==20.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +attrs==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' backscatter==0.2.4 beautifulsoup4==4.9.3 blockchain==1.4.4 -certifi==2020.6.20 -cffi==1.14.3 +certifi==2020.11.8 +cffi==1.14.4 chardet==3.0.4 click-plugins==1.1.1 click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -colorama==0.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' configparser==5.0.1; python_version >= '3.6' -cryptography==3.1.1 -clamd==1.0.2 +cryptography==3.2.1 +dataclasses==0.8; python_version < '3.7' decorator==4.4.2 deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +dnsdb2==1.1.1 dnspython==2.0.0 domaintools-api==0.5.2 enum-compat==0.0.3 @@ -40,30 +48,33 @@ geoip2==4.1.0 httplib2==0.18.1 idna-ssl==1.1.0; python_version < '3.7' idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +importlib-metadata==3.1.0; python_version < '3.8' +importlib==1.0.4; python_version < '3.8' isodate==0.6.0 -jbxapi==3.11.0 +jbxapi==3.14.0 json-log-formatter==0.3.0 jsonschema==3.2.0 lief==0.10.1 -lxml==4.5.2 +lxml==4.6.2 maclookup==1.0.3 +mail-parser==3.14.0 markdownify==0.5.3 -maxminddb==2.0.2; python_version >= '3.6' -multidict==4.7.6; python_version >= '3.5' +maxminddb==2.0.3; python_version >= '3.6' +multidict==5.0.2; python_version >= '3.5' np==1.0.2 -numpy==1.19.2; python_version >= '3.6' +numpy==1.19.4; python_version >= '3.6' oauth2==1.9.0.post1 -opencv-python==4.4.0.44 +opencv-python==4.4.0.46 pandas-ods-reader==0.0.7 -pandas==1.1.3 +pandas==1.1.4 passivetotal==1.0.31 pdftotext==2.1.5 -pillow==7.2.0 +pillow==8.0.1 progressbar2==3.53.1 -psutil==5.7.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +psutil==5.7.3; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodome==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodomex==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycryptodome==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pydeep==0.4 pyeupi==1.1 pygeoip==0.3.2 @@ -87,31 +98,36 @@ pyzbar==0.1.8 pyzipper==0.3.3; python_version >= '3.5' rdflib==5.0.0 redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.5.53 +reportlab==3.5.55 requests-cache==0.5.2 -requests[security]==2.24.0 -shodan==1.23.1 +requests[security]==2.25.0 +shodan==1.24.0 sigmatools==0.18.1 +simplejson==3.17.2; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +socialscan==1.4.1 socketio-client==0.5.7.4 -soupsieve==2.0.1; python_version >= '3.0' +soupsieve==2.0.1; python_version >= '3' sparqlwrapper==1.8.5 stix2-patterns==1.3.1 tabulate==0.8.7 -tornado==6.0.4; python_version >= '3.5' -trustar==0.3.33 +tornado==6.1; python_version >= '3.5' +tqdm==4.54.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +trustar==0.3.34 +typing-extensions==3.7.4.3; python_version < '3.8' tzlocal==2.1 unicodecsv==0.14.1 -url-normalize==1.4.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.25.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' +urllib3==1.26.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' validators==0.14.0 vt-graph-api==1.0.1 -vulners==1.5.8 -wand==0.6.3 +vulners==1.5.9 +wand==0.6.4 websocket-client==0.57.0 wrapt==1.12.1 xlrd==1.2.0 -xlsxwriter==1.3.6 +xlsxwriter==1.3.7 yara-python==3.8.1 -yarl==1.6.0; python_version >= '3.5' +yarl==1.6.3; python_version >= '3.6' +zipp==3.4.0; python_version >= '3.6' From 191e66b71a455d299d957ec0938de42cea2f5f3d Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 27 Nov 2020 21:12:20 +0100 Subject: [PATCH 080/476] fix: [pipenv] Missing clamd --- Pipfile | 1 + Pipfile.lock | 14 +++++++++++--- REQUIREMENTS | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Pipfile b/Pipfile index f5b7e6c..2aa159f 100644 --- a/Pipfile +++ b/Pipfile @@ -64,6 +64,7 @@ trustar = "*" markdownify = "==0.5.3" socialscan = "*" dnsdb2 = "*" +clamd = "*" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index bd42879..40fd98e 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "470b724579b091b5dfb8d755f57b1e5d5b9ba946c04df7ce4e637a03326e5d46" + "sha256": "3b955a6c921b05f901f7c345e10137875026fb9c621844ea310f0a579a90942c" }, "pipfile-spec": 6, "requires": { @@ -180,6 +180,14 @@ ], "version": "==3.0.4" }, + "clamd": { + "hashes": [ + "sha256:5c32546b7d1eb00fd6be00a889d79e00fbf980ed082826ccfa369bce3dcff5e7", + "sha256:d82a2fd814684a35a1b31feadafb2e69c8ebde9403613f6bdaa5d877c0f29560" + ], + "index": "pypi", + "version": "==1.0.2" + }, "click": { "hashes": [ "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", @@ -1357,7 +1365,7 @@ "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", "version": "==1.26.2" }, "uwhois": { @@ -1701,7 +1709,7 @@ "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", "version": "==1.26.2" }, "zipp": { diff --git a/REQUIREMENTS b/REQUIREMENTS index f577937..9195737 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -28,6 +28,7 @@ blockchain==1.4.4 certifi==2020.11.8 cffi==1.14.4 chardet==3.0.4 +clamd==1.0.2 click-plugins==1.1.1 click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' @@ -119,7 +120,7 @@ tzlocal==2.1 unicodecsv==0.14.1 url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' +urllib3==1.26.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' validators==0.14.0 vt-graph-api==1.0.1 vulners==1.5.9 From 2a870f2d97ce0ad2d72b0e1059a6e18b684834fd Mon Sep 17 00:00:00 2001 From: Jens Thom Date: Mon, 30 Nov 2020 12:06:19 +0100 Subject: [PATCH 081/476] * add parser for report version v1 and v2 * add summary JSON import module --- REQUIREMENTS | 3 + .../expansion => lib}/_vmray/__init__.py | 0 misp_modules/lib/_vmray/parser.py | 1408 +++++++++++++++++ .../_vmray/rest_api.py} | 0 .../expansion/_vmray/vmray_rest_api.py | 148 -- .../modules/expansion/vmray_submit.py | 2 +- .../modules/import_mod/_vmray/__init__.py | 0 .../modules/import_mod/vmray_import.py | 402 +---- .../import_mod/vmray_summary_json_import.py | 80 + 9 files changed, 1539 insertions(+), 504 deletions(-) rename misp_modules/{modules/expansion => lib}/_vmray/__init__.py (100%) create mode 100644 misp_modules/lib/_vmray/parser.py rename misp_modules/{modules/import_mod/_vmray/vmray_rest_api.py => lib/_vmray/rest_api.py} (100%) delete mode 100644 misp_modules/modules/expansion/_vmray/vmray_rest_api.py delete mode 100644 misp_modules/modules/import_mod/_vmray/__init__.py create mode 100644 misp_modules/modules/import_mod/vmray_summary_json_import.py diff --git a/REQUIREMENTS b/REQUIREMENTS index 955ecad..fd356c6 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -26,6 +26,8 @@ click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, colorama==0.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' configparser==5.0.1; python_version >= '3.6' cryptography==3.1.1 +clamd==1.0.2 +dataclasses; python_version < '3.7' decorator==4.4.2 deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnspython==2.0.0 @@ -46,6 +48,7 @@ jsonschema==3.2.0 lief==0.10.1 lxml==4.5.2 maclookup==1.0.3 +markdownify==0.5.3 maxminddb==2.0.2; python_version >= '3.6' multidict==4.7.6; python_version >= '3.5' np==1.0.2 diff --git a/misp_modules/modules/expansion/_vmray/__init__.py b/misp_modules/lib/_vmray/__init__.py similarity index 100% rename from misp_modules/modules/expansion/_vmray/__init__.py rename to misp_modules/lib/_vmray/__init__.py diff --git a/misp_modules/lib/_vmray/parser.py b/misp_modules/lib/_vmray/parser.py new file mode 100644 index 0000000..0c0cb24 --- /dev/null +++ b/misp_modules/lib/_vmray/parser.py @@ -0,0 +1,1408 @@ +import base64 +import json +import re + +from abc import ABC, abstractmethod +from dataclasses import asdict, dataclass, field +from enum import Enum +from pathlib import PureWindowsPath +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +from pymisp import MISPAttribute, MISPEvent, MISPObject + +from .rest_api import VMRayRESTAPI, VMRayRESTAPIError + + +USER_RE = re.compile(r".:.Users\\(.*?)\\", re.IGNORECASE) +DOC_RE = re.compile(r".:.DOCUME~1.\\(.*?)\\", re.IGNORECASE) +DOC_AND_SETTINGS_RE = re.compile(r".:.Documents and Settings\\(.*?)\\", re.IGNORECASE) +USERPROFILES = [USER_RE, DOC_RE, DOC_AND_SETTINGS_RE] + + +def classifications_to_str(classifications: List[str]) -> Optional[str]: + if classifications: + return "Classifications: " + ", ".join(classifications) + return None + + +def merge_lists(target: List[Any], source: List[Any]): + return list({*target, *source}) + + +@dataclass +class Attribute: + type: str + value: str + category: Optional[str] = None + comment: Optional[str] = None + to_ids: bool = False + + def __eq__(self, other: Dict[str, Any]) -> bool: + return asdict(self) == other + + +@dataclass +class Artifact: + is_ioc: bool + verdict: Optional[str] + + @abstractmethod + def to_attributes(self) -> Iterator[Attribute]: + raise NotImplementedError() + + @abstractmethod + def to_misp_object(self, tag: bool) -> MISPObject: + raise NotImplementedError() + + @abstractmethod + def merge(self, other: "Artifact") -> None: + raise NotImplementedError() + + @abstractmethod + def __eq__(self, other: "Artifact") -> bool: + raise NotImplementedError() + + def tag_artifact_attribute(self, attribute: MISPAttribute) -> None: + if self.is_ioc: + attribute.add_tag('vmray:artifact="IOC"') + + if self.verdict: + attribute.add_tag(f'vmray:verdict="{self.verdict}"') + + +@dataclass +class DomainArtifact(Artifact): + domain: str + sources: List[str] + ips: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + value = self.domain + comment = ", ".join(self.sources) if self.sources else None + + attr = Attribute(type="domain", value=value, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="domain-ip") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "domain", value=self.domain, to_ids=self.is_ioc, comment=classifications + ) + if tag: + self.tag_artifact_attribute(attr) + + for ip in self.ips: + obj.add_attribute("ip", value=ip, to_ids=self.is_ioc) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, DomainArtifact): + return + + self.ips = merge_lists(self.ips, other.ips) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, DomainArtifact): + return NotImplemented + + return self.domain == other.domain + + +@dataclass +class EmailArtifact(Artifact): + sender: Optional[str] + subject: Optional[str] + recipients: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + if self.sender: + classifications = classifications_to_str(self.classifications) + yield Attribute( + type="email-src", value=self.sender, comment=classifications + ) + + if self.subject: + yield Attribute(type="email-subject", value=self.subject, to_ids=False) + + for recipient in self.recipients: + yield Attribute(type="email-dst", value=recipient, to_ids=False) + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="email") + + if self.sender: + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "from", value=self.sender, to_ids=self.is_ioc, comment=classifications + ) + if tag: + self.tag_artifact_attribute(attr) + + if self.subject: + obj.add_attribute("subject", value=self.subject, to_ids=False) + + for recipient in self.recipients: + obj.add_attribute("to", value=recipient, to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, EmailArtifact): + return + + self.recipients = merge_lists(self.recipients, other.recipients) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, EmailArtifact): + return NotImplemented + + return self.sender == other.sender and self.subject == other.subject + + +@dataclass +class FileArtifact(Artifact): + filenames: List[str] + operations: List[str] + md5: str + sha1: str + sha256: str + ssdeep: str + imphash: Optional[str] + classifications: List[str] + size: Optional[int] + mimetype: Optional[str] = None + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"File operations: {operations}" + + for filename in self.filenames: + attr = Attribute(type="filename", value=filename, comment=comment) + yield attr + + for hash_type in ("md5", "sha1", "sha256", "ssdeep", "imphash"): + for filename in self.filenames: + value = getattr(self, hash_type) + if value is not None: + attr = Attribute( + type=f"filename|{hash_type}", + value=f"{filename}|{value}", + category="Payload delivery", + to_ids=True, + ) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="file") + + if self.size: + obj.add_attribute("size-in-bytes", value=self.size) + + classifications = classifications_to_str(self.classifications) + hashes = [ + ("md5", self.md5), + ("sha1", self.sha1), + ("sha256", self.sha256), + ("ssdeep", self.ssdeep), + ] + for (key, value) in hashes: + if not value: + continue + + attr = obj.add_attribute( + key, value=value, to_ids=self.is_ioc, comment=classifications + ) + + if tag: + self.tag_artifact_attribute(attr) + + if self.mimetype: + obj.add_attribute("mimetype", value=self.mimetype, to_ids=False) + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + for filename in self.filenames: + filename = PureWindowsPath(filename) + obj.add_attribute("filename", value=filename.name, comment=operations) + + fullpath = str(filename) + for regex in USERPROFILES: + fullpath = regex.sub(r"%USERPROFILE%\\", fullpath) + + obj.add_attribute("fullpath", fullpath) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, FileArtifact): + return + + self.filenames = merge_lists(self.filenames, other.filenames) + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, FileArtifact): + return NotImplemented + + return self.sha256 == other.sha256 + + +@dataclass +class IpArtifact(Artifact): + ip: str + sources: List[str] + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + sources = ", ".join(self.sources) + comment = f"Found in: {sources}" + + attr = Attribute(type="ip-dst", value=self.ip, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="ip-port") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "ip", value=self.ip, comment=classifications, to_ids=self.is_ioc + ) + if tag: + self.tag_artifact_attribute(attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, IpArtifact): + return + + self.sources = merge_lists(self.sources, other.sources) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, IpArtifact): + return NotImplemented + + return self.ip == other.ip + + +@dataclass +class MutexArtifact(Artifact): + name: str + operations: List[str] + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="mutex", value=self.name, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="mutex") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "name", + value=self.name, + category="External analysis", + to_ids=False, + comment=classifications, + ) + if tag: + self.tag_artifact_attribute(attr) + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + obj.add_attribute("description", value=operations, to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, MutexArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, MutexArtifact): + return NotImplemented + + return self.name == other.name + + +@dataclass +class ProcessArtifact(Artifact): + filename: str + pid: Optional[int] = None + parent_pid: Optional[int] = None + cmd_line: Optional[str] = None + operations: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + process_desc = f"Process created: {self.filename}\nPID: {self.pid}" + classifications = classifications_to_str(self.classifications) + yield Attribute(type="text", value=process_desc, comment=classifications) + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="process") + + if self.pid: + obj.add_attribute("pid", value=self.pid, category="External analysis") + + if self.parent_pid: + obj.add_attribute( + "parent-pid", value=self.parent_pid, category="External analysis" + ) + + classifications = classifications_to_str(self.classifications) + name_attr = obj.add_attribute( + "name", self.filename, category="External analysis", comment=classifications + ) + + cmd_attr = obj.add_attribute("command-line", value=self.cmd_line) + + if tag: + self.tag_artifact_attribute(name_attr) + self.tag_artifact_attribute(cmd_attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, ProcessArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, ProcessArtifact): + return NotImplemented + + return self.filename == other.filename and self.cmd_line == other.cmd_line + + +@dataclass +class RegistryArtifact(Artifact): + key: str + operations: List[str] + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="regkey", value=self.key, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="registry-key") + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + attr = obj.add_attribute( + "key", value=self.key, to_ids=self.is_ioc, comment=operations + ) + if tag: + self.tag_artifact_attribute(attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, RegistryArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, RegistryArtifact): + return NotImplemented + + return self.key == other.key + + +@dataclass +class UrlArtifact(Artifact): + url: str + operations: List[str] + domain: Optional[str] = None + ips: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="url", value=self.url, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="url") + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + attr = obj.add_attribute( + "url", + value=self.url, + comment=operations, + category="External analysis", + to_ids=False, + ) + if tag: + self.tag_artifact_attribute(attr) + + if self.domain: + obj.add_attribute( + "domain", self.domain, category="External analysis", to_ids=False + ) + + for ip in self.ips: + obj.add_attribute("ip", ip, category="External analysis", to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, UrlArtifact): + return + + self.ips = merge_lists(self.ips, other.ips) + self.operations = merge_lists(self.operations, other.operations) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, UrlArtifact): + return NotImplemented + + return self.url == other.url and self.domain == other.domain + + +@dataclass +class MitreAttack: + description: str + id: str + + def to_misp_galaxy(self) -> str: + return f'misp-galaxy:mitre-attack-pattern="{self.description} - {self.id}"' + + +@dataclass +class VTI: + category: str + operation: str + technique: str + score: int + + +class ReportVersion(Enum): + v1 = "v1" + v2 = "v2" + + +class VMRayParseError(Exception): + pass + + +class ReportParser(ABC): + @abstractmethod + def __init__(self, api: VMRayRESTAPI, analysis_id: int): + raise NotImplementedError() + + @abstractmethod + def is_static_report(self) -> bool: + raise NotImplementedError() + + @abstractmethod + def artifacts(self) -> Iterator[Artifact]: + raise NotImplementedError() + + @abstractmethod + def classifications(self) -> Optional[str]: + raise NotImplementedError() + + @abstractmethod + def details(self) -> Iterator[str]: + raise NotImplementedError() + + @abstractmethod + def mitre_attacks(self) -> Iterator[MitreAttack]: + raise NotImplementedError() + + @abstractmethod + def sandbox_type(self) -> str: + raise NotImplementedError() + + @abstractmethod + def score(self) -> str: + raise NotImplementedError() + + @abstractmethod + def vtis(self) -> Iterator[VTI]: + raise NotImplementedError() + + +class Summary(ReportParser): + def __init__( + self, analysis_id: int, api: VMRayRESTAPI = None, report: Dict[str, Any] = None + ): + self.analysis_id = analysis_id + + if report: + self.report = report + else: + data = api.call( + "GET", + f"/rest/analysis/{analysis_id}/archive/logs/summary.json", + raw_data=True, + ) + self.report = json.load(data) + + @staticmethod + def to_verdict(score: Union[int, str]) -> Optional[str]: + if isinstance(score, int): + if 0 <= score <= 24: + return "clean" + if 25 <= score <= 74: + return "suspicious" + if 75 <= score <= 100: + return "malicious" + return "n/a" + if isinstance(score, str): + score = score.lower() + if score in ("not_suspicious", "whitelisted"): + return "clean" + if score == "blacklisted": + return "malicious" + if score in ("not_available", "unknown"): + return "n/a" + return score + return None + + def is_static_report(self) -> bool: + return self.report["vti"]["vti_rule_type"] == "Static" + + def artifacts(self) -> Iterator[Artifact]: + artifacts = self.report["artifacts"] + domains = artifacts.get("domains", []) + for domain in domains: + classifications = domain.get("classifications", []) + is_ioc = domain.get("ioc", False) + verdict = self.to_verdict(domain.get("severity")) + ips = domain.get("ip_addresses", []) + artifact = DomainArtifact( + domain=domain["domain"], + sources=domain["sources"], + ips=ips, + classifications=classifications, + is_ioc=is_ioc, + verdict=verdict, + ) + yield artifact + + emails = artifacts.get("emails", []) + for email in emails: + sender = email.get("sender") + subject = email.get("subject") + verdict = self.to_verdict(email.get("severity")) + recipients = email.get("recipients", []) + classifications = email.get("classifications", []) + is_ioc = email.get("ioc", False) + + artifact = EmailArtifact( + sender=sender, + subject=subject, + verdict=verdict, + recipients=recipients, + classifications=classifications, + is_ioc=is_ioc, + ) + yield artifact + + files = artifacts.get("files", []) + for file_ in files: + if file_["filename"] is None: + continue + + filenames = [file_["filename"]] + if "filenames" in file_: + filenames += file_["filenames"] + + hashes = file_["hashes"] + classifications = file_.get("classifications", []) + operations = file_.get("operations", []) + is_ioc = file_.get("ioc", False) + mimetype = file_.get("mime_type") + verdict = self.to_verdict(file_.get("severity")) + + for hash_dict in hashes: + imp = hash_dict.get("imp_hash") + + artifact = FileArtifact( + filenames=filenames, + imphash=imp, + md5=hash_dict["md5_hash"], + ssdeep=hash_dict["ssdeep_hash"], + sha256=hash_dict["sha256_hash"], + sha1=hash_dict["sha1_hash"], + operations=operations, + classifications=classifications, + size=file_.get("file_size"), + is_ioc=is_ioc, + mimetype=mimetype, + verdict=verdict, + ) + yield artifact + + ips = artifacts.get("ips", []) + for ip in ips: + is_ioc = ip.get("ioc", False) + verdict = self.to_verdict(ip.get("severity")) + classifications = ip.get("classifications", []) + artifact = IpArtifact( + ip=ip["ip_address"], + sources=ip["sources"], + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + mutexes = artifacts.get("mutexes", []) + for mutex in mutexes: + verdict = self.to_verdict(mutex.get("severity")) + is_ioc = mutex.get("ioc", False) + artifact = MutexArtifact( + name=mutex["mutex_name"], + operations=mutex["operations"], + classifications=[], + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + processes = artifacts.get("processes", []) + for process in processes: + classifications = process.get("classifications", []) + cmd_line = process.get("cmd_line") + name = process["image_name"] + verdict = self.to_verdict(process.get("severity")) + is_ioc = process.get("ioc", False) + + artifact = ProcessArtifact( + filename=name, + classifications=classifications, + cmd_line=cmd_line, + verdict=verdict, + is_ioc=is_ioc, + ) + + registry = artifacts.get("registry", []) + for reg in registry: + is_ioc = reg.get("ioc", False) + verdict = self.to_verdict(reg.get("severity")) + artifact = RegistryArtifact( + key=reg["reg_key_name"], + operations=reg["operations"], + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + urls = artifacts.get("urls", []) + for url in urls: + ips = url.get("ip_addresses", []) + is_ioc = url.get("ioc", False) + verdict = self.to_verdict(url.get("severity")) + + artifact = UrlArtifact( + url=url["url"], + operations=url["operations"], + ips=ips, + is_ioc=is_ioc, + verdict=verdict, + ) + yield artifact + + def classifications(self) -> Optional[str]: + classifications = self.report["classifications"] + if classifications: + str_classifications = ", ".join(classifications) + return f"Classifications: {str_classifications}" + return None + + def details(self) -> Iterator[str]: + details = self.report["analysis_details"] + execution_successful = details["execution_successful"] + termination_reason = details["termination_reason"] + result = details["result_str"] + + if self.analysis_id == 0: + analysis = "" + else: + analysis = f" {self.analysis_id}" + + yield f"Analysis{analysis}: execution_successful: {execution_successful}" + yield f"Analysis{analysis}: termination_reason: {termination_reason}" + yield f"Analysis{analysis}: result: {result}" + + def mitre_attacks(self) -> Iterator[MitreAttack]: + mitre_attack = self.report["mitre_attack"] + techniques = mitre_attack.get("techniques", []) + + for technique in techniques: + mitre_attack = MitreAttack( + description=technique["description"], id=technique["id"] + ) + yield mitre_attack + + def sandbox_type(self) -> str: + vm_name = self.report["vm_and_analyzer_details"]["vm_name"] + sample_type = self.report["sample_details"]["sample_type"] + return f"{vm_name} | {sample_type}" + + def score(self) -> str: + vti_score = self.report["vti"]["vti_score"] + return self.to_verdict(vti_score) + + def vtis(self) -> Iterator[VTI]: + try: + vtis = self.report["vti"]["vti_rule_matches"] + except KeyError: + vtis = [] + + for vti in vtis: + new_vti = VTI( + category=vti["category_desc"], + operation=vti["operation_desc"], + technique=vti["technique_desc"], + score=vti["rule_score"], + ) + + yield new_vti + + +class SummaryV2(ReportParser): + def __init__( + self, analysis_id: int, api: VMRayRESTAPI = None, report: Dict[str, Any] = None + ): + self.analysis_id = analysis_id + + if report: + self.report = report + else: + self.api = api + data = api.call( + "GET", + f"/rest/analysis/{analysis_id}/archive/logs/summary_v2.json", + raw_data=True, + ) + self.report = json.load(data) + + def _resolve_refs( + self, data: Union[List[Dict[str, Any]], Dict[str, Any]] + ) -> Iterator[Dict[str, Any]]: + if not data: + return [] + + if isinstance(data, dict): + data = [data] + + for ref in data: + yield self._resolve_ref(ref) + + def _resolve_ref(self, data: Dict[str, Any]) -> Dict[str, Any]: + if data == {}: + return {} + + if data["_type"] != "reference" or data["source"] != "logs/summary_v2.json": + return {} + + resolved_ref = self.report + paths = data["path"] + for path_part in paths: + try: + resolved_ref = resolved_ref[path_part] + except KeyError: + return {} + + return resolved_ref + + @staticmethod + def convert_verdict(verdict: Optional[str]) -> str: + if verdict == "not_available" or not verdict: + return "n/a" + + return verdict + + def is_static_report(self) -> bool: + return self.report["vti"]["score_type"] == "static" + + def artifacts(self) -> Iterator[Artifact]: + artifacts = self.report["artifacts"] + + ref_domains = artifacts.get("ref_domains", []) + for domain in self._resolve_refs(ref_domains): + classifications = domain.get("classifications", []) + artifact = DomainArtifact( + domain=domain["domain"], + sources=domain["sources"], + is_ioc=domain["is_ioc"], + verdict=domain["verdict"], + ) + + ref_ip_addresses = domain.get("ref_ip_addresses", []) + if not ref_ip_addresses: + continue + + for ip_address in self._resolve_refs(ref_ip_addresses): + artifact.ips.append(ip_address["ip_address"]) + + yield artifact + + ref_emails = artifacts.get("ref_emails", []) + for email in self._resolve_refs(ref_emails): + sender = email.get("sender") + subject = email.get("subject") + recipients = email.get("recipients", []) + verdict = email["verdict"] + is_ioc = email["is_ioc"] + classifications = email.get("classifications", []) + + artifact = EmailArtifact( + sender=sender, + subject=subject, + recipients=recipients, + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + + yield artifact + + ref_files = artifacts.get("ref_files", []) + for file_ in self._resolve_refs(ref_files): + filenames = [] + + if "ref_filenames" in file_: + for filename in self._resolve_refs(file_["ref_filenames"]): + if not filename: + continue + filenames.append(filename["filename"]) + + artifact = FileArtifact( + operations=file_.get("operations", []), + md5=file_["hash_values"]["md5"], + sha1=file_["hash_values"]["sha1"], + sha256=file_["hash_values"]["sha256"], + ssdeep=file_["hash_values"]["ssdeep"], + imphash=None, + mimetype=file_.get("mime_type"), + filenames=filenames, + is_ioc=file_["is_ioc"], + classifications=file_.get("classifications", []), + size=file_["size"], + verdict=file_["verdict"], + ) + yield artifact + + ref_ip_addresses = artifacts.get("ref_ip_addresses", []) + for ip in self._resolve_refs(ref_ip_addresses): + classifications = ip.get("classifications", []) + verdict = ip["verdict"] + is_ioc = ip["is_ioc"] + artifact = IpArtifact( + ip=ip["ip_address"], + sources=ip["sources"], + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + ref_mutexes = artifacts.get("ref_mutexes", []) + for mutex in self._resolve_refs(ref_mutexes): + is_ioc = mutex["is_ioc"] + classifications = mutex.get("classifications", []) + artifact = MutexArtifact( + name=mutex["name"], + operations=mutex["operations"], + verdict=mutex["verdict"], + classifications=classifications, + is_ioc=is_ioc, + ) + yield artifact + + ref_processes = artifacts.get("ref_processes", []) + for process in self._resolve_refs(ref_processes): + cmd_line = process.get("cmd_line") + classifications = process.get("classifications", []) + verdict = process.get("verdict") + artifact = ProcessArtifact( + pid=process["os_pid"], + parent_pid=process["origin_monitor_id"], + filename=process["filename"], + is_ioc=process["is_ioc"], + cmd_line=cmd_line, + classifications=classifications, + verdict=verdict, + ) + + ref_registry_records = artifacts.get("ref_registry_records", []) + for reg in self._resolve_refs(ref_registry_records): + artifact = RegistryArtifact( + key=reg["reg_key_name"], + operations=reg["operations"], + is_ioc=reg["is_ioc"], + verdict=reg["verdict"], + ) + yield artifact + + url_refs = artifacts.get("ref_urls", []) + for url in self._resolve_refs(url_refs): + domain = None + ref_domain = url.get("ref_domain", {}) + if ref_domain: + domain = self._resolve_ref(ref_domain)["domain"] + + ips = [] + ref_ip_addresses = url.get("ref_ip_addresses", []) + for ip_address in self._resolve_refs(ref_ip_addresses): + ips.append(ip_address["ip_address"]) + + artifact = UrlArtifact( + url=url["url"], + operations=url["operations"], + is_ioc=url["is_ioc"], + domain=domain, + ips=ips, + verdict=url["verdict"], + ) + yield artifact + + def classifications(self) -> Optional[str]: + try: + classifications = ", ".join(self.report["classifications"]) + return f"Classifications: {classifications}" + except KeyError: + return None + + def details(self) -> Iterator[str]: + details = self.report["analysis_metadata"] + is_execution_successful = details["is_execution_successful"] + termination_reason = details["termination_reason"] + result = details["result_str"] + + yield f"Analysis {self.analysis_id}: execution_successful: {is_execution_successful}" + yield f"Analysis {self.analysis_id}: termination_reason: {termination_reason}" + yield f"Analysis {self.analysis_id}: result: {result}" + + def mitre_attacks(self) -> Iterator[MitreAttack]: + mitre_attack = self.report["mitre_attack"] + techniques = mitre_attack["v4"]["techniques"] + + for technique_id, technique in techniques.items(): + mitre_attack = MitreAttack( + description=technique["description"], + id=technique_id.replace("technique_", ""), + ) + yield mitre_attack + + def sandbox_type(self) -> str: + vm_information = self.report["virtual_machine"]["description"] + sample_type = self.report["analysis_metadata"]["sample_type"] + return f"{vm_information} | {sample_type}" + + def score(self) -> str: + verdict = self.report["analysis_metadata"]["verdict"] + return self.convert_verdict(verdict) + + def vtis(self) -> Iterator[VTI]: + if "matches" not in self.report["vti"]: + return + + vti_matches = self.report["vti"]["matches"] + for vti in vti_matches.values(): + new_vti = VTI( + category=vti["category_desc"], + operation=vti["operation_desc"], + technique=vti["technique_desc"], + score=vti["analysis_score"], + ) + + yield new_vti + + +class VMRayParser: + def __init__(self) -> None: + # required for api import + self.api: Optional[VMRayRESTAPI] = None + self.sample_id: Optional[int] = None + + # required for file import + self.report: Optional[Dict[str, Any]] = None + self.report_name: Optional[str] = None + self.include_report = False + + # required by API import and file import + self.report_version = ReportVersion.v2 + + self.use_misp_object = True + self.ignore_analysis_finished = False + self.tag_objects = True + + self.include_analysis_id = True + self.include_vti_details = True + self.include_iocs = True + self.include_all_artifacts = False + self.include_analysis_details = True + + # a new event if we use misp objects + self.event = MISPEvent() + + # new attributes if we don't use misp objects + self.attributes: List[Attribute] = [] + + def from_api(self, config: Dict[str, Any]) -> None: + url = self._read_config_key(config, "url") + api_key = self._read_config_key(config, "apikey") + + try: + self.sample_id = int(self._read_config_key(config, "Sample ID")) + except ValueError: + raise VMRayParseError("Could not convert sample id to integer.") + + self.api = VMRayRESTAPI(url, api_key, False) + + self.ignore_analysis_finished = self._config_from_string(config.get("ignore_analysis_finished")) + self._setup_optional_config(config) + self.report_version = self._get_report_version() + + def from_base64_string( + self, config: Dict[str, Any], data: str, filename: str + ) -> None: + """ read base64 encoded summary json """ + + buffer = base64.b64decode(data) + self.report = json.loads(buffer) + self.report_name = filename + + if "analysis_details" in self.report: + self.report_version = ReportVersion.v1 + elif "analysis_metadata" in self.report: + self.report_version = ReportVersion.v2 + else: + raise VMRayParseError("Uploaded file is not a summary.json") + + self._setup_optional_config(config) + self.include_report = bool(int(config.get("Attach Report", "0"))) + + def _setup_optional_config(self, config: Dict[str, Any]) -> None: + self.include_analysis_id = bool(int(config.get("Analysis ID", "1"))) + self.include_vti_details = bool(int(config.get("VTI", "1"))) + self.include_iocs = bool(int(config.get("IOCs", "1"))) + self.include_all_artifacts = bool(int(config.get("Artifacts", "0"))) + self.include_analysis_details = bool(int(config.get("Analysis Details", "1"))) + + self.use_misp_object = not self._config_from_string( + config.get("disable_misp_objects") + ) + self.tag_objects = not self._config_from_string(config.get("disable_tags")) + + @staticmethod + def _config_from_string(text: Optional[str]) -> bool: + if not text: + return False + + text = text.lower() + return text in ("yes", "true") + + @staticmethod + def _read_config_key(config: Dict[str, Any], key: str) -> str: + try: + value = config[key] + return value + except KeyError: + raise VMRayParseError(f"VMRay config is missing a value for `{key}`.") + + @staticmethod + def _analysis_score_to_taxonomies(analysis_score: int) -> Optional[str]: + mapping = { + -1: "-1", + 1: "1/5", + 2: "2/5", + 3: "3/5", + 4: "4/5", + 5: "5/5", + } + + try: + return mapping[analysis_score] + except KeyError: + return None + + def _get_report_version(self) -> ReportVersion: + info = self._vmary_api_call("/rest/system_info") + if info["version_major"] >= 4: + return ReportVersion.v2 + + # version 3.2 an less do not tag artifacts as ICOs + # so we extract all artifacts + if info["version_major"] == 3 and info["version_minor"] < 3: + self.include_all_artifacts = True + return ReportVersion.v1 + + def _vmary_api_call( + self, api_path: str, params: Dict[str, Any] = None, raw_data: bool = False + ) -> Union[Dict[str, Any], bytes]: + try: + return self.api.call("GET", api_path, params=params, raw_data=raw_data) + except (VMRayRESTAPIError, ValueError) as exc: + raise VMRayParseError(str(exc)) + + def _get_analysis(self) -> Dict[str, Any]: + return self._vmary_api_call(f"/rest/analysis/sample/{self.sample_id}") + + def _analysis_finished(self) -> bool: + result = self._vmary_api_call(f"/rest/submission/sample/{self.sample_id}") + + all_finished = [] + for submission in result: + finished = submission["submission_finished"] + all_finished.append(finished) + + return all(all_finished) + + def _online_reports(self) -> Iterator[Tuple[ReportParser, str]]: + # check if sample id exists + try: + self._vmary_api_call(f"/rest/sample/{self.sample_id}") + except VMRayRESTAPIError: + raise VMRayParseError( + f"Could not find sample id `{self.sample_id}` on server." + ) + + # check if all submission are finished + if not self.ignore_analysis_finished and not self._analysis_finished(): + raise VMRayParseError( + f"Not all analysis for `{self.sample_id}` are finished. " + "Try it again in a few minutes." + ) + + analysis_results = self._get_analysis() + for analysis in analysis_results: + analysis_id = analysis["analysis_id"] + permalink = analysis["analysis_webif_url"] + + # the summary json could not exist, due to a VM error + try: + if self.report_version == ReportVersion.v1: + report_parser = Summary(api=self.api, analysis_id=analysis_id) + else: + report_parser = SummaryV2(api=self.api, analysis_id=analysis_id) + except VMRayRESTAPIError: + continue + + yield report_parser, permalink + + def _offline_report(self) -> ReportParser: + if self.report_version == ReportVersion.v1: + analysis_id = 0 + return Summary(report=self.report, analysis_id=analysis_id) + else: + analysis_id = self.report["analysis_metadata"]["analysis_id"] + return SummaryV2(report=self.report, analysis_id=analysis_id) + + def _reports(self) -> Iterator[Tuple[ReportParser, Optional[str]]]: + if self.report: + yield self._offline_report(), None + else: + yield from self._online_reports() + + def _get_sample_verdict(self) -> Optional[str]: + if self.report: + if self.report_version == ReportVersion.v2: + verdict = SummaryV2.convert_verdict( + self.report["analysis_metadata"]["verdict"] + ) + return verdict + return None + + data = self._vmary_api_call(f"/rest/sample/{self.sample_id}") + if "sample_verdict" in data: + verdict = SummaryV2.convert_verdict(data["sample_verdict"]) + return verdict + + if "sample_severity" in data: + verdict = Summary.to_verdict(data["sample_severity"]) + return verdict + + return None + + def parse(self) -> None: + """ Convert analysis results to MISP Objects """ + + if self.use_misp_object: + self.parse_as_misp_object() + else: + self.parse_as_attributes() + + def parse_as_attributes(self) -> None: + """ + Parse report as attributes + This method is compatible with the implementation provided + by Koen Van Impe + """ + + for report, permalink in self._reports(): + if report.is_static_report(): + continue + + if self.include_analysis_details: + for detail in report.details(): + attr = Attribute(type="text", value=detail) + self.attributes.append(attr) + + classifications = report.classifications() + if classifications: + attr = Attribute(type="text", value=classifications) + self.attributes.append(attr) + + if self.include_vti_details: + for vti in report.vtis(): + attr = Attribute(type="text", value=vti.operation) + self.attributes.append(attr) + + for artifact in report.artifacts(): + if self.include_all_artifacts or ( + self.include_iocs and artifact.is_ioc + ): + for attr in artifact.to_attributes(): + self.attributes.append(attr) + + if self.include_analysis_id and permalink: + attr = Attribute(type="link", value=permalink) + self.attributes.append(attr) + + def parse_as_misp_object(self): + mitre_attacks = [] + vtis = [] + artifacts = [] + + # add sandbox signature + sb_sig = MISPObject(name="sb-signature") + sb_sig.add_attribute("software", "VMRay Platform") + + for report, permalink in self._reports(): + if report.is_static_report(): + continue + + # create sandbox object + obj = MISPObject(name="sandbox-report") + obj.add_attribute("on-premise-sandbox", "vmray") + + if permalink: + obj.add_attribute("permalink", permalink) + + if self.include_report and self.report: + report_data = base64.b64encode( + json.dumps(self.report, indent=2).encode("utf-8") + ).decode("utf-8") + obj.add_attribute( + "sandbox-file", value=self.report_name, data=report_data + ) + + score = report.score() + attr_score = obj.add_attribute("score", score) + + if self.tag_objects: + attr_score.add_tag(f'vmray:verdict="{score}"') + + sandbox_type = report.sandbox_type() + obj.add_attribute("sandbox-type", sandbox_type) + + classifications = report.classifications() + if classifications: + obj.add_attribute("results", classifications) + + self.event.add_object(obj) + + if self.include_vti_details: + for vti in report.vtis(): + if vti not in vtis: + vtis.append(vti) + + for artifact in report.artifacts(): + if self.include_all_artifacts or ( + self.include_iocs and artifact.is_ioc + ): + if artifact not in artifacts: + artifacts.append(artifact) + else: + idx = artifacts.index(artifact) + dup = artifacts[idx] + dup.merge(artifact) + + for mitre_attack in report.mitre_attacks(): + if mitre_attack not in mitre_attacks: + mitre_attacks.append(mitre_attack) + + # process VTI's + for vti in vtis: + vti_text = f"{vti.category}: {vti.operation}. {vti.technique}" + vti_attr = sb_sig.add_attribute("signature", value=vti_text) + + if self.tag_objects: + value = self._analysis_score_to_taxonomies(vti.score) + if value: + vti_attr.add_tag(f'vmray:vti_analysis_score="{value}"') + + self.event.add_object(sb_sig) + + # process artifacts + for artifact in artifacts: + artifact_obj = artifact.to_misp_object(self.tag_objects) + self.event.add_object(artifact_obj) + + # tag event with Mitre Att&ck + for mitre_attack in mitre_attacks: + self.event.add_tag(mitre_attack.to_misp_galaxy()) + + # tag event + if self.tag_objects: + verdict = self._get_sample_verdict() + if verdict: + self.event.add_tag(f'vmray:verdict="{verdict}"') + + def to_json(self) -> Dict[str, Any]: + """ Convert parsed results into JSON """ + + if not self.use_misp_object: + results = [] + + # remove duplicates + for attribute in self.attributes: + if attribute not in results: + results.append(asdict(attribute)) + + # add attributes to event + for attribute in results: + self.event.add_attribute(**attribute) + + self.event.run_expansions() + event = json.loads(self.event.to_json()) + + return {"results": event} diff --git a/misp_modules/modules/import_mod/_vmray/vmray_rest_api.py b/misp_modules/lib/_vmray/rest_api.py similarity index 100% rename from misp_modules/modules/import_mod/_vmray/vmray_rest_api.py rename to misp_modules/lib/_vmray/rest_api.py diff --git a/misp_modules/modules/expansion/_vmray/vmray_rest_api.py b/misp_modules/modules/expansion/_vmray/vmray_rest_api.py deleted file mode 100644 index 4d5245b..0000000 --- a/misp_modules/modules/expansion/_vmray/vmray_rest_api.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -"""Python client library for VMRay REST API""" - -import base64 -import datetime -import os.path -import requests -import urllib.parse - -# disable nasty certification warning -# pylint: disable=no-member -try: - requests.packages.urllib3.disable_warnings() -except AttributeError: - try: - import urllib3 - try: - urllib3.disable_warnings() - except AttributeError: - pass - except ImportError: - pass - -# pylint: disable= - - -class VMRayRESTAPIError(Exception): - """Exception class that is used when API returns an error""" - - def __init__(self, *args, **kwargs): - self.status_code = kwargs.pop("status_code", None) - Exception.__init__(self, *args, **kwargs) - - -def handle_rest_api_result(result): - """Handle result of API request (check for errors)""" - - if (result.status_code < 200) or (result.status_code > 299): - try: - json_result = result.json() - except ValueError: - raise VMRayRESTAPIError("API returned error %u: %s" % (result.status_code, result.text), status_code=result.status_code) - - raise VMRayRESTAPIError(json_result.get("error_msg", "Unknown error"), status_code=result.status_code) - - -class VMRayRESTAPI(object): - """VMRay REST API class""" - - def __init__(self, server, api_key, verify_cert=True): - # split server URL into components - url_desc = urllib.parse.urlsplit(server) - - # assume HTTPS if no scheme is specified - if url_desc.scheme == "": - server = "https://" + server - - # save variables - self.server = server - self.api_key = api_key - self.verify_cert = verify_cert - - def call(self, http_method, api_path, params=None, raw_data=False): - """Call VMRay REST API""" - - # get function of requests package - requests_func = getattr(requests, http_method.lower()) - - # parse parameters - req_params = {} - file_params = {} - - if params is not None: - for key, value in params.items(): - if isinstance(value, (datetime.date, - datetime.datetime, - float, - int)): - req_params[key] = str(value) - elif isinstance(value, str): - req_params[key] = str(value) - elif isinstance(value, dict): - filename = value["filename"] - sample = value["data"] - file_params[key] = (filename, sample, "application/octet-stream") - elif hasattr(value, "read"): - filename = os.path.split(value.name)[1] - # For the following block refer to DEV-1820 - try: - filename.decode("ASCII") - except (UnicodeDecodeError, UnicodeEncodeError): - b64_key = key + "name_b64enc" - byte_value = filename.encode("utf-8") - b64_value = base64.b64encode(byte_value) - - filename = "@param=%s" % b64_key - req_params[b64_key] = b64_value - file_params[key] = (filename, value, "application/octet-stream") - else: - raise VMRayRESTAPIError("Parameter \"%s\" has unknown type \"%s\"" % (key, type(value))) - - # construct request - if file_params: - files = file_params - else: - files = None - - # we need to adjust some stuff for POST requests - if http_method.lower() == "post": - req_data = req_params - req_params = None - else: - req_data = None - - # do request - result = requests_func(self.server + api_path, data=req_data, params=req_params, headers={"Authorization": "api_key " + self.api_key}, files=files, verify=self.verify_cert, stream=raw_data) - handle_rest_api_result(result) - - if raw_data: - return result.raw - - # parse result - try: - json_result = result.json() - except ValueError: - raise ValueError("API returned invalid JSON: %s" % (result.text)) - - # if there are no cached elements then return the data - if "continuation_id" not in json_result: - return json_result.get("data", None) - - data = json_result["data"] - - # get cached results - while "continuation_id" in json_result: - # send request to server - result = requests.get("%s/rest/continuation/%u" % (self.server, json_result["continuation_id"]), headers={"Authorization": "api_key " + self.api_key}, verify=self.verify_cert) - handle_rest_api_result(result) - - # parse result - try: - json_result = result.json() - except ValueError: - raise ValueError("API returned invalid JSON: %s" % (result.text)) - - data.extend(json_result["data"]) - - return data diff --git a/misp_modules/modules/expansion/vmray_submit.py b/misp_modules/modules/expansion/vmray_submit.py index 1c0d553..02a4a44 100644 --- a/misp_modules/modules/expansion/vmray_submit.py +++ b/misp_modules/modules/expansion/vmray_submit.py @@ -19,7 +19,7 @@ from distutils.util import strtobool import io import zipfile -from ._vmray.vmray_rest_api import VMRayRESTAPI +from _vmray.vmray_rest_api import VMRayRESTAPI misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment', 'malware-sample'], 'output': ['text', 'sha1', 'sha256', 'md5', 'link']} diff --git a/misp_modules/modules/import_mod/_vmray/__init__.py b/misp_modules/modules/import_mod/_vmray/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/misp_modules/modules/import_mod/vmray_import.py b/misp_modules/modules/import_mod/vmray_import.py index 824c970..8385634 100644 --- a/misp_modules/modules/import_mod/vmray_import.py +++ b/misp_modules/modules/import_mod/vmray_import.py @@ -6,8 +6,6 @@ Import VMRay results. This version supports import from different analyze jobs, starting from one sample (the supplied sample_id). -Requires "vmray_rest_api" - The expansion module vmray_submit and import module vmray_import are a two step process to import data from VMRay. You can automate this by setting the PyMISP example script 'vmray_automation' @@ -17,378 +15,72 @@ as a cron job import json -from ._vmray.vmray_rest_api import VMRayRESTAPI +from _vmray.parser import VMRayParser, VMRayParseError + misperrors = {'error': 'Error'} -inputSource = [] -moduleinfo = {'version': '0.2', 'author': 'Koen Van Impe', - 'description': 'Import VMRay results', + +moduleinfo = {'version': '0.4', 'author': 'Jens Thom (VMRay), Koen van Impe', + 'description': 'Import VMRay analysis results from a server', 'module-type': ['import']} -userConfig = {'include_analysisid': {'type': 'Boolean', - 'message': 'Include link to VMRay analysis' - }, - 'include_analysisdetails': {'type': 'Boolean', - 'message': 'Include (textual) analysis details' - }, - 'include_vtidetails': {'type': 'Boolean', - 'message': 'Include VMRay Threat Identifier (VTI) rules' - }, - 'include_imphash_ssdeep': {'type': 'Boolean', - 'message': 'Include imphash and ssdeep' - }, - 'include_extracted_files': {'type': 'Boolean', - 'message': 'Include extracted files section' - }, - 'sample_id': {'type': 'Integer', - 'errorMessage': 'Expected a sample ID', - 'message': 'The VMRay sample_id' - } - } +mispattributes = { + 'inputSource': [], + 'output': ['MISP objects'], + 'format': 'misp_standard', +} -moduleconfig = ['apikey', 'url', 'wait_period'] +userConfig = { + "Sample ID": { + "type": "Integer", + "errorMessage": "The VMRay sample ID to download the reports", + }, + "VTI": { + "type": "Boolean", + "message": "Include VMRay Threat Identifiers", + "checked": "True" + }, + "IOCs": { + "type": "Boolean", + "message": "Include IOCs", + "checked": "True" + }, + "Artifacts": { + "type": "Boolean", + "message": "Include other Artifacts", + }, + "Analysis Details": { + "type": "Boolean", + "message": "Include Analysis Details", + "checked": "True" + } +} + +moduleconfig = ["apikey", "url", "disable_tags", "disable_misp_objects", "ignore_analysis_finished"] def handler(q=False): - global include_analysisid, include_imphash_ssdeep, include_extracted_files, include_analysisdetails, include_vtidetails, include_static_to_ids - if q is False: return False request = json.loads(q) - include_analysisid = bool(int(request["config"].get("include_analysisid"))) - include_imphash_ssdeep = bool(int(request["config"].get("include_imphash_ssdeep"))) - include_extracted_files = bool(int(request["config"].get("include_extracted_files"))) - include_analysisdetails = bool(int(request["config"].get("include_extracted_files"))) - include_vtidetails = bool(int(request["config"].get("include_vtidetails"))) - include_static_to_ids = True - - # print("include_analysisid: %s include_imphash_ssdeep: %s include_extracted_files: %s include_analysisdetails: %s include_vtidetails: %s" % ( include_analysisid, include_imphash_ssdeep, include_extracted_files, include_analysisdetails, include_vtidetails)) - - sample_id = int(request["config"].get("sample_id")) - - if (request["config"].get("apikey") is None) or (request["config"].get("url") is None): - misperrors["error"] = "Missing API key or server URL (hint: try cloud.vmray.com)" + parser = VMRayParser() + try: + parser.from_api(request["config"]) + parser.parse() + except VMRayParseError as exc: + misperrors["error"] = str(exc) return misperrors - if sample_id > 0: - try: - api = VMRayRESTAPI(request["config"].get("url"), request["config"].get("apikey"), False) - vmray_results = {'results': []} - - # Get all information on the sample, returns a set of finished analyze jobs - data = vmrayGetInfoAnalysis(api, sample_id) - if data["data"]: - for analysis in data["data"]: - analysis_id = int(analysis["analysis_id"]) - if analysis_id > 0: - # Get the details for an analyze job - analysis_data = vmrayDownloadAnalysis(api, analysis_id) - - if analysis_data: - if include_analysisdetails and "analysis_details" in analysis_data: - analysis_details = vmrayAnalysisDetails(analysis_data["analysis_details"], analysis_id) - if analysis_details and len(analysis_details["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + analysis_details["results"]} - - if "classifications" in analysis_data: - classifications = vmrayClassifications(analysis_data["classifications"], analysis_id) - if classifications and len(classifications["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + classifications["results"]} - - if include_extracted_files and "extracted_files" in analysis_data: - extracted_files = vmrayExtractedfiles(analysis_data["extracted_files"]) - if extracted_files and len(extracted_files["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + extracted_files["results"]} - - if include_vtidetails and "vti" in analysis_data: - vti = vmrayVti(analysis_data["vti"]) - if vti and len(vti["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + vti["results"]} - - if "artifacts" in analysis_data: - artifacts = vmrayArtifacts(analysis_data["artifacts"]) - if artifacts and len(artifacts["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + artifacts["results"]} - - if include_analysisid: - a_id = {'results': []} - url1 = request["config"].get("url") + "/user/analysis/view?from_sample_id=%u" % sample_id - url2 = "&id=%u" % analysis_id - url3 = "&sub=%2Freport%2Foverview.html" - a_id["results"].append({"values": url1 + url2 + url3, "types": "link"}) - vmray_results = {'results': vmray_results["results"] + a_id["results"]} - - # Clean up (remove doubles) - if len(vmray_results["results"]) > 0: - vmray_results = vmrayCleanup(vmray_results) - return vmray_results - else: - misperrors['error'] = "No vti_results returned or jobs not finished" - return misperrors - else: - if "result" in data: - if data["result"] == "ok": - return vmray_results - - # Fallback - misperrors['error'] = "Unable to fetch sample id %u" % (sample_id) - return misperrors - except Exception as e: # noqa - misperrors['error'] = "Unable to access VMRay API : %s" % (e) - return misperrors - else: - misperrors['error'] = "Not a valid sample id" - return misperrors + event = parser.to_json() + return event def introspection(): - modulesetup = {} - try: - userConfig - modulesetup['userConfig'] = userConfig - except NameError: - pass - try: - inputSource - modulesetup['inputSource'] = inputSource - except NameError: - pass - return modulesetup + mispattributes["userConfig"] = userConfig + return mispattributes def version(): moduleinfo['config'] = moduleconfig return moduleinfo - - -def vmrayGetInfoAnalysis(api, sample_id): - ''' Get information from a sample, returns a set of analyzed reports''' - - if sample_id: - data = api.call("GET", "/rest/analysis/sample/%u" % (sample_id), raw_data=True) - return json.loads(data.read().decode()) - else: - return False - - -def vmrayDownloadAnalysis(api, analysis_id): - ''' Get the details from an analysis''' - if analysis_id: - try: - data = api.call("GET", "/rest/analysis/%u/archive/logs/summary.json" % (analysis_id), raw_data=True) - return json.loads(data.read().decode()) - except Exception as e: # noqa - misperrors['error'] = "Unable to download summary.json for analysis %s" % (analysis_id) - return misperrors - else: - return False - - -def vmrayVti(vti): - '''VMRay Threat Identifier (VTI) rules that matched for this analysis''' - - if vti: - r = {'results': []} - for rule in vti: - if rule == "vti_rule_matches": - vti_rule = vti["vti_rule_matches"] - for el in vti_rule: - if "operation_desc" in el: - comment = "" - types = ["text"] - values = el["operation_desc"] - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayExtractedfiles(extracted_files): - ''' Information about files which were extracted during the analysis, such as files that were created, modified, or embedded by the malware''' - - if extracted_files: - r = {'results': []} - - for file in extracted_files: - if "file_type" and "norm_filename" in file: - comment = "%s - %s" % (file["file_type"], file["norm_filename"]) - else: - comment = "" - - if "norm_filename" in file: - attr_filename_c = file["norm_filename"].rsplit("\\", 1) - if len(attr_filename_c) > 1: - attr_filename = attr_filename_c[len(attr_filename_c) - 1] - else: - attr_filename = "vmray_sample" - else: - attr_filename = "vmray_sample" - - if "md5_hash" in file and file["md5_hash"] is not None: - r['results'].append({'types': ["filename|md5"], 'values': '{}|{}'.format(attr_filename, file["md5_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "imp_hash" in file and file["imp_hash"] is not None: - r['results'].append({'types': ["filename|imphash"], 'values': '{}|{}'.format(attr_filename, file["imp_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha1_hash" in file and file["sha1_hash"] is not None: - r['results'].append({'types': ["filename|sha1"], 'values': '{}|{}'.format(attr_filename, file["sha1_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha256_hash" in file and file["sha256_hash"] is not None: - r['results'].append({'types': ["filename|sha256"], 'values': '{}|{}'.format(attr_filename, file["sha256_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "ssdeep_hash" in file and file["ssdeep_hash"] is not None: - r['results'].append({'types': ["filename|ssdeep"], 'values': '{}|{}'.format(attr_filename, file["ssdeep_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - - return r - - else: - return False - - -def vmrayClassifications(classification, analysis_id): - ''' List the classifications, tag them on a "text" attribute ''' - - if classification: - r = {'results': []} - types = ["text"] - comment = "" - values = "Classification : %s " % (", ".join(str(x) for x in classification)) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayAnalysisDetails(details, analysis_id): - ''' General information about the analysis information ''' - - if details: - r = {'results': []} - types = ["text"] - comment = "" - if "execution_successful" in details: - values = "Analysis %s : execution_successful : %s " % (analysis_id, str(details["execution_successful"])) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - if "termination_reason" in details: - values = "Analysis %s : termination_reason : %s " % (analysis_id, str(details["termination_reason"])) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - if "result_str" in details: - values = "Analysis %s : result : %s " % (analysis_id, details["result_str"]) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayArtifacts(patterns): - ''' IOCs that were seen during the analysis ''' - - if patterns: - r = {'results': []} - y = {'results': []} - - for pattern in patterns: - if pattern == "domains": - for el in patterns[pattern]: - values = el["domain"] - types = ["domain", "hostname"] - if "sources" in el: - sources = el["sources"] - comment = "Found in: " + ", ".join(str(x) for x in sources) - else: - comment = "" - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "files": - for el in patterns[pattern]: - filename_values = el["filename"] - attr_filename_c = filename_values.rsplit("\\", 1) - if len(attr_filename_c) > 1: - attr_filename = attr_filename_c[len(attr_filename_c) - 1] - else: - attr_filename = "" - filename_types = ["filename"] - filename_operations = el["operations"] - comment = "File operations: " + ", ".join(str(x) for x in filename_operations) - r['results'].append({'types': filename_types, 'values': filename_values, 'comment': comment}) - - # Run through all hashes - if "hashes" in el: - for hash in el["hashes"]: - if "md5_hash" in hash and hash["md5_hash"] is not None: - r['results'].append({'types': ["filename|md5"], 'values': '{}|{}'.format(attr_filename, hash["md5_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "imp_hash" in hash and hash["imp_hash"] is not None: - r['results'].append({'types': ["filename|imphash"], 'values': '{}|{}'.format(attr_filename, hash["imp_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha1_hash" in hash and hash["sha1_hash"] is not None: - r['results'].append({'types': ["filename|sha1"], 'values': '{}|{}'.format(attr_filename, hash["sha1_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha256_hash" in hash and hash["sha256_hash"] is not None: - r['results'].append({'types': ["filename|sha256"], 'values': '{}|{}'.format(attr_filename, hash["sha256_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "ssdeep_hash" in hash and hash["ssdeep_hash"] is not None: - r['results'].append({'types': ["filename|ssdeep"], 'values': '{}|{}'.format(attr_filename, hash["ssdeep_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if pattern == "ips": - for el in patterns[pattern]: - values = el["ip_address"] - types = ["ip-dst"] - if "sources" in el: - sources = el["sources"] - comment = "Found in: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "mutexes": - for el in patterns[pattern]: - values = el["mutex_name"] - types = ["mutex"] - if "operations" in el: - sources = el["operations"] - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "registry": - for el in patterns[pattern]: - values = el["reg_key_name"] - types = ["regkey"] - include_static_to_ids_tmp = include_static_to_ids - if "operations" in el: - sources = el["operations"] - if sources == ["access"]: - include_static_to_ids_tmp = False - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids_tmp}) - if pattern == "urls": - for el in patterns[pattern]: - values = el["url"] - types = ["url"] - if "operations" in el: - sources = el["operations"] - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - - # Remove doubles - for el in r["results"]: - if el not in y["results"]: - y["results"].append(el) - return y - - else: - return False - - -def vmrayCleanup(x): - ''' Remove doubles''' - y = {'results': []} - for el in x["results"]: - if el not in y["results"]: - y["results"].append(el) - return y diff --git a/misp_modules/modules/import_mod/vmray_summary_json_import.py b/misp_modules/modules/import_mod/vmray_summary_json_import.py new file mode 100644 index 0000000..e7f4985 --- /dev/null +++ b/misp_modules/modules/import_mod/vmray_summary_json_import.py @@ -0,0 +1,80 @@ +import json + +from _vmray.parser import VMRayParser, VMRayParseError + + +misperrors = {'error': 'Error'} + +moduleconfig = ["disable_tags"] + +moduleinfo = { + "version": "0.1", + "author": "VMRay", + "description": "Import a VMRay Summary JSON report.", + "module-type": ["import"], +} + +mispattributes = { + "inputSource": ["file"], + "output": ["MISP objects", "MISP attributes"], + "format": "misp_standard", +} + +user_config = { + "Analysis ID": { + "type": "Boolean", + "message": "Include Analysis ID", + "checked": "True" + }, + "VTI": { + "type": "Boolean", + "message": "Include VMRay Threat Identifiers", + "checked": "True" + }, + "IOCs": { + "type": "Boolean", + "message": "Include IOCs", + "checked": "True" + }, + "Artifacts": { + "type": "Boolean", + "message": "Include other Artifacts", + }, + "Analysis Details": { + "type": "Boolean", + "message": "Include Analysis Details", + }, + "Attach Report": { + "type": "Boolean", + "message": "Include the original imported file as attachment", + } +} + + +def handler(q=False): + # In case there's no data + if q is False: + return False + + q = json.loads(q) + + parser = VMRayParser() + try: + parser.from_base64_string(q["config"], q["data"], q["filename"]) + parser.parse() + except VMRayParseError as exc: + misperrors["error"] = str(exc) + return misperrors + + event = parser.to_json() + return event + + +def introspection(): + mispattributes["userConfig"] = user_config + return mispattributes + + +def version(): + moduleinfo["config"] = moduleconfig + return moduleinfo From 9dd120b0cf8a119091b82ab8bf2fc1cb18b54fb4 Mon Sep 17 00:00:00 2001 From: Jens Thom Date: Mon, 30 Nov 2020 12:24:35 +0100 Subject: [PATCH 082/476] resolve merge conflict --- REQUIREMENTS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index cf71c6b..9195737 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -58,16 +58,10 @@ jsonschema==3.2.0 lief==0.10.1 lxml==4.6.2 maclookup==1.0.3 -<<<<<<< HEAD -markdownify==0.5.3 -maxminddb==2.0.2; python_version >= '3.6' -multidict==4.7.6; python_version >= '3.5' -======= mail-parser==3.14.0 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' multidict==5.0.2; python_version >= '3.5' ->>>>>>> upstream/main np==1.0.2 numpy==1.19.4; python_version >= '3.6' oauth2==1.9.0.post1 From 0e4e432dc42985d1c6d6d77191d7a208ec318ac6 Mon Sep 17 00:00:00 2001 From: Jens Thom Date: Mon, 30 Nov 2020 12:48:01 +0100 Subject: [PATCH 083/476] fix imports and unused variables --- misp_modules/lib/_vmray/parser.py | 3 +++ misp_modules/modules/expansion/__init__.py | 1 - misp_modules/modules/import_mod/__init__.py | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/misp_modules/lib/_vmray/parser.py b/misp_modules/lib/_vmray/parser.py index 0c0cb24..6e8d375 100644 --- a/misp_modules/lib/_vmray/parser.py +++ b/misp_modules/lib/_vmray/parser.py @@ -709,6 +709,7 @@ class Summary(ReportParser): verdict=verdict, is_ioc=is_ioc, ) + yield artifact registry = artifacts.get("registry", []) for reg in registry: @@ -860,6 +861,7 @@ class SummaryV2(ReportParser): artifact = DomainArtifact( domain=domain["domain"], sources=domain["sources"], + classifications=classifications, is_ioc=domain["is_ioc"], verdict=domain["verdict"], ) @@ -960,6 +962,7 @@ class SummaryV2(ReportParser): classifications=classifications, verdict=verdict, ) + yield artifact ref_registry_records = artifacts.get("ref_registry_records", []) for reg in self._resolve_refs(ref_registry_records): diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index b6f05ef..2723736 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -1,4 +1,3 @@ -from . import _vmray # noqa import os import sys diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index fbad911..694a434 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -1,4 +1,3 @@ -from . import _vmray # noqa import os import sys sys.path.append('{}/lib'.format('/'.join((os.path.realpath(__file__)).split('/')[:-3]))) From bad538653d304086c6940f72df12f91f3112d223 Mon Sep 17 00:00:00 2001 From: Jesse Hedden Date: Fri, 4 Dec 2020 11:59:57 -0800 Subject: [PATCH 084/476] added more explicit error messages for indicators that return no enrichment data --- misp_modules/modules/expansion/trustar_enrich.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 1724441..b7ee2a4 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -195,12 +195,16 @@ def handler(q=False): try: metadata = trustar_parser.ts_client.get_indicators_metadata([Indicator(value=attribute['value'])])[0] + except IndexError: + misperrors['error'] += f" -- No metadata found for indicator {attribute['value']}" except Exception as e: misperrors['error'] += f" -- Could not retrieve indicator metadata from TruSTAR {e}" try: summary = list( trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE))[0] + except IndexError: + misperrors['error'] += f" -- No summary data found for indicator {attribute['value']}" except Exception as e: misperrors['error'] += f" -- Unable to retrieve TruSTAR summary data: {e}" From 778c9980c4a3990c91441bf3b71c539f02a26d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Fri, 4 Dec 2020 21:53:28 +0100 Subject: [PATCH 085/476] chg: Bump requirements --- Pipfile.lock | 250 ++++++++++++++++++++------------------------------- REQUIREMENTS | 18 ++-- 2 files changed, 105 insertions(+), 163 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 40fd98e..b0e069b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -157,12 +157,14 @@ "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", + "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", + "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", @@ -246,14 +248,6 @@ ], "version": "==3.2.1" }, - "dataclasses": { - "hashes": [ - "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", - "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" - ], - "markers": "python_version < '3.7'", - "version": "==0.8" - }, "decorator": { "hashes": [ "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", @@ -354,25 +348,9 @@ "hashes": [ "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" ], - "index": "pypi", "markers": "python_version < '3.7'", "version": "==1.1.0" }, - "importlib": { - "hashes": [ - "sha256:b6ee7066fea66e35f8d0acee24d98006de1a0a8a94a8ce6efe73a9a23c8d9826" - ], - "markers": "python_version < '3.8'", - "version": "==1.0.4" - }, - "importlib-metadata": { - "hashes": [ - "sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175", - "sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099" - ], - "markers": "python_version < '3.8'", - "version": "==3.1.0" - }, "isodate": { "hashes": [ "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", @@ -498,46 +476,46 @@ }, "multidict": { "hashes": [ - "sha256:060d68ae3e674c913ec41a464916f12c4d7ff17a3a9ebbf37ba7f2c681c2b33e", - "sha256:06f39f0ddc308dab4e5fa282d145f90cd38d7ed75390fc83335636909a9ec191", - "sha256:17847fede1aafdb7e74e01bb34ab47a1a1ea726e8184c623c45d7e428d2d5d34", - "sha256:1cd102057b09223b919f9447c669cf2efabeefb42a42ae6233f25ffd7ee31a79", - "sha256:20cc9b2dd31761990abff7d0e63cd14dbfca4ebb52a77afc917b603473951a38", - "sha256:2576e30bbec004e863d87216bc34abe24962cc2e964613241a1c01c7681092ab", - "sha256:2ab9cad4c5ef5c41e1123ed1f89f555aabefb9391d4e01fd6182de970b7267ed", - "sha256:359ea00e1b53ceef282232308da9d9a3f60d645868a97f64df19485c7f9ef628", - "sha256:3e61cc244fd30bd9fdfae13bdd0c5ec65da51a86575ff1191255cae677045ffe", - "sha256:43c7a87d8c31913311a1ab24b138254a0ee89142983b327a2c2eab7a7d10fea9", - "sha256:4a3f19da871befa53b48dd81ee48542f519beffa13090dc135fffc18d8fe36db", - "sha256:4df708ef412fd9b59b7e6c77857e64c1f6b4c0116b751cb399384ec9a28baa66", - "sha256:59182e975b8c197d0146a003d0f0d5dc5487ce4899502061d8df585b0f51fba2", - "sha256:6128d2c0956fd60e39ec7d1c8f79426f0c915d36458df59ddd1f0cff0340305f", - "sha256:6168839491a533fa75f3f5d48acbb829475e6c7d9fa5c6e245153b5f79b986a3", - "sha256:62abab8088704121297d39c8f47156cb8fab1da731f513e59ba73946b22cf3d0", - "sha256:653b2bbb0bbf282c37279dd04f429947ac92713049e1efc615f68d4e64b1dbc2", - "sha256:6566749cd78cb37cbf8e8171b5cd2cbfc03c99f0891de12255cf17a11c07b1a3", - "sha256:76cbdb22f48de64811f9ce1dd4dee09665f84f32d6a26de249a50c1e90e244e0", - "sha256:8efcf070d60fd497db771429b1c769a3783e3a0dd96c78c027e676990176adc5", - "sha256:8fa4549f341a057feec4c3139056ba73e17ed03a506469f447797a51f85081b5", - "sha256:9380b3f2b00b23a4106ba9dd022df3e6e2e84e1788acdbdd27603b621b3288df", - "sha256:9ed9b280f7778ad6f71826b38a73c2fdca4077817c64bc1102fdada58e75c03c", - "sha256:a7b8b5bd16376c8ac2977748bd978a200326af5145d8d0e7f799e2b355d425b6", - "sha256:af271c2540d1cd2a137bef8d95a8052230aa1cda26dd3b2c73d858d89993d518", - "sha256:b561e76c9e21402d9a446cdae13398f9942388b9bff529f32dfa46220af54d00", - "sha256:b82400ef848bbac6b9035a105ac6acaa1fb3eea0d164e35bbb21619b88e49fed", - "sha256:b98af08d7bb37d3456a22f689819ea793e8d6961b9629322d7728c4039071641", - "sha256:c58e53e1c73109fdf4b759db9f2939325f510a8a5215135330fe6755921e4886", - "sha256:cbabfc12b401d074298bfda099c58dfa5348415ae2e4ec841290627cb7cb6b2e", - "sha256:d4a6fb98e9e9be3f7d70fd3e852369c00a027bd5ed0f3e8ade3821bcad257408", - "sha256:d99da85d6890267292065e654a329e1d2f483a5d2485e347383800e616a8c0b1", - "sha256:e58db0e0d60029915f7fc95a8683fa815e204f2e1990f1fb46a7778d57ca8c35", - "sha256:e5bf89fe57f702a046c7ec718fe330ed50efd4bcf74722940db2eb0919cddb1c", - "sha256:f612e8ef8408391a4a3366e3508bab8ef97b063b4918a317cb6e6de4415f01af", - "sha256:f65a2442c113afde52fb09f9a6276bbc31da71add99dc76c3adf6083234e07c6", - "sha256:fa0503947a99a1be94f799fac89d67a5e20c333e78ddae16e8534b151cdc588a" + "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", + "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93", + "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632", + "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656", + "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79", + "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7", + "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d", + "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5", + "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224", + "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26", + "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea", + "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348", + "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6", + "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76", + "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1", + "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f", + "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952", + "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a", + "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37", + "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9", + "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359", + "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8", + "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da", + "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3", + "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d", + "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf", + "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841", + "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d", + "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93", + "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f", + "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647", + "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635", + "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456", + "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda", + "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5", + "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", + "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" ], - "markers": "python_version >= '3.5'", - "version": "==5.0.2" + "markers": "python_version >= '3.6'", + "version": "==5.1.0" }, "np": { "hashes": [ @@ -908,7 +886,7 @@ "pdfexport" ], "git": "https://github.com/MISP/PyMISP.git", - "ref": "fe91e10cedb4660b58dcc0db7833c46a5b0efeb9" + "ref": "649e068fd8272977ad5a434759c5db4dad8317e7" }, "pyonyphe": { "editable": true, @@ -917,10 +895,10 @@ }, "pyopenssl": { "hashes": [ - "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504", - "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507" + "sha256:898aefbde331ba718570244c3b01dcddb1b31a3b336613436a45e52e27d9a82d", + "sha256:92f08eccbd73701cf744e8ffd6989aa7842d48cbe3fea8a7c031c5647f590ac5" ], - "version": "==19.1.0" + "version": "==20.0.0" }, "pyparsing": { "hashes": [ @@ -982,10 +960,10 @@ }, "python-engineio": { "hashes": [ - "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b", - "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6" + "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", + "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" ], - "version": "==3.13.2" + "version": "==3.14.2" }, "python-magic": { "hashes": [ @@ -1006,10 +984,10 @@ "client" ], "hashes": [ - "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a", - "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522" + "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", + "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" ], - "version": "==4.6.0" + "version": "==4.6.1" }, "python-utils": { "hashes": [ @@ -1077,49 +1055,49 @@ }, "reportlab": { "hashes": [ - "sha256:06be7f04a631f02cd0202f7dee0d3e61dc265223f4ff861525ed7784b5552540", - "sha256:0a788a537c48915eda083485b59ac40ac012fa7c43070069bde6eb5ea588313c", - "sha256:1a7a38810e79653d0ea8e61db4f0517ac2a0e76edd2497cf6d4969dd3be30030", - "sha256:22301773db730545b44d4c77d8f29baf5683ccabec9883d978e8b8eda6d2175f", - "sha256:2906321b3d2779faafe47e2c13f9c69e1fb4ddb907f5a49cab3f9b0ea95df1f5", - "sha256:2d65f9cc5c0d3f63b5d024e6cf92234f1ab1f267cc9e5a847ab5d3efe1c3cf3e", - "sha256:2e012f7b845ef9f1f5bd63461d5201fa624b019a65ff5a93d0002b4f915bbc89", - "sha256:31ccfdbf5bb5ec85f0397661085ce4c9e52537ca0d2bf4220259666a4dcc55c2", - "sha256:3e10bd20c8ada9f7e1113157aa73b8e0048f2624e74794b73799c3deb13d7a3f", - "sha256:440d5f86c2b822abdb7981d691a78bdcf56f4710174830283034235ab2af2969", - "sha256:4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53", - "sha256:59659ee8897950fd1acd41a9cc61f4afdfda52dc2bb69a1924ce68089491849d", - "sha256:6216b11313467989ac9d9578ea3756d0af46e97184ee4e11a6b7ef652458f70d", - "sha256:6268a9a3d75e714b22beeb7687270956b06b232ccfdf37b1c6462961eab04457", - "sha256:6b226830f80df066d5986a3fdb3eb4d1b6320048f3d9ade539a6c03a5bc8b3ec", - "sha256:6e10eba6a0e330096f4200b18824b3194c399329b7830e34baee1c04ea07f99f", - "sha256:6e224c16c3d6fafdb2fb67b33c4b84d984ec34869834b3a137809f2fe5b84778", - "sha256:7da162fa677b90bd14f19b20ff80fec18c24a31ac44e5342ba49e198b13c4f92", - "sha256:8406e960a974a65b765c9ff74b269aa64718b4af1e8c511ebdbd9a5b44b0c7e6", - "sha256:8999bb075102d1b8ca4aada6ca14653d52bf02e37fd064e477eb180741f75077", - "sha256:8f6163729612e815b89649aed2e237505362a78014199f819fd92f9e5c96769b", - "sha256:9699fa8f0911ad56b46cc60bbaebe1557fd1c9e8da98185a7a1c0c40193eba48", - "sha256:9a53d76eec33abda11617aad1c9f5f4a2d906dd2f92a03a3f1ea370efbb52c95", - "sha256:9ed4d761b726ff411565eddb10cb37a6bca0ec873d9a18a83cf078f4502a2d94", - "sha256:a020d308e7c2de284d5407e3c6c13e3977a62b314f7bfe19bcc69677931da589", - "sha256:a2e6c15aecbe631245aab639751a58671312cced7e17de1ed9c45fb37036f6c9", - "sha256:b10cb48606d97b70edb094576e3d493d40467395e4fc267655135a2c92defbe8", - "sha256:b8d6e9df5181ed07b7ae145258eb69e686133afc97930af51a3c0c9d784d834d", - "sha256:bbb297754f5cf25eb8fcb817752984252a7feb0ca83e383718e4eec2fb67ea32", - "sha256:be90599e5e78c1ddfcfee8c752108def58b4c672ebcc4d3d9aa7fe65e7d3f16b", - "sha256:bfdfad9b8ae00bd0752b77f954c7405327fd99b2cc6d5e4273e65be61429d56a", - "sha256:c1e5ef5089e16b249388f65d8c8f8b74989e72eb8332060dc580a2ecb967cfc2", - "sha256:c5ed342e29a5fd7eeb0f2ccf7e5b946b5f750f05633b2d6a94b1c02094a77967", - "sha256:c7087a26b26aa82a3ba27e13e66f507cc697f9ceb4c046c0f758876b55f040a5", - "sha256:cf589e980d92b0bf343fa512b9d3ae9ed0469cbffd99cb270b6c83da143cb437", - "sha256:e6fb762e524a4fb118be9f44dbd9456cf80e42253ee8f1bdb0ea5c1f882d4ba8", - "sha256:f2fde5abb6f21c1eff5430f380cdbbee7fdeda6af935a83730ddce9f0c4e504e", - "sha256:f585b3bf7062c228306acd7f40b2ad915b32603228c19bb225952cc98fd2015a", - "sha256:f955a6366cf8e6729776c96e281bede468acd74f6eb49a5bbb048646adaa43d8", - "sha256:fe882fd348d8429debbdac4518d6a42888a7f4ad613dc596ce94788169caeb08" + "sha256:0008b5baa39d7e3a8132c4b47ecae88d6858ad386518e754e5e7b8025ee4722b", + "sha256:0ad5a540c336941272fe161ef3a9830da3d4b3a65a195531cebd3cad5db58b2a", + "sha256:0c965a5691686d746f558ee1c52aa9c63a01a0e13cba61ffc661573948e32f61", + "sha256:0fd568fa5615ae99f76289c52ff230207852ee942d4934f6c893c93d2a79544e", + "sha256:1117d905a3404c696869c7aabec9454b43ed6acbbc73f9256c6fcea23e7ae93e", + "sha256:1ea7c388e91ad9d823655ad6a13751ff67e8a0e7cf4065cf051b4c931cdd9450", + "sha256:26c0ee8f62652cc7fcdc47a1cb3b34775a4d625738025c1a7edb8718bda5a315", + "sha256:368c5b3fc3d5a541cb9dcacefa563fdb445365f517e3cbf64b4326631d1cf13c", + "sha256:451d42fdcdd7d84587d6d9c8f5d9a7d0e997305efb606705063ca1fe8bcca551", + "sha256:47394acba4da8e56ef8e55d8eb483b868521696ba49ab0f0fcf8a1a4a5ac6e49", + "sha256:51b16e297f7b937fc530dd151e4b38f1d305b01c9aa10657bc32a5d2901b8ad7", + "sha256:51c0cdcf606ded0a7b4b50050400f25125ea797fbfc3c817135993b38f8b764e", + "sha256:55c672c579618843e0fd00140fb71f1ffebc4f1c542ac385c4f4999f2f5398d9", + "sha256:5c34a96ecfbf595caf16178a06abcd26a5f8720e01fe1285d4c97333382cfaeb", + "sha256:61aa89a00754b18c4f2956b8bff831f1fd3affef6476dc63462d92211941605e", + "sha256:62234d29c97279917903e4587faf240a5dea4617be250db55386ff268eb5a7c5", + "sha256:670f2a8dcc23bf798c39b95c64bf76ee387549b962f76783670821978a226663", + "sha256:69387f171f6c7b55109caa6d061b17a18f2f9e724a0212c07cd692aeb369dd19", + "sha256:6c5c8871b659f7c2975382d7b61f3c182701fa9eb62cf649c3c73ba8fc5e2595", + "sha256:80139ceb3a568f5be908094f1701fd05391b71425e8b69aaed0d30db647ca2aa", + "sha256:80661a76d0019b5e2c315ccd3bc7093d754067d6142b36a3a0ec4f416073d23b", + "sha256:85a2236f324ae336da7f4b183fa99bed261bcc00ac1255ee91a504e68b086d00", + "sha256:89a3acd98bd4478d6bbc5cb32e0665ea546c98bff8b58d5e1014659daa6ef75a", + "sha256:8a39119fcab146bde41fd1c6d148f9ee1e2cca10c6f9c2b7eb4dd710a3a2c6ac", + "sha256:9c31c2526401da6cc92018f68483f2aac0a731cb98435445ea4b72d46b438c84", + "sha256:9e8ae1c3b8a1697147c5c97f00d66ab1c54d88c4615b0cdd9b1a667d7baf3eb7", + "sha256:a79aab8d069543d5085d58260f18705a08acd92a4501a41261913fddc2137d46", + "sha256:b3d9926e64bd8008007b2d9819d7b30179b069ce95431d5060f71afc36885389", + "sha256:c2a9a77ce4f25ffb52d705be82a9f41b47f6b0da23870ebc3587709e7242da30", + "sha256:c578dd0799f70fb577474cd383f035c6e1057e4fe837278113f9cfa6eee4b076", + "sha256:c5abd9d0023ad20030524ab0d5fa39d77aed025519b1fa426304ab2dd0328b89", + "sha256:ced96125525ba21311e9512adf391170b9e149f89e27e45b06ff07b70f97a0b2", + "sha256:d692fb88d6ef5e75242b00009b54953a0425eaa8bd3a36db9db8b396785e1f57", + "sha256:d70c2104286459658e61388af9eee838b612986bd8a36e1d21ba36152983ac15", + "sha256:de47c65c10ac6f0d2addb28f1b1657b1c707aca014d09d01b3b728cf19e8f791", + "sha256:e6e7592527791841db0820a72c6afae52655a05b0b6d4df184fd2bafe82ee1ee", + "sha256:e8a7e95ee6ea5566291b59ede5b9fadce809dca43ebfbfe11e3ff3d6492c6f0e", + "sha256:f041759138b3a95508c4281b3db3bf9bb28636d84c554272a58a5ca7c9f9bbf4", + "sha256:f39c7fc1fa2e4a1d9747a3effd70731a9d0e9eb5738247fa089c059eff19d43e", + "sha256:f65ac89ee0ba569f5279360eae08783f7f2e95c9810a9846c957fbd5950f4896" ], "index": "pypi", - "version": "==3.5.55" + "version": "==3.5.56" }, "requests": { "extras": [ @@ -1399,11 +1377,11 @@ }, "wand": { "hashes": [ - "sha256:6aeb0183d94762b37a8cdee97174f38ae21e626d44f62f1e2f0ab48a35026e98", - "sha256:eb49a51937d8d9e71ae03e34a845499f9b45ecb5ce0d8744e4c166bc733076eb" + "sha256:473af4a143d2c87693cc43dbd6f64d91ccfd7f0506cf4da53851cd34f114b39d", + "sha256:ec981b4f07f7582fc564aba8b57763a549392e9ef8b6a338e9da54cdd229cf95" ], "index": "pypi", - "version": "==0.6.4" + "version": "==0.6.5" }, "websocket-client": { "hashes": [ @@ -1492,14 +1470,6 @@ ], "markers": "python_version >= '3.6'", "version": "==1.6.3" - }, - "zipp": { - "hashes": [ - "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", - "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb" - ], - "markers": "python_version >= '3.6'", - "version": "==3.4.0" } }, "develop": { @@ -1590,14 +1560,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, - "importlib-metadata": { - "hashes": [ - "sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175", - "sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099" - ], - "markers": "python_version < '3.8'", - "version": "==3.1.0" - }, "iniconfig": { "hashes": [ "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", @@ -1623,11 +1585,11 @@ }, "packaging": { "hashes": [ - "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", - "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" + "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236", + "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.4" + "version": "==20.7" }, "pluggy": { "hashes": [ @@ -1688,14 +1650,6 @@ "index": "pypi", "version": "==2.25.0" }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, "toml": { "hashes": [ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", @@ -1711,14 +1665,6 @@ ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", "version": "==1.26.2" - }, - "zipp": { - "hashes": [ - "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", - "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb" - ], - "markers": "python_version >= '3.6'", - "version": "==3.4.0" } } } diff --git a/REQUIREMENTS b/REQUIREMENTS index 9195737..68f01bc 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -10,7 +10,7 @@ -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client -e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/MISP/PyMISP.git@fe91e10cedb4660b58dcc0db7833c46a5b0efeb9#egg=pymisp[email,fileobjects,openioc,pdfexport] +-e git+https://github.com/MISP/PyMISP.git@649e068fd8272977ad5a434759c5db4dad8317e7#egg=pymisp[email,fileobjects,openioc,pdfexport] -e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails @@ -34,7 +34,6 @@ click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' configparser==5.0.1; python_version >= '3.6' cryptography==3.2.1 -dataclasses==0.8; python_version < '3.7' decorator==4.4.2 deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.1 @@ -49,8 +48,6 @@ geoip2==4.1.0 httplib2==0.18.1 idna-ssl==1.1.0; python_version < '3.7' idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -importlib-metadata==3.1.0; python_version < '3.8' -importlib==1.0.4; python_version < '3.8' isodate==0.6.0 jbxapi==3.14.0 json-log-formatter==0.3.0 @@ -61,7 +58,7 @@ maclookup==1.0.3 mail-parser==3.14.0 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' -multidict==5.0.2; python_version >= '3.5' +multidict==5.1.0; python_version >= '3.6' np==1.0.2 numpy==1.19.4; python_version >= '3.6' oauth2==1.9.0.post1 @@ -79,7 +76,7 @@ pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3. pydeep==0.4 pyeupi==1.1 pygeoip==0.3.2 -pyopenssl==19.1.0 +pyopenssl==20.0.0 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.1 pypssl==2.1 @@ -88,10 +85,10 @@ pytesseract==0.3.6 python-baseconv==1.2.2 python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.10 -python-engineio==3.13.2 +python-engineio==3.14.2 python-magic==0.4.18 python-pptx==0.6.18 -python-socketio[client]==4.6.0 +python-socketio[client]==4.6.1 python-utils==2.4.0 pytz==2019.3 pyyaml==5.3.1 @@ -99,7 +96,7 @@ pyzbar==0.1.8 pyzipper==0.3.3; python_version >= '3.5' rdflib==5.0.0 redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.5.55 +reportlab==3.5.56 requests-cache==0.5.2 requests[security]==2.25.0 shodan==1.24.0 @@ -124,11 +121,10 @@ urllib3==1.26.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3. validators==0.14.0 vt-graph-api==1.0.1 vulners==1.5.9 -wand==0.6.4 +wand==0.6.5 websocket-client==0.57.0 wrapt==1.12.1 xlrd==1.2.0 xlsxwriter==1.3.7 yara-python==3.8.1 yarl==1.6.3; python_version >= '3.6' -zipp==3.4.0; python_version >= '3.6' From 58bac998c0338d7d929360262ae815965cb1d16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Wed, 9 Dec 2020 14:52:52 +0100 Subject: [PATCH 086/476] fix: Use pymisp from pypi --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 68f01bc..10fb179 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -10,7 +10,7 @@ -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client -e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/MISP/PyMISP.git@649e068fd8272977ad5a434759c5db4dad8317e7#egg=pymisp[email,fileobjects,openioc,pdfexport] +pymisp -e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails From 7104a35cca7faee027fcb198b3a1bd49796ef0a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 10 Dec 2020 01:15:44 +0100 Subject: [PATCH 087/476] fix: Use PyMISP from PyPi --- Pipfile | 2 +- Pipfile.lock | 137 ++++++++++++++++++++++++++------------------------- 2 files changed, 71 insertions(+), 68 deletions(-) diff --git a/Pipfile b/Pipfile index 2aa159f..cd631be 100644 --- a/Pipfile +++ b/Pipfile @@ -18,7 +18,7 @@ pypdns = "*" pypssl = "*" pyeupi = "*" uwhois = { editable = true, git = "https://github.com/Rafiot/uwhoisd.git", ref = "testing", subdirectory = "client" } -pymisp = { editable = true, extras = ["fileobjects,openioc,pdfexport,email"], git = "https://github.com/MISP/PyMISP.git" } +pymisp = { extras = ["fileobjects,openioc,pdfexport,email"], version = "*" } pyonyphe = { editable = true, git = "https://github.com/sebdraven/pyonyphe" } pydnstrails = { editable = true, git = "https://github.com/sebdraven/pydnstrails" } pytesseract = "*" diff --git a/Pipfile.lock b/Pipfile.lock index b0e069b..4935142 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3b955a6c921b05f901f7c345e10137875026fb9c621844ea310f0a579a90942c" + "sha256": "1c6ff4271554f106a004e60839c77f1a065b1a58fb6b12dea3c4a1ca5c5ed0ce" }, "pipfile-spec": 6, "requires": { @@ -120,6 +120,14 @@ "index": "pypi", "version": "==4.9.3" }, + "bidict": { + "hashes": [ + "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", + "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" + ], + "markers": "python_version >= '3.6'", + "version": "==0.21.2" + }, "blockchain": { "hashes": [ "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" @@ -129,10 +137,10 @@ }, "certifi": { "hashes": [ - "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", - "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" + "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", + "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" ], - "version": "==2020.11.8" + "version": "==2020.12.5" }, "cffi": { "hashes": [ @@ -223,30 +231,22 @@ }, "cryptography": { "hashes": [ - "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538", - "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f", - "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77", - "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b", - "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33", - "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e", - "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb", - "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e", - "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7", - "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297", - "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d", - "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7", - "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b", - "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7", - "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4", - "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8", - "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b", - "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851", - "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13", - "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b", - "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3", - "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df" + "sha256:1366e6fff96bb1d320e3ef3c531b0428cb780c517b6059ffe8820e2a30bf5858", + "sha256:2c28e69e8c2620869425420e466b224d351d5dc242d3e3293062cffa7fcdd276", + "sha256:402273e7f78e01f5c42452acef56bd52fa73fa0f312e4160db7ad29bbc90335d", + "sha256:41892759f13c7dfc329573cabd3a513f1e7b5d309ca55c931ffefc3b2f304899", + "sha256:4935d0603b118dc036c477917e5e8a020f7309bc11c363a4d572407dcbd53c80", + "sha256:55574bd84ff551fd6f7617e5eeda0b2d129f84788340ab57904f0c7f13f8f149", + "sha256:651eff09297e4518287f711b4e28523567cbde7beaa794d06d0b35ac9adc1172", + "sha256:66f41aa7642f97d35976750a2c0a6d5915733ba6c9ca7a0f327e56f037c1236e", + "sha256:9518da854136181407d946b971dd27a0e941d5d07f87f87a44c598b3da7a77d2", + "sha256:ad8dc319f876273b474a59797344d5986beaaaf18f7cc0ab9255155da057d979", + "sha256:d9f1e520f2ee08c5a88e1ae0b31159bdb13da40a486bea3e9f7d338564850ea6", + "sha256:ee0084f6d62f083316b08111b122dc4fbe16e534059b92b5ddc3d73dc52dd39c", + "sha256:f43d6e72e3cdf983b5e5e65938c0519ce4eeb42b6af766f714b1414ae7b9f8ef", + "sha256:f95ca692fafea80f1815bbfecf57c6833c0b21432d17026a077341debee76e79" ], - "version": "==3.2.1" + "version": "==3.3" }, "decorator": { "hashes": [ @@ -606,33 +606,33 @@ }, "pandas": { "hashes": [ - "sha256:09e0503758ad61afe81c9069505f8cb8c1e36ea8cc1e6826a95823ef5b327daf", - "sha256:0a11a6290ef3667575cbd4785a1b62d658c25a2fd70a5adedba32e156a8f1773", - "sha256:0d9a38a59242a2f6298fff45d09768b78b6eb0c52af5919ea9e45965d7ba56d9", - "sha256:112c5ba0f9ea0f60b2cc38c25f87ca1d5ca10f71efbee8e0f1bee9cf584ed5d5", - "sha256:185cf8c8f38b169dbf7001e1a88c511f653fbb9dfa3e048f5e19c38049e991dc", - "sha256:3aa8e10768c730cc1b610aca688f588831fa70b65a26cb549fbb9f35049a05e0", - "sha256:41746d520f2b50409dffdba29a15c42caa7babae15616bcf80800d8cfcae3d3e", - "sha256:43cea38cbcadb900829858884f49745eb1f42f92609d368cabcc674b03e90efc", - "sha256:5378f58172bd63d8c16dd5d008d7dcdd55bf803fcdbe7da2dcb65dbbf322f05b", - "sha256:54404abb1cd3f89d01f1fb5350607815326790efb4789be60508f458cdd5ccbf", - "sha256:5dac3aeaac5feb1016e94bde851eb2012d1733a222b8afa788202b836c97dad5", - "sha256:5fdb2a61e477ce58d3f1fdf2470ee142d9f0dde4969032edaf0b8f1a9dafeaa2", - "sha256:6613c7815ee0b20222178ad32ec144061cb07e6a746970c9160af1ebe3ad43b4", - "sha256:6d2b5b58e7df46b2c010ec78d7fb9ab20abf1d306d0614d3432e7478993fbdb0", - "sha256:8a5d7e57b9df2c0a9a202840b2881bb1f7a648eba12dd2d919ac07a33a36a97f", - "sha256:8b4c2055ebd6e497e5ecc06efa5b8aa76f59d15233356eb10dad22a03b757805", - "sha256:a15653480e5b92ee376f8458197a58cca89a6e95d12cccb4c2d933df5cecc63f", - "sha256:a7d2547b601ecc9a53fd41561de49a43d2231728ad65c7713d6b616cd02ddbed", - "sha256:a979d0404b135c63954dea79e6246c45dd45371a88631cdbb4877d844e6de3b6", - "sha256:b1f8111635700de7ac350b639e7e452b06fc541a328cf6193cf8fc638804bab8", - "sha256:c5a3597880a7a29a31ebd39b73b2c824316ae63a05c3c8a5ce2aea3fc68afe35", - "sha256:c681e8fcc47a767bf868341d8f0d76923733cbdcabd6ec3a3560695c69f14a1e", - "sha256:cf135a08f306ebbcfea6da8bf775217613917be23e5074c69215b91e180caab4", - "sha256:e2b8557fe6d0a18db4d61c028c6af61bfed44ef90e419ed6fadbdc079eba141e" + "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b", + "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f", + "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648", + "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb", + "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98", + "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a", + "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11", + "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a", + "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e", + "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae", + "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d", + "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9", + "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b", + "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788", + "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca", + "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5", + "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a", + "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814", + "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d", + "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086", + "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a", + "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb", + "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782", + "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b" ], "index": "pypi", - "version": "==1.1.4" + "version": "==1.1.5" }, "pandas-ods-reader": { "hashes": [ @@ -878,15 +878,18 @@ "subdirectory": "client" }, "pymisp": { - "editable": true, "extras": [ "email", "fileobjects", "openioc", "pdfexport" ], - "git": "https://github.com/MISP/PyMISP.git", - "ref": "649e068fd8272977ad5a434759c5db4dad8317e7" + "hashes": [ + "sha256:b7bdf04442f46ddcbbcc55866a7ad90f79aa7330c70b1446448dbed2ccdbda80", + "sha256:f0bbdd77358223ba75c9cc40f192c7a2a7a5838bdd08b28381f71d220151ea8a" + ], + "index": "pypi", + "version": "==2.4.135.3" }, "pyonyphe": { "editable": true, @@ -960,10 +963,10 @@ }, "python-engineio": { "hashes": [ - "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", - "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" + "sha256:33f7a214be5db35c867e97027bfe63676cb003d82aa17a607612b25ba5d84e5b", + "sha256:9f34afa4170f5ba6e3d9ff158752ccf8fbb2145f16554b2f0fc84646675be99a" ], - "version": "==3.14.2" + "version": "==4.0.0" }, "python-magic": { "hashes": [ @@ -984,10 +987,10 @@ "client" ], "hashes": [ - "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", - "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" + "sha256:53b8ab86d90ab47d6eda2db22c5d2dbaf6f2f74166bc6b9caf2bf3f070321d5e", + "sha256:5928abcf8d60d0356d5f6c2696a8d12d77394bf10dafcac6a40b328b49078eb1" ], - "version": "==4.6.1" + "version": "==5.0.1" }, "python-utils": { "hashes": [ @@ -1288,11 +1291,11 @@ }, "tqdm": { "hashes": [ - "sha256:5c0d04e06ccc0da1bd3fa5ae4550effcce42fcad947b4a6cafa77bdc9b09ff22", - "sha256:9e7b8ab0ecbdbf0595adadd5f0ebbb9e69010e0bd48bbb0c15e550bf2a5292df" + "sha256:38b658a3e4ecf9b4f6f8ff75ca16221ae3378b2e175d846b6b33ea3a20852cf5", + "sha256:d4f413aecb61c9779888c64ddf0c62910ad56dcbe857d8922bb505d4dbff0df1" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.54.0" + "version": "==4.54.1" }, "trustar": { "hashes": [ @@ -1483,10 +1486,10 @@ }, "certifi": { "hashes": [ - "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", - "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" + "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", + "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" ], - "version": "==2020.11.8" + "version": "==2020.12.5" }, "chardet": { "hashes": [ From 774b2f37a6c947eef6f136857914265306e6cffd Mon Sep 17 00:00:00 2001 From: Cory Kennedy Date: Mon, 4 Jan 2021 15:27:47 -0600 Subject: [PATCH 088/476] Corrected VMray rest API import When loading misp-modules, the VMray module ```modules/expansion/vmray_submit.py ``` incorrectly imports the library. VMray's documentation and examples here: https://pypi.org/project/vmray-rest-api/#history also reflect this change as the correct import. --- misp_modules/modules/expansion/vmray_submit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/vmray_submit.py b/misp_modules/modules/expansion/vmray_submit.py index 02a4a44..fa0a073 100644 --- a/misp_modules/modules/expansion/vmray_submit.py +++ b/misp_modules/modules/expansion/vmray_submit.py @@ -19,7 +19,7 @@ from distutils.util import strtobool import io import zipfile -from _vmray.vmray_rest_api import VMRayRESTAPI +from _vmray.rest_api import VMRayRESTAPI misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment', 'malware-sample'], 'output': ['text', 'sha1', 'sha256', 'md5', 'link']} From 3544ef6de061d2e0d6bcb33e2fa5362beb9a3810 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 8 Jan 2021 10:43:06 +0100 Subject: [PATCH 089/476] Update .gitignore update .gitignore to env pycharm --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3d994af..e4adeb2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ misp_modules.egg-info/ docs/expansion* docs/import_mod* docs/export_mod* -site* \ No newline at end of file +site* + +#pycharm env +.idea/* \ No newline at end of file From 8552f11d5efbd9e0e3183d156e7818b57bffddd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 21 Jan 2021 12:02:57 +0100 Subject: [PATCH 090/476] chg: Bump deps --- Pipfile.lock | 808 +++++++++++++++++++++++++++------------------------ REQUIREMENTS | 65 +++-- 2 files changed, 462 insertions(+), 411 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 4935142..f6d2225 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -221,6 +221,18 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==0.4.4" }, + "colorclass": { + "hashes": [ + "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" + ], + "version": "==2.2.0" + }, + "compressed-rtf": { + "hashes": [ + "sha256:c1c827f1d124d24608981a56e8b8691eb1f2a69a78ccad6440e7d92fde1781dd" + ], + "version": "==1.0.6" + }, "configparser": { "hashes": [ "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", @@ -231,22 +243,22 @@ }, "cryptography": { "hashes": [ - "sha256:1366e6fff96bb1d320e3ef3c531b0428cb780c517b6059ffe8820e2a30bf5858", - "sha256:2c28e69e8c2620869425420e466b224d351d5dc242d3e3293062cffa7fcdd276", - "sha256:402273e7f78e01f5c42452acef56bd52fa73fa0f312e4160db7ad29bbc90335d", - "sha256:41892759f13c7dfc329573cabd3a513f1e7b5d309ca55c931ffefc3b2f304899", - "sha256:4935d0603b118dc036c477917e5e8a020f7309bc11c363a4d572407dcbd53c80", - "sha256:55574bd84ff551fd6f7617e5eeda0b2d129f84788340ab57904f0c7f13f8f149", - "sha256:651eff09297e4518287f711b4e28523567cbde7beaa794d06d0b35ac9adc1172", - "sha256:66f41aa7642f97d35976750a2c0a6d5915733ba6c9ca7a0f327e56f037c1236e", - "sha256:9518da854136181407d946b971dd27a0e941d5d07f87f87a44c598b3da7a77d2", - "sha256:ad8dc319f876273b474a59797344d5986beaaaf18f7cc0ab9255155da057d979", - "sha256:d9f1e520f2ee08c5a88e1ae0b31159bdb13da40a486bea3e9f7d338564850ea6", - "sha256:ee0084f6d62f083316b08111b122dc4fbe16e534059b92b5ddc3d73dc52dd39c", - "sha256:f43d6e72e3cdf983b5e5e65938c0519ce4eeb42b6af766f714b1414ae7b9f8ef", - "sha256:f95ca692fafea80f1815bbfecf57c6833c0b21432d17026a077341debee76e79" + "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d", + "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7", + "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901", + "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c", + "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244", + "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6", + "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5", + "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e", + "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c", + "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0", + "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812", + "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a", + "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030", + "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302" ], - "version": "==3.3" + "version": "==3.3.1" }, "decorator": { "hashes": [ @@ -257,26 +269,26 @@ }, "deprecated": { "hashes": [ - "sha256:525ba66fb5f90b07169fdd48b6373c18f1ee12728ca277ca44567a367d9d7f74", - "sha256:a766c1dccb30c5f6eb2b203f87edd1d8588847709c78589e1521d769addc8218" + "sha256:471ec32b2755172046e28102cd46c481f21c6036a0ec027521eba8521aa4ef35", + "sha256:924b6921f822b64ec54f49be6700a126bab0640cfafca78f22c9d429ed590560" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.10" + "version": "==1.2.11" }, "dnsdb2": { "hashes": [ - "sha256:1454a2980a24453c4076cfa57765632f690673ec9efc104a95c97e4adbe70b6c" + "sha256:55c9f43eb231ff21f40a69183fdb0220f175519e108bc19d0c098e07532d0dfe" ], "index": "pypi", - "version": "==1.1.1" + "version": "==1.1.2" }, "dnspython": { "hashes": [ - "sha256:044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7", - "sha256:40bb3c24b9d4ec12500f0124288a65df232a3aa749bb0c39734b782873a2544d" + "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216", + "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4" ], "index": "pypi", - "version": "==2.0.0" + "version": "==2.1.0" }, "domaintools-api": { "hashes": [ @@ -286,6 +298,19 @@ "index": "pypi", "version": "==0.5.2" }, + "easygui": { + "hashes": [ + "sha256:690658af9fca3f2f2a55f24421045f9b33ca33c877ed5fb61d4b942d8ec335f3", + "sha256:dbc89afbb1aca83830ea4af568eb2491654e16b2706a14d040757fdf1fafbbfe" + ], + "version": "==0.98.1" + }, + "ebcdic": { + "hashes": [ + "sha256:33b4cb729bc2d0bf46cc1847b0e5946897cb8d3f53520c5b9aa5fa98d7e735f1" + ], + "version": "==1.1.1" + }, "enum-compat": { "hashes": [ "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e", @@ -293,6 +318,13 @@ ], "version": "==0.0.3" }, + "extract-msg": { + "hashes": [ + "sha256:7300a50bfa91405a381826f8e22f39458c7322fea1cd660ef699c4157a58be4b", + "sha256:7ce5761911b2caa9f07042efdecfcc9cf4afe524c3efbfd0aa5fa277faa1cc53" + ], + "version": "==0.28.1" + }, "ez-setup": { "hashes": [ "sha256:303c5b17d552d1e3fb0505d80549f8579f557e13d8dc90e5ecef3c07d7f58642" @@ -351,6 +383,13 @@ "markers": "python_version < '3.7'", "version": "==1.1.0" }, + "imapclient": { + "hashes": [ + "sha256:3eeb97b9aa8faab0caa5024d74bfde59408fbd542781246f6960873c7bf0dd01", + "sha256:60ba79758cc9f13ec910d7a3df9acaaf2bb6c458720d9a02ec33a41352fd1b99" + ], + "version": "==2.1.0" + }, "isodate": { "hashes": [ "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", @@ -378,24 +417,36 @@ ], "version": "==3.2.0" }, + "lark-parser": { + "hashes": [ + "sha256:20bdefdf1b6e9bcb38165ea5cc4f27921a99c6f4c35264a3a953fd60335f1f8c", + "sha256:8b747e1f544dcc2789e3feaddd2a50c6a73bed69d62e9c69760c1e1f7d23495f" + ], + "version": "==0.11.1" + }, "lief": { "hashes": [ - "sha256:276cc63ec12a21bdf01b8d30962692c17499788234f0765247ca7a35872097ec", - "sha256:3e6baaeb52bdc339b5f19688b58fd8d5778b92e50221f920cedfa2bec1f4d5c2", - "sha256:45e5c592b57168c447698381d927eb2386ffdd52afe0c48245f848d4cc7ee05a", - "sha256:6547752b5db105cd41c9fa65d0d7452a4d7541b77ffee716b46246c6d81e172f", - "sha256:83b51e01627b5982662f9550ac1230758aa56945ed86829e4291932d98417da3", - "sha256:895599194ea7495bf304e39317b04df20cccf799fc2751867cc1aa4997cfcdae", - "sha256:8a91cee2568306fe1d2bf84341b459c85368317d01d7105fa49e4f4ede837076", - "sha256:913b36a67707dc2afa72f117bab9856ea3f434f332b04a002a0f9723c8779320", - "sha256:9f604a361a3b1b3ed5fdafed0321c5956cb3b265b5efe2250d1bf8911a80c65b", - "sha256:a487fe7234c04bccd58223dbb79214421176e2629814c7a4a887764cceb5be7c", - "sha256:bc8488fb0661cb436fe4bb4fe947d0f9aa020e9acaed233ccf01ab04d888c68a", - "sha256:bddbf333af62310a10cb738a1df1dc2b140dd9c663b55ba3500c10c249d416d2", - "sha256:cce48d7c97cef85e01e6cfeff55f2068956b5c0257eb9c2d2c6d15e33dd1e4fc", - "sha256:f8b3f66956c56b582b3adc573bf2a938c25fb21c8894b373a113e24c494fc982" + "sha256:0cd2665ff28937755c8acedc2e3fb9de5ba752353e19b51b89297b8be3f63ccb", + "sha256:1a110bd5db41b4fde1a61094658b0366352ed4c0a00b55bde821046a59c2f913", + "sha256:1fb570712fa17ee153aca263ab1f1ec763772ccb46992e415b3dc1c0248466bc", + "sha256:2ee8f9787ea92109f19e5e4d22773042184ac524a3f11399ea5e13d974ac1f05", + "sha256:348ee294567826cad638b7e6cf2ede4ffe03524cd5b6038896f78e5b006d6295", + "sha256:77ba7dd0d48933c0b26c980bda1ab4a7ad3c7031880181fab0b94caad3bc1a4d", + "sha256:8774076dfbcf9b6906be4d9243de4a78fc09d317292251072d460ed1e0eeb96e", + "sha256:93d79a47db9977e6471b21d5efd4e7af4c29c76261d6583141fcf10f6ccd0eba", + "sha256:96d2a8d2310c7accaeb5c6679833c0cd8f0fb6d8c682a5df59d4d868c8881661", + "sha256:9837166402248a4ef29018d498c4eccc11cbc92ee4083da046fa747d3863b43d", + "sha256:9f2bd417090df21548af3a0216f3a02056291348c0826a5ff78e3f3046283978", + "sha256:afe4d15b519dd7d97732e85b7a2b11154c97a40ce517e1044b5cd5f80074ce36", + "sha256:b0a55424b3ffa08d16bf8ee6e5e9474b0a4b392ca4d94545c16e47e6366e41d4", + "sha256:ccf977099153eaefa351e72e84dfa829334699521ef00434b50647d80de2cc56", + "sha256:d95cf1224c7b311b8d25dbd4de627d28717266e62b9721f1dc4c8427f929a60f", + "sha256:e6ff05e6ebcb9bea8833fcb558d4db3bc2a78031c4792fcac9f9612fa78258b3", + "sha256:e8c66834a0ee9ed1899db165c09ca04aba8dee574de1ccc866d82fbf0c059bb8", + "sha256:f31fde4e7174b4bc9b67ff22fd93fa15fc3faa1592ac669f3addc95d9e66168e", + "sha256:f9b00c396c9f45c5f4cf37c034428ad525d6d7c7d38fc6c49ddc4b558201151b" ], - "version": "==0.10.1" + "version": "==0.11.0" }, "lxml": { "hashes": [ @@ -448,13 +499,6 @@ "index": "pypi", "version": "==1.0.3" }, - "mail-parser": { - "hashes": [ - "sha256:08925a64ed5f535051a25cf54b48f7ced918093e85691f4eba08933e3c7d6934", - "sha256:7577b8479e801be7b42fa7a2f6f66bda845c44c3b61ed0002771a82b3e410387" - ], - "version": "==3.14.0" - }, "markdownify": { "hashes": [ "sha256:30be8340724e706c9e811c27fe8c1542cf74a15b46827924fff5c54b40dd9b0d", @@ -474,6 +518,12 @@ "editable": true, "path": "." }, + "msoffcrypto-tool": { + "hashes": [ + "sha256:56a1fe5e58ca417ca8756e8d7224ae599323996da65f81a35273c0f1e2eaf490" + ], + "version": "==4.11.0" + }, "multidict": { "hashes": [ "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", @@ -526,43 +576,43 @@ }, "numpy": { "hashes": [ - "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", - "sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce", - "sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1", - "sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512", - "sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2", - "sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757", - "sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9", - "sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2", - "sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08", - "sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b", - "sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb", - "sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc", - "sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac", - "sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83", - "sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36", - "sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387", - "sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f", - "sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad", - "sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c", - "sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414", - "sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37", - "sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764", - "sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753", - "sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909", - "sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6", - "sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63", - "sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9", - "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949", - "sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab", - "sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c", - "sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3", - "sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893", - "sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15", - "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4" + "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", + "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", + "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", + "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", + "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", + "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", + "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", + "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", + "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", + "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", + "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", + "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", + "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", + "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", + "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", + "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", + "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", + "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", + "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", + "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", + "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", + "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", + "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", + "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", + "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", + "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", + "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", + "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", + "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", + "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", + "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", + "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", + "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", + "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" ], "markers": "python_version >= '3.6'", - "version": "==1.19.4" + "version": "==1.19.5" }, "oauth2": { "hashes": [ @@ -577,62 +627,72 @@ "git": "https://github.com/cartertemm/ODTReader.git/", "ref": "49d6938693f6faa3ff09998f86dba551ae3a996b" }, + "olefile": { + "hashes": [ + "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.46" + }, + "oletools": { + "hashes": [ + "sha256:8481cd60352399e15e9290ac57862a65952e9c83e3526ba833991a5c78f5cca1" + ], + "version": "==0.56" + }, "opencv-python": { "hashes": [ - "sha256:0548981fe189e0d57b9cc65066b66fd70d4bc84ea906f349a63d9098e1b911c6", - "sha256:117dbb2fd184de28d831f14c1da17864efcee7bb7895e43adf40f5e1da9137fb", - "sha256:135e05b69ab9665cbe2589f56e60895219bc2443a632bdc4bde72fb95eda1582", - "sha256:14df77490c8aedceae74e660564d48c04761658aecc93895ac5e974006a89606", - "sha256:17581c68400f828700e5c6b3b082f50c781bf74cb9a7b972a04f05d26c8e894a", - "sha256:4af0053c6a70f127a52c26b112341826d3dbfce6955beb9044d3eabd7e14d1cd", - "sha256:51baebb0f8f3cae4cccd30daf018a5bb75cb759d5658aea29100d34cd5cac106", - "sha256:6022609b67f9c0f14e6807e782660d1d1be94d4f0c7bc1794d7d8f600014acb2", - "sha256:68a9ec7e32f82cab267b6f757d9862a9a930371062739f9d00472e7c850c5854", - "sha256:6b1d85cbb64ce20ac5f79ad8e3e76a3dbff53d258c65f2fc0b9411321147a0be", - "sha256:6b6d23de6d5ddc55e865ac8532bf8062b26ba70305fa1c87c671717027dcd370", - "sha256:744e9ae2fb4c8574e6d4a762146b4d0984bdec60b98480fc54a363c03a07a1ac", - "sha256:7fe81d08df4eb5dc4c6aa5f09888b6fd390fce5fa7d5624a98cac890b9aa6181", - "sha256:8a8ebd7ceebc0be9c14ca3e25a1c4ae086016b469848258e998247f2fc855314", - "sha256:8aeda9b2c37bf91fa88d67f09b85f2250661eec43d72184ec544783de204e96a", - "sha256:9659e80059c9f39728c7dcc22032dff0d1d467f07b6cd8e036613393e4b7c71a", - "sha256:c1382209a771ca8a25fe89d4a2377875538c6ed3cf8745280e65636cbd0988f2", - "sha256:d80db278a07f51811dbf0f9c31ff7cd5b2501822fb7a7587e71f9ff27d5c04bd", - "sha256:db874c65654465ef71d6e8618bed8c725722bc90624132b9512bf061abb4eec0", - "sha256:e4c072cf4260063ebadc70e34d622fa1127a88e364475ed757709e249ebe990f", - "sha256:f69a56e958ecb549ba84e0497a438080932b4d52ded441cec04d80afde71dc0a" + "sha256:30edebc81b260bcfeb760b3600c367c5261dfb2fe41e5d1408d5357d0867b40d", + "sha256:32dee1c9fd3e31e28edef7b56f868e2b40e280b7062304f9fb8a14dbc51547d5", + "sha256:4982fa8ccc38310a2bd93e06334ba090b12b6aff2f6fcb8ff9613e3c9bc48f48", + "sha256:5172cb37dfd8a0b4945b071a493eb36e5f17675a160637fa380f9c1d9d80535c", + "sha256:6d8434a45e8f75c4da5fd0068ce001f4f8e35771cc851d746d4721eeaf517e25", + "sha256:78a6db8467639383caedf1d111da3510a4ee1a0aacf2117821cae2ee8f92ce37", + "sha256:9646875c501788b1b098f282d777b667d6da69801739504f1b2fd1268970d1da", + "sha256:9c77d508e6822f1f40c727d21b822d017622d8305dce7eccf0ab06caac16d5c6", + "sha256:a1dfa0486db367594510c0c799ec7481247dc86e651b69008806d875ab731471", + "sha256:b2b9ac86aec5f2dd531545cebdea1a1ef4f81ef1fb1760d78b4725f9575504f9", + "sha256:bcb27773cfd5340b2b599b303d9f5499838ef4780c20c038f6030175408c64df", + "sha256:c0503bfaa2b7b743d6ff5d81f1dd8428dbf4c33e7e4f836456d11be20c2e7721", + "sha256:c1159d91f29a85c3333edef6ca420284566d9bcdae46dda2fe7282515b48c8b6", + "sha256:c4ea4f8b217f3e8be6247fc0787fb81797d85202c722523f41070124a7a621c7", + "sha256:c8cc1f5ff3c352ebe756119014c4e4ec7ae5ac536d1f66b0316667ced37637c8", + "sha256:d16144c435b816c5536d5ff012c1a2b7e93155017db7103942ff7efb98c4df1f", + "sha256:d8aefcb30b71064dbbaa2b0ace161a36464c29375a83998fbda39a1d1740f942", + "sha256:e27d062fa1098d90f48b6c047351c89816492a08906a021c973ce510b04a7b9d", + "sha256:e2c17714da59d9d516ceef0450766ff9557ee232d62f702665af905193557582", + "sha256:e38fbd7b2db03204ec09930609b7313d6b6d2b271c8fe2c0aa271fa69b726a1b", + "sha256:e77d0feaff37326f62b127098264e2a7099deb476e38432b1083ce11cdedf560", + "sha256:ebe83901971a6755512424c4fe9f63341cca501b7c497bf608dd38ee31ba3f4c", + "sha256:efac9893d9e21cfb599828801c755ecde8f1e657f05ec6f002efe19422456d5a", + "sha256:fc1472b825d26c8a4f1cfb172a90c3cc47733e4af7522276c1c2efe8f6006a8b", + "sha256:ffc75c614b8dc3d8102f3ba15dafd6ec0400c7ffa71a91953d41511964ee50e0" ], "index": "pypi", - "version": "==4.4.0.46" + "version": "==4.5.1.48" }, "pandas": { "hashes": [ - "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b", - "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f", - "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648", - "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb", - "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98", - "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a", - "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11", - "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a", - "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e", - "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae", - "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d", - "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9", - "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b", - "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788", - "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca", - "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5", - "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a", - "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814", - "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d", - "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086", - "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a", - "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb", - "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782", - "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b" + "sha256:050ed2c9d825ef36738e018454e6d055c63d947c1d52010fbadd7584f09df5db", + "sha256:055647e7f4c5e66ba92c2a7dcae6c2c57898b605a3fb007745df61cc4015937f", + "sha256:23ac77a3a222d9304cb2a7934bb7b4805ff43d513add7a42d1a22dc7df14edd2", + "sha256:2de012a36cc507debd9c3351b4d757f828d5a784a5fc4e6766eafc2b56e4b0f5", + "sha256:30e9e8bc8c5c17c03d943e8d6f778313efff59e413b8dbdd8214c2ed9aa165f6", + "sha256:324e60bea729cf3b55c1bf9e88fe8b9932c26f8669d13b928e3c96b3a1453dff", + "sha256:37443199f451f8badfe0add666e43cdb817c59fa36bceedafd9c543a42f236ca", + "sha256:47ec0808a8357ab3890ce0eca39a63f79dcf941e2e7f494470fe1c9ec43f6091", + "sha256:496fcc29321e9a804d56d5aa5d7ec1320edfd1898eee2f451aa70171cf1d5a29", + "sha256:50e6c0a17ef7f831b5565fd0394dbf9bfd5d615ee4dd4bb60a3d8c9d2e872323", + "sha256:5527c5475d955c0bc9689c56865aaa2a7b13c504d6c44f0aadbf57b565af5ebd", + "sha256:57d5c7ac62925a8d2ab43ea442b297a56cc8452015e71e24f4aa7e4ed6be3d77", + "sha256:9d45f58b03af1fea4b48e44aa38a819a33dccb9821ef9e1d68f529995f8a632f", + "sha256:b26e2dabda73d347c7af3e6fed58483161c7b87a886a4e06d76ccfe55a044aa9", + "sha256:cfd237865d878da9b65cfee883da5e0067f5e2ff839e459466fb90565a77bda3", + "sha256:d7cca42dba13bfee369e2944ae31f6549a55831cba3117e17636955176004088", + "sha256:fe7de6fed43e7d086e3d947651ec89e55ddf00102f9dd5758763d56d182f0564" ], "index": "pypi", - "version": "==1.1.5" + "version": "==1.2.1" }, "pandas-ods-reader": { "hashes": [ @@ -651,6 +711,13 @@ "index": "pypi", "version": "==1.0.31" }, + "pcodedmp": { + "hashes": [ + "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955", + "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278" + ], + "version": "==1.2.6" + }, "pdftotext": { "hashes": [ "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" @@ -660,64 +727,41 @@ }, "pillow": { "hashes": [ - "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", - "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", - "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", - "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", - "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", - "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", - "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", - "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", - "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", - "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", - "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", - "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", - "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce" + "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6", + "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded", + "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865", + "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174", + "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032", + "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a", + "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e", + "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378", + "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17", + "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c", + "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913", + "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7", + "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0", + "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820", + "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba", + "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2", + "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b", + "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9", + "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234", + "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d", + "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5", + "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206", + "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9", + "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8", + "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59", + "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d", + "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7", + "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a", + "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0", + "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b", + "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d", + "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae" ], "index": "pypi", - "version": "==8.0.1" + "version": "==8.1.0" }, "progressbar2": { "hashes": [ @@ -728,20 +772,37 @@ }, "psutil": { "hashes": [ - "sha256:01bc82813fbc3ea304914581954979e637bcc7084e59ac904d870d6eb8bb2bc7", - "sha256:1cd6a0c9fb35ece2ccf2d1dd733c1e165b342604c67454fd56a4c12e0a106787", - "sha256:2cb55ef9591b03ef0104bedf67cc4edb38a3edf015cf8cf24007b99cb8497542", - "sha256:56c85120fa173a5d2ad1d15a0c6e0ae62b388bfb956bb036ac231fbdaf9e4c22", - "sha256:5d9106ff5ec2712e2f659ebbd112967f44e7d33f40ba40530c485cc5904360b8", - "sha256:6a3e1fd2800ca45083d976b5478a2402dd62afdfb719b30ca46cd28bb25a2eb4", - "sha256:ade6af32eb80a536eff162d799e31b7ef92ddcda707c27bbd077238065018df4", - "sha256:af73f7bcebdc538eda9cc81d19db1db7bf26f103f91081d780bbacfcb620dee2", - "sha256:e02c31b2990dcd2431f4524b93491941df39f99619b0d312dfe1d4d530b08b4b", - "sha256:fa38ac15dbf161ab1e941ff4ce39abd64b53fec5ddf60c23290daed2bc7d1157", - "sha256:fbcac492cb082fa38d88587d75feb90785d05d7e12d4565cbf1ecc727aff71b7" + "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64", + "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131", + "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c", + "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6", + "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023", + "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df", + "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394", + "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4", + "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b", + "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2", + "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d", + "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65", + "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d", + "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef", + "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7", + "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60", + "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6", + "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8", + "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b", + "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d", + "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac", + "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935", + "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d", + "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28", + "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876", + "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0", + "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", + "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.7.3" + "version": "==5.8.0" }, "pybgpranking": { "editable": true, @@ -885,11 +946,11 @@ "pdfexport" ], "hashes": [ - "sha256:b7bdf04442f46ddcbbcc55866a7ad90f79aa7330c70b1446448dbed2ccdbda80", - "sha256:f0bbdd77358223ba75c9cc40f192c7a2a7a5838bdd08b28381f71d220151ea8a" + "sha256:ccbef2673f992a558a11cfde8dd042c67aadbe71683911a6001da0f9f8242906", + "sha256:fcd4245c5fb17f835dbe98d842cdc50fa8aa6e610ee64f666ad5390f77a82737" ], "index": "pypi", - "version": "==2.4.135.3" + "version": "==2.4.137" }, "pyonyphe": { "editable": true, @@ -898,10 +959,10 @@ }, "pyopenssl": { "hashes": [ - "sha256:898aefbde331ba718570244c3b01dcddb1b31a3b336613436a45e52e27d9a82d", - "sha256:92f08eccbd73701cf744e8ffd6989aa7842d48cbe3fea8a7c031c5647f590ac5" + "sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51", + "sha256:818ae18e06922c066f777a33f1fca45786d85edfe71cd043de6379337a7f274b" ], - "version": "==20.0.0" + "version": "==20.0.1" }, "pyparsing": { "hashes": [ @@ -935,10 +996,10 @@ }, "pytesseract": { "hashes": [ - "sha256:b79641b7915ff039da22d5591cb2f5ca6cb0ed7c65194c9c750360dc6a1cc87f" + "sha256:4ecfc898d00a70fcc38d2bce729de1597c67e7bc5d2fa26094714c9f5b573645" ], "index": "pypi", - "version": "==0.3.6" + "version": "==0.3.7" }, "python-baseconv": { "hashes": [ @@ -987,17 +1048,16 @@ "client" ], "hashes": [ - "sha256:53b8ab86d90ab47d6eda2db22c5d2dbaf6f2f74166bc6b9caf2bf3f070321d5e", - "sha256:5928abcf8d60d0356d5f6c2696a8d12d77394bf10dafcac6a40b328b49078eb1" + "sha256:870f8b00a63ef7c9a1f85fd70028624867bf246115e82625f28ef79def8847bb", + "sha256:f53fd0d5bd9f75a70492062f4ae6195ab5d34d67a29024d740f25e468392893e" ], - "version": "==5.0.1" + "version": "==5.0.4" }, "python-utils": { "hashes": [ - "sha256:ebaadab29d0cb9dca0a82eab9c405f5be5125dbbff35b8f32cc433fa498dbaa7", - "sha256:f21fc09ff58ea5ebd1fd2e8ef7f63e39d456336900f26bdc9334a03a3f7d8089" + "sha256:2643aec3bfcd1062accafb915aa624b81a2b0f6dad9d0c1021debead4a35cda7" ], - "version": "==2.4.0" + "version": "==2.5.2" }, "pytz": { "hashes": [ @@ -1008,21 +1068,30 @@ }, "pyyaml": { "hashes": [ - "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", - "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", - "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", - "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e", - "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", - "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", - "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", - "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", - "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", - "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a", - "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", - "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", - "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" + "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf", + "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696", + "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393", + "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77", + "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922", + "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5", + "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8", + "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10", + "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc", + "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018", + "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e", + "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253", + "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183", + "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb", + "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185", + "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db", + "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46", + "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b", + "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63", + "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df", + "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc" ], - "version": "==5.3.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==5.4.1" }, "pyzbar": { "hashes": [ @@ -1035,11 +1104,11 @@ }, "pyzipper": { "hashes": [ - "sha256:49813f1d415bdd7c87064009b9270c6dd0a96da770cfe57df2c6d2d84a6c085a", - "sha256:bfdc65f616278b38ef03c6ea5a1aca7499caf98cbfcd47fc44f73e68f4307145" + "sha256:80d3acd52e9c9291d88f3d7ae36f30ade38e4639941c198c62285018667dc777", + "sha256:dd4cc0d222e207e3b25570f5214411625cc117b7f463d2d51e22d669c7880992" ], "markers": "python_version >= '3.5'", - "version": "==0.3.3" + "version": "==0.3.4" }, "rdflib": { "hashes": [ @@ -1058,60 +1127,60 @@ }, "reportlab": { "hashes": [ - "sha256:0008b5baa39d7e3a8132c4b47ecae88d6858ad386518e754e5e7b8025ee4722b", - "sha256:0ad5a540c336941272fe161ef3a9830da3d4b3a65a195531cebd3cad5db58b2a", - "sha256:0c965a5691686d746f558ee1c52aa9c63a01a0e13cba61ffc661573948e32f61", - "sha256:0fd568fa5615ae99f76289c52ff230207852ee942d4934f6c893c93d2a79544e", - "sha256:1117d905a3404c696869c7aabec9454b43ed6acbbc73f9256c6fcea23e7ae93e", - "sha256:1ea7c388e91ad9d823655ad6a13751ff67e8a0e7cf4065cf051b4c931cdd9450", - "sha256:26c0ee8f62652cc7fcdc47a1cb3b34775a4d625738025c1a7edb8718bda5a315", - "sha256:368c5b3fc3d5a541cb9dcacefa563fdb445365f517e3cbf64b4326631d1cf13c", - "sha256:451d42fdcdd7d84587d6d9c8f5d9a7d0e997305efb606705063ca1fe8bcca551", - "sha256:47394acba4da8e56ef8e55d8eb483b868521696ba49ab0f0fcf8a1a4a5ac6e49", - "sha256:51b16e297f7b937fc530dd151e4b38f1d305b01c9aa10657bc32a5d2901b8ad7", - "sha256:51c0cdcf606ded0a7b4b50050400f25125ea797fbfc3c817135993b38f8b764e", - "sha256:55c672c579618843e0fd00140fb71f1ffebc4f1c542ac385c4f4999f2f5398d9", - "sha256:5c34a96ecfbf595caf16178a06abcd26a5f8720e01fe1285d4c97333382cfaeb", - "sha256:61aa89a00754b18c4f2956b8bff831f1fd3affef6476dc63462d92211941605e", - "sha256:62234d29c97279917903e4587faf240a5dea4617be250db55386ff268eb5a7c5", - "sha256:670f2a8dcc23bf798c39b95c64bf76ee387549b962f76783670821978a226663", - "sha256:69387f171f6c7b55109caa6d061b17a18f2f9e724a0212c07cd692aeb369dd19", - "sha256:6c5c8871b659f7c2975382d7b61f3c182701fa9eb62cf649c3c73ba8fc5e2595", - "sha256:80139ceb3a568f5be908094f1701fd05391b71425e8b69aaed0d30db647ca2aa", - "sha256:80661a76d0019b5e2c315ccd3bc7093d754067d6142b36a3a0ec4f416073d23b", - "sha256:85a2236f324ae336da7f4b183fa99bed261bcc00ac1255ee91a504e68b086d00", - "sha256:89a3acd98bd4478d6bbc5cb32e0665ea546c98bff8b58d5e1014659daa6ef75a", - "sha256:8a39119fcab146bde41fd1c6d148f9ee1e2cca10c6f9c2b7eb4dd710a3a2c6ac", - "sha256:9c31c2526401da6cc92018f68483f2aac0a731cb98435445ea4b72d46b438c84", - "sha256:9e8ae1c3b8a1697147c5c97f00d66ab1c54d88c4615b0cdd9b1a667d7baf3eb7", - "sha256:a79aab8d069543d5085d58260f18705a08acd92a4501a41261913fddc2137d46", - "sha256:b3d9926e64bd8008007b2d9819d7b30179b069ce95431d5060f71afc36885389", - "sha256:c2a9a77ce4f25ffb52d705be82a9f41b47f6b0da23870ebc3587709e7242da30", - "sha256:c578dd0799f70fb577474cd383f035c6e1057e4fe837278113f9cfa6eee4b076", - "sha256:c5abd9d0023ad20030524ab0d5fa39d77aed025519b1fa426304ab2dd0328b89", - "sha256:ced96125525ba21311e9512adf391170b9e149f89e27e45b06ff07b70f97a0b2", - "sha256:d692fb88d6ef5e75242b00009b54953a0425eaa8bd3a36db9db8b396785e1f57", - "sha256:d70c2104286459658e61388af9eee838b612986bd8a36e1d21ba36152983ac15", - "sha256:de47c65c10ac6f0d2addb28f1b1657b1c707aca014d09d01b3b728cf19e8f791", - "sha256:e6e7592527791841db0820a72c6afae52655a05b0b6d4df184fd2bafe82ee1ee", - "sha256:e8a7e95ee6ea5566291b59ede5b9fadce809dca43ebfbfe11e3ff3d6492c6f0e", - "sha256:f041759138b3a95508c4281b3db3bf9bb28636d84c554272a58a5ca7c9f9bbf4", - "sha256:f39c7fc1fa2e4a1d9747a3effd70731a9d0e9eb5738247fa089c059eff19d43e", - "sha256:f65ac89ee0ba569f5279360eae08783f7f2e95c9810a9846c957fbd5950f4896" + "sha256:009fa61710647cdc62eb373345248d8ebb93583a058990f7c4f9be46d90aa5b1", + "sha256:04a08d284da86882ec3a41a7c719833362ef891b09ee8e2fbb47cee352aa684a", + "sha256:07bff6742fba612da8d1b1f783c436338c6fdc6962828159827d5ca7d2b67935", + "sha256:09fb11ab1500e679fc1b01199d2fed24435499856e75043a9ac0d31dd48fd881", + "sha256:18a876449c9000c391dd3415ebc8454cd7bb9e488977b894886a2d7d018f16cd", + "sha256:18eec161411026dde49767bee4e5e8eeb8014879554811a62581dc7433628d5b", + "sha256:19353aead39fc115a4d6c598d6fb9fa26da7e69160a0443ebb49b02903e704e8", + "sha256:1b85c20e89c22ae902ca973df2afdd2d64d27dc4ffd2b29ebad8c805a213756b", + "sha256:1da3d7a35f918cee905facfa94bd00ae6091cadc06dca1b0b31b69ae02d41d1d", + "sha256:33f3cfdc492575f8af3225701301a7e62fc478358729820c9e0091aff5831378", + "sha256:3b0026c1129147befd4e5a8cf25da8dea1096fce371e7b2412e36d7254019c06", + "sha256:3d7713dddaa8081ed709a1fa2456a43f6a74b0f07d605da8441fd53fef334f69", + "sha256:3e2b4d69763103b9dc9b54c0952dc3cee05cedd06e28c0987fad7f84705b12c0", + "sha256:4ca5233a19a5ceca23546290f43addec2345789c7d65bb32f8b2668aa148351f", + "sha256:5214a289cf01ebbd65e49bae83709671dd9edb601891cf0ae8abf85f3c0b392f", + "sha256:52f8237654acbc78ea2fa6fb4a6a06e5b023b6da93f7889adfe2deba09473fad", + "sha256:5ed00894e0f8281c0b7c0494b4d3067c641fd90c8e5cf933089ec4cc9a48e491", + "sha256:6191961533d49c9d860964d42bada4d7ac3bb28502d984feb8034093f2012fa8", + "sha256:6f3ad2b1afe99c436563cd436d8693d4a12e2c4bd45f70c7705759ff7837fe53", + "sha256:739b743b7ca1ba4b4d64c321de6fccb49b562d0507ea06c817d9cc4faed5cd22", + "sha256:792efba0c0c6e4ee94f6dc95f305451733ee9230a1c7d51cb8e5301a549e0dfb", + "sha256:79d63ca40231ca3860859b39a92daa5219035ba9553da89a5e1b218550744121", + "sha256:83b28104edd58ad65748d2d0e60e0d97e3b91b3e90b4573ea6fe60de6811972c", + "sha256:85650446538cd2f606ca234634142a7ccd74cb6db7cfec250f76a4242e0f2431", + "sha256:9da445cb79e3f740756924c053edc952cde11a65ff5af8acfda3c0a1317136ef", + "sha256:9fabd5fbd24f5971085ffe53150d663f158f7d3050b25c95736e29ebf676d454", + "sha256:a0c377bc45e73c3f15f55d7de69fab270d174749d5b454ab0de502b15430ec2a", + "sha256:a1d3f7022a920d4a5e165d264581f1862e1c1b877ceeabb96fe98cec98125ae5", + "sha256:a315edef5c5610b0c75790142f49487e89ea34397fc247ae8aa890fe6d6dd057", + "sha256:a755cca2dcf023130b03bb671670301a992157d5c3151d838c0b68ef89894536", + "sha256:b1b20208ecdfffd7ca027955c4fe8972b28b30a4b3b80cf25099a08d3b20ed7c", + "sha256:b26d6f416891cef93411d6d478a25db275766081a5fb66368248293ef459f3be", + "sha256:b4ba4c30af7044ee987e61c88a5ffb76031ca0c53666bc85d823b7de55ddbc75", + "sha256:b71faf3b6e4d7058e1af1b8afedaf39a962db4a219affc8177009d8244ec10d4", + "sha256:cfa854bea525f8c913cb77e2bda724d94b965a0eb3bcfc4a645a9baa29bb86e2", + "sha256:dd9687359e466086b9f6fe6d8069034017f8b6ca3080944fae5709767ca6814e", + "sha256:de0c675fc2998a7eaa929c356ba49c84f53a892e9ab25e8ee7d8ebbbdcb2ac16", + "sha256:e2b4e33fea2ce9d3a14ea39191b169e41eb2ac995274f54ac8fd27519974bce8", + "sha256:f3d4a1a273dc141e03b72a553c11bc14dd7a27ec7654a071edcf83eb04f004bc", + "sha256:ff547cf4c1de7e104cad1a378431ff81efcb03e90e40871ee686107da5b91442" ], "index": "pypi", - "version": "==3.5.56" + "version": "==3.5.59" }, "requests": { "extras": [ "security" ], "hashes": [ - "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", - "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" + "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" ], "index": "pypi", - "version": "==2.25.0" + "version": "==2.25.1" }, "requests-cache": { "hashes": [ @@ -1120,6 +1189,13 @@ ], "version": "==0.5.2" }, + "rtfde": { + "hashes": [ + "sha256:18386e4f060cee12a2a8035b0acf0cc99689f5dff1bf347bab7e92351860a21d", + "sha256:b86b5d734950fe8745a5b89133f50554252dbd67c6d1b9265e23ee140e7ea8a2" + ], + "version": "==0.0.2" + }, "shodan": { "hashes": [ "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" @@ -1135,57 +1211,6 @@ "index": "pypi", "version": "==0.18.1" }, - "simplejson": { - "hashes": [ - "sha256:034550078a11664d77bc1a8364c90bb7eef0e44c2dbb1fd0a4d92e3997088667", - "sha256:05b43d568300c1cd43f95ff4bfcff984bc658aa001be91efb3bb21df9d6288d3", - "sha256:0dd9d9c738cb008bfc0862c9b8fa6743495c03a0ed543884bf92fb7d30f8d043", - "sha256:10fc250c3edea4abc15d930d77274ddb8df4803453dde7ad50c2f5565a18a4bb", - "sha256:2862beabfb9097a745a961426fe7daf66e1714151da8bb9a0c430dde3d59c7c0", - "sha256:292c2e3f53be314cc59853bd20a35bf1f965f3bc121e007ab6fd526ed412a85d", - "sha256:2d3eab2c3fe52007d703a26f71cf649a8c771fcdd949a3ae73041ba6797cfcf8", - "sha256:2e7b57c2c146f8e4dadf84977a83f7ee50da17c8861fd7faf694d55e3274784f", - "sha256:311f5dc2af07361725033b13cc3d0351de3da8bede3397d45650784c3f21fbcf", - "sha256:344e2d920a7f27b4023c087ab539877a1e39ce8e3e90b867e0bfa97829824748", - "sha256:3fabde09af43e0cbdee407555383063f8b45bfb52c361bc5da83fcffdb4fd278", - "sha256:42b8b8dd0799f78e067e2aaae97e60d58a8f63582939af60abce4c48631a0aa4", - "sha256:4b3442249d5e3893b90cb9f72c7d6ce4d2ea144d2c0d9f75b9ae1e5460f3121a", - "sha256:55d65f9cc1b733d85ef95ab11f559cce55c7649a2160da2ac7a078534da676c8", - "sha256:5c659a0efc80aaaba57fcd878855c8534ecb655a28ac8508885c50648e6e659d", - "sha256:72d8a3ffca19a901002d6b068cf746be85747571c6a7ba12cbcf427bfb4ed971", - "sha256:75ecc79f26d99222a084fbdd1ce5aad3ac3a8bd535cd9059528452da38b68841", - "sha256:76ac9605bf2f6d9b56abf6f9da9047a8782574ad3531c82eae774947ae99cc3f", - "sha256:7d276f69bfc8c7ba6c717ba8deaf28f9d3c8450ff0aa8713f5a3280e232be16b", - "sha256:7f10f8ba9c1b1430addc7dd385fc322e221559d3ae49b812aebf57470ce8de45", - "sha256:8042040af86a494a23c189b5aa0ea9433769cc029707833f261a79c98e3375f9", - "sha256:813846738277729d7db71b82176204abc7fdae2f566e2d9fcf874f9b6472e3e6", - "sha256:845a14f6deb124a3bcb98a62def067a67462a000e0508f256f9c18eff5847efc", - "sha256:869a183c8e44bc03be1b2bbcc9ec4338e37fa8557fc506bf6115887c1d3bb956", - "sha256:8acf76443cfb5c949b6e781c154278c059b09ac717d2757a830c869ba000cf8d", - "sha256:8f713ea65958ef40049b6c45c40c206ab363db9591ff5a49d89b448933fa5746", - "sha256:934115642c8ba9659b402c8bdbdedb48651fb94b576e3b3efd1ccb079609b04a", - "sha256:9551f23e09300a9a528f7af20e35c9f79686d46d646152a0c8fc41d2d074d9b0", - "sha256:9a2b7543559f8a1c9ed72724b549d8cc3515da7daf3e79813a15bdc4a769de25", - "sha256:a55c76254d7cf8d4494bc508e7abb993a82a192d0db4552421e5139235604625", - "sha256:ad8f41c2357b73bc9e8606d2fa226233bf4d55d85a8982ecdfd55823a6959995", - "sha256:af4868da7dd53296cd7630687161d53a7ebe2e63814234631445697bd7c29f46", - "sha256:afebfc3dd3520d37056f641969ce320b071bc7a0800639c71877b90d053e087f", - "sha256:b59aa298137ca74a744c1e6e22cfc0bf9dca3a2f41f51bc92eb05695155d905a", - "sha256:bc00d1210567a4cdd215ac6e17dc00cb9893ee521cee701adfd0fa43f7c73139", - "sha256:c1cb29b1fced01f97e6d5631c3edc2dadb424d1f4421dad079cb13fc97acb42f", - "sha256:c94dc64b1a389a416fc4218cd4799aa3756f25940cae33530a4f7f2f54f166da", - "sha256:ceaa28a5bce8a46a130cd223e895080e258a88d51bf6e8de2fc54a6ef7e38c34", - "sha256:cff6453e25204d3369c47b97dd34783ca820611bd334779d22192da23784194b", - "sha256:d0b64409df09edb4c365d95004775c988259efe9be39697d7315c42b7a5e7e94", - "sha256:d4813b30cb62d3b63ccc60dd12f2121780c7a3068db692daeb90f989877aaf04", - "sha256:da3c55cdc66cfc3fffb607db49a42448785ea2732f055ac1549b69dcb392663b", - "sha256:e058c7656c44fb494a11443191e381355388443d543f6fc1a245d5d238544396", - "sha256:fed0f22bf1313ff79c7fc318f7199d6c2f96d4de3234b2f12a1eab350e597c06", - "sha256:ffd4e4877a78c84d693e491b223385e0271278f5f4e1476a4962dca6824ecfeb" - ], - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.17.2" - }, "six": { "hashes": [ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", @@ -1210,11 +1235,11 @@ }, "soupsieve": { "hashes": [ - "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", - "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" + "sha256:4bb21a6ee4707bf43b61230e80740e71bfe56e55d1f1f50924b087bb2975c851", + "sha256:6dc52924dc0bc710a5d16794e6b3480b2c7c08b07729505feab2b2c16661ff6e" ], "markers": "python_version >= '3'", - "version": "==2.0.1" + "version": "==2.1" }, "sparqlwrapper": { "hashes": [ @@ -1229,11 +1254,11 @@ }, "stix2-patterns": { "hashes": [ - "sha256:373a3de163e1b146499c6e5a7908e1f0987173139480897728fcbbba6a806f95", - "sha256:5a38f634adc856b7d03e13dd140d38e184ac1ef11077c1ffca28a262fa6d8c41" + "sha256:174fe5302d2c3223205033af987754132a9ea45a9f8e08aefafbe0549c889ea4", + "sha256:bc46cc4eba44b76a17eab7a3ff67f35203543cdb918ab24c1ebd58403fa27992" ], "index": "pypi", - "version": "==1.3.1" + "version": "==1.3.2" }, "tabulate": { "hashes": [ @@ -1291,11 +1316,11 @@ }, "tqdm": { "hashes": [ - "sha256:38b658a3e4ecf9b4f6f8ff75ca16221ae3378b2e175d846b6b33ea3a20852cf5", - "sha256:d4f413aecb61c9779888c64ddf0c62910ad56dcbe857d8922bb505d4dbff0df1" + "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a", + "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.54.1" + "version": "==4.56.0" }, "trustar": { "hashes": [ @@ -1401,11 +1426,11 @@ }, "xlrd": { "hashes": [ - "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", - "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" + "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", + "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" ], "index": "pypi", - "version": "==1.2.0" + "version": "==2.0.1" }, "xlsxwriter": { "hashes": [ @@ -1500,52 +1525,67 @@ }, "codecov": { "hashes": [ - "sha256:61bc71b5f58be8000bf9235aa9d0112f8fd3acca00aa02191bb81426d22a8584", - "sha256:a333626e6ff882db760ce71a1d84baf80ddff2cd459a3cc49b41fdac47d77ca5", - "sha256:d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33" + "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b", + "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8", + "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef" ], "index": "pypi", - "version": "==2.1.10" + "version": "==2.1.11" }, "coverage": { "hashes": [ - "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516", - "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259", - "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9", - "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097", - "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0", - "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f", - "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7", - "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c", - "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5", - "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7", - "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729", - "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978", - "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9", - "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f", - "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9", - "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822", - "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418", - "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82", - "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f", - "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d", - "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221", - "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4", - "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21", - "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709", - "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54", - "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d", - "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270", - "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24", - "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751", - "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a", - "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237", - "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7", - "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636", - "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8" + "sha256:08b3ba72bd981531fd557f67beee376d6700fba183b167857038997ba30dd297", + "sha256:2757fa64e11ec12220968f65d086b7a29b6583d16e9a544c889b22ba98555ef1", + "sha256:3102bb2c206700a7d28181dbe04d66b30780cde1d1c02c5f3c165cf3d2489497", + "sha256:3498b27d8236057def41de3585f317abae235dd3a11d33e01736ffedb2ef8606", + "sha256:378ac77af41350a8c6b8801a66021b52da8a05fd77e578b7380e876c0ce4f528", + "sha256:38f16b1317b8dd82df67ed5daa5f5e7c959e46579840d77a67a4ceb9cef0a50b", + "sha256:3911c2ef96e5ddc748a3c8b4702c61986628bb719b8378bf1e4a6184bbd48fe4", + "sha256:3a3c3f8863255f3c31db3889f8055989527173ef6192a283eb6f4db3c579d830", + "sha256:3b14b1da110ea50c8bcbadc3b82c3933974dbeea1832e814aab93ca1163cd4c1", + "sha256:535dc1e6e68fad5355f9984d5637c33badbdc987b0c0d303ee95a6c979c9516f", + "sha256:6f61319e33222591f885c598e3e24f6a4be3533c1d70c19e0dc59e83a71ce27d", + "sha256:723d22d324e7997a651478e9c5a3120a0ecbc9a7e94071f7e1954562a8806cf3", + "sha256:76b2775dda7e78680d688daabcb485dc87cf5e3184a0b3e012e1d40e38527cc8", + "sha256:782a5c7df9f91979a7a21792e09b34a658058896628217ae6362088b123c8500", + "sha256:7e4d159021c2029b958b2363abec4a11db0ce8cd43abb0d9ce44284cb97217e7", + "sha256:8dacc4073c359f40fcf73aede8428c35f84639baad7e1b46fce5ab7a8a7be4bb", + "sha256:8f33d1156241c43755137288dea619105477961cfa7e47f48dbf96bc2c30720b", + "sha256:8ffd4b204d7de77b5dd558cdff986a8274796a1e57813ed005b33fd97e29f059", + "sha256:93a280c9eb736a0dcca19296f3c30c720cb41a71b1f9e617f341f0a8e791a69b", + "sha256:9a4f66259bdd6964d8cf26142733c81fb562252db74ea367d9beb4f815478e72", + "sha256:9a9d4ff06804920388aab69c5ea8a77525cf165356db70131616acd269e19b36", + "sha256:a2070c5affdb3a5e751f24208c5c4f3d5f008fa04d28731416e023c93b275277", + "sha256:a4857f7e2bc6921dbd487c5c88b84f5633de3e7d416c4dc0bb70256775551a6c", + "sha256:a607ae05b6c96057ba86c811d9c43423f35e03874ffb03fbdcd45e0637e8b631", + "sha256:a66ca3bdf21c653e47f726ca57f46ba7fc1f260ad99ba783acc3e58e3ebdb9ff", + "sha256:ab110c48bc3d97b4d19af41865e14531f300b482da21783fdaacd159251890e8", + "sha256:b239711e774c8eb910e9b1ac719f02f5ae4bf35fa0420f438cdc3a7e4e7dd6ec", + "sha256:be0416074d7f253865bb67630cf7210cbc14eb05f4099cc0f82430135aaa7a3b", + "sha256:c46643970dff9f5c976c6512fd35768c4a3819f01f61169d8cdac3f9290903b7", + "sha256:c5ec71fd4a43b6d84ddb88c1df94572479d9a26ef3f150cef3dacefecf888105", + "sha256:c6e5174f8ca585755988bc278c8bb5d02d9dc2e971591ef4a1baabdf2d99589b", + "sha256:c89b558f8a9a5a6f2cfc923c304d49f0ce629c3bd85cb442ca258ec20366394c", + "sha256:cc44e3545d908ecf3e5773266c487ad1877be718d9dc65fc7eb6e7d14960985b", + "sha256:cc6f8246e74dd210d7e2b56c76ceaba1cc52b025cd75dbe96eb48791e0250e98", + "sha256:cd556c79ad665faeae28020a0ab3bda6cd47d94bec48e36970719b0b86e4dcf4", + "sha256:ce6f3a147b4b1a8b09aae48517ae91139b1b010c5f36423fa2b866a8b23df879", + "sha256:ceb499d2b3d1d7b7ba23abe8bf26df5f06ba8c71127f188333dddcf356b4b63f", + "sha256:cef06fb382557f66d81d804230c11ab292d94b840b3cb7bf4450778377b592f4", + "sha256:e448f56cfeae7b1b3b5bcd99bb377cde7c4eb1970a525c770720a352bc4c8044", + "sha256:e52d3d95df81c8f6b2a1685aabffadf2d2d9ad97203a40f8d61e51b70f191e4e", + "sha256:ee2f1d1c223c3d2c24e3afbb2dd38be3f03b1a8d6a83ee3d9eb8c36a52bee899", + "sha256:f2c6888eada180814b8583c3e793f3f343a692fc802546eed45f40a001b1169f", + "sha256:f51dbba78d68a44e99d484ca8c8f604f17e957c1ca09c3ebc2c7e3bbd9ba0448", + "sha256:f54de00baf200b4539a5a092a759f000b5f45fd226d6d25a76b0dff71177a714", + "sha256:fa10fee7e32213f5c7b0d6428ea92e3a3fdd6d725590238a3f92c0de1c78b9d2", + "sha256:fabeeb121735d47d8eab8671b6b031ce08514c86b7ad8f7d5490a7b6dcd6267d", + "sha256:fac3c432851038b3e6afe086f777732bcf7f6ebbfd90951fa04ee53db6d0bcdd", + "sha256:fda29412a66099af6d6de0baa6bd7c52674de177ec2ad2630ca264142d69c6c7", + "sha256:ff1330e8bc996570221b450e2d539134baa9465f5cb98aff0e0f73f34172e0ae" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.3" + "version": "==5.3.1" }, "flake8": { "hashes": [ @@ -1588,11 +1628,11 @@ }, "packaging": { "hashes": [ - "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236", - "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376" + "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858", + "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.7" + "version": "==20.8" }, "pluggy": { "hashes": [ @@ -1604,11 +1644,11 @@ }, "py": { "hashes": [ - "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", - "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" + "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", + "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.9.0" + "version": "==1.10.0" }, "pycodestyle": { "hashes": [ @@ -1636,22 +1676,22 @@ }, "pytest": { "hashes": [ - "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe", - "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e" + "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8", + "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306" ], "index": "pypi", - "version": "==6.1.2" + "version": "==6.2.1" }, "requests": { "extras": [ "security" ], "hashes": [ - "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", - "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" + "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" ], "index": "pypi", - "version": "==2.25.0" + "version": "==2.25.1" }, "toml": { "hashes": [ diff --git a/REQUIREMENTS b/REQUIREMENTS index 10fb179..c020cb1 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -10,7 +10,6 @@ -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client -e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 -pymisp -e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails @@ -24,22 +23,28 @@ async-timeout==3.0.1; python_full_version >= '3.5.3' attrs==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' backscatter==0.2.4 beautifulsoup4==4.9.3 +bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 -certifi==2020.11.8 +certifi==2020.12.5 cffi==1.14.4 chardet==3.0.4 clamd==1.0.2 click-plugins==1.1.1 click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +colorclass==2.2.0 +compressed-rtf==1.0.6 configparser==5.0.1; python_version >= '3.6' -cryptography==3.2.1 +cryptography==3.3.1 decorator==4.4.2 -deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -dnsdb2==1.1.1 -dnspython==2.0.0 +deprecated==1.2.11; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +dnsdb2==1.1.2 +dnspython==2.1.0 domaintools-api==0.5.2 +easygui==0.98.1 +ebcdic==1.1.1 enum-compat==0.0.3 +extract-msg==0.28.1 ez-setup==0.9 ezodf==0.3.2 future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' @@ -48,69 +53,75 @@ geoip2==4.1.0 httplib2==0.18.1 idna-ssl==1.1.0; python_version < '3.7' idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +imapclient==2.1.0 isodate==0.6.0 jbxapi==3.14.0 json-log-formatter==0.3.0 jsonschema==3.2.0 -lief==0.10.1 +lark-parser==0.11.1 +lief==0.11.0 lxml==4.6.2 maclookup==1.0.3 -mail-parser==3.14.0 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' +msoffcrypto-tool==4.11.0 multidict==5.1.0; python_version >= '3.6' np==1.0.2 -numpy==1.19.4; python_version >= '3.6' +numpy==1.19.5; python_version >= '3.6' oauth2==1.9.0.post1 -opencv-python==4.4.0.46 +olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +oletools==0.56 +opencv-python==4.5.1.48 pandas-ods-reader==0.0.7 -pandas==1.1.4 +pandas==1.2.1 passivetotal==1.0.31 +pcodedmp==1.2.6 pdftotext==2.1.5 -pillow==8.0.1 +pillow==8.1.0 progressbar2==3.53.1 -psutil==5.7.3; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +psutil==5.8.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' pycryptodome==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pydeep==0.4 pyeupi==1.1 pygeoip==0.3.2 -pyopenssl==20.0.0 +pymisp[email,fileobjects,openioc,pdfexport]==2.4.137 +pyopenssl==20.0.1 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.1 pypssl==2.1 pyrsistent==0.17.3; python_version >= '3.5' -pytesseract==0.3.6 +pytesseract==0.3.7 python-baseconv==1.2.2 python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.10 -python-engineio==3.14.2 +python-engineio==4.0.0 python-magic==0.4.18 python-pptx==0.6.18 -python-socketio[client]==4.6.1 -python-utils==2.4.0 +python-socketio[client]==5.0.4 +python-utils==2.5.2 pytz==2019.3 -pyyaml==5.3.1 +pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pyzbar==0.1.8 -pyzipper==0.3.3; python_version >= '3.5' +pyzipper==0.3.4; python_version >= '3.5' rdflib==5.0.0 redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.5.56 +reportlab==3.5.59 requests-cache==0.5.2 -requests[security]==2.25.0 +requests[security]==2.25.1 +rtfde==0.0.2 shodan==1.24.0 sigmatools==0.18.1 -simplejson==3.17.2; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' socialscan==1.4.1 socketio-client==0.5.7.4 -soupsieve==2.0.1; python_version >= '3' +soupsieve==2.1; python_version >= '3' sparqlwrapper==1.8.5 -stix2-patterns==1.3.1 +stix2-patterns==1.3.2 tabulate==0.8.7 tornado==6.1; python_version >= '3.5' -tqdm==4.54.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +tqdm==4.56.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' trustar==0.3.34 typing-extensions==3.7.4.3; python_version < '3.8' tzlocal==2.1 @@ -124,7 +135,7 @@ vulners==1.5.9 wand==0.6.5 websocket-client==0.57.0 wrapt==1.12.1 -xlrd==1.2.0 +xlrd==2.0.1 xlsxwriter==1.3.7 yara-python==3.8.1 yarl==1.6.3; python_version >= '3.6' From 87bf5405616c734babfac73fad01e228a0f28a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 21 Jan 2021 12:11:08 +0100 Subject: [PATCH 091/476] fix: Bump PyMISP dep to latest --- Pipfile.lock | 6 +++--- REQUIREMENTS | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index f6d2225..64465bf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -946,11 +946,11 @@ "pdfexport" ], "hashes": [ - "sha256:ccbef2673f992a558a11cfde8dd042c67aadbe71683911a6001da0f9f8242906", - "sha256:fcd4245c5fb17f835dbe98d842cdc50fa8aa6e610ee64f666ad5390f77a82737" + "sha256:439389a5377a9128018e9e4cc8e7ed9efa45a5efc4e77afbb55310ec7935d197", + "sha256:eed98c96b41a5e13ad1147f331ccb66e4fd9284df87528da5c99d759e29309d8" ], "index": "pypi", - "version": "==2.4.137" + "version": "==2.4.137.1" }, "pyonyphe": { "editable": true, diff --git a/REQUIREMENTS b/REQUIREMENTS index c020cb1..0ef401f 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -86,7 +86,7 @@ pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3. pydeep==0.4 pyeupi==1.1 pygeoip==0.3.2 -pymisp[email,fileobjects,openioc,pdfexport]==2.4.137 +pymisp[email,fileobjects,openioc,pdfexport]==2.4.137.1 pyopenssl==20.0.1 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.1 From 0a27db8dd5dc7ffe12dd95bf589fd081fe35a4db Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 25 Jan 2021 17:25:46 +0100 Subject: [PATCH 092/476] Update README long hyphen is not standard ASCII hyphen Fix #464 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b1d80a3..774974f 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ After=misp-workers.service Type=simple User=apache Group=apache -ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules –l 127.0.0.1 –s' +ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s' Restart=always RestartSec=10 From ac318e74d8a4204988eba8f515e6e216ecbaafcb Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 25 Jan 2021 22:07:00 +0100 Subject: [PATCH 093/476] chg: [requirements] fix 463 --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 0ef401f..86615cd 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -39,7 +39,7 @@ cryptography==3.3.1 decorator==4.4.2 deprecated==1.2.11; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.2 -dnspython==2.1.0 +dnspython3==1.15.0 domaintools-api==0.5.2 easygui==0.98.1 ebcdic==1.1.1 From 84c1fdd7dcabcc40a517306d4e80d2a50dd2253d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 26 Jan 2021 16:17:30 +0100 Subject: [PATCH 094/476] chg: [doc] fix #460 - rh install --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 774974f..622d808 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ sudo systemctl enable --now misp-modules As of this writing, the official RHEL repositories only contain Ruby 2.0.0 and Ruby 2.1 or higher is required. As such, this guide installs Ruby 2.2 from the [SCL](https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/3.2_release_notes/chap-installation#sect-Installation-Subscribe) repository. ~~~~bash -sudo yum install rh-ruby22 +sudo yum install rh-python36 rh-ruby22 sudo yum install openjpeg-devel sudo yum install rubygem-rouge rubygem-asciidoctor zbar-devel opencv-devel gcc-c++ pkgconfig poppler-cpp-devel python-devel redhat-rpm-config cd /var/www/MISP From 07b8968b7d65afcec886607eddef421e530f8155 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:52:27 +1030 Subject: [PATCH 095/476] Update assemblyline_submit.py --- misp_modules/modules/expansion/assemblyline_submit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/assemblyline_submit.py b/misp_modules/modules/expansion/assemblyline_submit.py index 206f5c0..ab430cf 100644 --- a/misp_modules/modules/expansion/assemblyline_submit.py +++ b/misp_modules/modules/expansion/assemblyline_submit.py @@ -7,7 +7,7 @@ from urllib.parse import urljoin moduleinfo = {"version": 1, "author": "Christian Studer", "module-type": ["expansion"], "description": "Submit files or URLs to AssemblyLine"} -moduleconfig = ["apiurl", "user_id", "apikey", "password"] +moduleconfig = ["apiurl", "user_id", "apikey", "password", "verifyssl"] mispattributes = {"input": ["attachment", "malware-sample", "url"], "output": ["link"]} From 6f5c77ef080d0ea46aaa39c7e605a17cb1b32f38 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:55:09 +1030 Subject: [PATCH 096/476] Update assemblyline_query.py --- misp_modules/modules/expansion/assemblyline_query.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/assemblyline_query.py b/misp_modules/modules/expansion/assemblyline_query.py index 67fce45..90bdd3c 100644 --- a/misp_modules/modules/expansion/assemblyline_query.py +++ b/misp_modules/modules/expansion/assemblyline_query.py @@ -11,7 +11,7 @@ mispattributes = {'input': ['link'], 'format': 'misp_standard'} moduleinfo = {'version': '1', 'author': 'Christian Studer', 'description': 'Query AssemblyLine with a report URL to get the parsed data.', 'module-type': ['expansion']} -moduleconfig = ["apiurl", "user_id", "apikey", "password"] +moduleconfig = ["apiurl", "user_id", "apikey", "password", "verifyssl"] class AssemblyLineParser(): @@ -125,7 +125,7 @@ def parse_config(apiurl, user_id, config): error = {"error": "Please provide your AssemblyLine API key or Password."} if config.get('apikey'): try: - return Client(apiurl, apikey=(user_id, config['apikey'])) + return Client(apiurl, apikey=(user_id, config['apikey']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' if config.get('password'): From 2832466f7f3657425c99e53d1d0b19bd95b51091 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:56:02 +1030 Subject: [PATCH 097/476] Update assemblyline_submit.py --- misp_modules/modules/expansion/assemblyline_submit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/assemblyline_submit.py b/misp_modules/modules/expansion/assemblyline_submit.py index ab430cf..9e019ff 100644 --- a/misp_modules/modules/expansion/assemblyline_submit.py +++ b/misp_modules/modules/expansion/assemblyline_submit.py @@ -16,12 +16,12 @@ def parse_config(apiurl, user_id, config): error = {"error": "Please provide your AssemblyLine API key or Password."} if config.get('apikey'): try: - return Client(apiurl, apikey=(user_id, config['apikey'])) + return Client(apiurl, apikey=(user_id, config['apikey']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' if config.get('password'): try: - return Client(apiurl, auth=(user_id, config['password'])) + return Client(apiurl, auth=(user_id, config['password']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' return error From 7781a0cae7586843344eec8f7c1a0142d3727fd4 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 10:18:52 +0100 Subject: [PATCH 098/476] add new module new module yeti --- REQUIREMENTS | 4 ++-- misp_modules/modules/expansion/yeti.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 misp_modules/modules/expansion/yeti.py diff --git a/REQUIREMENTS b/REQUIREMENTS index 73b002a..92175f2 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -8,7 +8,7 @@ -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe --e git+https://github.com/stricaud/faup.git#egg=pyfaup&subdirectory=src/lib/bindings/python +#-e git+https://github.com/stricaud/faup.git#egg=pyfaup&subdirectory=src/lib/bindings/python aiohttp==3.4.4 antlr4-python3-runtime==4.8 ; python_version >= '3' apiosintds==1.8.3 @@ -44,7 +44,7 @@ importlib-metadata==1.6.0 ; python_version < '3.8' isodate==0.6.0 jbxapi==3.4.0 jsonschema==3.2.0 -lief==0.10.1 + lxml==4.5.0 maclookup==1.0.3 maxminddb==1.5.2 diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py new file mode 100644 index 0000000..5742a08 --- /dev/null +++ b/misp_modules/modules/expansion/yeti.py @@ -0,0 +1,17 @@ +import json + +import json +try: + import pyeti +except ImportError: + print("pyeti module not installed.") + +misperrors = {'error': 'Error'} + +mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], + 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url']} +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', + 'description': 'Query on yeti', + 'module-type': ['expansion', 'hover']} + From 66fc121dbe0dbb7a69a62bfdaf98838a4f7a0bf3 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 11:17:40 +0100 Subject: [PATCH 099/476] Update yeti.py add config and struct --- misp_modules/modules/expansion/yeti.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 5742a08..0dd2275 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -1,6 +1,7 @@ import json import json + try: import pyeti except ImportError: @@ -15,3 +16,23 @@ moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', 'description': 'Query on yeti', 'module-type': ['expansion', 'hover']} +moduleconfig = ['apikey', 'url'] + + +class Yeti: + + def __init__(self, url, key): + self.api = pyeti.YetiApi(url, api_key=key) + self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} + + def search(self, value): + obs = self.api.observable_search(value=value) + if obs: + return obs + + def +def handler(q=False): + if q is False: + return False + request = json.loads(q) + attribute = request['attribute'] From 10e9b6db12f48eae397a592942a595b2c68b01cf Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 11:21:29 +0100 Subject: [PATCH 100/476] Update REQUIREMENTS correct conflic --- REQUIREMENTS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 92175f2..3abe64c 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -8,7 +8,7 @@ -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -#-e git+https://github.com/stricaud/faup.git#egg=pyfaup&subdirectory=src/lib/bindings/python +-e git+https://github.com/stricaud/faup.git#egg=pyfaup&subdirectory=src/lib/bindings/python aiohttp==3.4.4 antlr4-python3-runtime==4.8 ; python_version >= '3' apiosintds==1.8.3 @@ -44,7 +44,7 @@ importlib-metadata==1.6.0 ; python_version < '3.8' isodate==0.6.0 jbxapi==3.4.0 jsonschema==3.2.0 - +lief==0.10.0 lxml==4.5.0 maclookup==1.0.3 maxminddb==1.5.2 From 619d64808444a51e49db5a5864283530b8f66c54 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 11:37:34 +0100 Subject: [PATCH 101/476] Update yeti.py correct import --- misp_modules/modules/expansion/yeti.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 0dd2275..c2aed98 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -1,7 +1,5 @@ import json -import json - try: import pyeti except ImportError: @@ -30,7 +28,7 @@ class Yeti: if obs: return obs - def + def handler(q=False): if q is False: return False From b29b3ded28d26d43c5ebda403e95145d3cb24d96 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 11:47:27 +0100 Subject: [PATCH 102/476] Update yeti.py add method version --- misp_modules/modules/expansion/yeti.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c2aed98..bc30fdd 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -34,3 +34,8 @@ def handler(q=False): return False request = json.loads(q) attribute = request['attribute'] + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo \ No newline at end of file From 1def6e3f06393b77604763ed9af3c770165cfbcd Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Feb 2021 12:02:08 +0100 Subject: [PATCH 103/476] Update yeti.py add introspection method --- misp_modules/modules/expansion/yeti.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index bc30fdd..863bcd9 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -38,4 +38,7 @@ def handler(q=False): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo \ No newline at end of file + return moduleinfo + +def introspection(): + return mispattributes \ No newline at end of file From b67a20f84f2d9c5bc42c3a2cb9aaf2d547f259b9 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Tue, 2 Mar 2021 11:17:22 +1030 Subject: [PATCH 104/476] Change to pandas version requirement to address pip install failure Updated pandas version to 1.1.5 to allow pip install as defined at https://github.com/MISP/misp-modules to complete successfully. --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 86615cd..3142c88 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -73,7 +73,7 @@ olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, oletools==0.56 opencv-python==4.5.1.48 pandas-ods-reader==0.0.7 -pandas==1.2.1 +pandas==1.1.5 passivetotal==1.0.31 pcodedmp==1.2.6 pdftotext==2.1.5 From 1e6e752b5dd8cee3091532f28985d534fe127264 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Tue, 2 Mar 2021 11:29:36 +1030 Subject: [PATCH 105/476] Included missing dependencies for censys and pyfaup Added censys dependency Added pyfaup dependency --- REQUIREMENTS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 3142c88..681352a 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -25,6 +25,7 @@ backscatter==0.2.4 beautifulsoup4==4.9.3 bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 +censys==1.26.3 certifi==2020.12.5 cffi==1.14.4 chardet==3.0.4 @@ -85,6 +86,7 @@ pycryptodome==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1 pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pydeep==0.4 pyeupi==1.1 +pyfaup==1.2 pygeoip==0.3.2 pymisp[email,fileobjects,openioc,pdfexport]==2.4.137.1 pyopenssl==20.0.1 From 38457f0a7b0a61337bf9ac1509560e021d15b03c Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Tue, 2 Mar 2021 15:03:15 +0100 Subject: [PATCH 106/476] fix: Consider mail body as UTF-8 encoded --- .../modules/import_mod/email_import.py | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/misp_modules/modules/import_mod/email_import.py b/misp_modules/modules/import_mod/email_import.py index 7453dcd..3ebf3a2 100644 --- a/misp_modules/modules/import_mod/email_import.py +++ b/misp_modules/modules/import_mod/email_import.py @@ -110,21 +110,20 @@ def handler(q=False): email_object.add_reference(f_object.uuid, 'includes', 'Email attachment') mail_body = email_object.email.get_body(preferencelist=('html', 'plain')) - if extract_urls: - if mail_body: - charset = mail_body.get_content_charset() - if mail_body.get_content_type() == 'text/html': - url_parser = HTMLURLParser() - url_parser.feed(mail_body.get_payload(decode=True).decode(charset, errors='ignore')) - urls = url_parser.urls - else: - urls = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', mail_body.get_payload(decode=True).decode(charset, errors='ignore')) - for url in urls: - if not url: - continue - url_object = URLObject(url, standalone=False) - file_objects.append(url_object) - email_object.add_reference(url_object.uuid, 'includes', 'URL in email body') + if extract_urls and mail_body: + charset = mail_body.get_content_charset('utf-8') + if mail_body.get_content_type() == 'text/html': + url_parser = HTMLURLParser() + url_parser.feed(mail_body.get_payload(decode=True).decode(charset, errors='ignore')) + urls = url_parser.urls + else: + urls = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', mail_body.get_payload(decode=True).decode(charset, errors='ignore')) + for url in urls: + if not url: + continue + url_object = URLObject(url, standalone=False) + file_objects.append(url_object) + email_object.add_reference(url_object.uuid, 'includes', 'URL in email body') objects = [email_object.to_json()] if file_objects: From c0c7592cc218ee04b4fc641c8e90cd7f2b9890c1 Mon Sep 17 00:00:00 2001 From: adammchugh <34958726+adammchugh@users.noreply.github.com> Date: Thu, 4 Mar 2021 19:37:56 +1030 Subject: [PATCH 107/476] Fixed the censys version Unsure how I managed to get the version so wrong, but I have updated it to the current version and confirmed as working. --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 681352a..4beaebf 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -25,7 +25,7 @@ backscatter==0.2.4 beautifulsoup4==4.9.3 bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 -censys==1.26.3 +censys==1.1.1 certifi==2020.12.5 cffi==1.14.4 chardet==3.0.4 From 1209cd3a759f4c54613e323b70ad6154264b8ca7 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:00:19 +0100 Subject: [PATCH 108/476] yeti pluggin get_entities and get_neighboors --- .gitignore | 5 +++- misp_modules/modules/expansion/yeti.py | 39 +++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e4adeb2..323f87a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ docs/export_mod* site* #pycharm env -.idea/* \ No newline at end of file +.idea/* + +#venv +venv* \ No newline at end of file diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 863bcd9..8991aa5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -17,23 +17,54 @@ moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', moduleconfig = ['apikey', 'url'] -class Yeti: +class Yeti(pyeti.YetiApi): def __init__(self, url, key): - self.api = pyeti.YetiApi(url, api_key=key) + super(Yeti, self).__init__(url, key) self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} def search(self, value): - obs = self.api.observable_search(value=value) + obs = self.observable_search(value=value) if obs: - return obs + return obs[0] + def get_neighboors(self, obs_id): + neighboors = self.neighbors_observables(obs_id) + if neighboors and 'objs' in neighboors: + for n in neighboors: + yield n + + def get_tags(self, value): + obs = self.search(value) + if obs: + for t in obs['tags']: + yield t + + def get_entity(self, obs_id): + companies = self.observable_to_company(obs_id) + actors = self.observable_to_actor(obs_id) + campaigns = self.observable_to_campaign(obs_id) + exploit_kit = self.observable_to_exploitkit(obs_id) + exploit = self.observable_to_exploit(obs_id) + ind = self.observable_to_indicator(obs_id) + + res = [] + res.extend(companies) + res.extend(actors) + res.extend(campaigns) + res.extend(exploit) + res.extend(exploit_kit) + res.extend(ind) + + for r in res: + yield r['name'] def handler(q=False): if q is False: return False request = json.loads(q) attribute = request['attribute'] + print(attribute) def version(): From 0f31893fdb99c1bb7930efd4067fab8f98612588 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:06:12 +0100 Subject: [PATCH 109/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 8991aa5..78b7b4b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -63,6 +63,7 @@ def handler(q=False): if q is False: return False request = json.loads(q) + print(request) attribute = request['attribute'] print(attribute) From e7cb15a0c43dcfbd0132c8a41f69a16114ad07a3 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:22:53 +0100 Subject: [PATCH 110/476] Update yeti.py add ip-dst to enrich --- misp_modules/modules/expansion/yeti.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 78b7b4b..8c6f68a 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -63,9 +63,21 @@ def handler(q=False): if q is False: return False request = json.loads(q) - print(request) - attribute = request['attribute'] - print(attribute) + + if 'url' in request: + yeti_url = request['url'] + if 'apikey' in request: + apikey = request['apikey'] + if apikey and yeti_url: + yeti_client = Yeti(yeti_url,apikey) + if request.get('ip-dst'): + obs_value = request['ip-dst'] + + if yeti_client: + obs=yeti_client.search(obs_value) + print(obs) + else: + misperrors['error'] = 'Yeti Config Error' def version(): From 3fdce84ff793ca74d7c3e68ac4f7a7d0ad5202bc Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:24:43 +0100 Subject: [PATCH 111/476] Update yeti.py add log --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 8c6f68a..d8f47bb 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -63,7 +63,7 @@ def handler(q=False): if q is False: return False request = json.loads(q) - + print(request) if 'url' in request: yeti_url = request['url'] if 'apikey' in request: From e2a1ade14ac049ed11af95ba1627eec1d0f98ee1 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:28:50 +0100 Subject: [PATCH 112/476] Update yeti.py change path to access config settings --- misp_modules/modules/expansion/yeti.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index d8f47bb..110d6eb 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -64,10 +64,12 @@ def handler(q=False): return False request = json.loads(q) print(request) - if 'url' in request: - yeti_url = request['url'] - if 'apikey' in request: - apikey = request['apikey'] + apikey = None + yeti_url = None + if 'config' in request and 'url' in request['config']: + yeti_url = request['config']['url'] + if 'config' in request and 'apikey' in request['config']: + apikey = request['config']['apikey'] if apikey and yeti_url: yeti_client = Yeti(yeti_url,apikey) if request.get('ip-dst'): From 800020d6a23abd686050514e6499023115db4cae Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:34:01 +0100 Subject: [PATCH 113/476] Update yeti.py change inherit --- misp_modules/modules/expansion/yeti.py | 31 +++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 110d6eb..78c4928 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -17,19 +17,19 @@ moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', moduleconfig = ['apikey', 'url'] -class Yeti(pyeti.YetiApi): +class Yeti(): def __init__(self, url, key): super(Yeti, self).__init__(url, key) self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} - + self.yeti_client = pyeti.YetiApi(url, key) def search(self, value): - obs = self.observable_search(value=value) + obs = self.yeti_client.observable_search(value=value) if obs: return obs[0] def get_neighboors(self, obs_id): - neighboors = self.neighbors_observables(obs_id) + neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: for n in neighboors: yield n @@ -41,12 +41,12 @@ class Yeti(pyeti.YetiApi): yield t def get_entity(self, obs_id): - companies = self.observable_to_company(obs_id) - actors = self.observable_to_actor(obs_id) - campaigns = self.observable_to_campaign(obs_id) - exploit_kit = self.observable_to_exploitkit(obs_id) - exploit = self.observable_to_exploit(obs_id) - ind = self.observable_to_indicator(obs_id) + companies = self.yeti_client.observable_to_company(obs_id) + actors = self.yeti_client.observable_to_actor(obs_id) + campaigns = self.yeti_client.observable_to_campaign(obs_id) + exploit_kit = self.yeti_client.observable_to_exploitkit(obs_id) + exploit = self.yeti_client.observable_to_exploit(obs_id) + ind = self.yeti_client.observable_to_indicator(obs_id) res = [] res.extend(companies) @@ -62,10 +62,15 @@ class Yeti(pyeti.YetiApi): def handler(q=False): if q is False: return False - request = json.loads(q) - print(request) + + apikey = None yeti_url = None + yeti_client = None + + request = json.loads(q) + print(request) + if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] if 'config' in request and 'apikey' in request['config']: @@ -76,7 +81,7 @@ def handler(q=False): obs_value = request['ip-dst'] if yeti_client: - obs=yeti_client.search(obs_value) + obs= yeti_client.search(obs_value) print(obs) else: misperrors['error'] = 'Yeti Config Error' From 6aff43cf992c9e0acfd2b7059b56fb6ee301f0d5 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:37:04 +0100 Subject: [PATCH 114/476] Update yeti.py Correct bugs --- misp_modules/modules/expansion/yeti.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 78c4928..950c8d6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -20,7 +20,6 @@ moduleconfig = ['apikey', 'url'] class Yeti(): def __init__(self, url, key): - super(Yeti, self).__init__(url, key) self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} self.yeti_client = pyeti.YetiApi(url, key) def search(self, value): @@ -70,7 +69,7 @@ def handler(q=False): request = json.loads(q) print(request) - + if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] if 'config' in request and 'apikey' in request['config']: From e3f23793e04b830942fbb9c6b00d54ecc0db1482 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 11:40:11 +0100 Subject: [PATCH 115/476] Update yeti.py modify call yeti --- misp_modules/modules/expansion/yeti.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 950c8d6..eaf27ab 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -21,7 +21,8 @@ class Yeti(): def __init__(self, url, key): self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} - self.yeti_client = pyeti.YetiApi(url, key) + self.yeti_client = pyeti.YetiApi(url=url, api_key=key) + def search(self, value): obs = self.yeti_client.observable_search(value=value) if obs: From cb008124c327f662c55ee842a4052a9dbef151b2 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 15:06:13 +0100 Subject: [PATCH 116/476] Update yeti.py add neighboors iocs to add the event --- misp_modules/modules/expansion/yeti.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index eaf27ab..ccc614d 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -20,9 +20,9 @@ moduleconfig = ['apikey', 'url'] class Yeti(): def __init__(self, url, key): - self.dict = {'Ip': 'ip-src', 'Domain': 'domain', 'Hostname': 'hostname'} + self.dict = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) - + def search(self, value): obs = self.yeti_client.observable_search(value=value) if obs: @@ -81,10 +81,24 @@ def handler(q=False): obs_value = request['ip-dst'] if yeti_client: - obs= yeti_client.search(obs_value) - print(obs) + obs = yeti_client.search(obs_value) + values = [] + types = [] + to_push = {"results": []} + for obs in yeti_client.get_neighboors(obs['id']): + values.append(obs['value']) + types.append(yeti_client.dict[obs['type']]) + to_push['results'].append( + {'types': types, + 'values': values, + 'categories': ['Network Activities'] + } + ) + return to_push else: misperrors['error'] = 'Yeti Config Error' + return misperrors + def version(): From 7e1bf41d475d5598790d6cb95a13aabed62f26b1 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 15:08:32 +0100 Subject: [PATCH 117/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ccc614d..58ca63b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -82,6 +82,7 @@ def handler(q=False): if yeti_client: obs = yeti_client.search(obs_value) + print(obs) values = [] types = [] to_push = {"results": []} From 9de5dd89eec3a9572e7151ab74a1d0b97311c16f Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 15:14:25 +0100 Subject: [PATCH 118/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 58ca63b..828de47 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -86,9 +86,10 @@ def handler(q=False): values = [] types = [] to_push = {"results": []} - for obs in yeti_client.get_neighboors(obs['id']): - values.append(obs['value']) - types.append(yeti_client.dict[obs['type']]) + for obs_to_add in yeti_client.get_neighboors(obs['id']): + print(obs_to_add) + values.append(obs_to_add['value']) + types.append(yeti_client.dict[obs_to_add['type']]) to_push['results'].append( {'types': types, 'values': values, From bf617807df0c917dd699846393be52a4b1f161f6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 15:19:30 +0100 Subject: [PATCH 119/476] Update yeti.py modify acess dict --- misp_modules/modules/expansion/yeti.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 828de47..f0f8099 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -31,7 +31,7 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: - for n in neighboors: + for n in neighboors['objs']: yield n def get_tags(self, value): @@ -69,7 +69,6 @@ def handler(q=False): yeti_client = None request = json.loads(q) - print(request) if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] @@ -82,7 +81,6 @@ def handler(q=False): if yeti_client: obs = yeti_client.search(obs_value) - print(obs) values = [] types = [] to_push = {"results": []} From 33bba708bfd61ba40f05189fda04c53fc36fae88 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 16:53:49 +0100 Subject: [PATCH 120/476] Update yeti.py use format misp --- misp_modules/modules/expansion/yeti.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f0f8099..db1b4c5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -8,7 +8,8 @@ except ImportError: misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], - 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url']} + 'format': 'misp_standard' + } # possible module-types: 'expansion', 'hover' or both moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', 'description': 'Query on yeti', @@ -69,7 +70,7 @@ def handler(q=False): yeti_client = None request = json.loads(q) - + print(request) if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] if 'config' in request and 'apikey' in request['config']: From 294bdee51afba5f4879c46fefd71eaa88554af30 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 16:57:55 +0100 Subject: [PATCH 121/476] Update yeti.py using attribute --- misp_modules/modules/expansion/yeti.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index db1b4c5..79a1800 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -77,11 +77,11 @@ def handler(q=False): apikey = request['config']['apikey'] if apikey and yeti_url: yeti_client = Yeti(yeti_url,apikey) - if request.get('ip-dst'): - obs_value = request['ip-dst'] + if request.get('attribute'): + attribute = request['attribute'] if yeti_client: - obs = yeti_client.search(obs_value) + obs = yeti_client.search(attribute['value']) values = [] types = [] to_push = {"results": []} From 6fc3b2a860f260bcfc052aec459d90dd475f526b Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 5 Mar 2021 19:01:25 +0100 Subject: [PATCH 122/476] Update yeti.py refactoring --- misp_modules/modules/expansion/yeti.py | 52 ++++++++++++++++---------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 79a1800..f92a3b0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -5,6 +5,8 @@ try: except ImportError: print("pyeti module not installed.") +from pymisp import MISPEvent, MISPObject + misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], @@ -20,9 +22,12 @@ moduleconfig = ['apikey', 'url'] class Yeti(): - def __init__(self, url, key): + def __init__(self, url, key,attribute): self.dict = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) def search(self, value): obs = self.yeti_client.observable_search(value=value) @@ -60,6 +65,28 @@ class Yeti(): for r in res: yield r['name'] + def parse_yeti_result(self): + obs = self.search(self.attribute['value']) + values = [] + types = [] + + for obs_to_add in self.get_neighboors(obs['id']): + object_misp = self.get_object(obs_to_add) + self.misp_event.add_object(object_misp) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return results + + def get_object(self,obj_to_add): + if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ + (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): + domain_ip_object = MISPObject('domain-ip') + domain_ip_object.add_attribute() + domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + return domain_ip_object + def handler(q=False): if q is False: return False @@ -70,32 +97,19 @@ def handler(q=False): yeti_client = None request = json.loads(q) + attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attributes type'} print(request) if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] if 'config' in request and 'apikey' in request['config']: apikey = request['config']['apikey'] if apikey and yeti_url: - yeti_client = Yeti(yeti_url,apikey) - if request.get('attribute'): - attribute = request['attribute'] + yeti_client = Yeti(yeti_url, apikey, attribute) if yeti_client: - obs = yeti_client.search(attribute['value']) - values = [] - types = [] - to_push = {"results": []} - for obs_to_add in yeti_client.get_neighboors(obs['id']): - print(obs_to_add) - values.append(obs_to_add['value']) - types.append(yeti_client.dict[obs_to_add['type']]) - to_push['results'].append( - {'types': types, - 'values': values, - 'categories': ['Network Activities'] - } - ) - return to_push + else: misperrors['error'] = 'Yeti Config Error' return misperrors From 68a68486e64a734764d4e08f0d7f8b48739d8705 Mon Sep 17 00:00:00 2001 From: Kevin Holvoet <1122246+digihash@users.noreply.github.com> Date: Sat, 6 Mar 2021 22:30:22 +0100 Subject: [PATCH 123/476] Update README.md Added fix based on https://github.com/MISP/MISP/issues/4045 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 622d808..c4d72e7 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj sudo apt-get install python3-dev python3-pip libpq5 libjpeg-dev tesseract-ocr libpoppler-cpp-dev imagemagick virtualenv libopencv-dev zbar-tools libzbar0 libzbar-dev libfuzzy-dev build-essential -y sudo -u www-data virtualenv -p python3 /var/www/MISP/venv cd /usr/local/src/ -chown -R www-data . +sudo chown -R www-data: . sudo git clone https://github.com/MISP/misp-modules.git cd misp-modules sudo -u www-data /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS From c1700cc955ac1a970c8b598ef7456c0bbfc6da56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20L=C3=B6hel?= Date: Tue, 9 Mar 2021 16:46:11 -0600 Subject: [PATCH 124/476] fix: google.py module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrects import for gh.com/abenassi/Google-Search-API. Signed-off-by: Jürgen Löhel --- misp_modules/modules/expansion/google_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/google_search.py b/misp_modules/modules/expansion/google_search.py index b7b4e7a..bb8c536 100644 --- a/misp_modules/modules/expansion/google_search.py +++ b/misp_modules/modules/expansion/google_search.py @@ -1,6 +1,6 @@ import json try: - from google import google + from googleapi import google except ImportError: print("GoogleAPI not installed. Command : pip install git+https://github.com/abenassi/Google-Search-API") From 9e8d01b6c8596574b162bc7c7fe912a320f578f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20L=C3=B6hel?= Date: Tue, 9 Mar 2021 18:04:12 -0600 Subject: [PATCH 125/476] fix: google.py module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The search result does not include always 3 elements. It's better to enumerate here. The googleapi fails sometimes. Retry it 3 times. Signed-off-by: Jürgen Löhel --- misp_modules/modules/expansion/google_search.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/google_search.py b/misp_modules/modules/expansion/google_search.py index bb8c536..97e37ad 100644 --- a/misp_modules/modules/expansion/google_search.py +++ b/misp_modules/modules/expansion/google_search.py @@ -1,4 +1,6 @@ import json +import random +import time try: from googleapi import google except ImportError: @@ -9,6 +11,8 @@ mispattributes = {'input': ['url'], 'output': ['text']} moduleinfo = {'author': 'Oun & Gindt', 'module-type': ['hover'], 'description': 'An expansion hover module to expand google search information about an URL'} +def sleep(retry): + time.sleep(random.uniform(0, min(40, 0.01 * 2 ** retry))) def handler(q=False): if q is False: @@ -18,10 +22,16 @@ def handler(q=False): return {'error': "Unsupported attributes type"} num_page = 1 res = "" - search_results = google.search(request['url'], num_page) - for i in range(3): + # The googleapi module sets a random useragent. The output depends on the useragent. + # It's better to retry 3 times. + for retry in range(3): + search_results = google.search(request['url'], num_page) + if len(search_results) > 0: + break + sleep(retry) + for i, search_result in enumerate(search_results): res += "("+str(i+1)+")" + '\t' - res += json.dumps(search_results[i].description, ensure_ascii=False) + res += json.dumps(search_result.description, ensure_ascii=False) res += '\n\n' return {'results': [{'types': mispattributes['output'], 'values':res}]} From d913ae4b36ecd8cc7ff4b1db3a41ddee32701f0e Mon Sep 17 00:00:00 2001 From: Corsin Camichel Date: Sat, 13 Mar 2021 17:44:27 +0100 Subject: [PATCH 126/476] updating "hibp" for API version 3 --- misp_modules/modules/expansion/hibp.py | 28 +++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/misp_modules/modules/expansion/hibp.py b/misp_modules/modules/expansion/hibp.py index 8db3fa7..bea7749 100644 --- a/misp_modules/modules/expansion/hibp.py +++ b/misp_modules/modules/expansion/hibp.py @@ -1,14 +1,14 @@ +# -*- coding: utf-8 -*- import requests import json misperrors = {'error': 'Error'} -mispattributes = {'input': ['email-dst', 'email-src'], 'output': ['text']} # All mails as input -moduleinfo = {'version': '0.1', 'author': 'Aurélien Schwab', 'description': 'Module to access haveibeenpwned.com API.', 'module-type': ['hover']} -moduleconfig = ['user-agent'] # TODO take this into account in the code - -haveibeenpwned_api_url = 'https://api.haveibeenpwned.com/api/v2/breachedaccount/' -default_user_agent = 'MISP-Module' # User agent (must be set, requiered by API)) +mispattributes = {'input': ['email-dst', 'email-src'],'output': ['text']} +moduleinfo = {'version': '0.2', 'author': 'Corsin Camichel, Aurélien Schwab', 'description': 'Module to access haveibeenpwned.com API (v3).', 'module-type': ['hover']} +moduleconfig = ['api_key'] +haveibeenpwned_api_url = 'https://haveibeenpwned.com/api/v3/breachedaccount/' +API_KEY = "" # details at https://www.troyhunt.com/authentication-and-the-have-i-been-pwned-api/ def handler(q=False): if q is False: @@ -22,22 +22,26 @@ def handler(q=False): misperrors['error'] = "Unsupported attributes type" return misperrors - r = requests.get(haveibeenpwned_api_url + email, headers={'user-agent': default_user_agent}) # Real request - if r.status_code == 200: # OK (record found) + if (request['config'].get('api_key') is None): + misperrors['error'] = 'Have I Been Pwned authentication is incomplete (no API key)' + return misperrors + else: + API_KEY = request['config'].get('api_key') + + r = requests.get(haveibeenpwned_api_url + email, headers={'hibp-api-key': API_KEY}) + if r.status_code == 200: breaches = json.loads(r.text) if breaches: return {'results': [{'types': mispattributes['output'], 'values': breaches}]} - elif r.status_code == 404: # Not found (not an error) + elif r.status_code == 404: return {'results': [{'types': mispattributes['output'], 'values': 'OK (Not Found)'}]} - else: # Real error + else: misperrors['error'] = 'haveibeenpwned.com API not accessible (HTTP ' + str(r.status_code) + ')' return misperrors['error'] - def introspection(): return mispattributes - def version(): moduleinfo['config'] = moduleconfig return moduleinfo From d14d3d585fe2de3ac6082dfd4f47602de1a472b3 Mon Sep 17 00:00:00 2001 From: Corsin Camichel Date: Sat, 13 Mar 2021 20:36:49 +0100 Subject: [PATCH 127/476] first version of ThreatFox enrichment module --- misp_modules/modules/expansion/threatfox.py | 59 +++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 misp_modules/modules/expansion/threatfox.py diff --git a/misp_modules/modules/expansion/threatfox.py b/misp_modules/modules/expansion/threatfox.py new file mode 100644 index 0000000..6ddf730 --- /dev/null +++ b/misp_modules/modules/expansion/threatfox.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +import requests +import json + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['md5', 'sha1', 'sha256', 'domain', 'url', 'email-src', 'ip-dst|port', 'ip-src|port'],'output': ['text']} +moduleinfo = {'version': '0.1', 'author': 'Corsin Camichel', 'description': 'Module to search for an IOC on ThreatFox by abuse.ch.', 'module-type': ['hover', 'expansion']} +moduleconfig = [] + +API_URL = "https://threatfox-api.abuse.ch/api/v1/" + +# copied from +# https://github.com/marjatech/threatfox2misp/blob/main/threatfox2misp.py +def confidence_level_to_tag(level: int) -> str: + confidence_tagging = { + 0: 'misp:confidence-level="unconfident"', + 10: 'misp:confidence-level="rarely-confident"', + 37: 'misp:confidence-level="fairly-confident"', + 63: 'misp:confidence-level="usually-confident"', + 90: 'misp:confidence-level="completely-confident"', + } + + confidence_tag = "" + for tag_minvalue, tag in confidence_tagging.items(): + if level >= tag_minvalue: + confidence_tag = tag + return confidence_tag + +def handler(q=False): + if q is False: + return False + + request = json.loads(q) + ret_val = "" + + for input_type in mispattributes['input']: + if input_type in request: + to_query = request[input_type] + break + else: + misperrors['error'] = "Unsupported attributes type:" + return misperrors + + data = { "query": "search_ioc", "search_term": f"{to_query}" } + response = requests.post(API_URL, data=json.dumps(data)) + if response.status_code == 200: + result = json.loads(response.text) + if(result["query_status"] == "ok"): + confidence_tag = confidence_level_to_tag(result["data"][0]["confidence_level"]) + ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], confidence_tag ] }]} + + return ret_val + +def introspection(): + return mispattributes + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From a13184b078fc997bb8c37bf9c5dca58d14dd0123 Mon Sep 17 00:00:00 2001 From: Corsin Camichel Date: Sat, 13 Mar 2021 20:59:54 +0100 Subject: [PATCH 128/476] adding additional tags --- misp_modules/modules/expansion/threatfox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/threatfox.py b/misp_modules/modules/expansion/threatfox.py index 6ddf730..f2201a0 100644 --- a/misp_modules/modules/expansion/threatfox.py +++ b/misp_modules/modules/expansion/threatfox.py @@ -47,7 +47,7 @@ def handler(q=False): result = json.loads(response.text) if(result["query_status"] == "ok"): confidence_tag = confidence_level_to_tag(result["data"][0]["confidence_level"]) - ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], confidence_tag ] }]} + ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], result["data"][0]["malware_printable"], confidence_tag ] }]} return ret_val From f58f4aa9eb42a27cf749b30a0cf951271167460a Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 17 Mar 2021 20:17:07 +0100 Subject: [PATCH 129/476] chg: [farsight_passivedns] Added input types for more flex queries - Standard types still supported as before - Name or ip lookup, with optional flex queries - New attribute types added will only send flex queries to the DNSDB API --- .../modules/expansion/farsight_passivedns.py | 97 +++++++++++++++---- 1 file changed, 77 insertions(+), 20 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index c41333b..10e5dbf 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -4,12 +4,36 @@ from . import check_input_attribute, standard_error_message from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} +standard_query_input = [ + 'hostname', + 'domain', + 'ip-src', + 'ip-dst' +] +flex_query_input = [ + 'btc', + 'dkim', + 'email', + 'email-src', + 'email-dst', + 'domain|ip', + 'hex', + 'mac-address', + 'mac-eui-64', + 'other', + 'pattern-filename', + 'target-email', + 'text', + 'uri', + 'url', + 'whois-registrant-email', +] mispattributes = { - 'input': ['hostname', 'domain', 'ip-src', 'ip-dst'], + 'input': standard_query_input + flex_query_input, 'format': 'misp_standard' } moduleinfo = { - 'version': '0.4', + 'version': '0.5', 'author': 'Christophe Vandeplas', 'description': 'Module to access Farsight DNSDB Passive DNS', 'module-type': ['expansion', 'hover'] @@ -20,11 +44,38 @@ DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 TYPE_TO_FEATURE = { + "btc": "Bitcoin address", + "dkim": "domainkeys identified mail", "domain": "domain name", + "domain|ip": "domain name / IP address", + "hex": "value in hexadecimal format", "hostname": "hostname", - "ip-src": "IP address", - "ip-dst": "IP address" + "mac-address": "MAC address", + "mac-eui-64": "MAC EUI-64 address", + "pattern-filename": "pattern in the name of a file", + "target-email": "attack target email", + "uri": "Uniform Resource Identifier", + "url": "Uniform Resource Locator", + "whois-registrant-email": "email of a domain's registrant" } +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("ip-src", "ip-dst"), + "IP address" + ) +) +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("email", "email-src", "email-dst"), + "email address" + ) +) +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("other", "text"), + "text" + ) +) class FarsightDnsdbParser(): @@ -44,7 +95,7 @@ class FarsightDnsdbParser(): 'zone_time_first': {'type': 'datetime', 'object_relation': 'zone_time_first'}, 'zone_time_last': {'type': 'datetime', 'object_relation': 'zone_time_last'} } - self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' + self.comment = 'Result from a %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): for query_type, results in query_response.items(): @@ -87,17 +138,9 @@ def handler(q=False): config['server'] = DEFAULT_DNSDB_SERVER client_args = {feature: config[feature] for feature in ('apikey', 'server')} client = dnsdb2.Client(**client_args) - flex = add_flex_queries(config.get('flex_queries')) - if not config.get('limit'): - config['limit'] = DEFAULT_LIMIT - lookup_args = { - 'limit': config['limit'], - 'offset': 0, - 'ignore_limited': True - } - to_query = lookup_ip if attribute['type'] in ('ip-src', 'ip-dst') else lookup_name + to_query, args = parse_input(attribute, config) try: - response = to_query(client, attribute['value'], lookup_args, flex) + response = to_query(client, *args) except dnsdb2.DnsdbException as e: return {'error': e.__str__()} if not response: @@ -107,6 +150,20 @@ def handler(q=False): return parser.get_results() +def parse_input(attribute, config): + lookup_args = { + 'limit': config['limit'] if config.get('limit') else DEFAULT_LIMIT, + 'offset': 0, + 'ignore_limited': True + } + attribute_type = attribute['type'] + if attribute_type in flex_query_input: + return flex_queries, (lookup_args, attribute['value']) + flex = add_flex_queries(config.get('flex_queries')) + to_query = lookup_ip if 'ip-' in attribute_type else lookup_name + return to_query, (lookup_args, attribute['value'], flex) + + def add_flex_queries(flex): if not flex: return False @@ -115,7 +172,7 @@ def add_flex_queries(flex): return False -def flex_queries(client, name, lookup_args): +def flex_queries(client, lookup_args, name): response = {} rdata = list(client.flex_rdata_regex(name.replace('.', '\\.'), **lookup_args)) if rdata: @@ -126,7 +183,7 @@ def flex_queries(client, name, lookup_args): return response -def lookup_name(client, name, lookup_args, flex): +def lookup_name(client, lookup_args, name, flex): response = {} # RRSET = entries in the left-hand side of the domain name related labels rrset_response = list(client.lookup_rrset(name, **lookup_args)) @@ -137,17 +194,17 @@ def lookup_name(client, name, lookup_args, flex): if rdata_response: response['rdata'] = rdata_response if flex: - response.update(flex_queries(client, name, lookup_args)) + response.update(flex_queries(client, lookup_args, name)) return response -def lookup_ip(client, ip, lookup_args, flex): +def lookup_ip(client, lookup_args, ip, flex): response = {} res = list(client.lookup_rdata_ip(ip, **lookup_args)) if res: response['rdata'] = res if flex: - response.update(flex_queries(client, ip, lookup_args)) + response.update(flex_queries(client, lookup_args, ip)) return response From c8c44e75bf3ce5355ce25233776724092cf87f51 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 18 Mar 2021 18:40:27 +0100 Subject: [PATCH 130/476] fix: [farsight_passivedns] Fixed queries to the API - Since flex queries input may be email addresses, we nake sure we replace '@' by '.' in the flex queries input. - We also run the flex queries with the input as is first, before runnning them as second time with '.' characters escaped: '\\.' --- .../modules/expansion/farsight_passivedns.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 10e5dbf..c398245 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -174,12 +174,15 @@ def add_flex_queries(flex): def flex_queries(client, lookup_args, name): response = {} - rdata = list(client.flex_rdata_regex(name.replace('.', '\\.'), **lookup_args)) - if rdata: - response['flex_rdata'] = rdata - rrnames = list(client.flex_rrnames_regex(name.replace('.', '\\.'), **lookup_args)) - if rrnames: - response['flex_rrnames'] = rrnames + name = name.replace('@', '.') + for feature in ('rdata', 'rrnames'): + to_call = getattr(client, f'flex_{feature}_regex') + results = list(to_call(name, **lookup_args)) + for result in list(to_call(name.replace('.', '\\.'), **lookup_args)): + if result not in results: + results.append(result) + if results: + response[f'flex_{feature}'] = results return response From 458e432bb7e0948b83b607bef81306c7ba369488 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 18 Mar 2021 19:22:26 +0100 Subject: [PATCH 131/476] fix: Making pep8 happy --- misp_modules/modules/expansion/google_search.py | 2 ++ misp_modules/modules/expansion/hibp.py | 7 +++++-- misp_modules/modules/expansion/threatfox.py | 10 +++++++--- .../modules/export_mod/defender_endpoint_export.py | 7 +++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/google_search.py b/misp_modules/modules/expansion/google_search.py index 97e37ad..68224ab 100644 --- a/misp_modules/modules/expansion/google_search.py +++ b/misp_modules/modules/expansion/google_search.py @@ -11,9 +11,11 @@ mispattributes = {'input': ['url'], 'output': ['text']} moduleinfo = {'author': 'Oun & Gindt', 'module-type': ['hover'], 'description': 'An expansion hover module to expand google search information about an URL'} + def sleep(retry): time.sleep(random.uniform(0, min(40, 0.01 * 2 ** retry))) + def handler(q=False): if q is False: return False diff --git a/misp_modules/modules/expansion/hibp.py b/misp_modules/modules/expansion/hibp.py index bea7749..66911f2 100644 --- a/misp_modules/modules/expansion/hibp.py +++ b/misp_modules/modules/expansion/hibp.py @@ -3,12 +3,13 @@ import requests import json misperrors = {'error': 'Error'} -mispattributes = {'input': ['email-dst', 'email-src'],'output': ['text']} +mispattributes = {'input': ['email-dst', 'email-src'], 'output': ['text']} moduleinfo = {'version': '0.2', 'author': 'Corsin Camichel, Aurélien Schwab', 'description': 'Module to access haveibeenpwned.com API (v3).', 'module-type': ['hover']} moduleconfig = ['api_key'] haveibeenpwned_api_url = 'https://haveibeenpwned.com/api/v3/breachedaccount/' -API_KEY = "" # details at https://www.troyhunt.com/authentication-and-the-have-i-been-pwned-api/ +API_KEY = "" # details at https://www.troyhunt.com/authentication-and-the-have-i-been-pwned-api/ + def handler(q=False): if q is False: @@ -39,9 +40,11 @@ def handler(q=False): misperrors['error'] = 'haveibeenpwned.com API not accessible (HTTP ' + str(r.status_code) + ')' return misperrors['error'] + def introspection(): return mispattributes + def version(): moduleinfo['config'] = moduleconfig return moduleinfo diff --git a/misp_modules/modules/expansion/threatfox.py b/misp_modules/modules/expansion/threatfox.py index f2201a0..4a89918 100644 --- a/misp_modules/modules/expansion/threatfox.py +++ b/misp_modules/modules/expansion/threatfox.py @@ -3,12 +3,13 @@ import requests import json misperrors = {'error': 'Error'} -mispattributes = {'input': ['md5', 'sha1', 'sha256', 'domain', 'url', 'email-src', 'ip-dst|port', 'ip-src|port'],'output': ['text']} +mispattributes = {'input': ['md5', 'sha1', 'sha256', 'domain', 'url', 'email-src', 'ip-dst|port', 'ip-src|port'], 'output': ['text']} moduleinfo = {'version': '0.1', 'author': 'Corsin Camichel', 'description': 'Module to search for an IOC on ThreatFox by abuse.ch.', 'module-type': ['hover', 'expansion']} moduleconfig = [] API_URL = "https://threatfox-api.abuse.ch/api/v1/" + # copied from # https://github.com/marjatech/threatfox2misp/blob/main/threatfox2misp.py def confidence_level_to_tag(level: int) -> str: @@ -26,6 +27,7 @@ def confidence_level_to_tag(level: int) -> str: confidence_tag = tag return confidence_tag + def handler(q=False): if q is False: return False @@ -41,19 +43,21 @@ def handler(q=False): misperrors['error'] = "Unsupported attributes type:" return misperrors - data = { "query": "search_ioc", "search_term": f"{to_query}" } + data = {"query": "search_ioc", "search_term": f"{to_query}"} response = requests.post(API_URL, data=json.dumps(data)) if response.status_code == 200: result = json.loads(response.text) if(result["query_status"] == "ok"): confidence_tag = confidence_level_to_tag(result["data"][0]["confidence_level"]) - ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], result["data"][0]["malware_printable"], confidence_tag ] }]} + ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], result["data"][0]["malware_printable"], confidence_tag]}]} return ret_val + def introspection(): return mispattributes + def version(): moduleinfo['config'] = moduleconfig return moduleinfo diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py index eea929c..1c36efb 100755 --- a/misp_modules/modules/export_mod/defender_endpoint_export.py +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -24,31 +24,37 @@ moduleinfo = {'version': '1.0', 'author': 'Julien Bachmann, Hacknowledge', 'description': 'Defender for Endpoint KQL hunting query export module', 'module-type': ['export']} + def handle_sha1(value, period): query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) where SHA1 == '{value}' or InitiatingProcessSHA1 == '{value}'""" return query.replace('\n', ' ') + def handle_md5(value, period): query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) where MD5 == '{value}' or InitiatingProcessMD5 == '{value}'""" return query.replace('\n', ' ') + def handle_domain(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) where RemoteUrl contains '{value}'""" return query.replace('\n', ' ') + def handle_ip(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) where RemoteIP == '{value}'""" return query.replace('\n', ' ') + def handle_url(value, period): query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) where RemoteUrl startswith '{value}'""" return query.replace('\n', ' ') + handlers = { 'sha1': handle_sha1, 'md5': handle_md5, @@ -72,6 +78,7 @@ def handler(q=False): r = {"response": [], "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8')} return r + def introspection(): modulesetup = {} try: From 48f56b0690d2c4e77e3ef51660cf58a6067507b6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 10:52:48 +0100 Subject: [PATCH 132/476] Update yeti.py add object --- misp_modules/modules/expansion/yeti.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f92a3b0..0f474e2 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -23,7 +23,7 @@ moduleconfig = ['apikey', 'url'] class Yeti(): def __init__(self, url, key,attribute): - self.dict = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url'} + self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) self.attribute = attribute self.misp_event = MISPEvent() @@ -83,10 +83,16 @@ class Yeti(): if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') - domain_ip_object.add_attribute() + domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + domain_ip_object.add_attribute(**self.attribute) return domain_ip_object + def __get_attribute(self, obj_yeti): + typ_attribute = self.misp_mapping[obj_yeti['type']] + attr_misp = {'type':typ_attribute, 'value': obj_yeti['value']} + return attr_misp + def handler(q=False): if q is False: return False @@ -109,7 +115,8 @@ def handler(q=False): yeti_client = Yeti(yeti_url, apikey, attribute) if yeti_client: - + yeti_client.parse_yeti_result() + return yeti_client.get_result() else: misperrors['error'] = 'Yeti Config Error' return misperrors From 0618e288d3345880d91191f6710573f0abd9b199 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:01:02 +0100 Subject: [PATCH 133/476] Update yeti.py add relation object --- misp_modules/modules/expansion/yeti.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 0f474e2..676ffb2 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -90,14 +90,14 @@ class Yeti(): def __get_attribute(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] - attr_misp = {'type':typ_attribute, 'value': obj_yeti['value']} + attr_misp = {'type':typ_attribute, 'value': obj_yeti['value'], + 'object_relation': 'pdns'} return attr_misp def handler(q=False): if q is False: return False - apikey = None yeti_url = None yeti_client = None @@ -106,7 +106,7 @@ def handler(q=False): attribute = request['attribute'] if attribute['type'] not in mispattributes['input']: return {'error': 'Unsupported attributes type'} - print(request) + if 'config' in request and 'url' in request['config']: yeti_url = request['config']['url'] if 'config' in request and 'apikey' in request['config']: From c9bc97c9f9ed99d0fb3756339d4d1767e2b26bc2 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:15:27 +0100 Subject: [PATCH 134/476] Update yeti.py change relation type and misp event init --- misp_modules/modules/expansion/yeti.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 676ffb2..38bd3f4 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -69,7 +69,7 @@ class Yeti(): obs = self.search(self.attribute['value']) values = [] types = [] - + self.misp_event.add_attribute(**self.attribute) for obs_to_add in self.get_neighboors(obs['id']): object_misp = self.get_object(obs_to_add) self.misp_event.add_object(object_misp) @@ -79,7 +79,7 @@ class Yeti(): results = {key: event[key] for key in ('Attribute', 'Object')} return results - def get_object(self,obj_to_add): + def get_object(self, obj_to_add): if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') @@ -90,8 +90,13 @@ class Yeti(): def __get_attribute(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] - attr_misp = {'type':typ_attribute, 'value': obj_yeti['value'], - 'object_relation': 'pdns'} + attr_misp = {'type':typ_attribute, 'value': obj_yeti['value']} + if typ_attribute == 'ip-src' or typ_attribute =='ip-dst': + attr_misp['object_relation'] = 'ip' + elif 'domain' == typ_attribute: + attr_misp['object_relation'] = 'domain' + else: + attr_misp['object_relation'] = None return attr_misp def handler(q=False): From bd4a4b87fc9717b9fdf0dc3a5475b161015194d6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:18:01 +0100 Subject: [PATCH 135/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 38bd3f4..fa21676 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,6 +73,7 @@ class Yeti(): for obs_to_add in self.get_neighboors(obs['id']): object_misp = self.get_object(obs_to_add) self.misp_event.add_object(object_misp) + print(self.misp_event) def get_result(self): event = json.loads(self.misp_event.to_json()) @@ -91,7 +92,7 @@ class Yeti(): def __get_attribute(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'type':typ_attribute, 'value': obj_yeti['value']} - if typ_attribute == 'ip-src' or typ_attribute =='ip-dst': + if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': attr_misp['object_relation'] = 'ip' elif 'domain' == typ_attribute: attr_misp['object_relation'] = 'domain' From d868373c5a1eb4bb7b07bf4ce18d0152b5ecdd48 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:24:10 +0100 Subject: [PATCH 136/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index fa21676..aa0ead7 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -87,6 +87,7 @@ class Yeti(): domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') domain_ip_object.add_attribute(**self.attribute) + print(domain_ip_object) return domain_ip_object def __get_attribute(self, obj_yeti): From 347d12c78cf942078bef8a51f11c0a3f0c052775 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:27:23 +0100 Subject: [PATCH 137/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index aa0ead7..ceafca0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -99,6 +99,7 @@ class Yeti(): attr_misp['object_relation'] = 'domain' else: attr_misp['object_relation'] = None + print('Attribute %s' % attr_misp) return attr_misp def handler(q=False): From 1dfdb5a2a297da9d36ed4631e15a0b59f6c03208 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:29:57 +0100 Subject: [PATCH 138/476] Update yeti.py change type attr and relation --- misp_modules/modules/expansion/yeti.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ceafca0..5792c8b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -92,11 +92,14 @@ class Yeti(): def __get_attribute(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] - attr_misp = {'type':typ_attribute, 'value': obj_yeti['value']} + attr_misp = {'type': typ_attribute, 'value': obj_yeti['value']} if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': attr_misp['object_relation'] = 'ip' elif 'domain' == typ_attribute: attr_misp['object_relation'] = 'domain' + elif 'hostname' == typ_attribute: + attr_misp['object_relation'] = 'domain' + attr_misp['type'] = 'domain' else: attr_misp['object_relation'] = None print('Attribute %s' % attr_misp) From bd5c1b0b535d58db72ca72c0ad071ef0c21a0aa2 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:40:23 +0100 Subject: [PATCH 139/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 5792c8b..079697b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -69,7 +69,6 @@ class Yeti(): obs = self.search(self.attribute['value']) values = [] types = [] - self.misp_event.add_attribute(**self.attribute) for obs_to_add in self.get_neighboors(obs['id']): object_misp = self.get_object(obs_to_add) self.misp_event.add_object(object_misp) @@ -87,7 +86,7 @@ class Yeti(): domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') domain_ip_object.add_attribute(**self.attribute) - print(domain_ip_object) + print(type(domain_ip_object)) return domain_ip_object def __get_attribute(self, obj_yeti): @@ -105,6 +104,7 @@ class Yeti(): print('Attribute %s' % attr_misp) return attr_misp + def handler(q=False): if q is False: return False From 633f5efd564ec23bc7fa800291fccc2586c733c0 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:48:55 +0100 Subject: [PATCH 140/476] Update yeti.py log object --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 079697b..ffc0e34 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -86,7 +86,7 @@ class Yeti(): domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') domain_ip_object.add_attribute(**self.attribute) - print(type(domain_ip_object)) + print(domain_ip_object.to_json()) return domain_ip_object def __get_attribute(self, obj_yeti): From 65d8bb6b0735e92eb48267573f6bc93991997b96 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 11:51:55 +0100 Subject: [PATCH 141/476] Update yeti.py log json --- misp_modules/modules/expansion/yeti.py | 1 - 1 file changed, 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ffc0e34..c06fcad 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -85,7 +85,6 @@ class Yeti(): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') - domain_ip_object.add_attribute(**self.attribute) print(domain_ip_object.to_json()) return domain_ip_object From 7255a1eddc2b3f507be2263fd9ed64e667ffd116 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 12:09:54 +0100 Subject: [PATCH 142/476] Update yeti.py change relationship --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c06fcad..7e455e4 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -84,7 +84,7 @@ class Yeti(): (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) - domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + #domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') print(domain_ip_object.to_json()) return domain_ip_object From bc1bea0ec4d57e104e5487b051b7d30b91879fff Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 12:12:37 +0100 Subject: [PATCH 143/476] Update yeti.py change attribute add --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 7e455e4..fe4f4db 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -85,6 +85,7 @@ class Yeti(): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) #domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + domain_ip_object.add_attribute(**self.attribute) print(domain_ip_object.to_json()) return domain_ip_object From 28b554d975818881135734790ed44d5f3f746474 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 12:24:15 +0100 Subject: [PATCH 144/476] Update yeti.py add test --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index fe4f4db..c76cc9d 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -71,7 +71,8 @@ class Yeti(): types = [] for obs_to_add in self.get_neighboors(obs['id']): object_misp = self.get_object(obs_to_add) - self.misp_event.add_object(object_misp) + if object_misp: + self.misp_event.add_object(object_misp) print(self.misp_event) def get_result(self): @@ -86,7 +87,6 @@ class Yeti(): domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) #domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') domain_ip_object.add_attribute(**self.attribute) - print(domain_ip_object.to_json()) return domain_ip_object def __get_attribute(self, obj_yeti): From b9ce6d689c4eaba9c3538db655465271a92275ae Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 13:56:02 +0100 Subject: [PATCH 145/476] Update yeti.py add ref --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c76cc9d..cd78146 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -85,7 +85,7 @@ class Yeti(): (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) - #domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') domain_ip_object.add_attribute(**self.attribute) return domain_ip_object From 0d035c02927737d590c08c71d66054644b1f06d3 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 14:22:51 +0100 Subject: [PATCH 146/476] Update yeti.py add relationship --- misp_modules/modules/expansion/yeti.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index cd78146..d566ef6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -93,11 +93,14 @@ class Yeti(): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'type': typ_attribute, 'value': obj_yeti['value']} if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': - attr_misp['object_relation'] = 'ip' + attr_misp['object_relation'] = {'type': 'text', + 'object_relation': 'ip'} elif 'domain' == typ_attribute: - attr_misp['object_relation'] = 'domain' + attr_misp['object_relation'] = {'type': 'text', + 'object_relation': 'domain'} elif 'hostname' == typ_attribute: - attr_misp['object_relation'] = 'domain' + attr_misp['object_relation'] = {'type': 'text', + 'object_relation': 'domain'} attr_misp['type'] = 'domain' else: attr_misp['object_relation'] = None From 9eb41f4022a16fc87a7137386491c576f7ae2ce4 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 14:26:44 +0100 Subject: [PATCH 147/476] Update yeti.py change relation type --- misp_modules/modules/expansion/yeti.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index d566ef6..f44f2d6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -93,14 +93,14 @@ class Yeti(): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'type': typ_attribute, 'value': obj_yeti['value']} if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': - attr_misp['object_relation'] = {'type': 'text', - 'object_relation': 'ip'} + attr_misp['object_relation'].update({'type': 'text', + 'object_relation': 'ip'}) elif 'domain' == typ_attribute: - attr_misp['object_relation'] = {'type': 'text', - 'object_relation': 'domain'} + attr_misp.update({'type': 'text', + 'object_relation': 'domain'}) elif 'hostname' == typ_attribute: - attr_misp['object_relation'] = {'type': 'text', - 'object_relation': 'domain'} + attr_misp.update({'type': 'text', + 'object_relation': 'domain'}) attr_misp['type'] = 'domain' else: attr_misp['object_relation'] = None From 0a364cf815e5f16fcf75dcb8246d68832010a2a3 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 14:32:00 +0100 Subject: [PATCH 148/476] Update yeti.py update relation --- misp_modules/modules/expansion/yeti.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f44f2d6..199b5cf 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -96,12 +96,11 @@ class Yeti(): attr_misp['object_relation'].update({'type': 'text', 'object_relation': 'ip'}) elif 'domain' == typ_attribute: - attr_misp.update({'type': 'text', + attr_misp.update({'type': 'domain', 'object_relation': 'domain'}) elif 'hostname' == typ_attribute: - attr_misp.update({'type': 'text', + attr_misp.update({'type': 'domain', 'object_relation': 'domain'}) - attr_misp['type'] = 'domain' else: attr_misp['object_relation'] = None print('Attribute %s' % attr_misp) From 86275d7610d2f760297f9424bf14a4c2bb3e22ec Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 14:38:34 +0100 Subject: [PATCH 149/476] Update yeti.py change modification --- misp_modules/modules/expansion/yeti.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 199b5cf..f9ccec3 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -91,7 +91,7 @@ class Yeti(): def __get_attribute(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] - attr_misp = {'type': typ_attribute, 'value': obj_yeti['value']} + attr_misp = {'value': obj_yeti['value']} if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': attr_misp['object_relation'].update({'type': 'text', 'object_relation': 'ip'}) @@ -101,8 +101,6 @@ class Yeti(): elif 'hostname' == typ_attribute: attr_misp.update({'type': 'domain', 'object_relation': 'domain'}) - else: - attr_misp['object_relation'] = None print('Attribute %s' % attr_misp) return attr_misp From 5176a36acfd0f3985598e21e62d68426dcb2fac4 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:16:00 +0100 Subject: [PATCH 150/476] Update yeti.py change relations --- misp_modules/modules/expansion/yeti.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f9ccec3..4d78ffd 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -84,23 +84,23 @@ class Yeti(): if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') - domain_ip_object.add_attribute(**self.__get_attribute(obj_to_add)) - domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + domain_ip_object.add_attribute(self.__get_relation(obj_to_add), + obj_to_add['value']) domain_ip_object.add_attribute(**self.attribute) + domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + return domain_ip_object - def __get_attribute(self, obj_yeti): + def __get_relation(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'value': obj_yeti['value']} if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': - attr_misp['object_relation'].update({'type': 'text', - 'object_relation': 'ip'}) + return 'ip' elif 'domain' == typ_attribute: - attr_misp.update({'type': 'domain', - 'object_relation': 'domain'}) + return 'domain' elif 'hostname' == typ_attribute: - attr_misp.update({'type': 'domain', - 'object_relation': 'domain'}) + return 'domain' + print('Attribute %s' % attr_misp) return attr_misp From 624f42326473d921cc402de091b2b5195894c355 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:19:37 +0100 Subject: [PATCH 151/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 4d78ffd..298d086 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -94,6 +94,7 @@ class Yeti(): def __get_relation(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'value': obj_yeti['value']} + print('att %s' % typ_attribute) if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': return 'ip' elif 'domain' == typ_attribute: From cd971867760371f6c7df70f4585c1e3d84e30492 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:20:58 +0100 Subject: [PATCH 152/476] Update yeti.py remove add --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 298d086..3e2a094 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -86,7 +86,7 @@ class Yeti(): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - domain_ip_object.add_attribute(**self.attribute) + domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') return domain_ip_object From 83c4b2f4b0503b5c6f7f928578aabfa71f35b1db Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:22:53 +0100 Subject: [PATCH 153/476] Update yeti.py add relation --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 3e2a094..3cba9c6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -86,7 +86,7 @@ class Yeti(): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - + domain_ip_object.add_attribute('ip', self.attribute) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') return domain_ip_object From 1be2c27131477a307e98795fd2769742348fcfcd Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:26:45 +0100 Subject: [PATCH 154/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 3cba9c6..c61b4d2 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,7 +73,7 @@ class Yeti(): object_misp = self.get_object(obs_to_add) if object_misp: self.misp_event.add_object(object_misp) - print(self.misp_event) + print(self.misp_event.to_json()) def get_result(self): event = json.loads(self.misp_event.to_json()) From ed3e0d56fde64567e67b74a81032f4db96d87efc Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:29:21 +0100 Subject: [PATCH 155/476] Update yeti.py change logs --- misp_modules/modules/expansion/yeti.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c61b4d2..b201923 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,8 +73,7 @@ class Yeti(): object_misp = self.get_object(obs_to_add) if object_misp: self.misp_event.add_object(object_misp) - print(self.misp_event.to_json()) - + print('Event MISP %s' % self.misp_event.to_json()) def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} @@ -94,15 +93,12 @@ class Yeti(): def __get_relation(self, obj_yeti): typ_attribute = self.misp_mapping[obj_yeti['type']] attr_misp = {'value': obj_yeti['value']} - print('att %s' % typ_attribute) if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': return 'ip' elif 'domain' == typ_attribute: return 'domain' elif 'hostname' == typ_attribute: return 'domain' - - print('Attribute %s' % attr_misp) return attr_misp From 6b35a7ee4d2a54ff07e353de5af1efa79b31af4c Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:32:05 +0100 Subject: [PATCH 156/476] Update yeti.py value attribute --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index b201923..12f0f17 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -85,7 +85,7 @@ class Yeti(): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - domain_ip_object.add_attribute('ip', self.attribute) + domain_ip_object.add_attribute('ip', self.attribute['value']) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') return domain_ip_object From 76133ace8bcd48a3226cdcd15f8e7103f295f4b7 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:37:49 +0100 Subject: [PATCH 157/476] Update yeti.py change logs --- misp_modules/modules/expansion/yeti.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 12f0f17..9dd95a8 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,10 +73,12 @@ class Yeti(): object_misp = self.get_object(obs_to_add) if object_misp: self.misp_event.add_object(object_misp) - print('Event MISP %s' % self.misp_event.to_json()) + + def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} + print('results '% results) return results def get_object(self, obj_to_add): From ef2bf2962172f30dc3245d3ee4a9900646a65514 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:39:09 +0100 Subject: [PATCH 158/476] Update yeti.py correction format strings --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 9dd95a8..261e403 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -78,7 +78,7 @@ class Yeti(): def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} - print('results '% results) + print('results %s'% results) return results def get_object(self, obj_to_add): From 240d043f912a19b8bd6c1020da39d2a6d0b95096 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:50:37 +0100 Subject: [PATCH 159/476] Update yeti.py delete attr --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 261e403..a6318b5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -27,7 +27,7 @@ class Yeti(): self.yeti_client = pyeti.YetiApi(url=url, api_key=key) self.attribute = attribute self.misp_event = MISPEvent() - self.misp_event.add_attribute(**attribute) + #self.misp_event.add_attribute(**attribute) def search(self, value): obs = self.yeti_client.observable_search(value=value) From b42da0435b7927668bea2a40a6790d4e14d316e6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 19 Mar 2021 15:55:18 +0100 Subject: [PATCH 160/476] Update yeti.py add key results --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index a6318b5..1028f0c 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -27,7 +27,7 @@ class Yeti(): self.yeti_client = pyeti.YetiApi(url=url, api_key=key) self.attribute = attribute self.misp_event = MISPEvent() - #self.misp_event.add_attribute(**attribute) + self.misp_event.add_attribute(**attribute) def search(self, value): obs = self.yeti_client.observable_search(value=value) @@ -126,7 +126,7 @@ def handler(q=False): if yeti_client: yeti_client.parse_yeti_result() - return yeti_client.get_result() + return {'results': yeti_client.get_result()} else: misperrors['error'] = 'Yeti Config Error' return misperrors From 2855f7ff5ff63f34e4bd2ca68302cfd271851d64 Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Tue, 23 Mar 2021 13:39:36 -0400 Subject: [PATCH 161/476] updates for greynoise community api --- documentation/README.md | 9 +- misp_modules/modules/expansion/greynoise.py | 117 ++++++++++++++------ 2 files changed, 89 insertions(+), 37 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 78d051b..5891766 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -611,16 +611,17 @@ Module to query a local copy of Maxmind's Geolite database. Module to access GreyNoise.io API - **features**: ->The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. +>The module takes an IP address as input and queries GreyNoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. - **input**: >An IP address. - **output**: ->Additional information about the IP fetched from Greynoise API. +>Additional information about the IP fetched from GreyNoise API. - **references**: > - https://greynoise.io/ -> - https://github.com/GreyNoise-Intelligence/api.greynoise.io +> - https://developer.greynoise.io/ - **requirements**: ->A Greynoise API key. +> - A GreyNoise API key. +> - A GreyNoise API Type selection of "community" or "enterprise" based API key type ----- diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index 4cd89d5..9d8f803 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -1,61 +1,112 @@ import requests import json -misperrors = {'error': 'Error'} -mispattributes = {'input': ['ip-dst', 'ip-src'], 'output': ['text']} +misperrors = {"error": "Error"} +mispattributes = {"input": ["ip-dst", "ip-src"], "output": ["text"]} moduleinfo = { - 'version': '0.2', - 'author': 'Aurélien Schwab ', - 'description': 'Module to access GreyNoise.io API.', - 'module-type': ['hover'] + "version": "0.2", + "author": "Aurélien Schwab ", + "description": "Module to access GreyNoise.io API.", + "module-type": ["hover"], } -moduleconfig = ['api_key'] - -greynoise_api_url = 'https://api.greynoise.io/v2/noise/quick/' +moduleconfig = ["api_key", "api_type"] codes_mapping = { - '0x00': 'The IP has never been observed scanning the Internet', - '0x01': 'The IP has been observed by the GreyNoise sensor network', - '0x02': 'The IP has been observed scanning the GreyNoise sensor network, but has not completed a full connection, meaning this can be spoofed', - '0x03': 'The IP is adjacent to another host that has been directly observed by the GreyNoise sensor network', - '0x04': 'Reserved', - '0x05': 'This IP is commonly spoofed in Internet-scan activity', - '0x06': 'This IP has been observed as noise, but this host belongs to a cloud provider where IPs can be cycled frequently', - '0x07': 'This IP is invalid', - '0x08': 'This IP was classified as noise, but has not been observed engaging in Internet-wide scans or attacks in over 60 days' + "0x00": "The IP has never been observed scanning the Internet", + "0x01": "The IP has been observed by the GreyNoise sensor network", + "0x02": "The IP has been observed scanning the GreyNoise sensor network, " + "but has not completed a full connection, meaning this can be spoofed", + "0x03": "The IP is adjacent to another host that has been directly observed by " + "the GreyNoise sensor network", + "0x04": "Reserved", + "0x05": "This IP is commonly spoofed in Internet-scan activity", + "0x06": "This IP has been observed as noise, but this host belongs to a cloud " + "provider where IPs can be cycled frequently", + "0x07": "This IP is invalid", + "0x08": "This IP was classified as noise, but has not been observed engaging in " + "Internet-wide scans or attacks in over 60 days", } -def handler(q=False): +def handler(q=False): # noqa: C901 if q is False: return False request = json.loads(q) - if not request.get('config') or not request['config'].get('api_key'): - return {'error': 'Missing Greynoise API key.'} + if not request.get("config") or not request["config"].get("api_key"): + return {"error": "Missing Greynoise API key."} + if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": + greynoise_api_url = "https://api.greynoise.io/v2/noise/quick/" + else: + greynoise_api_url = "https://api.dev.greynoise.io/v3/community/" + headers = { - 'Accept': 'application/json', - 'key': request['config']['api_key'] + "Accept": "application/json", + "key": request["config"]["api_key"], + "User-Agent": "greynoise-misp-module-{}".format(moduleinfo["version"]), } - for input_type in mispattributes['input']: + for input_type in mispattributes["input"]: if input_type in request: ip = request[input_type] break else: - misperrors['error'] = "Unsupported attributes type." + misperrors["error"] = "Unsupported attributes type." return misperrors - response = requests.get(f'{greynoise_api_url}{ip}', headers=headers) # Real request - if response.status_code == 200: # OK (record found) - return {'results': [{'types': mispattributes['output'], 'values': codes_mapping[response.json()['code']]}]} + response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) # Real request + if response.status_code == 200: + if request["config"]["api_type"] == "enterprise": + return { + "results": [ + { + "types": ["text"], + "values": codes_mapping[response.json()["code"]], + } + ] + } + elif response.json()["noise"]: + return { + "results": [ + { + "types": ["text"], + "values": "IP Address ({}) has been observed by GreyNoise " + "scanning the internet in the last 90 days. GreyNoise has " + "classified it as {} and it was last seen on {}. For more " + "information visit {}".format( + response.json()["ip"], + response.json()["classification"], + response.json()["last_seen"], + response.json()["link"], + ), + } + ] + } + elif response.json()["riot"]: + return { + "results": [ + { + "types": ["text"], + "values": "IP Address ({}) is part of GreyNoise Project RIOT " + "and likely belongs to a benign service from {}. For more " + "information visit {}".format( + response.json()["ip"], + response.json()["name"], + response.json()["link"], + ), + } + ] + } # There is an error errors = { 400: "Bad request.", + 404: "IP not observed scanning the internet or contained in RIOT data set.", 401: "Unauthorized. Please check your API key.", - 429: "Too many requests. You've hit the rate-limit." + 429: "Too many requests. You've hit the rate-limit.", } try: - misperrors['error'] = errors[response.status_code] + misperrors["error"] = errors[response.status_code] except KeyError: - misperrors['error'] = f'GreyNoise API not accessible (HTTP {response.status_code})' - return misperrors['error'] + misperrors[ + "error" + ] = f"GreyNoise API not accessible (HTTP {response.status_code})" + return misperrors def introspection(): @@ -63,5 +114,5 @@ def introspection(): def version(): - moduleinfo['config'] = moduleconfig + moduleinfo["config"] = moduleconfig return moduleinfo From 714eb425c6bc3cf798f241a569f8034622fa6fcd Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Tue, 23 Mar 2021 13:41:05 -0400 Subject: [PATCH 162/476] fix ver info --- misp_modules/modules/expansion/greynoise.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index 9d8f803..36d55bc 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -4,8 +4,8 @@ import json misperrors = {"error": "Error"} mispattributes = {"input": ["ip-dst", "ip-src"], "output": ["text"]} moduleinfo = { - "version": "0.2", - "author": "Aurélien Schwab ", + "version": "1.0", + "author": "Brad Chiappetta ", "description": "Module to access GreyNoise.io API.", "module-type": ["hover"], } From 5e20ea0dc09ab2f5f1f1278d763626a3b30a0c0c Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Fri, 26 Mar 2021 11:19:40 -0400 Subject: [PATCH 163/476] update community api to released ver --- misp_modules/modules/expansion/greynoise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index 36d55bc..19b4653 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -36,7 +36,7 @@ def handler(q=False): # noqa: C901 if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": greynoise_api_url = "https://api.greynoise.io/v2/noise/quick/" else: - greynoise_api_url = "https://api.dev.greynoise.io/v3/community/" + greynoise_api_url = "https://api.greynoise.io/v3/community/" headers = { "Accept": "application/json", From 40537e898b77482813ce557c27095a27be4f2e31 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Fri, 26 Mar 2021 17:38:50 +0000 Subject: [PATCH 164/476] Update README.md Ensure that the clone of misp-modules is owned by www-data --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4d72e7..ab6d34d 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ sudo apt-get install python3-dev python3-pip libpq5 libjpeg-dev tesseract-ocr li sudo -u www-data virtualenv -p python3 /var/www/MISP/venv cd /usr/local/src/ sudo chown -R www-data: . -sudo git clone https://github.com/MISP/misp-modules.git +sudo -u www-data git clone https://github.com/MISP/misp-modules.git cd misp-modules sudo -u www-data /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS sudo -u www-data /var/www/MISP/venv/bin/pip install . From 25d826076c84563566d552d29f172f39bdaa7ee2 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 29 Mar 2021 20:09:29 +0200 Subject: [PATCH 165/476] add: [farsight_passivedns] New lookup argument based on the first_seen & last_seen fields --- misp_modules/modules/expansion/farsight_passivedns.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index c398245..8cdd8b6 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -1,6 +1,7 @@ import dnsdb2 import json from . import check_input_attribute, standard_error_message +from datetime import datetime from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} @@ -156,6 +157,11 @@ def parse_input(attribute, config): 'offset': 0, 'ignore_limited': True } + if attribute.get('first_seen'): + lookup_args['time_first_after'] = parse_timestamp(attribute['first_seen']) + if attribute.get('last_seen'): + lookup_args['time_last_before'] = parse_timestamp(attribute['last_seen']) + print(lookup_args) attribute_type = attribute['type'] if attribute_type in flex_query_input: return flex_queries, (lookup_args, attribute['value']) @@ -163,6 +169,9 @@ def parse_input(attribute, config): to_query = lookup_ip if 'ip-' in attribute_type else lookup_name return to_query, (lookup_args, attribute['value'], flex) +def parse_timestamp(str_date): + datetime_date = datetime.strptime(str_date, '%Y-%m-%dT%H:%M:%S.%f%z') + return str(int(datetime_date.timestamp())) def add_flex_queries(flex): if not flex: From efd2ffce3b3df2f7cc9edb022c5d13f66dfee450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Tue, 30 Mar 2021 00:13:41 +0200 Subject: [PATCH 166/476] chg: Bump deps --- Pipfile.lock | 1000 ++++++++++++++++++++++++-------------------------- 1 file changed, 486 insertions(+), 514 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 64465bf..04a507c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -18,46 +18,46 @@ "default": { "aiohttp": { "hashes": [ - "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9", - "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f", - "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f", - "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005", - "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a", - "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e", - "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd", - "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a", - "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656", - "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0", - "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6", - "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a", - "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c", - "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b", - "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957", - "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9", - "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001", - "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e", - "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60", - "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564", - "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45", - "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a", - "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13", - "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f", - "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4", - "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f", - "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235", - "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914", - "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3", - "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3", - "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150", - "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e", - "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347", - "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b", - "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7", - "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245", - "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1" + "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe", + "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe", + "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5", + "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8", + "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd", + "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb", + "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c", + "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87", + "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0", + "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290", + "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5", + "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287", + "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde", + "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf", + "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8", + "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16", + "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf", + "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809", + "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213", + "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f", + "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013", + "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b", + "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9", + "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5", + "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb", + "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df", + "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4", + "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439", + "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f", + "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22", + "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f", + "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5", + "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970", + "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009", + "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc", + "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a", + "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" ], "markers": "python_version >= '3.6'", - "version": "==3.7.3" + "version": "==3.7.4.post0" }, "antlr4-python3-runtime": { "hashes": [ @@ -82,10 +82,10 @@ }, "assemblyline-client": { "hashes": [ - "sha256:6a36a654185ba40d10bdd0213a1926aacb4351290824e406cbff6b6b5b251f5f" + "sha256:68cca09f45df1964a07b69d3284e28ee8f911ac497dad737b3423d1a062950e8" ], "index": "pypi", - "version": "==4.0.1" + "version": "==4.0.2" }, "async-timeout": { "hashes": [ @@ -120,14 +120,6 @@ "index": "pypi", "version": "==4.9.3" }, - "bidict": { - "hashes": [ - "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", - "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" - ], - "markers": "python_version >= '3.6'", - "version": "==0.21.2" - }, "blockchain": { "hashes": [ "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" @@ -144,51 +136,53 @@ }, "cffi": { "hashes": [ - "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", - "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", - "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", - "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", - "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", - "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", - "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", - "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", - "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", - "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", - "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", - "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", - "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", - "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", - "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", - "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", - "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", - "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", - "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", - "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", - "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", - "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", - "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", - "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", - "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", - "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", - "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", - "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", - "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", - "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", - "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", - "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", - "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", - "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", - "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", - "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" + "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813", + "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06", + "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea", + "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee", + "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396", + "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73", + "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315", + "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1", + "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49", + "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892", + "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482", + "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058", + "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5", + "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53", + "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045", + "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3", + "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5", + "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e", + "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c", + "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369", + "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827", + "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053", + "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa", + "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4", + "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322", + "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132", + "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62", + "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa", + "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0", + "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396", + "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e", + "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991", + "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6", + "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1", + "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406", + "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d", + "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" ], - "version": "==1.14.4" + "version": "==1.14.5" }, "chardet": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" ], - "version": "==3.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" }, "clamd": { "hashes": [ @@ -235,30 +229,28 @@ }, "configparser": { "hashes": [ - "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", - "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" + "sha256:85d5de102cfe6d14a5172676f09d19c465ce63d6019cf0a4ef13385fc535e828", + "sha256:af59f2cdd7efbdd5d111c1976ecd0b82db9066653362f0962d7bf1d3ab89a1fa" ], "markers": "python_version >= '3.6'", - "version": "==5.0.1" + "version": "==5.0.2" }, "cryptography": { "hashes": [ - "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d", - "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7", - "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901", - "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c", - "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244", - "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6", - "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5", - "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e", - "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c", - "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0", - "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812", - "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a", - "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030", - "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302" + "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d", + "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959", + "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6", + "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873", + "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2", + "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713", + "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", + "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", + "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", + "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", + "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", + "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" ], - "version": "==3.3.1" + "version": "==3.4.7" }, "decorator": { "hashes": [ @@ -269,18 +261,18 @@ }, "deprecated": { "hashes": [ - "sha256:471ec32b2755172046e28102cd46c481f21c6036a0ec027521eba8521aa4ef35", - "sha256:924b6921f822b64ec54f49be6700a126bab0640cfafca78f22c9d429ed590560" + "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771", + "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.11" + "version": "==1.2.12" }, "dnsdb2": { "hashes": [ - "sha256:55c9f43eb231ff21f40a69183fdb0220f175519e108bc19d0c098e07532d0dfe" + "sha256:e7ed25c8ca1e456c77deaf67f440ae0c2ff94c714dab4d67df14ccc82f501faf" ], "index": "pypi", - "version": "==1.1.2" + "version": "==1.1.3" }, "dnspython": { "hashes": [ @@ -292,18 +284,18 @@ }, "domaintools-api": { "hashes": [ - "sha256:62e2e688d14dbd7ca51a44bd0a8490aa69c712895475598afbdbb1e1e15bf2f2", - "sha256:fe75e3cc86e7e2904b06d8e94b1986e721fdce85d695c87d1140403957e4c989" + "sha256:10fd899b2fe063a23edbcf15daf516fe14fb4a67ef1bf72af630a183161cb003", + "sha256:fde92d0f1fb0cfc324548eca85c3bab7774ffa93581fd92ced954ce11d5891e1" ], "index": "pypi", - "version": "==0.5.2" + "version": "==0.5.4" }, "easygui": { "hashes": [ - "sha256:690658af9fca3f2f2a55f24421045f9b33ca33c877ed5fb61d4b942d8ec335f3", - "sha256:dbc89afbb1aca83830ea4af568eb2491654e16b2706a14d040757fdf1fafbbfe" + "sha256:073f728ca88a77b74f404446fb8ec3004945427677c5618bd00f70c1b999fef2", + "sha256:8d38764803c27bbccab2771e6c021cb20647049b36617f765fac79f01af07a27" ], - "version": "==0.98.1" + "version": "==0.98.2" }, "ebcdic": { "hashes": [ @@ -320,10 +312,10 @@ }, "extract-msg": { "hashes": [ - "sha256:7300a50bfa91405a381826f8e22f39458c7322fea1cd660ef699c4157a58be4b", - "sha256:7ce5761911b2caa9f07042efdecfcc9cf4afe524c3efbfd0aa5fa277faa1cc53" + "sha256:6ad2702bef86e6c1b8505e2993c7f3d37a1f3d140903138ee2df4a299dd2a29c", + "sha256:7ebdbd7863a3699080a69f71ec0cd30ed9bfee70bad9acc6a8e6abe9523c78c0" ], - "version": "==0.28.1" + "version": "==0.28.7" }, "ez-setup": { "hashes": [ @@ -363,10 +355,10 @@ }, "httplib2": { "hashes": [ - "sha256:8af66c1c52c7ffe1aa5dc4bcd7c769885254b0756e6e69f953c7f0ab49a70ba3", - "sha256:ca2914b015b6247791c4866782fa6042f495b94401a0f0bd3e1d6e0ba2236782" + "sha256:749c32603f9bf16c1277f59531d502e8f1c2ca19901ae653b49c4ed698f0820e", + "sha256:e0d428dad43c72dbce7d163b7753ffc7a39c097e6788ef10f4198db69b92f08e" ], - "version": "==0.18.1" + "version": "==0.19.0" }, "idna": { "hashes": [ @@ -399,10 +391,10 @@ }, "jbxapi": { "hashes": [ - "sha256:7cebd7ea73838ffd9e77b6a3bac6e4e1263b8cb4678b0579361b9257db684893" + "sha256:2cdb8e935cb35c3af83209b847cedb3911b5f0b4d905ed89f76fa0e34d62ea26" ], "index": "pypi", - "version": "==3.14.0" + "version": "==3.16.0" }, "json-log-formatter": { "hashes": [ @@ -419,77 +411,76 @@ }, "lark-parser": { "hashes": [ - "sha256:20bdefdf1b6e9bcb38165ea5cc4f27921a99c6f4c35264a3a953fd60335f1f8c", - "sha256:8b747e1f544dcc2789e3feaddd2a50c6a73bed69d62e9c69760c1e1f7d23495f" + "sha256:ef610461ebf2b243502f337d9d49879e39f9add846a4749e88c8dcdc1378bb6b" ], - "version": "==0.11.1" + "version": "==0.11.2" }, "lief": { "hashes": [ - "sha256:0cd2665ff28937755c8acedc2e3fb9de5ba752353e19b51b89297b8be3f63ccb", - "sha256:1a110bd5db41b4fde1a61094658b0366352ed4c0a00b55bde821046a59c2f913", - "sha256:1fb570712fa17ee153aca263ab1f1ec763772ccb46992e415b3dc1c0248466bc", - "sha256:2ee8f9787ea92109f19e5e4d22773042184ac524a3f11399ea5e13d974ac1f05", - "sha256:348ee294567826cad638b7e6cf2ede4ffe03524cd5b6038896f78e5b006d6295", - "sha256:77ba7dd0d48933c0b26c980bda1ab4a7ad3c7031880181fab0b94caad3bc1a4d", - "sha256:8774076dfbcf9b6906be4d9243de4a78fc09d317292251072d460ed1e0eeb96e", - "sha256:93d79a47db9977e6471b21d5efd4e7af4c29c76261d6583141fcf10f6ccd0eba", - "sha256:96d2a8d2310c7accaeb5c6679833c0cd8f0fb6d8c682a5df59d4d868c8881661", - "sha256:9837166402248a4ef29018d498c4eccc11cbc92ee4083da046fa747d3863b43d", - "sha256:9f2bd417090df21548af3a0216f3a02056291348c0826a5ff78e3f3046283978", - "sha256:afe4d15b519dd7d97732e85b7a2b11154c97a40ce517e1044b5cd5f80074ce36", - "sha256:b0a55424b3ffa08d16bf8ee6e5e9474b0a4b392ca4d94545c16e47e6366e41d4", - "sha256:ccf977099153eaefa351e72e84dfa829334699521ef00434b50647d80de2cc56", - "sha256:d95cf1224c7b311b8d25dbd4de627d28717266e62b9721f1dc4c8427f929a60f", - "sha256:e6ff05e6ebcb9bea8833fcb558d4db3bc2a78031c4792fcac9f9612fa78258b3", - "sha256:e8c66834a0ee9ed1899db165c09ca04aba8dee574de1ccc866d82fbf0c059bb8", - "sha256:f31fde4e7174b4bc9b67ff22fd93fa15fc3faa1592ac669f3addc95d9e66168e", - "sha256:f9b00c396c9f45c5f4cf37c034428ad525d6d7c7d38fc6c49ddc4b558201151b" + "sha256:2092703329ed5a2dc5111300469346528e7db2a31c72767dc48c50474087dc83", + "sha256:254e391d1f640cb89c8a4ce3ebdbfe239bc615e50931e226cbca64b22a63d3e9", + "sha256:2e33789c16b525991c8dc62a4265afdb7003e28b29744251526e3604f40ef3d4", + "sha256:5266c387eec479663bab503d095c0c5ce1b13e69a81167cd6898215d07e001dc", + "sha256:560cca9dc490d0bee84aca30533f7c7ac9e874060bbc9bdbc6f64da63e4e351a", + "sha256:599e8519398af84e1204791044f442b2d469ccc02196905cab8e378ee4d6da4d", + "sha256:59df04a2bf46c021772148086ff5eedf736c885e3b522f05024a2539feec6174", + "sha256:5ca9e60eb55f4fa7fcd4e526273f56ef94d10995b50a681a1bba714098e9bccc", + "sha256:626bf3a31644e5790736cebfc366f3227ed76979e3e6e47c68365bd47e73d76a", + "sha256:74a4822f1883d6d7f230856422e700176c4ba67792dce9b013a956e70947c83f", + "sha256:846da4389a258f5525a147c7d29867ce0af59e1d81923f8dbed1ed83599f589f", + "sha256:9abefaa0c2916bb7b15712dd2a85cc2d91beb5c380b819fe2b22156eb5b98546", + "sha256:a6d2f59723819aac71cfdf3be898d83d9d9c33c02489125eee5ff40aa4177be6", + "sha256:b175e688f51500332fb726c72b237d081ba905f0ee7290d80cc7d1cbf86c93ff", + "sha256:ba79766fb63096f96bdba1de748f81670b4d545cc2f79d8217e3a42b81cef864", + "sha256:bfe10417af317351a73babc7b7c82981ffe08efcd6fe6c79b816be1bcd52bab4", + "sha256:c9c8f704198610bb06e3a56bc8fa4ba91cfba6606964027277c81baee245601b", + "sha256:d42072d75b61e5314a1223d9afe666b6a62cf030fd494fe90a55d8baf8343204", + "sha256:e469daed11efbd989f56afd0167ae391bdd0de9984ad274679f1da3a5ec60494", + "sha256:f864c1dd918c49611779eb1f487d74bc97613a0690ce7c17a18949fc7dc5e79e" ], - "version": "==0.11.0" + "version": "==0.11.4" }, "lxml": { "hashes": [ - "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", - "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", - "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", - "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", - "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", - "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", - "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", - "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", - "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", - "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", - "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", - "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", - "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", - "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", - "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", - "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", - "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", - "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", - "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", - "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", - "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", - "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", - "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", - "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", - "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", - "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", - "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", - "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", - "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", - "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", - "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", - "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", - "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", - "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", - "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", - "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", - "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" + "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d", + "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3", + "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2", + "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f", + "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927", + "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3", + "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7", + "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f", + "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade", + "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468", + "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b", + "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4", + "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83", + "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04", + "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791", + "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51", + "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1", + "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a", + "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f", + "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee", + "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec", + "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969", + "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28", + "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a", + "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa", + "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106", + "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d", + "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4", + "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0", + "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4", + "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2", + "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0", + "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654", + "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2", + "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23", + "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586" ], "index": "pypi", - "version": "==4.6.2" + "version": "==4.6.3" }, "maclookup": { "hashes": [ @@ -576,43 +567,33 @@ }, "numpy": { "hashes": [ - "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", - "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", - "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", - "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", - "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", - "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", - "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", - "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", - "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", - "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", - "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", - "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", - "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", - "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", - "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", - "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", - "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", - "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", - "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", - "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", - "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", - "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", - "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", - "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", - "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", - "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", - "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", - "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", - "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", - "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", - "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", - "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", - "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", - "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" + "sha256:2428b109306075d89d21135bdd6b785f132a1f5a3260c371cee1fae427e12727", + "sha256:377751954da04d4a6950191b20539066b4e19e3b559d4695399c5e8e3e683bf6", + "sha256:4703b9e937df83f5b6b7447ca5912b5f5f297aba45f91dbbbc63ff9278c7aa98", + "sha256:471c0571d0895c68da309dacee4e95a0811d0a9f9f532a48dc1bea5f3b7ad2b7", + "sha256:61d5b4cf73622e4d0c6b83408a16631b670fc045afd6540679aa35591a17fe6d", + "sha256:6c915ee7dba1071554e70a3664a839fbc033e1d6528199d4621eeaaa5487ccd2", + "sha256:6e51e417d9ae2e7848314994e6fc3832c9d426abce9328cf7571eefceb43e6c9", + "sha256:719656636c48be22c23641859ff2419b27b6bdf844b36a2447cb39caceb00935", + "sha256:780ae5284cb770ade51d4b4a7dce4faa554eb1d88a56d0e8b9f35fca9b0270ff", + "sha256:878922bf5ad7550aa044aa9301d417e2d3ae50f0f577de92051d739ac6096cee", + "sha256:924dc3f83de20437de95a73516f36e09918e9c9c18d5eac520062c49191025fb", + "sha256:97ce8b8ace7d3b9288d88177e66ee75480fb79b9cf745e91ecfe65d91a856042", + "sha256:9c0fab855ae790ca74b27e55240fe4f2a36a364a3f1ebcfd1fb5ac4088f1cec3", + "sha256:9cab23439eb1ebfed1aaec9cd42b7dc50fc96d5cd3147da348d9161f0501ada5", + "sha256:a8e6859913ec8eeef3dbe9aed3bf475347642d1cdd6217c30f28dee8903528e6", + "sha256:aa046527c04688af680217fffac61eec2350ef3f3d7320c07fd33f5c6e7b4d5f", + "sha256:abc81829c4039e7e4c30f7897938fa5d4916a09c2c7eb9b244b7a35ddc9656f4", + "sha256:bad70051de2c50b1a6259a6df1daaafe8c480ca98132da98976d8591c412e737", + "sha256:c73a7975d77f15f7f68dacfb2bca3d3f479f158313642e8ea9058eea06637931", + "sha256:d15007f857d6995db15195217afdbddfcd203dfaa0ba6878a2f580eaf810ecd6", + "sha256:d76061ae5cab49b83a8cf3feacefc2053fac672728802ac137dd8c4123397677", + "sha256:e8e4fbbb7e7634f263c5b0150a629342cc19b47c5eba8d1cd4363ab3455ab576", + "sha256:e9459f40244bb02b2f14f6af0cd0732791d72232bbb0dc4bab57ef88e75f6935", + "sha256:edb1f041a9146dcf02cd7df7187db46ab524b9af2515f392f337c7cbbf5b52cd" ], - "markers": "python_version >= '3.6'", - "version": "==1.19.5" + "markers": "python_version >= '3.7'", + "version": "==1.20.2" }, "oauth2": { "hashes": [ @@ -673,26 +654,25 @@ }, "pandas": { "hashes": [ - "sha256:050ed2c9d825ef36738e018454e6d055c63d947c1d52010fbadd7584f09df5db", - "sha256:055647e7f4c5e66ba92c2a7dcae6c2c57898b605a3fb007745df61cc4015937f", - "sha256:23ac77a3a222d9304cb2a7934bb7b4805ff43d513add7a42d1a22dc7df14edd2", - "sha256:2de012a36cc507debd9c3351b4d757f828d5a784a5fc4e6766eafc2b56e4b0f5", - "sha256:30e9e8bc8c5c17c03d943e8d6f778313efff59e413b8dbdd8214c2ed9aa165f6", - "sha256:324e60bea729cf3b55c1bf9e88fe8b9932c26f8669d13b928e3c96b3a1453dff", - "sha256:37443199f451f8badfe0add666e43cdb817c59fa36bceedafd9c543a42f236ca", - "sha256:47ec0808a8357ab3890ce0eca39a63f79dcf941e2e7f494470fe1c9ec43f6091", - "sha256:496fcc29321e9a804d56d5aa5d7ec1320edfd1898eee2f451aa70171cf1d5a29", - "sha256:50e6c0a17ef7f831b5565fd0394dbf9bfd5d615ee4dd4bb60a3d8c9d2e872323", - "sha256:5527c5475d955c0bc9689c56865aaa2a7b13c504d6c44f0aadbf57b565af5ebd", - "sha256:57d5c7ac62925a8d2ab43ea442b297a56cc8452015e71e24f4aa7e4ed6be3d77", - "sha256:9d45f58b03af1fea4b48e44aa38a819a33dccb9821ef9e1d68f529995f8a632f", - "sha256:b26e2dabda73d347c7af3e6fed58483161c7b87a886a4e06d76ccfe55a044aa9", - "sha256:cfd237865d878da9b65cfee883da5e0067f5e2ff839e459466fb90565a77bda3", - "sha256:d7cca42dba13bfee369e2944ae31f6549a55831cba3117e17636955176004088", - "sha256:fe7de6fed43e7d086e3d947651ec89e55ddf00102f9dd5758763d56d182f0564" + "sha256:09761bf5f8c741d47d4b8b9073288de1be39bbfccc281d70b889ade12b2aad29", + "sha256:0f27fd1adfa256388dc34895ca5437eaf254832223812afd817a6f73127f969c", + "sha256:43e00770552595c2250d8d712ec8b6e08ca73089ac823122344f023efa4abea3", + "sha256:46fc671c542a8392a4f4c13edc8527e3a10f6cb62912d856f82248feb747f06e", + "sha256:475b7772b6e18a93a43ea83517932deff33954a10d4fbae18d0c1aba4182310f", + "sha256:4d821b9b911fc1b7d428978d04ace33f0af32bb7549525c8a7b08444bce46b74", + "sha256:5e3c8c60541396110586bcbe6eccdc335a38e7de8c217060edaf4722260b158f", + "sha256:621c044a1b5e535cf7dcb3ab39fca6f867095c3ef223a524f18f60c7fee028ea", + "sha256:72ffcea00ae8ffcdbdefff800284311e155fbb5ed6758f1a6110fc1f8f8f0c1c", + "sha256:8a051e957c5206f722e83f295f95a2cf053e890f9a1fba0065780a8c2d045f5d", + "sha256:97b1954533b2a74c7e20d1342c4f01311d3203b48f2ebf651891e6a6eaf01104", + "sha256:9f5829e64507ad10e2561b60baf285c470f3c4454b007c860e77849b88865ae7", + "sha256:a93e34f10f67d81de706ce00bf8bb3798403cabce4ccb2de10c61b5ae8786ab5", + "sha256:d59842a5aa89ca03c2099312163ffdd06f56486050e641a45d926a072f04d994", + "sha256:dbb255975eb94143f2e6ec7dadda671d25147939047839cd6b8a4aff0379bb9b", + "sha256:df6f10b85aef7a5bb25259ad651ad1cc1d6bb09000595cab47e718cbac250b1d" ], "index": "pypi", - "version": "==1.2.1" + "version": "==1.2.3" }, "pandas-ods-reader": { "hashes": [ @@ -704,12 +684,11 @@ }, "passivetotal": { "hashes": [ - "sha256:2944974d380a41f19f8fbb3d7cbfc8285479eb81092940b57bf0346d66706a05", - "sha256:a0cbea84b0bd6e9f3694ddeb447472b3d6f09e28940a7a0388456b8cf6a8e478", - "sha256:e35bf2cbccb385795a67d66f180d14ce9136cf1611b1c3da8a1055a1aced6264" + "sha256:aef48db0890cecbf1bff629ac37f0f1d64f1ca33d4e4ec33802277167051d4ff", + "sha256:c38f48bae146e726797eea06a8ee5bcac12aa2bac6909d560f8759686693d4bc" ], "index": "pypi", - "version": "==1.0.31" + "version": "==2.1.0" }, "pcodedmp": { "hashes": [ @@ -727,41 +706,42 @@ }, "pillow": { "hashes": [ - "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6", - "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded", - "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865", - "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174", - "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032", - "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a", - "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e", - "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378", - "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17", - "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c", - "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913", - "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7", - "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0", - "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820", - "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba", - "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2", - "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b", - "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9", - "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234", - "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d", - "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5", - "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206", - "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9", - "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8", - "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59", - "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d", - "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7", - "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a", - "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0", - "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b", - "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d", - "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae" + "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af", + "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1", + "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c", + "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55", + "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060", + "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e", + "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8", + "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e", + "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0", + "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328", + "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238", + "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733", + "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03", + "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06", + "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71", + "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b", + "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6", + "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910", + "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce", + "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28", + "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d", + "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb", + "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6", + "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09", + "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be", + "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0", + "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44", + "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1", + "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341", + "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34", + "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2", + "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a", + "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5" ], "index": "pypi", - "version": "==8.1.0" + "version": "==8.1.2" }, "progressbar2": { "hashes": [ @@ -807,7 +787,7 @@ "pybgpranking": { "editable": true, "git": "https://github.com/D4-project/BGP-Ranking.git/", - "ref": "fd9c0e03af9b61d4bf0b67ac73c7208a55178a54", + "ref": "68de39f6c5196f796055c1ac34504054d688aa59", "subdirectory": "client" }, "pycparser": { @@ -820,85 +800,75 @@ }, "pycryptodome": { "hashes": [ - "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", - "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", - "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", - "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", - "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", - "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", - "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", - "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", - "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", - "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", - "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", - "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", - "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", - "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", - "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", - "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", - "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", - "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", - "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", - "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", - "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", - "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", - "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", - "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", - "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", - "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", - "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", - "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", - "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", - "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", - "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", - "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", - "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", - "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", - "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" + "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", + "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", + "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", + "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", + "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", + "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", + "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", + "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", + "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", + "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", + "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", + "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", + "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", + "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", + "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", + "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", + "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", + "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", + "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", + "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", + "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", + "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", + "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", + "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", + "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", + "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", + "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", + "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", + "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", + "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.9" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==3.10.1" }, "pycryptodomex": { "hashes": [ - "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", - "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", - "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", - "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", - "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", - "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", - "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", - "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", - "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", - "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", - "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", - "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", - "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", - "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", - "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", - "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", - "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", - "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", - "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", - "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", - "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", - "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", - "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", - "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", - "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", - "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", - "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", - "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", - "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", - "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", - "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", - "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", - "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", - "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", - "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" + "sha256:00a584ee52bf5e27d540129ca9bf7c4a7e7447f24ff4a220faa1304ad0c09bcd", + "sha256:04265a7a84ae002001249bd1de2823bcf46832bd4b58f6965567cb8a07cf4f00", + "sha256:0bd35af6a18b724c689e56f2dbbdd8e409288be71952d271ba3d9614b31d188c", + "sha256:20c45a30f3389148f94edb77f3b216c677a277942f62a2b81a1cc0b6b2dde7fc", + "sha256:2959304d1ce31ab303d9fb5db2b294814278b35154d9b30bf7facc52d6088d0a", + "sha256:36dab7f506948056ceba2d57c1ade74e898401960de697cefc02f3519bd26c1b", + "sha256:37ec1b407ec032c7a0c1fdd2da12813f560bad38ae61ad9c7ce3c0573b3e5e30", + "sha256:3b8eb85b3cc7f083d87978c264d10ff9de3b4bfc46f1c6fdc2792e7d7ebc87bb", + "sha256:3dfce70c4e425607ae87b8eae67c9c7dbba59a33b62d70f79417aef0bc5c735b", + "sha256:418f51c61eab52d9920f4ef468d22c89dab1be5ac796f71cf3802f6a6e667df0", + "sha256:4195604f75cdc1db9bccdb9e44d783add3c817319c30aaff011670c9ed167690", + "sha256:4344ab16faf6c2d9df2b6772995623698fb2d5f114dace4ab2ff335550cf71d5", + "sha256:541cd3e3e252fb19a7b48f420b798b53483302b7fe4d9954c947605d0a263d62", + "sha256:564063e3782474c92cbb333effd06e6eb718471783c6e67f28c63f0fc3ac7b23", + "sha256:72f44b5be46faef2a1bf2a85902511b31f4dd7b01ce0c3978e92edb2cc812a82", + "sha256:8a98e02cbf8f624add45deff444539bf26345b479fc04fa0937b23cd84078d91", + "sha256:940db96449d7b2ebb2c7bf190be1514f3d67914bd37e54e8d30a182bd375a1a9", + "sha256:961333e7ee896651f02d4692242aa36b787b8e8e0baa2256717b2b9d55ae0a3c", + "sha256:9f713ffb4e27b5575bd917c70bbc3f7b348241a351015dbbc514c01b7061ff7e", + "sha256:a6584ae58001d17bb4dc0faa8a426919c2c028ef4d90ceb4191802ca6edb8204", + "sha256:c2b680987f418858e89dbb4f09c8c919ece62811780a27051ace72b2f69fb1be", + "sha256:d8fae5ba3d34c868ae43614e0bd6fb61114b2687ac3255798791ce075d95aece", + "sha256:dbd2c361db939a4252589baa94da4404d45e3fc70da1a31e541644cdf354336e", + "sha256:e090a8609e2095aa86978559b140cf8968af99ee54b8791b29ff804838f29f10", + "sha256:e4a1245e7b846e88ba63e7543483bda61b9acbaee61eadbead5a1ce479d94740", + "sha256:ec9901d19cadb80d9235ee41cc58983f18660314a0eb3fc7b11b0522ac3b6c4a", + "sha256:f2abeb4c4ce7584912f4d637b2c57f23720d35dd2892bfeb1b2c84b6fb7a8c88", + "sha256:f3bb267df679f70a9f40f17d62d22fe12e8b75e490f41807e7560de4d3e6bf9f", + "sha256:f933ecf4cb736c7af60a6a533db2bf569717f2318b265f92907acff1db43bc34", + "sha256:fc9c55dc1ed57db76595f2d19a479fc1c3a1be2c9da8de798a93d286c5f65f38" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.9" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==3.10.1" }, "pydeep": { "hashes": [ @@ -930,12 +900,12 @@ "pyintel471": { "editable": true, "git": "https://github.com/MISP/PyIntel471.git", - "ref": "0df8d51f1c1425de66714b3a5a45edb69b8cc2fc" + "ref": "917272fafa8e12102329faca52173e90c5256968" }, "pyipasnhistory": { "editable": true, "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "fc5e48608afc113e101ca6421bf693b7b9753f9e", + "ref": "1f020c44c440988899a6798903fd6941e06f8930", "subdirectory": "client" }, "pymisp": { @@ -946,11 +916,11 @@ "pdfexport" ], "hashes": [ - "sha256:439389a5377a9128018e9e4cc8e7ed9efa45a5efc4e77afbb55310ec7935d197", - "sha256:eed98c96b41a5e13ad1147f331ccb66e4fd9284df87528da5c99d759e29309d8" + "sha256:44f373f0ef0850f75520dcf8decd2119ef73a9feb5d8dea1711375074ddf7c3e", + "sha256:d6a804e9caef8e4383a8f2a720addf8063b0a78d924fab55020a84270f4e48c7" ], "index": "pypi", - "version": "==2.4.137.1" + "version": "==2.4.140" }, "pyonyphe": { "editable": true, @@ -1024,17 +994,17 @@ }, "python-engineio": { "hashes": [ - "sha256:33f7a214be5db35c867e97027bfe63676cb003d82aa17a607612b25ba5d84e5b", - "sha256:9f34afa4170f5ba6e3d9ff158752ccf8fbb2145f16554b2f0fc84646675be99a" + "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", + "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" ], - "version": "==4.0.0" + "version": "==3.14.2" }, "python-magic": { "hashes": [ - "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", - "sha256:b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce" + "sha256:8551e804c09a3398790bd9e392acb26554ae2609f29c72abb0b9dee9a5571eae", + "sha256:ca884349f2c92ce830e3f498c5b7c7051fe2942c3ee4332f65213b8ebff15a62" ], - "version": "==0.4.18" + "version": "==0.4.22" }, "python-pptx": { "hashes": [ @@ -1048,16 +1018,17 @@ "client" ], "hashes": [ - "sha256:870f8b00a63ef7c9a1f85fd70028624867bf246115e82625f28ef79def8847bb", - "sha256:f53fd0d5bd9f75a70492062f4ae6195ab5d34d67a29024d740f25e468392893e" + "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", + "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" ], - "version": "==5.0.4" + "version": "==4.6.1" }, "python-utils": { "hashes": [ - "sha256:2643aec3bfcd1062accafb915aa624b81a2b0f6dad9d0c1021debead4a35cda7" + "sha256:18fbc1a1df9a9061e3059a48ebe5c8a66b654d688b0e3ecca8b339a7f168f208", + "sha256:352d5b1febeebf9b3cdb9f3c87a3b26ef22d3c9e274a8ec1e7048ecd2fac4349" ], - "version": "==2.5.2" + "version": "==2.5.6" }, "pytz": { "hashes": [ @@ -1080,15 +1051,23 @@ "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018", "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e", "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253", + "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347", "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183", + "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541", "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb", "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185", + "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc", "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db", + "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa", "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46", + "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122", "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b", "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63", "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df", - "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc" + "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc", + "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247", + "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", + "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==5.4.1" @@ -1127,49 +1106,38 @@ }, "reportlab": { "hashes": [ - "sha256:009fa61710647cdc62eb373345248d8ebb93583a058990f7c4f9be46d90aa5b1", - "sha256:04a08d284da86882ec3a41a7c719833362ef891b09ee8e2fbb47cee352aa684a", - "sha256:07bff6742fba612da8d1b1f783c436338c6fdc6962828159827d5ca7d2b67935", - "sha256:09fb11ab1500e679fc1b01199d2fed24435499856e75043a9ac0d31dd48fd881", - "sha256:18a876449c9000c391dd3415ebc8454cd7bb9e488977b894886a2d7d018f16cd", - "sha256:18eec161411026dde49767bee4e5e8eeb8014879554811a62581dc7433628d5b", - "sha256:19353aead39fc115a4d6c598d6fb9fa26da7e69160a0443ebb49b02903e704e8", - "sha256:1b85c20e89c22ae902ca973df2afdd2d64d27dc4ffd2b29ebad8c805a213756b", - "sha256:1da3d7a35f918cee905facfa94bd00ae6091cadc06dca1b0b31b69ae02d41d1d", - "sha256:33f3cfdc492575f8af3225701301a7e62fc478358729820c9e0091aff5831378", - "sha256:3b0026c1129147befd4e5a8cf25da8dea1096fce371e7b2412e36d7254019c06", - "sha256:3d7713dddaa8081ed709a1fa2456a43f6a74b0f07d605da8441fd53fef334f69", - "sha256:3e2b4d69763103b9dc9b54c0952dc3cee05cedd06e28c0987fad7f84705b12c0", - "sha256:4ca5233a19a5ceca23546290f43addec2345789c7d65bb32f8b2668aa148351f", - "sha256:5214a289cf01ebbd65e49bae83709671dd9edb601891cf0ae8abf85f3c0b392f", - "sha256:52f8237654acbc78ea2fa6fb4a6a06e5b023b6da93f7889adfe2deba09473fad", - "sha256:5ed00894e0f8281c0b7c0494b4d3067c641fd90c8e5cf933089ec4cc9a48e491", - "sha256:6191961533d49c9d860964d42bada4d7ac3bb28502d984feb8034093f2012fa8", - "sha256:6f3ad2b1afe99c436563cd436d8693d4a12e2c4bd45f70c7705759ff7837fe53", - "sha256:739b743b7ca1ba4b4d64c321de6fccb49b562d0507ea06c817d9cc4faed5cd22", - "sha256:792efba0c0c6e4ee94f6dc95f305451733ee9230a1c7d51cb8e5301a549e0dfb", - "sha256:79d63ca40231ca3860859b39a92daa5219035ba9553da89a5e1b218550744121", - "sha256:83b28104edd58ad65748d2d0e60e0d97e3b91b3e90b4573ea6fe60de6811972c", - "sha256:85650446538cd2f606ca234634142a7ccd74cb6db7cfec250f76a4242e0f2431", - "sha256:9da445cb79e3f740756924c053edc952cde11a65ff5af8acfda3c0a1317136ef", - "sha256:9fabd5fbd24f5971085ffe53150d663f158f7d3050b25c95736e29ebf676d454", - "sha256:a0c377bc45e73c3f15f55d7de69fab270d174749d5b454ab0de502b15430ec2a", - "sha256:a1d3f7022a920d4a5e165d264581f1862e1c1b877ceeabb96fe98cec98125ae5", - "sha256:a315edef5c5610b0c75790142f49487e89ea34397fc247ae8aa890fe6d6dd057", - "sha256:a755cca2dcf023130b03bb671670301a992157d5c3151d838c0b68ef89894536", - "sha256:b1b20208ecdfffd7ca027955c4fe8972b28b30a4b3b80cf25099a08d3b20ed7c", - "sha256:b26d6f416891cef93411d6d478a25db275766081a5fb66368248293ef459f3be", - "sha256:b4ba4c30af7044ee987e61c88a5ffb76031ca0c53666bc85d823b7de55ddbc75", - "sha256:b71faf3b6e4d7058e1af1b8afedaf39a962db4a219affc8177009d8244ec10d4", - "sha256:cfa854bea525f8c913cb77e2bda724d94b965a0eb3bcfc4a645a9baa29bb86e2", - "sha256:dd9687359e466086b9f6fe6d8069034017f8b6ca3080944fae5709767ca6814e", - "sha256:de0c675fc2998a7eaa929c356ba49c84f53a892e9ab25e8ee7d8ebbbdcb2ac16", - "sha256:e2b4e33fea2ce9d3a14ea39191b169e41eb2ac995274f54ac8fd27519974bce8", - "sha256:f3d4a1a273dc141e03b72a553c11bc14dd7a27ec7654a071edcf83eb04f004bc", - "sha256:ff547cf4c1de7e104cad1a378431ff81efcb03e90e40871ee686107da5b91442" + "sha256:13ac281c8d5c904089022377bd9646c910deae63e7342dd9552088d330d73e89", + "sha256:14f38792176e41642f9ea7a83678df156d8abb3a90bbe396425a200614eed03d", + "sha256:15aeb8f8bdad5fa666d18a7d229bc7eb8f4e5a1dc8423931b3e690b6ce5021bc", + "sha256:1db86072b0ec3e5f9c5ab2980c61658ae3acee86e204b0d4c48112bc5cffd2f5", + "sha256:202109018f40d620812cf30dc300ea73385aed305d1de63c42229cb881821ffb", + "sha256:30e82ec00c566c4d8bfdcca0b93131749cc51ea0884395054d2afedf266f3f29", + "sha256:374252d118719e7b9b1bd0e5ce3f7083b5aaaeb1a9422983aa63b116621d34ae", + "sha256:3c1be70cf168ed29a449a009d7cad6dcc3e45d129f7ddb07b3854b8cee8d125b", + "sha256:45fe94e90c6b48c4ae877339b777fcc4f822795c1d4c7a0d6cffaf24987199b1", + "sha256:536f1ebf951cd48623974ba160c95e7c7219d4aa5664cdae17dffa2f19cf1cf3", + "sha256:54827fa29843b15834e5bc618508f245f3addee7bf980eebacfebb74f150e611", + "sha256:55c903f8aea4fbfca26f9f821c77c576c9791ce487ddfa3ffa1f2c44c5af79e2", + "sha256:63fba51babad0047def4ffaa41d0065248ca39d680e98dc9e3010de5425539b4", + "sha256:6fc3f01e9005ac53d639eafe22b3852937e42161d74a7d0681bc83f48cff1b30", + "sha256:6ff269ea41daa5cfd6124b13da1481fc40db2539fa82107dd9675f6670d95c25", + "sha256:7711fcdb0c1edfb48dcffd7e73430e9b5ceba0816a37fd269a327cd13088bcaf", + "sha256:7d4a59975a743eddc15895014d738bb38cbdecdd2496f651fb05779486bcb536", + "sha256:879e1123d49e0df76c478cccdacd4a9f4a2b4b445beec3d72a05f8b3775daa84", + "sha256:aa1ec9557c0d9dbe3eceb6581220aa1d77c404b8ff3decb40eae0bf075512142", + "sha256:ad0d3f657addd9c4215faf2699eafd54e89e404e35d696dda9dbe3c126132900", + "sha256:b784685141fe3fc26d8f703b21f89073a0ce46a800d06b7d58f2ceb481a65644", + "sha256:bd0870c840d47a6639df17c54f0c5676a06ab6798bb92ed8ef9b983c0326c2d0", + "sha256:bdb0781d1d4d1ed0745f5f22c06ed60760865511e65046432d145f55fd908f60", + "sha256:ce04f4bf9d15895bbfee6d53eb168cffd9fcedc625f0fcb5c343d809d0b37271", + "sha256:cf76145a89bb0ebf562c3252ce4d254547fe59daeb80ce2076d89867e9c03735", + "sha256:e8ebb34f30a11ac4196ae83d0b4f1f87bbe326c0f8a6eb4b768e622ec7f017f5", + "sha256:ed4b80c24a4e5e91927aa95901cce3f6fef7551e94a72ac5a2fa22740708cbff", + "sha256:f8a8f8b62cc150f71310e444ded4e32e7136c75aced6738877c3328e84338c94", + "sha256:fdf604246a5318157a581a483ceb0aab858582b478b24016768fdaff1c190f50" ], "index": "pypi", - "version": "==3.5.59" + "version": "==3.5.66" }, "requests": { "extras": [ @@ -1198,18 +1166,18 @@ }, "shodan": { "hashes": [ - "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" + "sha256:7e2bddbc1b60bf620042d0010f4b762a80b43111dbea9c041d72d4325e260c23" ], "index": "pypi", - "version": "==1.24.0" + "version": "==1.25.0" }, "sigmatools": { "hashes": [ - "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", - "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" + "sha256:0c30884589dc4b3fd30ae7f4e335a0d1dc284ddf0998983c4736176bc9087447", + "sha256:841136694829069c92a21b6b9d6d9cef4bd53b4d25e50d35da863a2e5601f71d" ], "index": "pypi", - "version": "==0.18.1" + "version": "==0.19.1" }, "six": { "hashes": [ @@ -1235,11 +1203,11 @@ }, "soupsieve": { "hashes": [ - "sha256:4bb21a6ee4707bf43b61230e80740e71bfe56e55d1f1f50924b087bb2975c851", - "sha256:6dc52924dc0bc710a5d16794e6b3480b2c7c08b07729505feab2b2c16661ff6e" + "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc", + "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b" ], "markers": "python_version >= '3'", - "version": "==2.1" + "version": "==2.2.1" }, "sparqlwrapper": { "hashes": [ @@ -1262,10 +1230,10 @@ }, "tabulate": { "hashes": [ - "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", - "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" + "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", + "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" ], - "version": "==0.8.7" + "version": "==0.8.9" }, "tornado": { "hashes": [ @@ -1316,11 +1284,11 @@ }, "tqdm": { "hashes": [ - "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a", - "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65" + "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7", + "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.56.0" + "version": "==4.59.0" }, "trustar": { "hashes": [ @@ -1368,11 +1336,11 @@ }, "urllib3": { "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" + "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", + "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.2" + "version": "==1.26.4" }, "uwhois": { "editable": true, @@ -1388,35 +1356,35 @@ }, "vt-graph-api": { "hashes": [ - "sha256:200c4f5a7c0a518502e890c4f4508a5ea042af9407d2889ef16a17ef11b7d25c", - "sha256:223c1cf32d69e10b5d3e178ec315589c7dfa7d43ccff6630a11ed5c5f498715c" + "sha256:3b13ce6e460aadd9917e883a8fc205f491ba09107963c9ebd3f5df4a8b3e67b7", + "sha256:d766285b06b854da04dd26cdb0ad3613fa17a935c00825b3dc04ea2b307381a6" ], "index": "pypi", - "version": "==1.0.1" + "version": "==1.1.2" }, "vulners": { "hashes": [ - "sha256:065aa63d5626d51cf45260bc6cc3a6ea682977689c036a6daba695905e881ba7", - "sha256:0e1356040f456f87841ccfe9f2f6ed36a256370606d530679d5d9993fe91386c", - "sha256:ab9ed8fbf1d3c80f0d066b13ac9d70d11dc9cb0b77568be65396117a4245e916" + "sha256:146305b799a991961dde97735d00605b9c335c15e0168050a5953ff9d69bdc28", + "sha256:d09b360549550abe669d70f962f60c696eae889c4ad7d5e8b9b47e71f1b81fb3", + "sha256:fa5a85d969734a58d9bedfba459002c272c6414196ab54207a05ef394af064c3" ], "index": "pypi", - "version": "==1.5.9" + "version": "==1.5.11" }, "wand": { "hashes": [ - "sha256:473af4a143d2c87693cc43dbd6f64d91ccfd7f0506cf4da53851cd34f114b39d", - "sha256:ec981b4f07f7582fc564aba8b57763a549392e9ef8b6a338e9da54cdd229cf95" + "sha256:540a2da5fb3ada1f0abf6968e0fa01ca7de6cd517f3be5c52d03a4fc8d54d75e", + "sha256:b752b2c2ee6ce04210da4b2e591013a4d9303fbed3fcbd3fb450930777dcb117" ], "index": "pypi", - "version": "==0.6.5" + "version": "==0.6.6" }, "websocket-client": { "hashes": [ - "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549", - "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010" + "sha256:44b5df8f08c74c3d82d28100fdc81f4536809ce98a17f0757557813275fbb663", + "sha256:63509b41d158ae5b7f67eb4ad20fecbb4eee99434e73e140354dc3ff8e09716f" ], - "version": "==0.57.0" + "version": "==0.58.0" }, "wrapt": { "hashes": [ @@ -1434,10 +1402,10 @@ }, "xlsxwriter": { "hashes": [ - "sha256:9b1ade2d1ba5d9b40a6d1de1d55ded4394ab8002718092ae80a08532c2add2e6", - "sha256:b807c2d3e379bf6a925f472955beef3e07495c1bac708640696876e68675b49b" + "sha256:2b7e22b1268c2ed85d73e5629097c9a63357f2429667ada9863cd05ff8ee33aa", + "sha256:30ebc19d0f201fafa34a6c622050ed2a268ac8dee24037a61605caa801dc8af5" ], - "version": "==1.3.7" + "version": "==1.3.8" }, "yara-python": { "hashes": [ @@ -1518,10 +1486,11 @@ }, "chardet": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" ], - "version": "==3.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" }, "codecov": { "hashes": [ @@ -1534,66 +1503,69 @@ }, "coverage": { "hashes": [ - "sha256:08b3ba72bd981531fd557f67beee376d6700fba183b167857038997ba30dd297", - "sha256:2757fa64e11ec12220968f65d086b7a29b6583d16e9a544c889b22ba98555ef1", - "sha256:3102bb2c206700a7d28181dbe04d66b30780cde1d1c02c5f3c165cf3d2489497", - "sha256:3498b27d8236057def41de3585f317abae235dd3a11d33e01736ffedb2ef8606", - "sha256:378ac77af41350a8c6b8801a66021b52da8a05fd77e578b7380e876c0ce4f528", - "sha256:38f16b1317b8dd82df67ed5daa5f5e7c959e46579840d77a67a4ceb9cef0a50b", - "sha256:3911c2ef96e5ddc748a3c8b4702c61986628bb719b8378bf1e4a6184bbd48fe4", - "sha256:3a3c3f8863255f3c31db3889f8055989527173ef6192a283eb6f4db3c579d830", - "sha256:3b14b1da110ea50c8bcbadc3b82c3933974dbeea1832e814aab93ca1163cd4c1", - "sha256:535dc1e6e68fad5355f9984d5637c33badbdc987b0c0d303ee95a6c979c9516f", - "sha256:6f61319e33222591f885c598e3e24f6a4be3533c1d70c19e0dc59e83a71ce27d", - "sha256:723d22d324e7997a651478e9c5a3120a0ecbc9a7e94071f7e1954562a8806cf3", - "sha256:76b2775dda7e78680d688daabcb485dc87cf5e3184a0b3e012e1d40e38527cc8", - "sha256:782a5c7df9f91979a7a21792e09b34a658058896628217ae6362088b123c8500", - "sha256:7e4d159021c2029b958b2363abec4a11db0ce8cd43abb0d9ce44284cb97217e7", - "sha256:8dacc4073c359f40fcf73aede8428c35f84639baad7e1b46fce5ab7a8a7be4bb", - "sha256:8f33d1156241c43755137288dea619105477961cfa7e47f48dbf96bc2c30720b", - "sha256:8ffd4b204d7de77b5dd558cdff986a8274796a1e57813ed005b33fd97e29f059", - "sha256:93a280c9eb736a0dcca19296f3c30c720cb41a71b1f9e617f341f0a8e791a69b", - "sha256:9a4f66259bdd6964d8cf26142733c81fb562252db74ea367d9beb4f815478e72", - "sha256:9a9d4ff06804920388aab69c5ea8a77525cf165356db70131616acd269e19b36", - "sha256:a2070c5affdb3a5e751f24208c5c4f3d5f008fa04d28731416e023c93b275277", - "sha256:a4857f7e2bc6921dbd487c5c88b84f5633de3e7d416c4dc0bb70256775551a6c", - "sha256:a607ae05b6c96057ba86c811d9c43423f35e03874ffb03fbdcd45e0637e8b631", - "sha256:a66ca3bdf21c653e47f726ca57f46ba7fc1f260ad99ba783acc3e58e3ebdb9ff", - "sha256:ab110c48bc3d97b4d19af41865e14531f300b482da21783fdaacd159251890e8", - "sha256:b239711e774c8eb910e9b1ac719f02f5ae4bf35fa0420f438cdc3a7e4e7dd6ec", - "sha256:be0416074d7f253865bb67630cf7210cbc14eb05f4099cc0f82430135aaa7a3b", - "sha256:c46643970dff9f5c976c6512fd35768c4a3819f01f61169d8cdac3f9290903b7", - "sha256:c5ec71fd4a43b6d84ddb88c1df94572479d9a26ef3f150cef3dacefecf888105", - "sha256:c6e5174f8ca585755988bc278c8bb5d02d9dc2e971591ef4a1baabdf2d99589b", - "sha256:c89b558f8a9a5a6f2cfc923c304d49f0ce629c3bd85cb442ca258ec20366394c", - "sha256:cc44e3545d908ecf3e5773266c487ad1877be718d9dc65fc7eb6e7d14960985b", - "sha256:cc6f8246e74dd210d7e2b56c76ceaba1cc52b025cd75dbe96eb48791e0250e98", - "sha256:cd556c79ad665faeae28020a0ab3bda6cd47d94bec48e36970719b0b86e4dcf4", - "sha256:ce6f3a147b4b1a8b09aae48517ae91139b1b010c5f36423fa2b866a8b23df879", - "sha256:ceb499d2b3d1d7b7ba23abe8bf26df5f06ba8c71127f188333dddcf356b4b63f", - "sha256:cef06fb382557f66d81d804230c11ab292d94b840b3cb7bf4450778377b592f4", - "sha256:e448f56cfeae7b1b3b5bcd99bb377cde7c4eb1970a525c770720a352bc4c8044", - "sha256:e52d3d95df81c8f6b2a1685aabffadf2d2d9ad97203a40f8d61e51b70f191e4e", - "sha256:ee2f1d1c223c3d2c24e3afbb2dd38be3f03b1a8d6a83ee3d9eb8c36a52bee899", - "sha256:f2c6888eada180814b8583c3e793f3f343a692fc802546eed45f40a001b1169f", - "sha256:f51dbba78d68a44e99d484ca8c8f604f17e957c1ca09c3ebc2c7e3bbd9ba0448", - "sha256:f54de00baf200b4539a5a092a759f000b5f45fd226d6d25a76b0dff71177a714", - "sha256:fa10fee7e32213f5c7b0d6428ea92e3a3fdd6d725590238a3f92c0de1c78b9d2", - "sha256:fabeeb121735d47d8eab8671b6b031ce08514c86b7ad8f7d5490a7b6dcd6267d", - "sha256:fac3c432851038b3e6afe086f777732bcf7f6ebbfd90951fa04ee53db6d0bcdd", - "sha256:fda29412a66099af6d6de0baa6bd7c52674de177ec2ad2630ca264142d69c6c7", - "sha256:ff1330e8bc996570221b450e2d539134baa9465f5cb98aff0e0f73f34172e0ae" + "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c", + "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6", + "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45", + "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a", + "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03", + "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529", + "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a", + "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a", + "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2", + "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6", + "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759", + "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53", + "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a", + "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4", + "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff", + "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502", + "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793", + "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb", + "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905", + "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821", + "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b", + "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81", + "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0", + "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b", + "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3", + "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184", + "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701", + "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a", + "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82", + "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638", + "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5", + "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083", + "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6", + "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90", + "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465", + "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a", + "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3", + "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e", + "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066", + "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf", + "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b", + "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae", + "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669", + "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873", + "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b", + "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6", + "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb", + "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160", + "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c", + "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079", + "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d", + "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.3.1" + "version": "==5.5" }, "flake8": { "hashes": [ - "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839", - "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b" + "sha256:12d05ab02614b6aee8df7c36b97d1a3b2372761222b19b58621355e82acddcff", + "sha256:78873e372b12b093da7b5e5ed302e8ad9e988b38b063b61ad937f26ca58fc5f0" ], "index": "pypi", - "version": "==3.8.4" + "version": "==3.9.0" }, "idna": { "hashes": [ @@ -1628,11 +1600,11 @@ }, "packaging": { "hashes": [ - "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858", - "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093" + "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", + "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.8" + "version": "==20.9" }, "pluggy": { "hashes": [ @@ -1652,19 +1624,19 @@ }, "pycodestyle": { "hashes": [ - "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", - "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" + "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", + "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.6.0" + "version": "==2.7.0" }, "pyflakes": { "hashes": [ - "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", - "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" + "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", + "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.2.0" + "version": "==2.3.1" }, "pyparsing": { "hashes": [ @@ -1676,11 +1648,11 @@ }, "pytest": { "hashes": [ - "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8", - "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306" + "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9", + "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839" ], "index": "pypi", - "version": "==6.2.1" + "version": "==6.2.2" }, "requests": { "extras": [ @@ -1703,11 +1675,11 @@ }, "urllib3": { "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" + "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", + "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.2" + "version": "==1.26.4" } } } From 327a1ac893d72adb0e2078587ac3c674bdce1621 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 30 Mar 2021 03:42:54 +0200 Subject: [PATCH 167/476] fix: [farsight_passivedns] Fixed lookup_rdata_name results desclaration - Getting generator as a list as it is already the case for all the other results, so it avoids issues to read the results by accidently looping through the generator before it is actually needed, which would lose the content of the generator - Also removed print that was accidently introduced with the last commit --- misp_modules/modules/expansion/farsight_passivedns.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 8cdd8b6..6fc5f27 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -161,7 +161,6 @@ def parse_input(attribute, config): lookup_args['time_first_after'] = parse_timestamp(attribute['first_seen']) if attribute.get('last_seen'): lookup_args['time_last_before'] = parse_timestamp(attribute['last_seen']) - print(lookup_args) attribute_type = attribute['type'] if attribute_type in flex_query_input: return flex_queries, (lookup_args, attribute['value']) @@ -202,7 +201,7 @@ def lookup_name(client, lookup_args, name, flex): if rrset_response: response['rrset'] = rrset_response # RDATA = entries on the right-hand side of the domain name related labels - rdata_response = client.lookup_rdata_name(name, **lookup_args) + rdata_response = list(client.lookup_rdata_name(name, **lookup_args)) if rdata_response: response['rdata'] = rdata_response if flex: From 5077050a3ea2b7af175dbb9eb529dee507b3f50a Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 30 Mar 2021 03:47:34 +0200 Subject: [PATCH 168/476] chg: [farsight_passivedns] Making first_time and last_time results human readable - We get the datetime format instead of the raw timestamp --- misp_modules/modules/expansion/farsight_passivedns.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 6fc5f27..1a0bd7f 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -155,7 +155,8 @@ def parse_input(attribute, config): lookup_args = { 'limit': config['limit'] if config.get('limit') else DEFAULT_LIMIT, 'offset': 0, - 'ignore_limited': True + 'ignore_limited': True, + 'humantime': True } if attribute.get('first_seen'): lookup_args['time_first_after'] = parse_timestamp(attribute['first_seen']) From d7b529d3fe9c9cc32f624e4167fd733e1ff8a375 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 30 Mar 2021 03:42:54 +0200 Subject: [PATCH 169/476] fix: [farsight_passivedns] Fixed lookup_rdata_name results desclaration - Getting generator as a list as it is already the case for all the other results, so it avoids issues to read the results by accidently looping through the generator before it is actually needed, which would lose the content of the generator - Also removed print that was accidently introduced with the last commit --- misp_modules/modules/expansion/farsight_passivedns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index c398245..ba6a25a 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -193,7 +193,7 @@ def lookup_name(client, lookup_args, name, flex): if rrset_response: response['rrset'] = rrset_response # RDATA = entries on the right-hand side of the domain name related labels - rdata_response = client.lookup_rdata_name(name, **lookup_args) + rdata_response = list(client.lookup_rdata_name(name, **lookup_args)) if rdata_response: response['rdata'] = rdata_response if flex: From a6a8978b203d2795600de69ffe3eac187385ad7d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 30 Mar 2021 03:47:34 +0200 Subject: [PATCH 170/476] chg: [farsight_passivedns] Making first_time and last_time results human readable - We get the datetime format instead of the raw timestamp --- misp_modules/modules/expansion/farsight_passivedns.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index ba6a25a..f39e537 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -154,7 +154,8 @@ def parse_input(attribute, config): lookup_args = { 'limit': config['limit'] if config.get('limit') else DEFAULT_LIMIT, 'offset': 0, - 'ignore_limited': True + 'ignore_limited': True, + 'humantime': True } attribute_type = attribute['type'] if attribute_type in flex_query_input: From 505bbbc20ad5bd6c4b9abb749c93ea86fc0cac0d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 30 Mar 2021 17:34:01 +0200 Subject: [PATCH 171/476] fix: [farsight_passivedns] Excluding last_seen value for now, in order to get the available results - With last_seen set we can easily get results included in a certain time frame (between first seen and last seen), but we do not get the latest results. In order to get those ones, we skip filtering on the time_last_before value --- misp_modules/modules/expansion/farsight_passivedns.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 1a0bd7f..98ee2ed 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -160,8 +160,6 @@ def parse_input(attribute, config): } if attribute.get('first_seen'): lookup_args['time_first_after'] = parse_timestamp(attribute['first_seen']) - if attribute.get('last_seen'): - lookup_args['time_last_before'] = parse_timestamp(attribute['last_seen']) attribute_type = attribute['type'] if attribute_type in flex_query_input: return flex_queries, (lookup_args, attribute['value']) From a2282c47215d970ad65824dd9a5cc1da4e928ca0 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 31 Mar 2021 13:42:07 +0200 Subject: [PATCH 172/476] add: [farsight_passivedns] Adding first_seen & last_seen (when available) in passivedns objects - The object_relation `time_first` is added as the `first_seen` value of the object - Same with `time_last` -> `last_seen` --- misp_modules/modules/expansion/farsight_passivedns.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 98ee2ed..e6e1e25 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -108,6 +108,10 @@ class FarsightDnsdbParser(): passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) for feature, value in result.items(): passivedns_object.add_attribute(**self._parse_attribute(comment, feature, value)) + if result.get('time_first'): + passivedns_object.first_seen = result['time_first'] + if result.get('time_last'): + passivedns_object.last_seen = result['time_last'] passivedns_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(passivedns_object) From 51e6122c67935cbc4052a8ce62590071fcb57b8d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 31 Mar 2021 14:05:32 +0200 Subject: [PATCH 173/476] chg: [documentation] updated --- documentation/README.md | 42 ++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 5891766..b25258a 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -510,15 +510,12 @@ A module to query the Phishing Initiative service (https://phishing-initiative.l Module to access Farsight DNSDB Passive DNS. - **features**: ->This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. ->The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. +>This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. +> The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. > ->An API key is required to submit queries to the API. ->It is also possible to define a custom server URL, and to set a limit of results to get. ->This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). -> ->Additionally to the lookup queries, responses from flex queries can be returned with the results. ->To get this additional data with the results, there is a `flex_queries` configuration parameter to set to `true`. The module submit then regex queries to the API, using the domain, hostname or IP address as keyword for the search. Passive-dns objects are returned next to the ones resulting from the lookup queries. +>An API key is required to submit queries to the API. +> It is also possible to define a custom server URL, and to set a limit of results to get. +> This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). - **input**: >A domain, hostname or IP address MISP attribute. - **output**: @@ -527,7 +524,7 @@ Module to access Farsight DNSDB Passive DNS. > - https://www.farsightsecurity.com/ > - https://docs.dnsdb.info/dnsdb-api/ - **requirements**: ->An access to the Farsight Passive DNS API (apikey), The dnsdb2 python library +>An access to the Farsight Passive DNS API (apikey) ----- @@ -611,17 +608,16 @@ Module to query a local copy of Maxmind's Geolite database. Module to access GreyNoise.io API - **features**: ->The module takes an IP address as input and queries GreyNoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. +>The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. - **input**: >An IP address. - **output**: ->Additional information about the IP fetched from GreyNoise API. +>Additional information about the IP fetched from Greynoise API. - **references**: > - https://greynoise.io/ -> - https://developer.greynoise.io/ +> - https://github.com/GreyNoise-Intelligence/api.greynoise.io - **requirements**: -> - A GreyNoise API key. -> - A GreyNoise API Type selection of "community" or "enterprise" based API key type +>A Greynoise API key. ----- @@ -1757,6 +1753,22 @@ Module to export malicious network activity attributes to Cisco fireSIGHT manage ----- +#### [defender_endpoint_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/defender_endpoint_export.py) + + + +Defender for Endpoint KQL hunting query export module +- **features**: +>This module export an event as Defender for Endpoint KQL queries that can then be used in your own python3 or Powershell tool. If you are using Microsoft Sentinel, you can directly connect your MISP instance to Sentinel and then create queries using the `ThreatIntelligenceIndicator` table to match events against imported IOC. +- **input**: +>MISP Event attributes +- **output**: +>Defender for Endpoint KQL queries +- **references**: +>https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/advanced-hunting-schema-reference + +----- + #### [goamlexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/goamlexport.py) @@ -1861,7 +1873,7 @@ Simple export of a MISP event to PDF. > 'Activate_galaxy_description' is a boolean (True or void) to activate the description of event related galaxies. > 'Activate_related_events' is a boolean (True or void) to activate the description of related event. Be aware this might leak information on confidential events linked to the current event ! > 'Activate_internationalization_fonts' is a boolean (True or void) to activate Noto fonts instead of default fonts (Helvetica). This allows the support of CJK alphabet. Be sure to have followed the procedure to download Noto fonts (~70Mo) in the right place (/tools/pdf_fonts/Noto_TTF), to allow PyMisp to find and use them during PDF generation. -> 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option +> 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option - **input**: >MISP Event - **output**: From 0752628de587138b05bf6824eb68ad03dfc1382f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 8 Apr 2021 19:14:13 +0200 Subject: [PATCH 174/476] fix: [cve_advanced] Some CVEs are not in CWE format but in NVD-CWE-Other --- misp_modules/modules/expansion/cve_advanced.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index 9071ff9..a5e807e 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -87,7 +87,7 @@ class VulnerabilityParser(): ) def __parse_weakness(self, vulnerability_uuid): - cwe_string, cwe_id = self.vulnerability['cwe'].split('-') + cwe_string, cwe_id = self.vulnerability['cwe'].split('-')[:2] cwes = requests.get(self.api_url.replace('/cve/', '/cwe')) if cwes.status_code == 200: for cwe in cwes.json(): From a381ffdce6fd6cc28971dda6e147b24359150d4b Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 9 Apr 2021 00:20:36 +0200 Subject: [PATCH 175/476] chg: [doc] fix index of mkdocs --- docs/img/favicon.ico | Bin 0 -> 1150 bytes docs/img/misp.png | Bin 0 -> 10376 bytes docs/index.md | 4 ++++ mkdocs.yml | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/img/favicon.ico create mode 100644 docs/img/misp.png create mode 100644 docs/index.md diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dca12d10129b448c28687d768edf3d18ba02514b GIT binary patch literal 1150 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..53b3e77 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,4 @@ + +- [expansion](./expansion) +- [export](./export_mod) +- [import](./import_mod) diff --git a/mkdocs.yml b/mkdocs.yml index be23ba7..bafd3d6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,7 +16,7 @@ edit_uri: "" use_directory_urls: true # Copyright -copyright: "Copyright © 2019 MISP Project" +copyright: "Copyright © 2019-2021 MISP Project" # Options extra: From 25c5648cd6e8a41f6642a1eda2c70f75efd12c0e Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 08:30:49 +0200 Subject: [PATCH 176/476] chg: [Pipfile.lock] updated --- Pipfile.lock | 1082 +++++++++++++++++++++++++++++--------------------- 1 file changed, 631 insertions(+), 451 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 04a507c..896a592 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1c6ff4271554f106a004e60839c77f1a065b1a58fb6b12dea3c4a1ca5c5ed0ce" + "sha256": "1e40a27ecb603ad61301ace74783297f581773a131fb83638a03ae2488ba4e12" }, "pipfile-spec": 6, "requires": { @@ -18,52 +18,52 @@ "default": { "aiohttp": { "hashes": [ - "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe", - "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe", - "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5", - "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8", - "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd", - "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb", - "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c", - "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87", - "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0", - "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290", - "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5", - "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287", - "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde", - "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf", - "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8", - "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16", - "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf", - "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809", - "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213", - "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f", - "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013", - "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b", - "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9", - "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5", - "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb", - "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df", - "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4", - "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439", - "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f", - "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22", - "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f", - "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5", - "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970", - "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009", - "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc", - "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a", - "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" + "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9", + "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f", + "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f", + "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005", + "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a", + "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e", + "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd", + "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a", + "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656", + "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0", + "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6", + "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a", + "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c", + "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b", + "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957", + "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9", + "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001", + "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e", + "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60", + "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564", + "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45", + "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a", + "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13", + "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f", + "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4", + "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f", + "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235", + "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914", + "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3", + "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3", + "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150", + "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e", + "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347", + "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b", + "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7", + "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245", + "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1" ], - "markers": "python_version >= '3.6'", - "version": "==3.7.4.post0" + "index": "pypi", + "version": "==3.7.3" }, "antlr4-python3-runtime": { "hashes": [ "sha256:15793f5d0512a372b4e7d2284058ad32ce7dd27126b105fb0b2245130445db33" ], - "markers": "python_version >= '3'", + "index": "pypi", "version": "==4.8" }, "apiosintds": { @@ -78,21 +78,22 @@ "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314" ], + "index": "pypi", "version": "==1.4.0" }, "assemblyline-client": { "hashes": [ - "sha256:68cca09f45df1964a07b69d3284e28ee8f911ac497dad737b3423d1a062950e8" + "sha256:6a36a654185ba40d10bdd0213a1926aacb4351290824e406cbff6b6b5b251f5f" ], "index": "pypi", - "version": "==4.0.2" + "version": "==4.0.1" }, "async-timeout": { "hashes": [ "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" ], - "markers": "python_full_version >= '3.5.3'", + "index": "pypi", "version": "==3.0.1" }, "attrs": { @@ -100,9 +101,17 @@ "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==20.3.0" }, + "backoff": { + "hashes": [ + "sha256:5e73e2cbe780e1915a204799dba0a01896f45f4385e636bcca7a0614d879d0cd", + "sha256:b8fba021fac74055ac05eb7c7bfce4723aedde6cd0a504e5326bcb0bdd6d19a4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.10.0" + }, "backscatter": { "hashes": [ "sha256:7a0d1aa3661635de81e2a09b15d53e35cbe399a111cc58a70925f80e6874abd3", @@ -120,6 +129,14 @@ "index": "pypi", "version": "==4.9.3" }, + "bidict": { + "hashes": [ + "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", + "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" + ], + "index": "pypi", + "version": "==0.21.2" + }, "blockchain": { "hashes": [ "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" @@ -127,62 +144,72 @@ "index": "pypi", "version": "==1.4.4" }, + "censys": { + "hashes": [ + "sha256:0a2e2c73471d37fb55c4c5597d48334cfc56fd39daebbae18c7b07f0d2a51dc4", + "sha256:d7d935ffe3309f8279d566113f2d958803154fd090ad07abe0d3458a396db9fd" + ], + "index": "pypi", + "version": "==1.1.1" + }, "certifi": { "hashes": [ "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" ], + "index": "pypi", "version": "==2020.12.5" }, "cffi": { "hashes": [ - "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813", - "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06", - "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea", - "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee", - "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396", - "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73", - "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315", - "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1", - "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49", - "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892", - "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482", - "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058", - "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5", - "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53", - "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045", - "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3", - "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5", - "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e", - "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c", - "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369", - "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827", - "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053", - "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa", - "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4", - "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322", - "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132", - "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62", - "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa", - "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0", - "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396", - "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e", - "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991", - "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6", - "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1", - "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406", - "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d", - "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" + "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", + "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", + "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", + "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", + "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", + "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", + "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", + "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", + "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", + "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", + "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", + "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", + "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", + "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", + "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", + "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", + "sha256:7ef7d4ced6b325e92eb4d3502946c78c5367bc416398d387b39591532536734e", + "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", + "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", + "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", + "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", + "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", + "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", + "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", + "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", + "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", + "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", + "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", + "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", + "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", + "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", + "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", + "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", + "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", + "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", + "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", + "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" ], - "version": "==1.14.5" + "index": "pypi", + "version": "==1.14.4" }, "chardet": { "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" + "index": "pypi", + "version": "==3.0.4" }, "clamd": { "hashes": [ @@ -197,7 +224,7 @@ "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "index": "pypi", "version": "==7.1.2" }, "click-plugins": { @@ -205,6 +232,7 @@ "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" ], + "index": "pypi", "version": "==1.1.1" }, "colorama": { @@ -212,95 +240,118 @@ "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "index": "pypi", "version": "==0.4.4" }, "colorclass": { "hashes": [ "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" ], + "index": "pypi", "version": "==2.2.0" }, "compressed-rtf": { "hashes": [ "sha256:c1c827f1d124d24608981a56e8b8691eb1f2a69a78ccad6440e7d92fde1781dd" ], + "index": "pypi", "version": "==1.0.6" }, "configparser": { "hashes": [ - "sha256:85d5de102cfe6d14a5172676f09d19c465ce63d6019cf0a4ef13385fc535e828", - "sha256:af59f2cdd7efbdd5d111c1976ecd0b82db9066653362f0962d7bf1d3ab89a1fa" + "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", + "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" ], - "markers": "python_version >= '3.6'", - "version": "==5.0.2" + "index": "pypi", + "version": "==5.0.1" }, "cryptography": { "hashes": [ - "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d", - "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959", - "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6", - "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873", - "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2", - "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713", - "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", - "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", - "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", - "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", - "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", - "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" + "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d", + "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7", + "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901", + "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c", + "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244", + "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6", + "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5", + "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e", + "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c", + "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0", + "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812", + "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a", + "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030", + "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302" ], - "version": "==3.4.7" + "index": "pypi", + "version": "==3.3.1" + }, + "dataclasses": { + "hashes": [ + "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", + "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" + ], + "markers": "python_version < '3.7'", + "version": "==0.8" }, "decorator": { "hashes": [ "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" ], + "index": "pypi", "version": "==4.4.2" }, "deprecated": { "hashes": [ - "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771", - "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1" + "sha256:471ec32b2755172046e28102cd46c481f21c6036a0ec027521eba8521aa4ef35", + "sha256:924b6921f822b64ec54f49be6700a126bab0640cfafca78f22c9d429ed590560" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.12" + "index": "pypi", + "version": "==1.2.11" }, "dnsdb2": { "hashes": [ - "sha256:e7ed25c8ca1e456c77deaf67f440ae0c2ff94c714dab4d67df14ccc82f501faf" + "sha256:55c9f43eb231ff21f40a69183fdb0220f175519e108bc19d0c098e07532d0dfe" ], "index": "pypi", - "version": "==1.1.3" + "version": "==1.1.2" }, "dnspython": { "hashes": [ - "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216", - "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4" + "sha256:40f563e1f7a7b80dc5a4e76ad75c23da53d62f1e15e6e517293b04e1f84ead7c", + "sha256:861e6e58faa730f9845aaaa9c6c832851fbf89382ac52915a51f89c71accdd31" ], "index": "pypi", - "version": "==2.1.0" + "version": "==1.15.0" + }, + "dnspython3": { + "hashes": [ + "sha256:6eb9504abafb91cb67ed9dc3d3289a3ccc438533b460eccbf77e36c5323100f4" + ], + "index": "pypi", + "version": "==1.15.0" }, "domaintools-api": { "hashes": [ - "sha256:10fd899b2fe063a23edbcf15daf516fe14fb4a67ef1bf72af630a183161cb003", - "sha256:fde92d0f1fb0cfc324548eca85c3bab7774ffa93581fd92ced954ce11d5891e1" + "sha256:62e2e688d14dbd7ca51a44bd0a8490aa69c712895475598afbdbb1e1e15bf2f2", + "sha256:fe75e3cc86e7e2904b06d8e94b1986e721fdce85d695c87d1140403957e4c989" ], "index": "pypi", - "version": "==0.5.4" + "version": "==0.5.2" }, "easygui": { "hashes": [ - "sha256:073f728ca88a77b74f404446fb8ec3004945427677c5618bd00f70c1b999fef2", - "sha256:8d38764803c27bbccab2771e6c021cb20647049b36617f765fac79f01af07a27" + "sha256:690658af9fca3f2f2a55f24421045f9b33ca33c877ed5fb61d4b942d8ec335f3", + "sha256:dbc89afbb1aca83830ea4af568eb2491654e16b2706a14d040757fdf1fafbbfe" ], - "version": "==0.98.2" + "index": "pypi", + "version": "==0.98.1" }, "ebcdic": { "hashes": [ "sha256:33b4cb729bc2d0bf46cc1847b0e5946897cb8d3f53520c5b9aa5fa98d7e735f1" ], + "index": "pypi", "version": "==1.1.1" }, "enum-compat": { @@ -308,19 +359,22 @@ "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e", "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157" ], + "index": "pypi", "version": "==0.0.3" }, "extract-msg": { "hashes": [ - "sha256:6ad2702bef86e6c1b8505e2993c7f3d37a1f3d140903138ee2df4a299dd2a29c", - "sha256:7ebdbd7863a3699080a69f71ec0cd30ed9bfee70bad9acc6a8e6abe9523c78c0" + "sha256:7300a50bfa91405a381826f8e22f39458c7322fea1cd660ef699c4157a58be4b", + "sha256:7ce5761911b2caa9f07042efdecfcc9cf4afe524c3efbfd0aa5fa277faa1cc53" ], - "version": "==0.28.7" + "index": "pypi", + "version": "==0.28.1" }, "ez-setup": { "hashes": [ "sha256:303c5b17d552d1e3fb0505d80549f8579f557e13d8dc90e5ecef3c07d7f58642" ], + "index": "pypi", "version": "==0.9" }, "ezodf": { @@ -334,7 +388,7 @@ "hashes": [ "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==0.18.2" }, "futures": { @@ -343,6 +397,7 @@ "sha256:51ecb45f0add83c806c68e4b06106f90db260585b25ef2abfcda0bd95c0132fd", "sha256:c4884a65654a7c45435063e14ae85280eb1f111d94e542396717ba9828c4337f" ], + "index": "pypi", "version": "==3.1.1" }, "geoip2": { @@ -355,24 +410,25 @@ }, "httplib2": { "hashes": [ - "sha256:749c32603f9bf16c1277f59531d502e8f1c2ca19901ae653b49c4ed698f0820e", - "sha256:e0d428dad43c72dbce7d163b7753ffc7a39c097e6788ef10f4198db69b92f08e" + "sha256:8af66c1c52c7ffe1aa5dc4bcd7c769885254b0756e6e69f953c7f0ab49a70ba3", + "sha256:ca2914b015b6247791c4866782fa6042f495b94401a0f0bd3e1d6e0ba2236782" ], - "version": "==0.19.0" + "index": "pypi", + "version": "==0.18.1" }, "idna": { "hashes": [ "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.10" }, "idna-ssl": { "hashes": [ "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" ], - "markers": "python_version < '3.7'", + "index": "pypi", "version": "==1.1.0" }, "imapclient": { @@ -380,26 +436,37 @@ "sha256:3eeb97b9aa8faab0caa5024d74bfde59408fbd542781246f6960873c7bf0dd01", "sha256:60ba79758cc9f13ec910d7a3df9acaaf2bb6c458720d9a02ec33a41352fd1b99" ], + "index": "pypi", "version": "==2.1.0" }, + "importlib-metadata": { + "hashes": [ + "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a", + "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe" + ], + "markers": "python_version < '3.8'", + "version": "==3.10.0" + }, "isodate": { "hashes": [ "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" ], + "index": "pypi", "version": "==0.6.0" }, "jbxapi": { "hashes": [ - "sha256:2cdb8e935cb35c3af83209b847cedb3911b5f0b4d905ed89f76fa0e34d62ea26" + "sha256:7cebd7ea73838ffd9e77b6a3bac6e4e1263b8cb4678b0579361b9257db684893" ], "index": "pypi", - "version": "==3.16.0" + "version": "==3.14.0" }, "json-log-formatter": { "hashes": [ "sha256:ee187c9a80936cbf1259f73573973450fc24b84a4fb54e53eb0dcff86ea1e759" ], + "index": "pypi", "version": "==0.3.0" }, "jsonschema": { @@ -407,80 +474,85 @@ "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" ], + "index": "pypi", "version": "==3.2.0" }, "lark-parser": { "hashes": [ - "sha256:ef610461ebf2b243502f337d9d49879e39f9add846a4749e88c8dcdc1378bb6b" + "sha256:20bdefdf1b6e9bcb38165ea5cc4f27921a99c6f4c35264a3a953fd60335f1f8c", + "sha256:8b747e1f544dcc2789e3feaddd2a50c6a73bed69d62e9c69760c1e1f7d23495f" ], - "version": "==0.11.2" + "index": "pypi", + "version": "==0.11.1" }, "lief": { "hashes": [ - "sha256:2092703329ed5a2dc5111300469346528e7db2a31c72767dc48c50474087dc83", - "sha256:254e391d1f640cb89c8a4ce3ebdbfe239bc615e50931e226cbca64b22a63d3e9", - "sha256:2e33789c16b525991c8dc62a4265afdb7003e28b29744251526e3604f40ef3d4", - "sha256:5266c387eec479663bab503d095c0c5ce1b13e69a81167cd6898215d07e001dc", - "sha256:560cca9dc490d0bee84aca30533f7c7ac9e874060bbc9bdbc6f64da63e4e351a", - "sha256:599e8519398af84e1204791044f442b2d469ccc02196905cab8e378ee4d6da4d", - "sha256:59df04a2bf46c021772148086ff5eedf736c885e3b522f05024a2539feec6174", - "sha256:5ca9e60eb55f4fa7fcd4e526273f56ef94d10995b50a681a1bba714098e9bccc", - "sha256:626bf3a31644e5790736cebfc366f3227ed76979e3e6e47c68365bd47e73d76a", - "sha256:74a4822f1883d6d7f230856422e700176c4ba67792dce9b013a956e70947c83f", - "sha256:846da4389a258f5525a147c7d29867ce0af59e1d81923f8dbed1ed83599f589f", - "sha256:9abefaa0c2916bb7b15712dd2a85cc2d91beb5c380b819fe2b22156eb5b98546", - "sha256:a6d2f59723819aac71cfdf3be898d83d9d9c33c02489125eee5ff40aa4177be6", - "sha256:b175e688f51500332fb726c72b237d081ba905f0ee7290d80cc7d1cbf86c93ff", - "sha256:ba79766fb63096f96bdba1de748f81670b4d545cc2f79d8217e3a42b81cef864", - "sha256:bfe10417af317351a73babc7b7c82981ffe08efcd6fe6c79b816be1bcd52bab4", - "sha256:c9c8f704198610bb06e3a56bc8fa4ba91cfba6606964027277c81baee245601b", - "sha256:d42072d75b61e5314a1223d9afe666b6a62cf030fd494fe90a55d8baf8343204", - "sha256:e469daed11efbd989f56afd0167ae391bdd0de9984ad274679f1da3a5ec60494", - "sha256:f864c1dd918c49611779eb1f487d74bc97613a0690ce7c17a18949fc7dc5e79e" + "sha256:0cd2665ff28937755c8acedc2e3fb9de5ba752353e19b51b89297b8be3f63ccb", + "sha256:1a110bd5db41b4fde1a61094658b0366352ed4c0a00b55bde821046a59c2f913", + "sha256:1fb570712fa17ee153aca263ab1f1ec763772ccb46992e415b3dc1c0248466bc", + "sha256:2ee8f9787ea92109f19e5e4d22773042184ac524a3f11399ea5e13d974ac1f05", + "sha256:348ee294567826cad638b7e6cf2ede4ffe03524cd5b6038896f78e5b006d6295", + "sha256:77ba7dd0d48933c0b26c980bda1ab4a7ad3c7031880181fab0b94caad3bc1a4d", + "sha256:8774076dfbcf9b6906be4d9243de4a78fc09d317292251072d460ed1e0eeb96e", + "sha256:93d79a47db9977e6471b21d5efd4e7af4c29c76261d6583141fcf10f6ccd0eba", + "sha256:96d2a8d2310c7accaeb5c6679833c0cd8f0fb6d8c682a5df59d4d868c8881661", + "sha256:9837166402248a4ef29018d498c4eccc11cbc92ee4083da046fa747d3863b43d", + "sha256:9f2bd417090df21548af3a0216f3a02056291348c0826a5ff78e3f3046283978", + "sha256:ad19b9ef5c2a2552a82683bbf92ef3e986b422d552968b378195e356191aa545", + "sha256:afe4d15b519dd7d97732e85b7a2b11154c97a40ce517e1044b5cd5f80074ce36", + "sha256:b0a55424b3ffa08d16bf8ee6e5e9474b0a4b392ca4d94545c16e47e6366e41d4", + "sha256:ccf977099153eaefa351e72e84dfa829334699521ef00434b50647d80de2cc56", + "sha256:d95cf1224c7b311b8d25dbd4de627d28717266e62b9721f1dc4c8427f929a60f", + "sha256:e6ff05e6ebcb9bea8833fcb558d4db3bc2a78031c4792fcac9f9612fa78258b3", + "sha256:e8c66834a0ee9ed1899db165c09ca04aba8dee574de1ccc866d82fbf0c059bb8", + "sha256:f31fde4e7174b4bc9b67ff22fd93fa15fc3faa1592ac669f3addc95d9e66168e", + "sha256:f9b00c396c9f45c5f4cf37c034428ad525d6d7c7d38fc6c49ddc4b558201151b" ], - "version": "==0.11.4" + "index": "pypi", + "version": "==0.11.0" }, "lxml": { "hashes": [ - "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d", - "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3", - "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2", - "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f", - "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927", - "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3", - "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7", - "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f", - "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade", - "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468", - "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b", - "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4", - "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83", - "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04", - "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791", - "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51", - "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1", - "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a", - "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f", - "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee", - "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec", - "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969", - "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28", - "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a", - "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa", - "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106", - "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d", - "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4", - "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0", - "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4", - "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2", - "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0", - "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654", - "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2", - "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23", - "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586" + "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", + "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", + "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", + "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", + "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", + "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", + "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", + "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", + "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", + "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", + "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", + "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", + "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", + "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", + "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", + "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", + "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", + "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", + "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", + "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", + "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", + "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", + "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", + "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", + "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", + "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", + "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", + "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", + "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", + "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", + "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", + "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", + "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", + "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", + "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", + "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", + "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" ], "index": "pypi", - "version": "==4.6.3" + "version": "==4.6.2" }, "maclookup": { "hashes": [ @@ -502,17 +574,18 @@ "hashes": [ "sha256:47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc" ], - "markers": "python_version >= '3.6'", + "index": "pypi", "version": "==2.0.3" }, "misp-modules": { "editable": true, - "path": "." + "file": "file:///usr/local/src/misp-modules" }, "msoffcrypto-tool": { "hashes": [ "sha256:56a1fe5e58ca417ca8756e8d7224ae599323996da65f81a35273c0f1e2eaf490" ], + "index": "pypi", "version": "==4.11.0" }, "multidict": { @@ -555,7 +628,7 @@ "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" ], - "markers": "python_version >= '3.6'", + "index": "pypi", "version": "==5.1.0" }, "np": { @@ -567,33 +640,43 @@ }, "numpy": { "hashes": [ - "sha256:2428b109306075d89d21135bdd6b785f132a1f5a3260c371cee1fae427e12727", - "sha256:377751954da04d4a6950191b20539066b4e19e3b559d4695399c5e8e3e683bf6", - "sha256:4703b9e937df83f5b6b7447ca5912b5f5f297aba45f91dbbbc63ff9278c7aa98", - "sha256:471c0571d0895c68da309dacee4e95a0811d0a9f9f532a48dc1bea5f3b7ad2b7", - "sha256:61d5b4cf73622e4d0c6b83408a16631b670fc045afd6540679aa35591a17fe6d", - "sha256:6c915ee7dba1071554e70a3664a839fbc033e1d6528199d4621eeaaa5487ccd2", - "sha256:6e51e417d9ae2e7848314994e6fc3832c9d426abce9328cf7571eefceb43e6c9", - "sha256:719656636c48be22c23641859ff2419b27b6bdf844b36a2447cb39caceb00935", - "sha256:780ae5284cb770ade51d4b4a7dce4faa554eb1d88a56d0e8b9f35fca9b0270ff", - "sha256:878922bf5ad7550aa044aa9301d417e2d3ae50f0f577de92051d739ac6096cee", - "sha256:924dc3f83de20437de95a73516f36e09918e9c9c18d5eac520062c49191025fb", - "sha256:97ce8b8ace7d3b9288d88177e66ee75480fb79b9cf745e91ecfe65d91a856042", - "sha256:9c0fab855ae790ca74b27e55240fe4f2a36a364a3f1ebcfd1fb5ac4088f1cec3", - "sha256:9cab23439eb1ebfed1aaec9cd42b7dc50fc96d5cd3147da348d9161f0501ada5", - "sha256:a8e6859913ec8eeef3dbe9aed3bf475347642d1cdd6217c30f28dee8903528e6", - "sha256:aa046527c04688af680217fffac61eec2350ef3f3d7320c07fd33f5c6e7b4d5f", - "sha256:abc81829c4039e7e4c30f7897938fa5d4916a09c2c7eb9b244b7a35ddc9656f4", - "sha256:bad70051de2c50b1a6259a6df1daaafe8c480ca98132da98976d8591c412e737", - "sha256:c73a7975d77f15f7f68dacfb2bca3d3f479f158313642e8ea9058eea06637931", - "sha256:d15007f857d6995db15195217afdbddfcd203dfaa0ba6878a2f580eaf810ecd6", - "sha256:d76061ae5cab49b83a8cf3feacefc2053fac672728802ac137dd8c4123397677", - "sha256:e8e4fbbb7e7634f263c5b0150a629342cc19b47c5eba8d1cd4363ab3455ab576", - "sha256:e9459f40244bb02b2f14f6af0cd0732791d72232bbb0dc4bab57ef88e75f6935", - "sha256:edb1f041a9146dcf02cd7df7187db46ab524b9af2515f392f337c7cbbf5b52cd" + "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", + "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", + "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", + "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", + "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", + "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", + "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", + "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", + "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", + "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", + "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", + "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", + "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", + "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", + "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", + "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", + "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", + "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", + "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", + "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", + "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", + "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", + "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", + "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", + "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", + "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", + "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", + "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", + "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", + "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", + "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", + "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", + "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", + "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" ], - "markers": "python_version >= '3.7'", - "version": "==1.20.2" + "index": "pypi", + "version": "==1.19.5" }, "oauth2": { "hashes": [ @@ -612,13 +695,14 @@ "hashes": [ "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==0.46" }, "oletools": { "hashes": [ "sha256:8481cd60352399e15e9290ac57862a65952e9c83e3526ba833991a5c78f5cca1" ], + "index": "pypi", "version": "==0.56" }, "opencv-python": { @@ -654,25 +738,33 @@ }, "pandas": { "hashes": [ - "sha256:09761bf5f8c741d47d4b8b9073288de1be39bbfccc281d70b889ade12b2aad29", - "sha256:0f27fd1adfa256388dc34895ca5437eaf254832223812afd817a6f73127f969c", - "sha256:43e00770552595c2250d8d712ec8b6e08ca73089ac823122344f023efa4abea3", - "sha256:46fc671c542a8392a4f4c13edc8527e3a10f6cb62912d856f82248feb747f06e", - "sha256:475b7772b6e18a93a43ea83517932deff33954a10d4fbae18d0c1aba4182310f", - "sha256:4d821b9b911fc1b7d428978d04ace33f0af32bb7549525c8a7b08444bce46b74", - "sha256:5e3c8c60541396110586bcbe6eccdc335a38e7de8c217060edaf4722260b158f", - "sha256:621c044a1b5e535cf7dcb3ab39fca6f867095c3ef223a524f18f60c7fee028ea", - "sha256:72ffcea00ae8ffcdbdefff800284311e155fbb5ed6758f1a6110fc1f8f8f0c1c", - "sha256:8a051e957c5206f722e83f295f95a2cf053e890f9a1fba0065780a8c2d045f5d", - "sha256:97b1954533b2a74c7e20d1342c4f01311d3203b48f2ebf651891e6a6eaf01104", - "sha256:9f5829e64507ad10e2561b60baf285c470f3c4454b007c860e77849b88865ae7", - "sha256:a93e34f10f67d81de706ce00bf8bb3798403cabce4ccb2de10c61b5ae8786ab5", - "sha256:d59842a5aa89ca03c2099312163ffdd06f56486050e641a45d926a072f04d994", - "sha256:dbb255975eb94143f2e6ec7dadda671d25147939047839cd6b8a4aff0379bb9b", - "sha256:df6f10b85aef7a5bb25259ad651ad1cc1d6bb09000595cab47e718cbac250b1d" + "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b", + "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f", + "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648", + "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb", + "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98", + "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a", + "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11", + "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a", + "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e", + "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae", + "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d", + "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9", + "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b", + "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788", + "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca", + "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5", + "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a", + "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814", + "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d", + "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086", + "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a", + "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb", + "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782", + "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b" ], "index": "pypi", - "version": "==1.2.3" + "version": "==1.1.5" }, "pandas-ods-reader": { "hashes": [ @@ -684,17 +776,19 @@ }, "passivetotal": { "hashes": [ - "sha256:aef48db0890cecbf1bff629ac37f0f1d64f1ca33d4e4ec33802277167051d4ff", - "sha256:c38f48bae146e726797eea06a8ee5bcac12aa2bac6909d560f8759686693d4bc" + "sha256:2944974d380a41f19f8fbb3d7cbfc8285479eb81092940b57bf0346d66706a05", + "sha256:a0cbea84b0bd6e9f3694ddeb447472b3d6f09e28940a7a0388456b8cf6a8e478", + "sha256:e35bf2cbccb385795a67d66f180d14ce9136cf1611b1c3da8a1055a1aced6264" ], "index": "pypi", - "version": "==2.1.0" + "version": "==1.0.31" }, "pcodedmp": { "hashes": [ "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955", "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278" ], + "index": "pypi", "version": "==1.2.6" }, "pdftotext": { @@ -706,48 +800,48 @@ }, "pillow": { "hashes": [ - "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af", - "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1", - "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c", - "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55", - "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060", - "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e", - "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8", - "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e", - "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0", - "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328", - "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238", - "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733", - "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03", - "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06", - "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71", - "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b", - "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6", - "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910", - "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce", - "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28", - "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d", - "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb", - "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6", - "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09", - "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be", - "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0", - "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44", - "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1", - "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341", - "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34", - "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2", - "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a", - "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5" + "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6", + "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded", + "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865", + "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174", + "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032", + "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a", + "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e", + "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378", + "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17", + "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c", + "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913", + "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7", + "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0", + "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820", + "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba", + "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2", + "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b", + "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9", + "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234", + "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d", + "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5", + "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206", + "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9", + "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8", + "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59", + "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d", + "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7", + "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a", + "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0", + "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b", + "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d", + "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae" ], "index": "pypi", - "version": "==8.1.2" + "version": "==8.1.0" }, "progressbar2": { "hashes": [ "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" ], + "index": "pypi", "version": "==3.53.1" }, "psutil": { @@ -781,13 +875,13 @@ "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==5.8.0" }, "pybgpranking": { "editable": true, "git": "https://github.com/D4-project/BGP-Ranking.git/", - "ref": "68de39f6c5196f796055c1ac34504054d688aa59", + "ref": "fd9c0e03af9b61d4bf0b67ac73c7208a55178a54", "subdirectory": "client" }, "pycparser": { @@ -795,85 +889,100 @@ "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.20" }, "pycryptodome": { "hashes": [ - "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", - "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", - "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", - "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", - "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", - "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", - "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", - "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", - "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", - "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", - "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", - "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", - "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", - "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", - "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", - "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", - "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", - "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", - "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", - "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", - "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", - "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", - "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", - "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", - "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", - "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", - "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", - "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", - "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", - "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" + "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", + "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", + "sha256:21ef416aa52802d22b9c11598d4e5352285bd9d6b5d868cde3e6bf2b22b4ebfb", + "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", + "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", + "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", + "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", + "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", + "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", + "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", + "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", + "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", + "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", + "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", + "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", + "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", + "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", + "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", + "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", + "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", + "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", + "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", + "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", + "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", + "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", + "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", + "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", + "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", + "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", + "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", + "sha256:b17b0ad9faee14d6318f965d58d323b0b37247e1e0c9c40c23504c00f4af881e", + "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", + "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", + "sha256:b830fae2a46536ee830599c3c4af114f5228f31e54adac370767616a701a99dc", + "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", + "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", + "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", + "sha256:f381036287c25d9809a08224ce4d012b7b7d50b6ada3ddbc3bc6f1f659365120", + "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.10.1" + "index": "pypi", + "version": "==3.9.9" }, "pycryptodomex": { "hashes": [ - "sha256:00a584ee52bf5e27d540129ca9bf7c4a7e7447f24ff4a220faa1304ad0c09bcd", - "sha256:04265a7a84ae002001249bd1de2823bcf46832bd4b58f6965567cb8a07cf4f00", - "sha256:0bd35af6a18b724c689e56f2dbbdd8e409288be71952d271ba3d9614b31d188c", - "sha256:20c45a30f3389148f94edb77f3b216c677a277942f62a2b81a1cc0b6b2dde7fc", - "sha256:2959304d1ce31ab303d9fb5db2b294814278b35154d9b30bf7facc52d6088d0a", - "sha256:36dab7f506948056ceba2d57c1ade74e898401960de697cefc02f3519bd26c1b", - "sha256:37ec1b407ec032c7a0c1fdd2da12813f560bad38ae61ad9c7ce3c0573b3e5e30", - "sha256:3b8eb85b3cc7f083d87978c264d10ff9de3b4bfc46f1c6fdc2792e7d7ebc87bb", - "sha256:3dfce70c4e425607ae87b8eae67c9c7dbba59a33b62d70f79417aef0bc5c735b", - "sha256:418f51c61eab52d9920f4ef468d22c89dab1be5ac796f71cf3802f6a6e667df0", - "sha256:4195604f75cdc1db9bccdb9e44d783add3c817319c30aaff011670c9ed167690", - "sha256:4344ab16faf6c2d9df2b6772995623698fb2d5f114dace4ab2ff335550cf71d5", - "sha256:541cd3e3e252fb19a7b48f420b798b53483302b7fe4d9954c947605d0a263d62", - "sha256:564063e3782474c92cbb333effd06e6eb718471783c6e67f28c63f0fc3ac7b23", - "sha256:72f44b5be46faef2a1bf2a85902511b31f4dd7b01ce0c3978e92edb2cc812a82", - "sha256:8a98e02cbf8f624add45deff444539bf26345b479fc04fa0937b23cd84078d91", - "sha256:940db96449d7b2ebb2c7bf190be1514f3d67914bd37e54e8d30a182bd375a1a9", - "sha256:961333e7ee896651f02d4692242aa36b787b8e8e0baa2256717b2b9d55ae0a3c", - "sha256:9f713ffb4e27b5575bd917c70bbc3f7b348241a351015dbbc514c01b7061ff7e", - "sha256:a6584ae58001d17bb4dc0faa8a426919c2c028ef4d90ceb4191802ca6edb8204", - "sha256:c2b680987f418858e89dbb4f09c8c919ece62811780a27051ace72b2f69fb1be", - "sha256:d8fae5ba3d34c868ae43614e0bd6fb61114b2687ac3255798791ce075d95aece", - "sha256:dbd2c361db939a4252589baa94da4404d45e3fc70da1a31e541644cdf354336e", - "sha256:e090a8609e2095aa86978559b140cf8968af99ee54b8791b29ff804838f29f10", - "sha256:e4a1245e7b846e88ba63e7543483bda61b9acbaee61eadbead5a1ce479d94740", - "sha256:ec9901d19cadb80d9235ee41cc58983f18660314a0eb3fc7b11b0522ac3b6c4a", - "sha256:f2abeb4c4ce7584912f4d637b2c57f23720d35dd2892bfeb1b2c84b6fb7a8c88", - "sha256:f3bb267df679f70a9f40f17d62d22fe12e8b75e490f41807e7560de4d3e6bf9f", - "sha256:f933ecf4cb736c7af60a6a533db2bf569717f2318b265f92907acff1db43bc34", - "sha256:fc9c55dc1ed57db76595f2d19a479fc1c3a1be2c9da8de798a93d286c5f65f38" + "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", + "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", + "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", + "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", + "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", + "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", + "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", + "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", + "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", + "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", + "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", + "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", + "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", + "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", + "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", + "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", + "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", + "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", + "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", + "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", + "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", + "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", + "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", + "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", + "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", + "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", + "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", + "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", + "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", + "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", + "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", + "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", + "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", + "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", + "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.10.1" + "index": "pypi", + "version": "==3.9.9" }, "pydeep": { "hashes": [ "sha256:22866eb422d1d5907f8076ee792da65caecb172425d27576274e2a8eacf6afc1" ], + "index": "pypi", "version": "==0.4" }, "pydnstrails": { @@ -889,6 +998,14 @@ "index": "pypi", "version": "==1.1" }, + "pyfaup": { + "hashes": [ + "sha256:5648bc3ebd80239aec927aedfc218c3a6ff36de636cc53822bfeb70b0869b1e7", + "sha256:75f96f7da86ffb5402d3fcc2dbf98a511e792cf9100c159e34cdba8996ddc7f9" + ], + "index": "pypi", + "version": "==1.2" + }, "pygeoip": { "hashes": [ "sha256:1938b9dac7b00d77f94d040b9465ea52c938f3fcdcd318b5537994f3c16aef96", @@ -900,12 +1017,12 @@ "pyintel471": { "editable": true, "git": "https://github.com/MISP/PyIntel471.git", - "ref": "917272fafa8e12102329faca52173e90c5256968" + "ref": "0df8d51f1c1425de66714b3a5a45edb69b8cc2fc" }, "pyipasnhistory": { "editable": true, "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "1f020c44c440988899a6798903fd6941e06f8930", + "ref": "fc5e48608afc113e101ca6421bf693b7b9753f9e", "subdirectory": "client" }, "pymisp": { @@ -916,11 +1033,11 @@ "pdfexport" ], "hashes": [ - "sha256:44f373f0ef0850f75520dcf8decd2119ef73a9feb5d8dea1711375074ddf7c3e", - "sha256:d6a804e9caef8e4383a8f2a720addf8063b0a78d924fab55020a84270f4e48c7" + "sha256:439389a5377a9128018e9e4cc8e7ed9efa45a5efc4e77afbb55310ec7935d197", + "sha256:eed98c96b41a5e13ad1147f331ccb66e4fd9284df87528da5c99d759e29309d8" ], "index": "pypi", - "version": "==2.4.140" + "version": "==2.4.137.1" }, "pyonyphe": { "editable": true, @@ -932,6 +1049,7 @@ "sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51", "sha256:818ae18e06922c066f777a33f1fca45786d85edfe71cd043de6379337a7f274b" ], + "index": "pypi", "version": "==20.0.1" }, "pyparsing": { @@ -939,7 +1057,7 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.4.7" }, "pypdns": { @@ -961,7 +1079,7 @@ "hashes": [ "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" ], - "markers": "python_version >= '3.5'", + "index": "pypi", "version": "==0.17.3" }, "pytesseract": { @@ -975,6 +1093,7 @@ "hashes": [ "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" ], + "index": "pypi", "version": "==1.2.2" }, "python-dateutil": { @@ -982,7 +1101,7 @@ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.8.1" }, "python-docx": { @@ -994,17 +1113,19 @@ }, "python-engineio": { "hashes": [ - "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", - "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" + "sha256:33f7a214be5db35c867e97027bfe63676cb003d82aa17a607612b25ba5d84e5b", + "sha256:9f34afa4170f5ba6e3d9ff158752ccf8fbb2145f16554b2f0fc84646675be99a" ], - "version": "==3.14.2" + "index": "pypi", + "version": "==4.0.0" }, "python-magic": { "hashes": [ - "sha256:8551e804c09a3398790bd9e392acb26554ae2609f29c72abb0b9dee9a5571eae", - "sha256:ca884349f2c92ce830e3f498c5b7c7051fe2942c3ee4332f65213b8ebff15a62" + "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", + "sha256:b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce" ], - "version": "==0.4.22" + "index": "pypi", + "version": "==0.4.18" }, "python-pptx": { "hashes": [ @@ -1018,23 +1139,26 @@ "client" ], "hashes": [ - "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", - "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" + "sha256:870f8b00a63ef7c9a1f85fd70028624867bf246115e82625f28ef79def8847bb", + "sha256:f53fd0d5bd9f75a70492062f4ae6195ab5d34d67a29024d740f25e468392893e" ], - "version": "==4.6.1" + "index": "pypi", + "version": "==5.0.4" }, "python-utils": { "hashes": [ - "sha256:18fbc1a1df9a9061e3059a48ebe5c8a66b654d688b0e3ecca8b339a7f168f208", - "sha256:352d5b1febeebf9b3cdb9f3c87a3b26ef22d3c9e274a8ec1e7048ecd2fac4349" + "sha256:10e155d88b706b25ede773354ea782eee6d494294651228469c916eb20f7ee1c", + "sha256:2643aec3bfcd1062accafb915aa624b81a2b0f6dad9d0c1021debead4a35cda7" ], - "version": "==2.5.6" + "index": "pypi", + "version": "==2.5.2" }, "pytz": { "hashes": [ "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" ], + "index": "pypi", "version": "==2019.3" }, "pyyaml": { @@ -1069,7 +1193,7 @@ "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "index": "pypi", "version": "==5.4.1" }, "pyzbar": { @@ -1086,7 +1210,7 @@ "sha256:80d3acd52e9c9291d88f3d7ae36f30ade38e4639941c198c62285018667dc777", "sha256:dd4cc0d222e207e3b25570f5214411625cc117b7f463d2d51e22d669c7880992" ], - "markers": "python_version >= '3.5'", + "index": "pypi", "version": "==0.3.4" }, "rdflib": { @@ -1094,6 +1218,7 @@ "sha256:78149dd49d385efec3b3adfbd61c87afaf1281c30d3fcaf1b323b34f603fb155", "sha256:88208ea971a87886d60ae2b1a4b2cdc263527af0454c422118d43fe64b357877" ], + "index": "pypi", "version": "==5.0.0" }, "redis": { @@ -1101,43 +1226,54 @@ "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "index": "pypi", "version": "==3.5.3" }, "reportlab": { "hashes": [ - "sha256:13ac281c8d5c904089022377bd9646c910deae63e7342dd9552088d330d73e89", - "sha256:14f38792176e41642f9ea7a83678df156d8abb3a90bbe396425a200614eed03d", - "sha256:15aeb8f8bdad5fa666d18a7d229bc7eb8f4e5a1dc8423931b3e690b6ce5021bc", - "sha256:1db86072b0ec3e5f9c5ab2980c61658ae3acee86e204b0d4c48112bc5cffd2f5", - "sha256:202109018f40d620812cf30dc300ea73385aed305d1de63c42229cb881821ffb", - "sha256:30e82ec00c566c4d8bfdcca0b93131749cc51ea0884395054d2afedf266f3f29", - "sha256:374252d118719e7b9b1bd0e5ce3f7083b5aaaeb1a9422983aa63b116621d34ae", - "sha256:3c1be70cf168ed29a449a009d7cad6dcc3e45d129f7ddb07b3854b8cee8d125b", - "sha256:45fe94e90c6b48c4ae877339b777fcc4f822795c1d4c7a0d6cffaf24987199b1", - "sha256:536f1ebf951cd48623974ba160c95e7c7219d4aa5664cdae17dffa2f19cf1cf3", - "sha256:54827fa29843b15834e5bc618508f245f3addee7bf980eebacfebb74f150e611", - "sha256:55c903f8aea4fbfca26f9f821c77c576c9791ce487ddfa3ffa1f2c44c5af79e2", - "sha256:63fba51babad0047def4ffaa41d0065248ca39d680e98dc9e3010de5425539b4", - "sha256:6fc3f01e9005ac53d639eafe22b3852937e42161d74a7d0681bc83f48cff1b30", - "sha256:6ff269ea41daa5cfd6124b13da1481fc40db2539fa82107dd9675f6670d95c25", - "sha256:7711fcdb0c1edfb48dcffd7e73430e9b5ceba0816a37fd269a327cd13088bcaf", - "sha256:7d4a59975a743eddc15895014d738bb38cbdecdd2496f651fb05779486bcb536", - "sha256:879e1123d49e0df76c478cccdacd4a9f4a2b4b445beec3d72a05f8b3775daa84", - "sha256:aa1ec9557c0d9dbe3eceb6581220aa1d77c404b8ff3decb40eae0bf075512142", - "sha256:ad0d3f657addd9c4215faf2699eafd54e89e404e35d696dda9dbe3c126132900", - "sha256:b784685141fe3fc26d8f703b21f89073a0ce46a800d06b7d58f2ceb481a65644", - "sha256:bd0870c840d47a6639df17c54f0c5676a06ab6798bb92ed8ef9b983c0326c2d0", - "sha256:bdb0781d1d4d1ed0745f5f22c06ed60760865511e65046432d145f55fd908f60", - "sha256:ce04f4bf9d15895bbfee6d53eb168cffd9fcedc625f0fcb5c343d809d0b37271", - "sha256:cf76145a89bb0ebf562c3252ce4d254547fe59daeb80ce2076d89867e9c03735", - "sha256:e8ebb34f30a11ac4196ae83d0b4f1f87bbe326c0f8a6eb4b768e622ec7f017f5", - "sha256:ed4b80c24a4e5e91927aa95901cce3f6fef7551e94a72ac5a2fa22740708cbff", - "sha256:f8a8f8b62cc150f71310e444ded4e32e7136c75aced6738877c3328e84338c94", - "sha256:fdf604246a5318157a581a483ceb0aab858582b478b24016768fdaff1c190f50" + "sha256:009fa61710647cdc62eb373345248d8ebb93583a058990f7c4f9be46d90aa5b1", + "sha256:04a08d284da86882ec3a41a7c719833362ef891b09ee8e2fbb47cee352aa684a", + "sha256:07bff6742fba612da8d1b1f783c436338c6fdc6962828159827d5ca7d2b67935", + "sha256:09fb11ab1500e679fc1b01199d2fed24435499856e75043a9ac0d31dd48fd881", + "sha256:18a876449c9000c391dd3415ebc8454cd7bb9e488977b894886a2d7d018f16cd", + "sha256:18eec161411026dde49767bee4e5e8eeb8014879554811a62581dc7433628d5b", + "sha256:19353aead39fc115a4d6c598d6fb9fa26da7e69160a0443ebb49b02903e704e8", + "sha256:1b85c20e89c22ae902ca973df2afdd2d64d27dc4ffd2b29ebad8c805a213756b", + "sha256:1da3d7a35f918cee905facfa94bd00ae6091cadc06dca1b0b31b69ae02d41d1d", + "sha256:33f3cfdc492575f8af3225701301a7e62fc478358729820c9e0091aff5831378", + "sha256:3b0026c1129147befd4e5a8cf25da8dea1096fce371e7b2412e36d7254019c06", + "sha256:3d7713dddaa8081ed709a1fa2456a43f6a74b0f07d605da8441fd53fef334f69", + "sha256:3e2b4d69763103b9dc9b54c0952dc3cee05cedd06e28c0987fad7f84705b12c0", + "sha256:4ca5233a19a5ceca23546290f43addec2345789c7d65bb32f8b2668aa148351f", + "sha256:5214a289cf01ebbd65e49bae83709671dd9edb601891cf0ae8abf85f3c0b392f", + "sha256:52f8237654acbc78ea2fa6fb4a6a06e5b023b6da93f7889adfe2deba09473fad", + "sha256:5ed00894e0f8281c0b7c0494b4d3067c641fd90c8e5cf933089ec4cc9a48e491", + "sha256:6191961533d49c9d860964d42bada4d7ac3bb28502d984feb8034093f2012fa8", + "sha256:6f3ad2b1afe99c436563cd436d8693d4a12e2c4bd45f70c7705759ff7837fe53", + "sha256:739b743b7ca1ba4b4d64c321de6fccb49b562d0507ea06c817d9cc4faed5cd22", + "sha256:792efba0c0c6e4ee94f6dc95f305451733ee9230a1c7d51cb8e5301a549e0dfb", + "sha256:79d63ca40231ca3860859b39a92daa5219035ba9553da89a5e1b218550744121", + "sha256:83b28104edd58ad65748d2d0e60e0d97e3b91b3e90b4573ea6fe60de6811972c", + "sha256:85650446538cd2f606ca234634142a7ccd74cb6db7cfec250f76a4242e0f2431", + "sha256:9da445cb79e3f740756924c053edc952cde11a65ff5af8acfda3c0a1317136ef", + "sha256:9fabd5fbd24f5971085ffe53150d663f158f7d3050b25c95736e29ebf676d454", + "sha256:a0c377bc45e73c3f15f55d7de69fab270d174749d5b454ab0de502b15430ec2a", + "sha256:a1d3f7022a920d4a5e165d264581f1862e1c1b877ceeabb96fe98cec98125ae5", + "sha256:a315edef5c5610b0c75790142f49487e89ea34397fc247ae8aa890fe6d6dd057", + "sha256:a755cca2dcf023130b03bb671670301a992157d5c3151d838c0b68ef89894536", + "sha256:b1b20208ecdfffd7ca027955c4fe8972b28b30a4b3b80cf25099a08d3b20ed7c", + "sha256:b26d6f416891cef93411d6d478a25db275766081a5fb66368248293ef459f3be", + "sha256:b4ba4c30af7044ee987e61c88a5ffb76031ca0c53666bc85d823b7de55ddbc75", + "sha256:b71faf3b6e4d7058e1af1b8afedaf39a962db4a219affc8177009d8244ec10d4", + "sha256:cfa854bea525f8c913cb77e2bda724d94b965a0eb3bcfc4a645a9baa29bb86e2", + "sha256:dd9687359e466086b9f6fe6d8069034017f8b6ca3080944fae5709767ca6814e", + "sha256:de0c675fc2998a7eaa929c356ba49c84f53a892e9ab25e8ee7d8ebbbdcb2ac16", + "sha256:e2b4e33fea2ce9d3a14ea39191b169e41eb2ac995274f54ac8fd27519974bce8", + "sha256:f3d4a1a273dc141e03b72a553c11bc14dd7a27ec7654a071edcf83eb04f004bc", + "sha256:ff547cf4c1de7e104cad1a378431ff81efcb03e90e40871ee686107da5b91442" ], "index": "pypi", - "version": "==3.5.66" + "version": "==3.5.59" }, "requests": { "extras": [ @@ -1155,6 +1291,7 @@ "sha256:813023269686045f8e01e2289cc1e7e9ae5ab22ddd1e2849a9093ab3ab7270eb", "sha256:81e13559baee64677a7d73b85498a5a8f0639e204517b5d05ff378e44a57831a" ], + "index": "pypi", "version": "==0.5.2" }, "rtfde": { @@ -1162,29 +1299,30 @@ "sha256:18386e4f060cee12a2a8035b0acf0cc99689f5dff1bf347bab7e92351860a21d", "sha256:b86b5d734950fe8745a5b89133f50554252dbd67c6d1b9265e23ee140e7ea8a2" ], + "index": "pypi", "version": "==0.0.2" }, "shodan": { "hashes": [ - "sha256:7e2bddbc1b60bf620042d0010f4b762a80b43111dbea9c041d72d4325e260c23" + "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" ], "index": "pypi", - "version": "==1.25.0" + "version": "==1.24.0" }, "sigmatools": { "hashes": [ - "sha256:0c30884589dc4b3fd30ae7f4e335a0d1dc284ddf0998983c4736176bc9087447", - "sha256:841136694829069c92a21b6b9d6d9cef4bd53b4d25e50d35da863a2e5601f71d" + "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", + "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" ], "index": "pypi", - "version": "==0.19.1" + "version": "==0.18.1" }, "six": { "hashes": [ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==1.15.0" }, "socialscan": { @@ -1199,15 +1337,16 @@ "hashes": [ "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" ], + "index": "pypi", "version": "==0.5.7.4" }, "soupsieve": { "hashes": [ - "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc", - "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b" + "sha256:4bb21a6ee4707bf43b61230e80740e71bfe56e55d1f1f50924b087bb2975c851", + "sha256:6dc52924dc0bc710a5d16794e6b3480b2c7c08b07729505feab2b2c16661ff6e" ], - "markers": "python_version >= '3'", - "version": "==2.2.1" + "index": "pypi", + "version": "==2.1" }, "sparqlwrapper": { "hashes": [ @@ -1230,10 +1369,11 @@ }, "tabulate": { "hashes": [ - "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", - "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" + "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", + "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" ], - "version": "==0.8.9" + "index": "pypi", + "version": "==0.8.7" }, "tornado": { "hashes": [ @@ -1279,16 +1419,16 @@ "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" ], - "markers": "python_version >= '3.5'", + "index": "pypi", "version": "==6.1" }, "tqdm": { "hashes": [ - "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7", - "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33" + "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a", + "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.59.0" + "index": "pypi", + "version": "==4.56.0" }, "trustar": { "hashes": [ @@ -1303,7 +1443,7 @@ "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" ], - "markers": "python_version < '3.8'", + "index": "pypi", "version": "==3.7.4.3" }, "tzlocal": { @@ -1311,12 +1451,14 @@ "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4" ], + "index": "pypi", "version": "==2.1" }, "unicodecsv": { "hashes": [ "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" ], + "index": "pypi", "version": "==0.14.1" }, "url-normalize": { @@ -1324,7 +1466,7 @@ "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2", "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "index": "pypi", "version": "==1.4.3" }, "urlarchiver": { @@ -1336,11 +1478,11 @@ }, "urllib3": { "hashes": [ - "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", - "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.4" + "index": "pypi", + "version": "==1.26.2" }, "uwhois": { "editable": true, @@ -1352,44 +1494,47 @@ "hashes": [ "sha256:f0ac832212e3ee2e9b10e156f19b106888cf1429c291fbc5297aae87685014ae" ], + "index": "pypi", "version": "==0.14.0" }, "vt-graph-api": { "hashes": [ - "sha256:3b13ce6e460aadd9917e883a8fc205f491ba09107963c9ebd3f5df4a8b3e67b7", - "sha256:d766285b06b854da04dd26cdb0ad3613fa17a935c00825b3dc04ea2b307381a6" + "sha256:200c4f5a7c0a518502e890c4f4508a5ea042af9407d2889ef16a17ef11b7d25c", + "sha256:223c1cf32d69e10b5d3e178ec315589c7dfa7d43ccff6630a11ed5c5f498715c" ], "index": "pypi", - "version": "==1.1.2" + "version": "==1.0.1" }, "vulners": { "hashes": [ - "sha256:146305b799a991961dde97735d00605b9c335c15e0168050a5953ff9d69bdc28", - "sha256:d09b360549550abe669d70f962f60c696eae889c4ad7d5e8b9b47e71f1b81fb3", - "sha256:fa5a85d969734a58d9bedfba459002c272c6414196ab54207a05ef394af064c3" + "sha256:065aa63d5626d51cf45260bc6cc3a6ea682977689c036a6daba695905e881ba7", + "sha256:0e1356040f456f87841ccfe9f2f6ed36a256370606d530679d5d9993fe91386c", + "sha256:ab9ed8fbf1d3c80f0d066b13ac9d70d11dc9cb0b77568be65396117a4245e916" ], "index": "pypi", - "version": "==1.5.11" + "version": "==1.5.9" }, "wand": { "hashes": [ - "sha256:540a2da5fb3ada1f0abf6968e0fa01ca7de6cd517f3be5c52d03a4fc8d54d75e", - "sha256:b752b2c2ee6ce04210da4b2e591013a4d9303fbed3fcbd3fb450930777dcb117" + "sha256:473af4a143d2c87693cc43dbd6f64d91ccfd7f0506cf4da53851cd34f114b39d", + "sha256:ec981b4f07f7582fc564aba8b57763a549392e9ef8b6a338e9da54cdd229cf95" ], "index": "pypi", - "version": "==0.6.6" + "version": "==0.6.5" }, "websocket-client": { "hashes": [ - "sha256:44b5df8f08c74c3d82d28100fdc81f4536809ce98a17f0757557813275fbb663", - "sha256:63509b41d158ae5b7f67eb4ad20fecbb4eee99434e73e140354dc3ff8e09716f" + "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549", + "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010" ], - "version": "==0.58.0" + "index": "pypi", + "version": "==0.57.0" }, "wrapt": { "hashes": [ "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" ], + "index": "pypi", "version": "==1.12.1" }, "xlrd": { @@ -1402,10 +1547,11 @@ }, "xlsxwriter": { "hashes": [ - "sha256:2b7e22b1268c2ed85d73e5629097c9a63357f2429667ada9863cd05ff8ee33aa", - "sha256:30ebc19d0f201fafa34a6c622050ed2a268ac8dee24037a61605caa801dc8af5" + "sha256:9b1ade2d1ba5d9b40a6d1de1d55ded4394ab8002718092ae80a08532c2add2e6", + "sha256:b807c2d3e379bf6a925f472955beef3e07495c1bac708640696876e68675b49b" ], - "version": "==1.3.8" + "index": "pypi", + "version": "==1.3.7" }, "yara-python": { "hashes": [ @@ -1464,8 +1610,16 @@ "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" ], - "markers": "python_version >= '3.6'", + "index": "pypi", "version": "==1.6.3" + }, + "zipp": { + "hashes": [ + "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", + "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + ], + "markers": "python_version >= '3.6'", + "version": "==3.4.1" } }, "develop": { @@ -1474,7 +1628,7 @@ "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==20.3.0" }, "certifi": { @@ -1482,15 +1636,16 @@ "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" ], + "index": "pypi", "version": "==2020.12.5" }, "chardet": { "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" + "index": "pypi", + "version": "==3.0.4" }, "codecov": { "hashes": [ @@ -1572,9 +1727,17 @@ "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.10" }, + "importlib-metadata": { + "hashes": [ + "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a", + "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe" + ], + "markers": "python_version < '3.8'", + "version": "==3.10.0" + }, "iniconfig": { "hashes": [ "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", @@ -1643,16 +1806,16 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "index": "pypi", "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9", - "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839" + "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634", + "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc" ], "index": "pypi", - "version": "==6.2.2" + "version": "==6.2.3" }, "requests": { "extras": [ @@ -1673,13 +1836,30 @@ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, + "typing-extensions": { + "hashes": [ + "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", + "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", + "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" + ], + "index": "pypi", + "version": "==3.7.4.3" + }, "urllib3": { "hashes": [ - "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", - "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" + "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", + "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.4" + "index": "pypi", + "version": "==1.26.2" + }, + "zipp": { + "hashes": [ + "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", + "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + ], + "markers": "python_version >= '3.6'", + "version": "==3.4.1" } } } From b27dd2acfc3bf2f5b83b2821dcbd074e7f16f28c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 08:57:59 +0200 Subject: [PATCH 177/476] chg: [travis] get rid of pipenv --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4d551b2..78fd6fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,8 @@ before_install: install: - sudo apt-get install libzbar0 libzbar-dev libpoppler-cpp-dev tesseract-ocr libfuzzy-dev libcaca-dev liblua5.3-dev - pip install pipenv - - pipenv install --dev + - pip install -r REQUIREMENTS + # - pipenv install --dev # install gtcaca - git clone git://github.com/stricaud/gtcaca.git - mkdir -p gtcaca/build From 961672412b9e492b46c75531a40712c7e487674c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 09:09:24 +0200 Subject: [PATCH 178/476] chg: [pipenv] removed --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 78fd6fc..13c7a13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,20 +38,20 @@ install: - popd script: - - pipenv run coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -l 127.0.0.1 & + - coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -l 127.0.0.1 & - pid=$! - sleep 5 - - pipenv run nosetests --with-coverage --cover-package=misp_modules + - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid - pushd ~/ - - pipenv run coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -s -l 127.0.0.1 & + - coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -s -l 127.0.0.1 & - pid=$! - popd - sleep 5 - - pipenv run nosetests --with-coverage --cover-package=misp_modules + - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid - - pipenv run flake8 --ignore=E501,W503,E226 misp_modules + - flake8 --ignore=E501,W503,E226 misp_modules after_success: - - pipenv run coverage combine .coverage* - - pipenv run codecov + - coverage combine .coverage* + - codecov From ba33b2ebbac80cb246cf01f159ea78060238ac8c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 10:13:25 +0200 Subject: [PATCH 179/476] chg: [coverage] install --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 13c7a13..39d6316 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,6 +38,7 @@ install: - popd script: + - pip install coverage - coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -l 127.0.0.1 & - pid=$! - sleep 5 From a912239757ff126a38c07c3bcef46201a6caee76 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 11:11:01 +0200 Subject: [PATCH 180/476] chg: [test expansion] IPv4 address of CIRCL updated --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 3d3d024..a6ef56d 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -144,7 +144,7 @@ class TestExpansions(unittest.TestCase): module_name = "circl_passivessl" query = {"module": module_name, "attribute": {"type": "ip-dst", - "value": "149.13.33.14", + "value": "185.194.93.14", "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d"}, "config": {}} if module_name in self.configs: From 834732c4134e98d14fcad6ee9486187ae3e6d7f2 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 11:12:56 +0200 Subject: [PATCH 181/476] chg: [travis] missing dep --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 39d6316..dca4f44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ script: - sleep 5 - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid + - pip install flake8 - flake8 --ignore=E501,W503,E226 misp_modules after_success: From 07d23fbb9b93cfcf1b88a622a0a4aa17a1ba8411 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 14:26:38 +0200 Subject: [PATCH 182/476] fix: [test] dns module --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index a6ef56d..d0229e7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -199,7 +199,7 @@ class TestExpansions(unittest.TestCase): def test_dns(self): query = {"module": "dns", "hostname": "www.circl.lu", "config": {"nameserver": "8.8.8.8"}} response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), '149.13.33.14') + self.assertEqual(self.get_values(response), '185.194.93.14') def test_docx(self): filename = 'test.docx' From 296d2d63c96ec4987cb4d99d45c75dc9eaa1c591 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 12 Apr 2021 14:28:30 +0200 Subject: [PATCH 183/476] chg: [requirements] openpyxl added --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 4beaebf..ba5b5e5 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -73,6 +73,7 @@ oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' oletools==0.56 opencv-python==4.5.1.48 +openpyxl pandas-ods-reader==0.0.7 pandas==1.1.5 passivetotal==1.0.31 From 577d0de5007140572132497998341254299cc618 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 14 Apr 2021 14:45:55 +0200 Subject: [PATCH 184/476] chg: [farsight] make PEP happy --- misp_modules/modules/expansion/farsight_passivedns.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index e6e1e25..de18735 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -171,10 +171,12 @@ def parse_input(attribute, config): to_query = lookup_ip if 'ip-' in attribute_type else lookup_name return to_query, (lookup_args, attribute['value'], flex) + def parse_timestamp(str_date): datetime_date = datetime.strptime(str_date, '%Y-%m-%dT%H:%M:%S.%f%z') return str(int(datetime_date.timestamp())) + def add_flex_queries(flex): if not flex: return False From fd00fe6cb21f9bbad2e1f0018258922af3b0f11c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 14 Apr 2021 14:51:28 +0200 Subject: [PATCH 185/476] chg: [passivetotal] new test IP address --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index d0229e7..85943b2 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -348,7 +348,7 @@ class TestExpansions(unittest.TestCase): def test_passivetotal(self): module_name = "passivetotal" - query = {"module": module_name, "ip-src": "149.13.33.14", "config": {}} + query = {"module": module_name, "ip-src": "185.194.93.14", "config": {}} if module_name in self.configs: query["config"] = self.configs[module_name] response = self.misp_modules_post(query) From d522b25b20999b0cefb56829318424b4378ea27e Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 14 Apr 2021 14:55:35 +0200 Subject: [PATCH 186/476] chg: [test] fixing IP addresses --- tests/test_expansions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 85943b2..f3bc53a 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -459,8 +459,8 @@ class TestExpansions(unittest.TestCase): def test_threatcrowd(self): query_types = ('domain', 'ip-src', 'md5', 'whois-registrant-email') - query_values = ('circl.lu', '149.13.33.4', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') - results = ('149.13.33.14', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') + query_values = ('circl.lu', '185.194.93.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') + results = ('185.194.93.14', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') for query_type, query_value, result in zip(query_types, query_values, results): query = {"module": "threatcrowd", query_type: query_value} response = self.misp_modules_post(query) From 729feaa3f20f437649b15d504966d7c4160cfa21 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 14 Apr 2021 16:52:55 +0200 Subject: [PATCH 187/476] fix: [hibp] Fixed config handling to avoir KeyError exceptions --- misp_modules/modules/expansion/hibp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/hibp.py b/misp_modules/modules/expansion/hibp.py index 66911f2..b2d1c16 100644 --- a/misp_modules/modules/expansion/hibp.py +++ b/misp_modules/modules/expansion/hibp.py @@ -23,7 +23,7 @@ def handler(q=False): misperrors['error'] = "Unsupported attributes type" return misperrors - if (request['config'].get('api_key') is None): + if request.get('config') is None or request['config'].get('api_key') is None: misperrors['error'] = 'Have I Been Pwned authentication is incomplete (no API key)' return misperrors else: @@ -37,7 +37,7 @@ def handler(q=False): elif r.status_code == 404: return {'results': [{'types': mispattributes['output'], 'values': 'OK (Not Found)'}]} else: - misperrors['error'] = 'haveibeenpwned.com API not accessible (HTTP ' + str(r.status_code) + ')' + misperrors['error'] = f'haveibeenpwned.com API not accessible (HTTP {str(r.status_code)})' return misperrors['error'] From 6dda2d08c07a9a7eeb395bd8600cd57257b86109 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 14 Apr 2021 19:57:33 +0200 Subject: [PATCH 188/476] fix: [tests] Fixed hibp test which requires an API key --- tests/test_expansions.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index f3bc53a..62ca7f1 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -228,12 +228,16 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), 'Farsight DNSDB apikey is missing') def test_haveibeenpwned(self): + module_name = 'hibp' query = {"module": "hibp", "email-src": "info@circl.lu"} response = self.misp_modules_post(query) - to_check = self.get_values(response) - if to_check == "haveibeenpwned.com API not accessible (HTTP 401)": - self.skipTest(f"haveibeenpwned blocks travis IPs: {response}") - self.assertEqual(to_check, 'OK (Not Found)', response) + if module_name in self.configs: + to_check = self.get_values(response) + if to_check == "haveibeenpwned.com API not accessible (HTTP 401)": + self.skipTest(f"haveibeenpwned blocks travis IPs: {response}") + self.assertEqual(to_check, 'OK (Not Found)', response) + else: + self.assertEqual(self.get_errors(response), 'Have I Been Pwned authentication is incomplete (no API key)') def test_greynoise(self): module_name = 'greynoise' From 513e8eabc667cf36d8744ad117e40a5eca5ac80d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 15 Apr 2021 10:33:36 +0200 Subject: [PATCH 189/476] chg: [tests] historical records in threatcrowd --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 62ca7f1..2781c38 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -464,7 +464,7 @@ class TestExpansions(unittest.TestCase): def test_threatcrowd(self): query_types = ('domain', 'ip-src', 'md5', 'whois-registrant-email') query_values = ('circl.lu', '185.194.93.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') - results = ('185.194.93.14', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') + results = ('149.13.33.4', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') for query_type, query_value, result in zip(query_types, query_values, results): query = {"module": "threatcrowd", query_type: query_value} response = self.misp_modules_post(query) From 53e386bf46d8d4626ff60700419be3efd071d90d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 15 Apr 2021 16:08:56 +0200 Subject: [PATCH 190/476] fix: [tests] Fixed tests for some modules waiting for standard MISP Attribute format as input --- tests/test_expansions.py | 71 +++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 62ca7f1..06c80bc 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -430,7 +430,14 @@ class TestExpansions(unittest.TestCase): def test_shodan(self): module_name = "shodan" - query = {"module": module_name, "ip-src": "149.13.33.14"} + query = { + "module": module_name, + "attribute": { + "uuid": "a21aae0c-7426-4762-9b79-854314d69059", + "type": "ip-src", + "value": "149.13.33.14" + } + } if module_name in self.configs: query['config'] = self.configs[module_name] response = self.misp_modules_post(query) @@ -513,16 +520,33 @@ class TestExpansions(unittest.TestCase): def test_virustotal_public(self): module_name = "virustotal_public" - query_types = ('domain', 'ip-src', 'sha256', 'url') - query_values = ('circl.lu', '149.13.33.14', - 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', - 'http://194.169.88.56:49151/.i') + attributes = ( + { + "uuid": "ffea0594-355a-42fe-9b98-fad28fd248b3", + "type": "domain", + "value": "circl.lu" + }, + { + "uuid": "1f3f0f2d-5143-4b05-a0f1-8ac82f51a979", + "type": "ip-src", + "value": "149.13.33.14" + }, + { + "uuid": "b4be6652-f4ff-4515-ae63-3f016df37e8f", + "type": "sha256", + "value": "a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3" + }, + { + "uuid": "6cead544-b683-48cb-b19b-a2561ffa1f51", + "type": "url", + "value": "http://194.169.88.56:49151/.i" + } + ) results = ('whois', 'asn', 'file', 'virustotal-report') if module_name in self.configs: - for query_type, query_value, result in zip(query_types, query_values, results): + for attribute, result in zip(attributes, results): query = {"module": module_name, - "attribute": {"type": query_type, - "value": query_value}, + "attribute": attribute, "config": self.configs[module_name]} response = self.misp_modules_post(query) try: @@ -538,16 +562,33 @@ class TestExpansions(unittest.TestCase): def test_virustotal(self): module_name = "virustotal" - query_types = ('domain', 'ip-src', 'sha256', 'url') - query_values = ('circl.lu', '149.13.33.14', - 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', - 'http://194.169.88.56:49151/.i') + attributes = ( + { + "uuid": "ffea0594-355a-42fe-9b98-fad28fd248b3", + "type": "domain", + "value": "circl.lu" + }, + { + "uuid": "1f3f0f2d-5143-4b05-a0f1-8ac82f51a979", + "type": "ip-src", + "value": "149.13.33.14" + }, + { + "uuid": "b4be6652-f4ff-4515-ae63-3f016df37e8f", + "type": "sha256", + "value": "a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3" + }, + { + "uuid": "6cead544-b683-48cb-b19b-a2561ffa1f51", + "type": "url", + "value": "http://194.169.88.56:49151/.i" + } + ) results = ('domain-ip', 'asn', 'virustotal-report', 'virustotal-report') if module_name in self.configs: - for query_type, query_value, result in zip(query_types, query_values, results): + for attribute, result in zip(attributes, results): query = {"module": module_name, - "attribute": {"type": query_type, - "value": query_value}, + "attribute": attribute, "config": self.configs[module_name]} response = self.misp_modules_post(query) try: From 611bb6fa9ebc32b5bd6e18507c5ea21cb7a91b4d Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 15 Apr 2021 16:12:00 +0200 Subject: [PATCH 191/476] fix: [ocr_enrich] Fixed tesseract input format - It looks like the `image_to_string` method now assumes RGB format and the `imdecode` method seems to give BGR format, so we convert the image array before --- misp_modules/modules/expansion/ocr_enrich.py | 24 ++++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/ocr_enrich.py b/misp_modules/modules/expansion/ocr_enrich.py index cd6baca..4c24cb8 100644 --- a/misp_modules/modules/expansion/ocr_enrich.py +++ b/misp_modules/modules/expansion/ocr_enrich.py @@ -6,14 +6,21 @@ import pytesseract misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment'], - 'output': ['freetext', 'text']} -moduleinfo = {'version': '0.1', 'author': 'Sascha Rommelfangen', + 'output': ['freetext']} +moduleinfo = {'version': '0.2', 'author': 'Sascha Rommelfangen', 'description': 'OCR decoder', 'module-type': ['expansion']} moduleconfig = [] +def filter_decoded(decoded): + for line in decoded.split('\n'): + decoded_line = line.strip('\t\x0b\x0c\r ') + if decoded_line: + yield decoded_line + + def handler(q=False): if q is False: return False @@ -31,9 +38,16 @@ def handler(q=False): image = img_array image = cv2.imdecode(img_array, cv2.IMREAD_COLOR) try: - decoded = pytesseract.image_to_string(image) - return {'results': [{'types': ['freetext'], 'values': decoded, 'comment': "OCR from file " + filename}, - {'types': ['text'], 'values': decoded, 'comment': "ORC from file " + filename}]} + decoded = pytesseract.image_to_string(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) + return { + 'results':[ + { + 'types': ['freetext'], + 'values': list(filter_decoded(decoded)), + 'comment': f"OCR from file {filename}" + } + ] + } except Exception as e: print(e) err = "Couldn't analyze file type. Only images are supported right now." From 97d4950f823ac62264decd874057dad922aa7853 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 15 Apr 2021 16:39:28 +0200 Subject: [PATCH 192/476] fix: [tests] Fixed variable names that have been changed with the latest commit --- tests/test_expansions.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 5a9a990..88f974d 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -554,9 +554,10 @@ class TestExpansions(unittest.TestCase): except Exception: self.assertEqual(self.get_errors(response), "VirusTotal request rate limit exceeded.") else: - query = {"module": module_name, - "attribute": {"type": query_types[0], - "value": query_values[0]}} + query = { + "module": module_name, + "attribute": attributes[0] + } response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), "A VirusTotal api key is required for this module.") @@ -596,9 +597,10 @@ class TestExpansions(unittest.TestCase): except Exception: self.assertEqual(self.get_errors(response), "VirusTotal request rate limit exceeded.") else: - query = {"module": module_name, - "attribute": {"type": query_types[0], - "value": query_values[0]}} + query = { + "module": module_name, + "attribute": attributes[0] + } response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), "A VirusTotal api key is required for this module.") From 300cdc7a4c78bf128fc031856c44255562ebaecd Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 15 Apr 2021 16:41:15 +0200 Subject: [PATCH 193/476] fix: [ocr_enrich] Making Pep8 happy --- misp_modules/modules/expansion/ocr_enrich.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/ocr_enrich.py b/misp_modules/modules/expansion/ocr_enrich.py index 4c24cb8..ff0a70c 100644 --- a/misp_modules/modules/expansion/ocr_enrich.py +++ b/misp_modules/modules/expansion/ocr_enrich.py @@ -40,7 +40,7 @@ def handler(q=False): try: decoded = pytesseract.image_to_string(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) return { - 'results':[ + 'results': [ { 'types': ['freetext'], 'values': list(filter_decoded(decoded)), From 576dcca6719d88d141c8606eaee317e2291cdecb Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 16 Apr 2021 16:45:38 +0200 Subject: [PATCH 194/476] chg: [rbl] Small changes on the rbl list and the results handling --- misp_modules/modules/expansion/rbl.py | 126 +++++++++++++------------- 1 file changed, 62 insertions(+), 64 deletions(-) diff --git a/misp_modules/modules/expansion/rbl.py b/misp_modules/modules/expansion/rbl.py index 4d7bba5..46a3b4e 100644 --- a/misp_modules/modules/expansion/rbl.py +++ b/misp_modules/modules/expansion/rbl.py @@ -12,69 +12,69 @@ except ImportError: misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst'], 'output': ['text']} -moduleinfo = {'version': '0.1', 'author': 'Christian Studer', +moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'Check an IPv4 address against known RBLs.', 'module-type': ['expansion', 'hover']} moduleconfig = [] -rbls = { - 'spam.spamrats.com': 'http://www.spamrats.com', - 'spamguard.leadmon.net': 'http://www.leadmon.net/SpamGuard/', - 'rbl-plus.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'web.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'ix.dnsbl.manitu.net': 'http://www.dnsbl.manitu.net', - 'virus.rbl.jp': 'http://www.rbl.jp', - 'dul.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'bogons.cymru.com': 'http://www.team-cymru.org/Services/Bogons/', - 'psbl.surriel.com': 'http://psbl.surriel.com', - 'misc.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'httpbl.abuse.ch': 'http://dnsbl.abuse.ch', - 'combined.njabl.org': 'http://combined.njabl.org', - 'smtp.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'korea.services.net': 'http://korea.services.net', - 'drone.abuse.ch': 'http://dnsbl.abuse.ch', - 'rbl.efnetrbl.org': 'http://rbl.efnetrbl.org', - 'cbl.anti-spam.org.cn': 'http://www.anti-spam.org.cn/?Locale=en_US', - 'b.barracudacentral.org': 'http://www.barracudacentral.org/rbl/removal-request', - 'bl.spamcannibal.org': 'http://www.spamcannibal.org', - 'xbl.spamhaus.org': 'http://www.spamhaus.org/xbl/', - 'zen.spamhaus.org': 'http://www.spamhaus.org/zen/', - 'rbl.suresupport.com': 'http://suresupport.com/postmaster', - 'db.wpbl.info': 'http://www.wpbl.info', - 'sbl.spamhaus.org': 'http://www.spamhaus.org/sbl/', - 'http.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'csi.cloudmark.com': 'http://www.cloudmark.com/en/products/cloudmark-sender-intelligence/index', - 'rbl.interserver.net': 'http://rbl.interserver.net', - 'ubl.unsubscore.com': 'http://www.lashback.com/blacklist/', - 'dnsbl.sorbs.net': 'http://www.sorbs.net', - 'virbl.bit.nl': 'http://virbl.bit.nl', - 'pbl.spamhaus.org': 'http://www.spamhaus.org/pbl/', - 'socks.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'short.rbl.jp': 'http://www.rbl.jp', - 'dnsbl.dronebl.org': 'http://www.dronebl.org', - 'blackholes.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'truncate.gbudb.net': 'http://www.gbudb.com/truncate/index.jsp', - 'dyna.spamrats.com': 'http://www.spamrats.com', - 'spamrbl.imp.ch': 'http://antispam.imp.ch', - 'spam.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'wormrbl.imp.ch': 'http://antispam.imp.ch', - 'query.senderbase.org': 'http://www.senderbase.org/about', - 'opm.tornevall.org': 'http://dnsbl.tornevall.org', - 'netblock.pedantic.org': 'http://pedantic.org', - 'access.redhawk.org': 'http://www.redhawk.org/index.php?option=com_wrapper&Itemid=33', - 'cdl.anti-spam.org.cn': 'http://www.anti-spam.org.cn/?Locale=en_US', - 'multi.surbl.org': 'http://www.surbl.org', - 'noptr.spamrats.com': 'http://www.spamrats.com', - 'dnsbl.inps.de': 'http://dnsbl.inps.de/index.cgi?lang=en', - 'bl.spamcop.net': 'http://bl.spamcop.net', - 'cbl.abuseat.org': 'http://cbl.abuseat.org', - 'dsn.rfc-ignorant.org': 'http://www.rfc-ignorant.org/policy-dsn.php', - 'zombie.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'dnsbl.njabl.org': 'http://dnsbl.njabl.org', - 'relays.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'rbl.spamlab.com': 'http://tools.appriver.com/index.aspx?tool=rbl', - 'all.bl.blocklist.de': 'http://www.blocklist.de/en/rbldns.html' -} +rbls = ( + "spam.spamrats.com", + "spamguard.leadmon.net", + "rbl-plus.mail-abuse.org", + "web.dnsbl.sorbs.net", + "ix.dnsbl.manitu.net", + "virus.rbl.jp", + "dul.dnsbl.sorbs.net", + "bogons.cymru.com", + "psbl.surriel.com", + "misc.dnsbl.sorbs.net", + "httpbl.abuse.ch", + "combined.njabl.org", + "smtp.dnsbl.sorbs.net", + "korea.services.net", + "drone.abuse.ch", + "rbl.efnetrbl.org", + "cbl.anti-spam.org.cn", + "b.barracudacentral.org", + "bl.spamcannibal.org", + "xbl.spamhaus.org", + "zen.spamhaus.org", + "rbl.suresupport.com", + "db.wpbl.info", + "sbl.spamhaus.org", + "http.dnsbl.sorbs.net", + "csi.cloudmark.com", + "rbl.interserver.net", + "ubl.unsubscore.com", + "dnsbl.sorbs.net", + "virbl.bit.nl", + "pbl.spamhaus.org", + "socks.dnsbl.sorbs.net", + "short.rbl.jp", + "dnsbl.dronebl.org", + "blackholes.mail-abuse.org", + "truncate.gbudb.net", + "dyna.spamrats.com", + "spamrbl.imp.ch", + "spam.dnsbl.sorbs.net", + "wormrbl.imp.ch", + "query.senderbase.org", + "opm.tornevall.org", + "netblock.pedantic.org", + "access.redhawk.org", + "cdl.anti-spam.org.cn", + "multi.surbl.org", + "noptr.spamrats.com", + "dnsbl.inps.de", + "bl.spamcop.net", + "cbl.abuseat.org", + "dsn.rfc-ignorant.org", + "zombie.dnsbl.sorbs.net", + "dnsbl.njabl.org", + "relays.mail-abuse.org", + "rbl.spamlab.com", + "all.bl.blocklist.de" +) def handler(q=False): @@ -88,18 +88,16 @@ def handler(q=False): else: misperrors['error'] = "Unsupported attributes type" return misperrors - listeds = [] - infos = [] + infos = {} ipRev = '.'.join(ip.split('.')[::-1]) for rbl in rbls: query = '{}.{}'.format(ipRev, rbl) try: txt = resolver.query(query, 'TXT') - listeds.append(query) - infos.append([str(t) for t in txt]) + infos[query] = [str(t) for t in txt] except Exception: continue - result = "\n".join([f"{listed}: {' - '.join(info)}" for listed, info in zip(listeds, infos)]) + result = "\n".join([f"{rbl}: {' - '.join(info)}" for rbl, info in infos.items()]) if not result: return {'error': 'No data found by querying known RBLs'} return {'results': [{'types': mispattributes.get('output'), 'values': result}]} From 4a20045787cabeda03a0b7938013e6f9c13459bd Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 16 Apr 2021 16:47:20 +0200 Subject: [PATCH 195/476] fix: [tests] Fixed btc_steroids test assertion --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 88f974d..6017465 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -115,7 +115,7 @@ class TestExpansions(unittest.TestCase): self.assertTrue(self.get_values(response).startswith('\n\nAddress:\t1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA\nBalance:\t0.0002126800 BTC (+0.0007482500 BTC / -0.0005355700 BTC)')) except Exception: - self.assertEqual(self.get_values(response), 'Not a valid BTC address, or Balance has changed') + self.assertTrue(self.get_values(response).startswith('Not a valid BTC address')) def test_btc_scam_check(self): query = {"module": "btc_scam_check", "btc": "1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA"} From dbff9b3aa89c3352e922d88af17398fe36e2c8d1 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 16 Apr 2021 22:00:27 +0200 Subject: [PATCH 196/476] chg: [rbl] Added a timeout parameter to change the resolver timeout & lifetime if needed --- misp_modules/modules/expansion/rbl.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/rbl.py b/misp_modules/modules/expansion/rbl.py index 46a3b4e..d3f661e 100644 --- a/misp_modules/modules/expansion/rbl.py +++ b/misp_modules/modules/expansion/rbl.py @@ -3,9 +3,6 @@ import sys try: import dns.resolver - resolver = dns.resolver.Resolver() - resolver.timeout = 0.2 - resolver.lifetime = 0.2 except ImportError: print("dnspython3 is missing, use 'pip install dnspython3' to install it.") sys.exit(0) @@ -15,7 +12,7 @@ mispattributes = {'input': ['ip-src', 'ip-dst'], 'output': ['text']} moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'Check an IPv4 address against known RBLs.', 'module-type': ['expansion', 'hover']} -moduleconfig = [] +moduleconfig = ['timeout'] rbls = ( "spam.spamrats.com", @@ -88,6 +85,13 @@ def handler(q=False): else: misperrors['error'] = "Unsupported attributes type" return misperrors + resolver = dns.resolver.Resolver() + try: + timeout = float(request['config']['timeout']) + except (KeyError, ValueError): + timeout = 0.4 + resolver.timeout = timeout + resolver.lifetime = timeout infos = {} ipRev = '.'.join(ip.split('.')[::-1]) for rbl in rbls: From 0b7bb587be2f17caeeb859152de4d5d1f270334f Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 16 Apr 2021 22:17:52 +0200 Subject: [PATCH 197/476] fix; [tests] Changes on assertion statements that should fix the passivetotal, rbl & shodan tests --- tests/test_expansions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 6017465..c5b5467 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -357,7 +357,7 @@ class TestExpansions(unittest.TestCase): query["config"] = self.configs[module_name] response = self.misp_modules_post(query) try: - self.assertEqual(self.get_values(response), 'circl.lu') + self.assertIn('www.circl.lu', response.json()['results'][0]['values']) except Exception: self.assertIn(self.get_errors(response), ('We hit an error, time to bail!', 'API quota exceeded.')) else: @@ -401,7 +401,7 @@ class TestExpansions(unittest.TestCase): query = {"module": "rbl", "ip-src": "8.8.8.8"} response = self.misp_modules_post(query) try: - self.assertTrue(self.get_values(response).startswith('8.8.8.8.query.senderbase.org')) + self.assertTrue(self.get_values(response).startswith('8.8.8.8.bl.spamcannibal.org')) except Exception: self.assertEqual(self.get_errors(response), "No data found by querying known RBLs") @@ -441,7 +441,7 @@ class TestExpansions(unittest.TestCase): if module_name in self.configs: query['config'] = self.configs[module_name] response = self.misp_modules_post(query) - self.assertIn("circl.lu", self.get_values(response)) + self.assertEqual(self.get_object(response), 'ip-api-address') else: response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Shodan authentication is missing') From a9f90d964c163be168b3a8907e01972f6a73c506 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Sun, 18 Apr 2021 18:11:37 +0200 Subject: [PATCH 198/476] fix: [tests] Back to the former ip address in the threatcrowd module test --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index c5b5467..928ffe7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -470,7 +470,7 @@ class TestExpansions(unittest.TestCase): def test_threatcrowd(self): query_types = ('domain', 'ip-src', 'md5', 'whois-registrant-email') - query_values = ('circl.lu', '185.194.93.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') + query_values = ('circl.lu', '149.13.33.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') results = ('149.13.33.4', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') for query_type, query_value, result in zip(query_types, query_values, results): query = {"module": "threatcrowd", query_type: query_value} From d5cf82f849b35fdd51b22d09fcec0f1b02e5939c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 08:07:22 +0200 Subject: [PATCH 199/476] chg: [test] skip some tests if running in the CI (API limitation or specific host issues) --- tests/test_expansions.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 2781c38..2674c64 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -8,6 +8,7 @@ from base64 import b64encode import json import os +LiveCI = True class TestExpansions(unittest.TestCase): @@ -460,8 +461,9 @@ class TestExpansions(unittest.TestCase): query = {"module": "stix2_pattern_syntax_validator", "stix2-pattern": "[ipv4-addr:value = '8.8.8.8']"} response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), 'Syntax valid') - def test_threatcrowd(self): + if LiveCI: + return True query_types = ('domain', 'ip-src', 'md5', 'whois-registrant-email') query_values = ('circl.lu', '185.194.93.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') results = ('149.13.33.4', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') @@ -471,6 +473,8 @@ class TestExpansions(unittest.TestCase): self.assertTrue(self.get_values(response), result) def test_threatminer(self): + if LiveCI: + return True query_types = ('domain', 'ip-src', 'md5') query_values = ('circl.lu', '149.13.33.4', 'b538dbc6160ef54f755a540e06dc27cd980fc4a12005e90b3627febb44a1a90f') results = ('149.13.33.14', 'f6ecb9d5c21defb1f622364a30cb8274f817a1a2', 'http://www.circl.lu/') @@ -606,6 +610,8 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), "An API authentication is required (key and password).") def test_xlsx(self): + if LiveCI: + return True filename = 'test.xlsx' with open(f'{self.dirname}/test_files/{filename}', 'rb') as f: encoded = b64encode(f.read()).decode() From 97a0f3a2c5b55a22d46a86a17a71d44d2e09f81a Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 08:30:39 +0200 Subject: [PATCH 200/476] chg: [tests] LiveCI set for RBL tests (network connectivity issues in the CI) --- tests/test_expansions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index d6b7b33..cfe5b56 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -399,6 +399,8 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), "Ransomcoindb API key is missing") def test_rbl(self): + if LiveCI: + return True query = {"module": "rbl", "ip-src": "8.8.8.8"} response = self.misp_modules_post(query) try: From 7e9f510066727da4f0ed50bc56232a4880ad9694 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 09:47:52 +0200 Subject: [PATCH 201/476] new: [ChangeLog] added --- ChangeLog.md | 4602 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4602 insertions(+) create mode 100644 ChangeLog.md diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..010d2a7 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,4602 @@ +# Changelog + + +## v2.4.141 (2021-04-19) + +### Changes + +* [tests] LiveCI set for RBL tests (network connectivity issues in the CI) [Alexandre Dulaunoy] + +* [rbl] Added a timeout parameter to change the resolver timeout & lifetime if needed. [chrisr3d] + +* [rbl] Small changes on the rbl list and the results handling. [chrisr3d] + +* [test] skip some tests if running in the CI (API limitation or specific host issues) [Alexandre Dulaunoy] + +* [tests] historical records in threatcrowd. [Alexandre Dulaunoy] + +* [test] fixing IP addresses. [Alexandre Dulaunoy] + +* [passivetotal] new test IP address. [Alexandre Dulaunoy] + +* [farsight] make PEP happy. [Alexandre Dulaunoy] + +* [requirements] openpyxl added. [Alexandre Dulaunoy] + +* [travis] missing dep. [Alexandre Dulaunoy] + +* [test expansion] IPv4 address of CIRCL updated. [Alexandre Dulaunoy] + +* [coverage] install. [Alexandre Dulaunoy] + +* [pipenv] removed. [Alexandre Dulaunoy] + +* [travis] get rid of pipenv. [Alexandre Dulaunoy] + +* [Pipfile.lock] updated. [Alexandre Dulaunoy] + +* [doc] fix index of mkdocs. [Alexandre Dulaunoy] + +* [documentation] updated. [Alexandre Dulaunoy] + +* [farsight_passivedns] Making first_time and last_time results human readable. [chrisr3d] + + - We get the datetime format instead of the raw + timestamp + +* Bump deps. [Raphaël Vinot] + +* [farsight_passivedns] Making first_time and last_time results human readable. [chrisr3d] + + - We get the datetime format instead of the raw + timestamp + +* [farsight_passivedns] Added input types for more flex queries. [chrisr3d] + + - Standard types still supported as before + - Name or ip lookup, with optional flex queries + - New attribute types added will only send flex + queries to the DNSDB API + +* [doc] fix #460 - rh install. [Alexandre Dulaunoy] + +* [requirements] fix 463. [Alexandre Dulaunoy] + +### Fix + +* [tests] Fixed btc_steroids test assertion. [chrisr3d] + +* [ocr_enrich] Making Pep8 happy. [chrisr3d] + +* [tests] Fixed variable names that have been changed with the latest commit. [chrisr3d] + +* [ocr_enrich] Fixed tesseract input format. [chrisr3d] + + - It looks like the `image_to_string` method now + assumes RGB format and the `imdecode` method + seems to give BGR format, so we convert the + image array before + +* [tests] Fixed tests for some modules waiting for standard MISP Attribute format as input. [chrisr3d] + +* [tests] Fixed hibp test which requires an API key. [chrisr3d] + +* [hibp] Fixed config handling to avoir KeyError exceptions. [chrisr3d] + +* [test] dns module. [Alexandre Dulaunoy] + +* [main] Disable duplicate JSON decoding. [Jakub Onderka] + +* [cve_advanced] Some CVEs are not in CWE format but in NVD-CWE-Other. [Alexandre Dulaunoy] + +* [farsight_passivedns] Fixed lookup_rdata_name results desclaration. [chrisr3d] + + - Getting generator as a list as it is already the + case for all the other results, so it avoids + issues to read the results by accidently looping + through the generator before it is actually + needed, which would lose the content of the + generator + - Also removed print that was accidently introduced + with the last commit + +* [farsight_passivedns] Excluding last_seen value for now, in order to get the available results. [chrisr3d] + + - With last_seen set we can easily get results + included in a certain time frame (between first + seen and last seen), but we do not get the + latest results. In order to get those ones, we + skip filtering on the time_last_before value + +* [farsight_passivedns] Fixed lookup_rdata_name results desclaration. [chrisr3d] + + - Getting generator as a list as it is already the + case for all the other results, so it avoids + issues to read the results by accidently looping + through the generator before it is actually + needed, which would lose the content of the + generator + - Also removed print that was accidently introduced + with the last commit + +* Making pep8 happy. [chrisr3d] + +* [farsight_passivedns] Fixed queries to the API. [chrisr3d] + + - Since flex queries input may be email addresses, + we nake sure we replace '@' by '.' in the flex + queries input. + - We also run the flex queries with the input as + is first, before runnning them as second time + with '.' characters escaped: '\\.' + +* Google.py module. [Jürgen Löhel] + + The search result does not include always 3 elements. It's better to + enumerate here. + The googleapi fails sometimes. Retry it 3 times. + +* Google.py module. [Jürgen Löhel] + + Corrects import for gh.com/abenassi/Google-Search-API. + +* Consider mail body as UTF-8 encoded. [Jakub Onderka] + +### Other + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Fix; [tests] Changes on assertion statements that should fix the passivetotal, rbl & shodan tests. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Merge pull request #435 from JakubOnderka/remove-duplicate-decoding. [Alexandre Dulaunoy] + + fix: [main] Remove duplicate JSON decoding + +* Add: [farsight_passivedns] Adding first_seen & last_seen (when available) in passivedns objects. [chrisr3d] + + - The object_relation `time_first` is added as the + `first_seen` value of the object + - Same with `time_last` -> `last_seen` + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge pull request #484 from GreyNoise-Intelligence/main. [Alexandre Dulaunoy] + + Update to GreyNoise expansion module + +* Update community api to released ver. [Brad Chiappetta] + +* Fix ver info. [Brad Chiappetta] + +* Updates for greynoise community api. [Brad Chiappetta] + +* Merge pull request #485 from jgwilson42/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [James Wilson] + + Ensure that the clone of misp-modules is owned by www-data + +* Merge pull request #482 from MISP/new_features. [Alexandre Dulaunoy] + + Farsight_passivedns module updated with new input types compatible with flex queries + +* Add: [farsight_passivedns] New lookup argument based on the first_seen & last_seen fields. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge pull request #481 from cocaman/main. [Alexandre Dulaunoy] + + Adding ThreatFox enrichment module + +* Adding additional tags. [Corsin Camichel] + +* First version of ThreatFox enrichment module. [Corsin Camichel] + +* Merge pull request #480 from cocaman/patch-1. [Alexandre Dulaunoy] + + updating "hibp" for API version 3 + +* Updating "hibp" for API version 3. [Corsin Camichel] + +* Merge pull request #477 from jloehel/fix/google-module. [Alexandre Dulaunoy] + + Fix/google module + +* Merge pull request #476 from digihash/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Kevin Holvoet] + + Added fix based on https://github.com/MISP/MISP/issues/4045 + +* Merge pull request #475 from adammchugh/patch-3. [Alexandre Dulaunoy] + + Fixed the censys version + +* Fixed the censys version. [adammchugh] + + Unsure how I managed to get the version so wrong, but I have updated it to the current version and confirmed as working. + +* Merge pull request #474 from JakubOnderka/patch-4. [Alexandre Dulaunoy] + + fix: Consider mail body as UTF-8 encoded + +* Merge pull request #473 from adammchugh/patch-2. [Alexandre Dulaunoy] + + Change to pandas version requirement to address pip install failure + +* Included missing dependencies for censys and pyfaup. [adammchugh] + + Added censys dependency + Added pyfaup dependency + +* Change to pandas version requirement to address pip install failure. [adammchugh] + + Updated pandas version to 1.1.5 to allow pip install as defined at https://github.com/MISP/misp-modules to complete successfully. + +* Merge pull request #470 from adammchugh/patch-1. [Alexandre Dulaunoy] + + Update assemblyline_submit.py - Add verify SSL option + +* Update assemblyline_submit.py. [adammchugh] + +* Update assemblyline_query.py. [adammchugh] + +* Update assemblyline_submit.py. [adammchugh] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Update README long hyphen is not standard ASCII hyphen. [Alexandre Dulaunoy] + + Fix #464 + + +## v2.4.137 (2021-01-25) + +### Changes + +* Bump deps. [Raphaël Vinot] + +* Bump requirements. [Raphaël Vinot] + +* [pipenv] Enable email extras for PyMISP. [Jakub Onderka] + +### Fix + +* Bump PyMISP dep to latest. [Raphaël Vinot] + +* Use PyMISP from PyPi. [Raphaël Vinot] + +* Use pymisp from pypi. [Raphaël Vinot] + +* [pipenv] Missing clamd. [Jakub Onderka] + +### Other + +* Merge pull request #466 from NoDataFound/main. [Alexandre Dulaunoy] + + Corrected VMray rest API import + +* Corrected VMray rest API import. [Cory Kennedy] + + When loading misp-modules, the VMray module ```modules/expansion/vmray_submit.py ``` incorrectly imports the library. VMray's documentation and examples here: https://pypi.org/project/vmray-rest-api/#history also reflect this change as the correct import. + +* Merge pull request #457 from trustar/main. [Alexandre Dulaunoy] + + added more explicit error messages for indicators that return no enri… + +* Added more explicit error messages for indicators that return no enrichment data. [Jesse Hedden] + +* Merge pull request #452 from kuselfu/main. [Alexandre Dulaunoy] + + update vmray_import, add vmray_summary_json_import + +* Fix imports and unused variables. [Jens Thom] + +* Resolve merge conflict. [Jens Thom] + +* Merge remote-tracking branch 'upstream/main' into main. [Jens Thom] + +* Merge pull request #451 from JakubOnderka/versions-update. [Alexandre Dulaunoy] + + fix: [pipenv] Missing clamd + +* Merge pull request #450 from JakubOnderka/versions-update. [Alexandre Dulaunoy] + + chg: [pipenv] Enable email extras for PyMISP + +* Merge pull request #448 from HacknowledgeCH/export_defender_endpoint. [Alexandre Dulaunoy] + + Export defender endpoint + +* Fixed error reported by LGTM analysis. [milkmix] + +* Added documentation. [milkmix] + +* Added missing quotes. [milkmix] + +* Added URL support. [milkmix] + +* Typo in python src name. [milkmix] + +* Initial work on Defender for Endpoint export module. [milkmix] + +* * add parser for report version v1 and v2 * add summary JSON import module. [Jens Thom] + + +## v2.4.134 (2020-11-18) + +### New + +* [expansion] Added html_to_markdown module. [mokaddem] + + It fetches the HTML from the provided URL, performs a bit of DOM + clean-up then convert it into markdown + +* [clamav] Module for malware scan by ClamAV. [Jakub Onderka] + +* [passivedns, passivessl] Add support for ip-src|port and ip-dst|port. [Jakub Onderka] + +* Censys Expansion module. [Golbark] + +* Expansion module to query MALWAREbazaar API with some hash attribute. [chrisr3d] + +### Changes + +* [pipenv] Updated lock Pipfile again. [chrisr3d] + +* [pipenv] Updated lock Pipfile. [chrisr3d] + +* Added socialscan library in Pipfile and updated the lock file. [chrisr3d] + +* [documentation] Cleaner documentation directories & auto-generation. [chrisr3d] + + Including: + - A move of the previous `doc` and `docs` directories to `documentation` + - `documentation` is now the default directory + - The documentation previously under `doc` is now in `documentation/website` + - The mkdocs previously under `docs` is now in `documentation/mkdocs` + - All single JSON documentation files have been JQed + - Some small improvements to list fields displaying + +* [pipenv] Updated Pipfile. [chrisr3d] + +* [documentation] Updated the farsight-passivedns documentation. [chrisr3d] + +* [cpe] Added default limit to the results. [chrisr3d] + + - Results returned by CVE-search are sorted by + cvss score and limited in number to avoid + potential massive amount of data retuned back + to MISP. + - Users can overwrite the default limit with the + configuration already present as optional, and + can also set the limit to 0 to get the full list + of results + +* [farsight_passivedns] Now using the dnsdb2 python library. [chrisr3d] + + - Also updated the results parsing to check in + each returned result for every field if they are + included, to avoid key errors if any field is + missing + +* [cpe] Support of the new CVE-Search API. [chrisr3d] + +* [doc] Updated the farsight_passivedns module documentation. [chrisr3d] + +* [farsight_passivedns] More context added to the results. [chrisr3d] + + - References between the passive-dns objects and + the initial attribute + - Comment on object attributes mentioning whether + the results come from an rrset or an rdata + lookup + +* [farsight_passivedns] Rework of the module to return MISP objects. [chrisr3d] + + - All the results are parsed as passive-dns MISP + objects + - More love to give to the parsing to add + references between the passive-dns objects and + the input attribute, depending on the type of + the query (rrset or rdata), or the rrtype + (to be determined) + +* [cpe] Changed CVE-Search API default url. [chrisr3d] + +* [clamav] Add reference to original attribute. [Jakub Onderka] + +* [clamav] TCP port connection must be an integer. [Alexandre Dulaunoy] + +* Bump deps. [Raphaël Vinot] + +* Updated expansion modules documentation. [chrisr3d] + + - Added documentation for the missing modules + - Renamed some of the documentation files to match + with the module names and avoid issues within + the documentation file (README.md) with the link + of the miss-spelled module names + +* Updated the bgpranking expansion module test. [chrisr3d] + +* Updated documentation for the recently updated bgpranking module. [chrisr3d] + +* Updated the bgpranking expansion module to return MISP objects. [chrisr3d] + + - The module no longer returns freetext, since the + result returned to the freetext import as text + only allowed MISP to parse the same AS number as + the input attribute. + - The new result returned with the updated module + is an asn object describing more precisely the + AS number, and its ranking for a given day + +* Turned the Shodan expansion module into a misp_standard format module. [chrisr3d] + + - As expected with the misp_standard modules, the + input is a full attribute and the module is able + to return attributes and objects + - There was a lot of data that was parsed as regkey + attributes by the freetext import, the module now + parses properly the different field of the result + of the query returned by Shodan + +* Updated documentation about the greynoise module. [chrisr3d] + +* Updated Greynoise tests following the latest changes on the expansion module. [chrisr3d] + +* Making use of the Greynoise v2 API. [chrisr3d] + +* Bump deps. [Raphaël Vinot] + +* [doc] Added details about faup. [Steve Clement] + +* [doc] in case btc expansion fails, give another hint at why it fails. [Steve Clement] + +* [travis] Added gtcaca and liblua to faup. [Steve Clement] + +* [travis] Added py3.8. [Steve Clement] + +* Bump dependencies. [Raphaël Vinot] + + Should fix https://github.com/MISP/MISP/issues/5739 + +* Quick ransomdncoin test just to make sure the module loads. [chrisr3d] + + - I do not have any api key right now, so the test + should just reach the error + +* Catching missing config issue. [chrisr3d] + +### Fix + +* [pipenv] Removed duplicated dnsdb2 entry that I missed while merging conflict. [chrisr3d] + +* Removed debugging print command. [chrisr3d] + +* [tests] Less specific assertion for the rbl module test. [chrisr3d] + +* [farsight_passivedns] Fixed pep8 backslash issue. [chrisr3d] + +* [farsight_passivedns] Fixed issue with variable name. [chrisr3d] + +* [documentation] Added missing cpe module documentation. [chrisr3d] + +* [cpe] Fixed typo in vulnerable-configuration object relation fields. [chrisr3d] + +* [farsight_passivedns] Fixed typo in the lookup fields. [chrisr3d] + +* [farsight_passivedns] Uncommented mandatory field that was commented for tests. [chrisr3d] + +* [tests] Small fixes on the expansion tests. [chrisr3d] + +* [dnsdb] Avoiding AttributeError with the sys library, probably depending on the python version. [chrisr3d] + +* [documentation] Updated links to the scripts, with the default branch no longer being master, but main. [chrisr3d] + +* Typo. [chrisr3d] + +* Updated Pipfile. [chrisr3d] + +* [cpe] Typos and variable name issues fixed + Making the module available in MISP. [chrisr3d] + +* [cve-advanced] Using the cpe and weakness attribute types. [chrisr3d] + +* [cve_advanced] Avoiding potential MISP object references issues. [chrisr3d] + + - Adding objects as dictionaries in an event may + cause issues in some cases. It is better to pass + the MISP object as is, as it is already a valid + object since the MISPObject class is used + +* [virustotal_public] Resolve key error when user enrich hostname. [chrisr3d] + + - Same as #424 + +* [virustotal] Resolve key error when user enrich hostname. [Jakub Onderka] + +* Typo in EMailObject. [Raphaël Vinot] + + Fix #427 + +* Making pep8 happy. [chrisr3d] + +* Fixed pep8. [chrisr3d] + +* Fixed pep8 + some copy paste issues introduced with the latest commits. [chrisr3d] + +* Avoid issues with the attribute value field name. [chrisr3d] + + - The module setup allows 'value1' as attribute + value field name, but we want to make sure that + users passing standard misp format with 'value' + instead, will not have issues, as well as + keeping the current setup + +* [virustotal] Subdomains is optional in VT response. [Jakub Onderka] + +* Fixed list of sigma backends. [chrisr3d] + +* Fixed validators dependency issues. [chrisr3d] + + - Possible rollback if we get issues with virustotal + +* Removed multiple spaces to comply with pep8. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Removed trustar_import module name in init to avoid validation issues. [chrisr3d] + + (until it is submitted via PR?) + +* [circl_passivessl] Return proper error for IPv6 addresses. [Jakub Onderka] + +* [circl_passivessl] Return not found error. [Jakub Onderka] + + If passivessl returns empty response, return Not found error instead of error in log + +* [circl_passivedns] Return not found error. [Jakub Onderka] + + If passivedns returns empty response, return Not found error instead of error in log + +* [pep] Comply to PEP E261. [Steve Clement] + +* [travis] gtcaca has no build directory. [Steve Clement] + +* [pip] pyfaup required. [Steve Clement] + +* [doc] corrected filenames for 2 docs. [Christophe Vandeplas] + +* Making pep8 happy. [chrisr3d] + +* Catching errors in the reponse of the query to URLhaus. [chrisr3d] + +* Making pep8 happy with indentation. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Removed unused import. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Making the module config available so the module works. [chrisr3d] + +* [VT] Disable SHA512 query for VT. [Jakub Onderka] + +### Other + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #429 from MISP/new_module. [Christian Studer] + + New module using socialscan to check the availability of an email address or username on some online platforms + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Add: Added documentation for the socialscan new module. [chrisr3d] + + - Also quick fix of the message for an invalid + result or response concerning the queried email + address or username + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Add: New module using socialscan library to check email addresses and usernames linked to accounts on online platforms. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #445 from chrisr3d/main. [Christian Studer] + + Added missing cpe module documentation + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Add: [farsight-passivedns] Optional feature to submit flex queries. [chrisr3d] + + - The rrset and rdata queries remain the same but + with the parameter `flex_queries`, users can + also get the results of the flex rrnames & flex + rdata regex queries about their domain, hostname + or ip address + - Results can thus include passive-dns objects + containing the `raw_rdata` object_relation added + with 0a3e948 + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'chrisr3d_patch' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #443 from trustar/main. [Alexandre Dulaunoy] + + fixed typo causing firstSeen and lastSeen to not be pulled from enric… + +* Fixed typo causing firstSeen and lastSeen to not be pulled from enrichment data. [Jesse Hedden] + +* Merge pull request #440 from MISP/chrisr3d_patch. [Alexandre Dulaunoy] + + Farsight passivedns module update + +* Merge pull request #437 from chrisr3d/main. [Alexandre Dulaunoy] + + New expansion module to get the vulnerabilities related to a CPE + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #436 from MISP/new-html-to-markdown. [Christian Studer] + + new: [expansion] Added html_to_markdown module + +* Add: Documentation for the html_to_markdown expansion module. [chrisr3d] + +* Add: Added documentation for the cpe module. [chrisr3d] + +* Add: First shot of an expansio module to query cve-search with a cpe to get the related vulnerabilities. [chrisr3d] + +* Merge pull request #432 from JakubOnderka/clamav. [Alexandre Dulaunoy] + + chg: [clamav] Add reference to original attribute + +* Merge pull request #431 from JakubOnderka/clamav. [Alexandre Dulaunoy] + + new: [clamav] Module for malware scan by ClamAV + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Raphaël Vinot] + +* Merge pull request #424 from JakubOnderka/vt-subdomains-fix. [Christian Studer] + + fix: [virustotal] Resolve key error when user enrich hostname + +* Merge pull request #426 from hildenjohannes/main. [Alexandre Dulaunoy] + + Recorded Future module: Add proxy support and User-Agent header + +* Add proxy support and User-Agent header. [johannesh] + +* Merge pull request #425 from elhoim/elhoim-patch-1. [Alexandre Dulaunoy] + + Disable correlation for detection-ratio attribute in virustotal.py + +* Disable correlation for detection-ratio in virustotal.py. [David André] + +* Merge pull request #422 from trustar/feat/EN-5047/MISP-manual-update. [Alexandre Dulaunoy] + + Feat/en 5047/misp manual update + +* Merge branch 'main' into feat/EN-5047/MISP-manual-update. [Jesse Hedden] + +* Merge pull request #420 from hildenjohannes/main. [Alexandre Dulaunoy] + + Fix typo error introduced in commit: 3b7a5c4dc2541f3b07baee69a7e8b969… + +* Fix typo error introduced in commit: 3b7a5c4dc2541f3b07baee69a7e8b9694a1627fc. [johannesh] + +* Merge pull request #417 from trustar/feat/EN-4664/trustar-misp. [Alexandre Dulaunoy] + + Feat/en 4664/trustar misp + +* Added description to readme. [Jesse Hedden] + +* Merge branch 'master' of github.com:trustar/misp-modules into feat/EN-4664/trustar-misp. [Jesse Hedden] + +* Removed obsoleted module name. [Jesse Hedden] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #416 from hildenjohannes/main. [Alexandre Dulaunoy] + + Add Recorded Future module documentation + +* Improve wording. [johannesh] + +* Add Recorded Future module documentation. [johannesh] + +* Add: Specific error message for misp_standard format expansion modules. [chrisr3d] + + - Checking if the input format is respected and + displaying an error message if it is not + +* Merge pull request #415 from hildenjohannes/main. [Alexandre Dulaunoy] + + Add Recorded Future expansion module + +* Add Recorded Future expansion module. [johannesh] + +* Added comments. [Jesse Hedden] + +* Added comments. [Jesse Hedden] + +* Added comments. [Jesse Hedden] + +* Added error checking. [Jesse Hedden] + +* Updating to include metadata and alter type of trustar link generated. [Jesse Hedden] + +* Merge pull request #1 from trustar/feat/EN-4664/trustar-misp. [Jesse Hedden] + + Feat/en 4664/trustar misp + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #411 from JakubOnderka/vt-subdomains-fix. [Alexandre Dulaunoy] + + fix: [virustotal] Subdomains is optional in VT response + +* Merge remote-tracking branch 'origin' into main. [chrisr3d] + +* Add: Trustar python library added to Pipfile. [chrisr3d] + +* Merge branch 'trustar-feat/EN-4664/trustar-misp' [chrisr3d] + +* Merge branch 'feat/EN-4664/trustar-misp' of https://github.com/trustar/misp-modules into trustar-feat/EN-4664/trustar-misp. [chrisr3d] + +* Removed obsolete file. [Jesse Hedden] + +* Corrected variable name. [Jesse Hedden] + +* Fixed indent. [Jesse Hedden] + +* Fixed incorrect attribute name. [Jesse Hedden] + +* Fixed metatag; convert summaries generator to list for error handling. [Jesse Hedden] + +* Added strip to remove potential whitespace. [Jesse Hedden] + +* Removed extra parameter. [Jesse Hedden] + +* Added try/except for TruSTAR API errors and additional comments. [Jesse Hedden] + +* Added comments and increased page size to max for get_indicator_summaries. [Jesse Hedden] + +* Uploaded TruSTAR logo. [Jesse Hedden] + +* Updated client metatag and version. [Jesse Hedden] + +* Added module documentation. [Jesse Hedden] + +* Added client metatag to trustar client. [Jesse Hedden] + +* Ready for code review. [Jesse Hedden] + +* WIP: initial push. [Jesse Hedden] + +* Initial commit. not a working product. need to create a class to manage the MISP event and TruStar client. [Jesse Hedden] + +* Merge pull request #381 from MISP/new_module. [Christian Studer] + + New module for MALWAREbazaar + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #407 from JakubOnderka/patch-3. [Alexandre Dulaunoy] + + fix: [circl_passivessl] Return proper error for IPv6 addresses + +* Merge pull request #406 from JakubOnderka/ip-port. [Alexandre Dulaunoy] + + new: [passivedns, passivessl] Add support for ip-src|port and ip-dst|port + +* Merge pull request #405 from JakubOnderka/patch-2. [Alexandre Dulaunoy] + + fix: [circl_passivedns] Return not found error + +* Merge pull request #402 from MISP/dependabot/pip/httplib2-0.18.0. [Alexandre Dulaunoy] + + build(deps): bump httplib2 from 0.17.0 to 0.18.0 + +* Build(deps): bump httplib2 from 0.17.0 to 0.18.0. [dependabot[bot]] + + Bumps [httplib2](https://github.com/httplib2/httplib2) from 0.17.0 to 0.18.0. + - [Release notes](https://github.com/httplib2/httplib2/releases) + - [Changelog](https://github.com/httplib2/httplib2/blob/master/CHANGELOG) + - [Commits](https://github.com/httplib2/httplib2/compare/v0.17.0...v0.18.0) + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #395 from SteveClement/master. [Steve Clement] + + chg: [deps] pyfaup seems to be required but not installed + +* Merge pull request #393 from vmray-labs/update-vmray-module. [Alexandre Dulaunoy] + + Update vmray_submit module + +* Update vmray_submit. [Matthias Meidinger] + + The submit module hat some smaller issues with the reanalyze flag. + The source for the enrichment object has been changed and the robustness + of user supplied config parsing improved. + +* Merge pull request #388 from Golbark/censys_expansion. [Christophe Vandeplas] + + new: usr: Censys Expansion module + +* Fix variable issue in the loop. [Golbark] + +* Adding support for more input types, including multi-types. [Golbark] + +* Add: Added documentation for the latest new modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #380 from JakubOnderka/patch-1. [Christian Studer] + + csvimport: Return error if input is not valid UTF-8 + +* Csvimport: Return error if input is not valid UTF-8. [Jakub Onderka] + +* Merge pull request #379 from cudeso/master. [Alexandre Dulaunoy] + + Cytomic Orion MISP Module + +* Documentation for Cytomic Orion. [Koen Van Impe] + +* Update __init__ [Koen Van Impe] + +* Make Travis (a little bit) happy. [Koen Van Impe] + +* Cytomic Orion MISP Module. [Koen Van Impe] + + An expansion module to enrich attributes in MISP and share indicators + of compromise with Cytomic Orion + +* Merge pull request #377 from 0xbennyv/master. [Alexandre Dulaunoy] + + Added SophosLabs Intelix as expansion module + +* Removed Unused Import. [bennyv] + +* Fixed handler error handling for missing config. [bennyv] + +* Fixed formatting in README.md. [bennyv] + +* Updated the README.md for SOPHOSLabs Intelix. [bennyv] + +* Initial Build of SOPHOSLabs Intelix Product. [bennyv] + +* Merge pull request #374 from M0un/projet-m2-oun-gindt. [Christian Studer] + + Rendu projet master2 sécurité par Mathilde OUN et Vincent GINDT // No… + +* Rendu projet master2 sécurité par Mathilde OUN et Vincent GINDT // Nouveau module misp de recherche google sur les urls. [Mathilde Oun et Vincent Gindt] + +* Merge pull request #373 from seanthegeek/patch-1. [Christian Studer] + + Create missing __init__.py for _ransomcoindb + +* Revert change inteded for other patch. [Sean Whalen] + +* Install cmake to build faup. [Sean Whalen] + +* Create __init__.py. [Sean Whalen] + +* Merge pull request #371 from GlennHD/master. [Christian Studer] + + Added GeoIP_City and GeoIP_ASN Database Modules + +* Update geoip_asn.py. [GlennHD] + +* Update geoip_city.py. [GlennHD] + +* Added geoip_asn and geoip_city to load. [GlennHD] + +* Added GeoIP_ASN Enrichment module. [GlennHD] + +* Added GeoIP_City Enrichment module. [GlennHD] + +* Added GeoIP City and GeoIP ASN Info. [GlennHD] + +* Merge pull request #370 from JakubOnderka/vt-query-sha512. [Alexandre Dulaunoy] + + fix: [VT] Disable SHA512 query for VT + +* Merge pull request #368 from andurin/lastline_verifyssl. [Christian Studer] + + Lastline verify_ssl option + +* Lastline verify_ssl option. [Hendrik] + + Helps people with on-prem boxes + + +## v2.4.121 (2020-02-06) + +### Fix + +* Making pep8 happy. [chrisr3d] + +* [tests] Fixed BGP raking module test. [chrisr3d] + +### Other + +* Merge pull request #367 from joesecurity/master. [Christian Studer] + + joe: (1) allow users to disable PE object import (2) set 'to_ids' to False + +* Joe: (1) allow users to disable PE object import (2) set 'to_ids' to False. [Georg Schölly] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #365 from ostefano/analysis. [Alexandre Dulaunoy] + + change: migrate to analysis API when submitting files to Lastline + +* Change: migrate to analysis API when submitting tasks to Lastline. [Stefano Ortolani] + +* Merge pull request #364 from cudeso/master. [Christian Studer] + + 2nd fix for VT Public module + +* 2nd fix for VT Public module. [Koen Van Impe] + +* Fix error message in Public VT module. [Koen Van Impe] + + +## v2.4.120 (2020-01-21) + +### New + +* Updated ipasn and added vt_graph documentation. [chrisr3d] + +* Enrichment module for querying APIVoid with domain attributes. [chrisr3d] + +### Changes + +* Making ipasn module return asn object(s) [chrisr3d] + + - Latest changes on the returned value as string + broke the freetext parser, because no asn number + could be parsed when we return the full json + blob as a freetext attribute + - Now returning asn object(s) with a reference to + the initial attribute + +* Bumped pipfile.lock with up-to-date libraries and new vt_graph_api library requirement. [chrisr3d] + +* Checking attributes category. [chrisr3d] + + - We check the category before adding the + attribute to the event + - Checking if the category is correct and if not, + doing a case insensitive check + - If the category is not correct after the 2 first + tests, we simply delete it from the attribute + and pymisp will give the attribute a default + category value based on the atttribute type, at + the creation of the attribute + +* Regenerated the modules documentation following the latest changes. [chrisr3d] + +* Updated documentation following the latest changes on the passive dns module. [chrisr3d] + +* Made circl_passivedns module able to return MISP objects. [chrisr3d] + +* Updated documentation following the latest changes on the passive ssl module. [chrisr3d] + +* Made circl_passivessl module able to return MISP objects. [chrisr3d] + +* Bump dependencies. [Raphaël Vinot] + +* Install faup in travis. [Raphaël Vinot] + +* Deactive emails tests, need update. [Raphaël Vinot] + +* Update email import module, support objects. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +### Fix + +* Fixed ipasn test input format + module version updated. [chrisr3d] + +* Updated ipasn test following the latest changes on the module. [chrisr3d] + +* Typo. [chrisr3d] + +* Fixed vt_graph imports. [chrisr3d] + +* Fixed pep8 in the new module and related libraries. [chrisr3d] + +* Fixed typo on function import. [chrisr3d] + +* [doc] Added APIVoid logo. [chrisr3d] + +* Making pep8 happy with whitespace after ':' [chrisr3d] + +* [tests] With values, tests are always better ... [chrisr3d] + +* [tests] Fixed copy paste issue. [chrisr3d] + +* [tests] Fixed error catching in passive dns and ssl modules. [chrisr3d] + +* [tests] Avoiding issues with btc addresses. [chrisr3d] + +* Making pep8 happy by having spaces around '+' operators. [chrisr3d] + +* [tests] Added missing variable. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Missing dependency in travis. [Raphaël Vinot] + +* Properly install pymisp with file object dependencies. [Raphaël Vinot] + +* Quick variable name fix. [chrisr3d] + +* OTX tests were failing, new entry. [Raphaël Vinot] + +* Somewhat broken emails needed some love. [Raphaël Vinot] + +* MIssing parameter in skip. [Raphaël Vinot] + +* Missing pushd. [Raphaël Vinot] + +* Missing sudo. [Raphaël Vinot] + +### Other + +* Merge pull request #361 from VirusTotal/master. [Christian Studer] + + add vt_graph export module + +* Add vt-graph-api to the requirements. [Alvaro Garcia] + +* Add vt_graph export module. [Alvaro Garcia] + +* Merge pull request #360 from ec4n6/patch-1. [Alexandre Dulaunoy] + + Fix ipasn.py bug + +* Update ipasn.py. [Erick Cheng] + +* Add: Documentation for the new API Void module. [chrisr3d] + +* Add: [tests] Test case for the APIVoid module. [chrisr3d] + +* Revert "fix: [tests] Fixed copy paste issue" [chrisr3d] + + This reverts commit fd711475dd84749063f9ff15961453f90c804101. + +* Add: Test cases for reworked passive dns and ssl modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + + +## v2.4.119 (2019-12-03) + +### Changes + +* Bump dependencies. [Raphaël Vinot] + +* Use MISPObject in ransomcoindb. [Raphaël Vinot] + +* Reintroducing the limit to reduce the number of recursive calls to the API when querying for a domain. [chrisr3d] + +### Fix + +* Making pep8 happy. [chrisr3d] + +* Fixed AssemblyLine input description. [chrisr3d] + +* Fixed input types list since domain should not be submitted to AssemblyLine. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Added missing AssemblyLine logo. [chrisr3d] + +* Avoiding KeyError exception when no result is found. [chrisr3d] + +### Other + +* Merge pull request #356 from ostefano/lastline. [Alexandre Dulaunoy] + + add: Modules to query/import/submit data from/to Lastline + +* Add: Modules to query/import/submit data from/to Lastline. [Stefano Ortolani] + +* Revert "Merge pull request #341 from StefanKelm/master" [Raphaël Vinot] + + This reverts commit 1df0d9152ed3346a9432393177c89e137bfc0c64, reversing + changes made to 6042619c6b7fb40fd77b5328f933e67e839e1e83. + + This PR was a fixing a typo in a test case. The typo is in a 3rd party + service. + +* Merge pull request #341 from StefanKelm/master. [Raphaël Vinot] + + Update test_expansions.py + +* Update test_expansions.py. [StefanKelm] + + Tiniest of typos + +* Merge branch 'aaronkaplan-master' [Raphaël Vinot] + +* Oops , use relative import. [aaronkaplan] + +* Use a helpful user-agent string. [aaronkaplan] + +* Final url fix. [aaronkaplan] + +* Revert "fix url" [aaronkaplan] + + This reverts commit 44130e2bf9842c03fb80245b90a873917b56df74. + +* Revert "fix url again" [aaronkaplan] + + This reverts commit c5924aee2543b268b296a57096e636261676b63c. + +* Fix url again. [aaronkaplan] + +* Fix url. [aaronkaplan] + +* Mention the ransomcoindb in the README file as a new module. [aaronkaplan] + +* Remove pprint. [aaronkaplan] + +* Initial version of the ransomcoindb expansion module. [aaronkaplan] + +* Merge pull request #352 from aaronkaplan/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [AaronK] + + fixes #351 + +* Add: Added documentation for the AssemblyLine query module. [chrisr3d] + +* Add: Module to query AssemblyLine and parse the results. [chrisr3d] + + - Takes an AssemblyLine submission link to query + the API and get the full submission report + - Parses the potentially malicious files and the + IPs, domains or URLs they are connecting to + - Possible improvement of the parsing filters in + order to include more data in the MISP event + +* Add: Added documentation and description in readme for the AssemblyLine submit module. [chrisr3d] + +* Add: Updated python dependencies to include the assemblyline_client library. [chrisr3d] + +* Add: New expansion module to submit samples and urls to AssemblyLine. [chrisr3d] + + +## v2.4.118 (2019-11-08) + +### Changes + +* Using EQL module description from blaverick62. [chrisr3d] + +* [test expansion] Enhanced results parsing. [chrisr3d] + +* [travis] skip E226 as it's more a question of style. [Alexandre Dulaunoy] + +* [apiosintds] make flake8 happy. [Alexandre Dulaunoy] + +* [Pipfile] apiosintDS added as required by new module. [Alexandre Dulaunoy] + +* [env] Pipfile updated. [Alexandre Dulaunoy] + +* [pipenv] updated. [Alexandre Dulaunoy] + +* Avoids returning empty values + easier results parsing. [chrisr3d] + +* Taking into consideration if a user agent is specified in the module configuration. [chrisr3d] + +* Updated csv import documentation. [chrisr3d] + +### Fix + +* Fixed csv file parsing. [chrisr3d] + +* Fixed Xforce Exchange authentication + rework. [chrisr3d] + + - Now able to return MISP objects + - Support of the xforce exchange authentication + with apikey & apipassword + +* Added urlscan & secuirtytrails modules in __init__ list. [chrisr3d] + +* Avoiding empty config error on passivetotal module. [chrisr3d] + +* More clarity on the exception raised on the securitytrails module. [chrisr3d] + +* Better exceptions handling on the passivetotal module. [chrisr3d] + +* Fixed results parsing for various module tests. [chrisr3d] + +* Fixed variable name. [chrisr3d] + +* Bumped Pipfile.lock with the latest libraries versions. [chrisr3d] + +* Fixed config parsing and the associated error message. [chrisr3d] + +* Fixed config parsing + results parsing. [chrisr3d] + + - Avoiding errors with config field when it is + empty or the apikey is not set + - Parsing all the results instead of only the + first one + +* Fixed VT results. [chrisr3d] + +* Making urlscan module available in MISP for ip attributes. [chrisr3d] + + - As expected in the the handler function + +* Avoiding various modules to fail with uncritical issues. [chrisr3d] + + - Avoiding securitytrails to fail with an unavailable + feature for free accounts + - Avoiding urlhaus to fail with input attribute + fields that are not critical for the query and + results + - Avoiding VT modules to fail when a certain + resource does not exist in the dataset + +* Fixed config field parsing for various modules. [chrisr3d] + + - Same as previous commit + +* [expansion] Better config field handling for various modules. [chrisr3d] + + - Testing if config is present before trying to + look whithin the config field + - The config field should be there when the module + is called form MISP, but it is not always the + case when the module is queried from somewhere else + +* [test expansion] Using CVE with lighter results. [chrisr3d] + +* Avoid issues when some config fields are not set. [chrisr3d] + +* Updated pipfile.lock with the correct geoip2 library info. [chrisr3d] + +* Fixed requirements for pymisp and geoip python libraries. [chrisr3d] + +* Fixed Geoip with the supported python library + fixed Geolite db path management. [chrisr3d] + +* Removed unused self param turning the associated functions into static methods. [chrisr3d] + +* Updates following the latest CVE-search version. [chrisr3d] + + - Support of the new vulnerable configuration + field for CPE version > 2.2 + - Support of different 'unknown CWE' message + +* Fixed module names with - to avoid errors with python paths. [chrisr3d] + +* Fixed tesseract python library issues. [Christian Studer] + + - Avoiding 'tesseract is not installed or it's not in your path' issues + +* Using absolute path to open files instead of relative path. [chrisr3d] + +* Removed unused import\ [chrisr3d] + +* Handling issues when the otx api is queried too often in a short time. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Avoiding empty values + Fixed empty types error + Fixed filename KeyError. [chrisr3d] + +* Fixed ThreatMiner results parsing. [chrisr3d] + +* Catching wikidata errors properly + fixed errors parsing. [chrisr3d] + +* Grouped two if conditions to avoid issues with variable unassigned if the second condition is not true. [chrisr3d] + +* Handling errors and exceptions for expansion modules tests that could fail due to a connection error. [chrisr3d] + +* Considering the case of empty results. [chrisr3d] + +* Catching results exceptions properly. [chrisr3d] + +* Catching exceptions and results properly depending on the cases. [chrisr3d] + +* Handling cases where there is no result from the query. [chrisr3d] + +* DBL spamhaus test. [chrisr3d] + +* Quick typo & dbl spamhaus test fixes. [chrisr3d] + +* Fixed pattern parsing + made the module hover only. [chrisr3d] + +* Travis tests should be happy now. [chrisr3d] + +* Copy paste syntax error. [chrisr3d] + +* Fixed greynoise test following the latest changes on the module. [chrisr3d] + +* Returning results in text format. [chrisr3d] + + - Makes the hover functionality display the full + result instead of skipping the records list + +* Making pep8 happy. [chrisr3d] + +* Avoiding errors with uncommon lines. [chrisr3d] + + - Excluding first from data parsed all lines that + are comments or empty + - Skipping lines with failing indexes + +* Fixed unassigned variable name. [chrisr3d] + +* Removed no longer used variables. [chrisr3d] + +* Csv import rework & improvement. [chrisr3d] + + - More efficient parsing + - Support of multiple csv formats + - Possibility to customise headers + - More improvement to come for external csv file + +* Making pep8 happy. [chrisr3d] + +* [tests] Fixed tests to avoid config issues with the cve module. [chrisr3d] + + - Config currently empty in the module, but being + updated soon with a pending pull request + +### Other + +* Add: Updated documentation with the EQL export module. [chrisr3d] + +* Merge branch 'master' of github.com:blaverick62/misp-modules. [chrisr3d] + +* Added documentation json for new modules. [Braden Laverick] + +* Updated README to include EQL modules. [Braden Laverick] + +* Add: Xforce Exchange module tests. [chrisr3d] + +* Merge pull request #347 from MISP/tests. [Christian Studer] + + More advanced expansion tests + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: Updated documentation with the latest modules info. [chrisr3d] + +* Updated README with new modules and fixed some links. [chrisr3d] + +* Add: Added test for vulners module. [chrisr3d] + +* Add: Added qrcode module test with its test image. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge pull request #346 from blaverick62/master. [Alexandre Dulaunoy] + + EQL Query Generation Modules + +* Removed extraneous comments and unused imports. [Braden Laverick] + +* Fixed python links. [Braden Laverick] + +* Changed file name to mass eql export. [Braden Laverick] + +* Fixed comments. [Braden Laverick] + +* Added ors for compound queries. [Braden Laverick] + +* Fixed syntax error. [Braden Laverick] + +* Changed to single attribute EQL. [Braden Laverick] + +* Added EQL enrichment module. [Braden Laverick] + +* Fixed string formatting. [Braden Laverick] + +* Fixed type error in JSON parsing. [Braden Laverick] + +* Attempting to import endgame module. [Braden Laverick] + +* Added endgame export to __all__ [Braden Laverick] + +* Added EQL export test module. [Braden Laverick] + +* Add: [test expansion] Added various tests for modules with api authentication. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: [test expansion] New modules tests. [chrisr3d] + + - Starting testing some modules with api keys + - Testing new apiosintDS module + +* Merge pull request #344 from davidonzo/master. [Alexandre Dulaunoy] + + Added apiosintDS module to query OSINT.digitalside.it services + +* Added apiosintDS module to query OSINT.digitalside.it services. [Davide] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #345 from 0xmilkmix/fix_geoip2. [Alexandre Dulaunoy] + + updated to geoip2 to support mmdb format + +* Updated to geoip2 to support mmdb format. [milkmix] + +* Add: cve_advanced module test + functions to test attributes and objects results. [chrisr3d] + +* Merge pull request #342 from MISP/tests. [Christian Studer] + + More expansion tests + +* Merge branch 'tests' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: Tests for all the office, libreoffice, pdf & OCR enrich modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: threatminer module test. [chrisr3d] + +* Add: Tests for expansion modules with different input types. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #339 from MISP/tests. [Christian Studer] + + Expansion modules tests update + +* Add: Added tests for the rest of the easily testable expansion modules. [chrisr3d] + + - More tests for more complex modules to come soon + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'tests' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Tests for sigma queries and syntax validator modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: More modules tested. [chrisr3d] + +* Add: Added tests for some expansion modules without API key required. [chrisr3d] + + - More tests to come + +* Merge pull request #338 from MISP/features_csvimport. [Christian Studer] + + Fixed the CSV import module + +* Merge pull request #335 from FafnerKeyZee/patch-2. [Christian Studer] + + Travis should not be complaining with the tests after the latest update on "test_cve" + +* Adding custom API. [Fafner [_KeyZee_]] + + Adding the possibility to have our own API server. + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #334 from FafnerKeyZee/patch-1. [Alexandre Dulaunoy] + + Cleaning the error message + +* Cleaning the error message. [Fafner [_KeyZee_]] + + The original message can be confusing is the user change to is own API. + + +## v2.4.116 (2019-09-17) + +### Other + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #329 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Update mkdocs documentation + +* Fixing Install.md. [8ear] + +* Fix Install.md. [8ear] + +* Change Install documentation. [8ear] + +* Merge pull request #328 from 8ear/8ear-add-docker-capabilitites. [Alexandre Dulaunoy] + + Add Docker Capabilitites + +* Add .travis.yml command for docker build. [8ear] + +* Merge github.com:MISP/misp-modules into 8ear-add-docker-capabilitites. [8ear] + +* Disable not required package virtualenv for final stage. [8ear] + +* Fix entrypoint bug. [8ear] + +* Improve the Dockerfile. [8ear] + +* Add Dockerfile, Entrypoint and Healthcheck script. [8ear] + +* Update install doc. [8ear] + +* Bugfixing for MISP-modules. [8ear] + +* Add: New parameter to specify a custom CVE API to query. [chrisr3d] + + - Any API specified here must return the same + format as the CIRCL CVE search one in order to + be supported by the parsing functions, and + ideally provide response to the same kind of + requests (so the CWE search works as well) + + +## v2.4.114 (2019-08-30) + +### Changes + +* [cuckooimport] Handle archives downloaded from both the WebUI and the API. [Pierre-Jean Grenier] + +### Fix + +* Prevent symlink attacks. [Pierre-Jean Grenier] + +* Have I been pwned API changed again. [Raphaël Vinot] + +### Other + +* Merge pull request #327 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + fix: prevent symlink attacks + +* Merge pull request #326 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + chg: [cuckooimport] Handle archives downloaded from both the WebUI and the API + + +## v2.4.113 (2019-08-19) + +### New + +* Rewrite cuckooimport. [Pierre-Jean Grenier] + +### Changes + +* Update PyMISP version. [Pierre-Jean Grenier] + +### Fix + +* Avoiding issues when no CWE id is provided. [chrisr3d] + +* Fixed unnecessary dictionary field call. [chrisr3d] + + - No longer necessary to go under 'Event' field + since PyMISP does not contain it since the + latest update + +### Other + +* Merge pull request #322 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + Rewrite cuckooimport + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Added initial event to reference it from the vulnerability object created out of it. [chrisr3d] + + +## v2.4.112 (2019-08-02) + +### New + +* First version of an advanced CVE parser module. [chrisr3d] + + - Using cve.circl.lu as well as the initial module + - Going deeper into the CVE parsing + - More parsing to come with the CWE, CAPEC and so on + +### Changes + +* [docs] add additional references. [Alexandre Dulaunoy] + +* [travis] revert. [Alexandre Dulaunoy] + +* [travis] github token. [Alexandre Dulaunoy] + +* [travis] mkdocs disabled for the time being. [Alexandre Dulaunoy] + +* [doc] Fix #317 - update the link to the latest version of the training. [Alexandre Dulaunoy] + +* [doc] README updated to the latest version. [Alexandre Dulaunoy] + +* [docs] symbolic link removed. [Alexandre Dulaunoy] + +* [docs] add logos symbolic link. [Alexandre Dulaunoy] + +* Add print to figure out what's going on on travis. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* Updated the module to work with the updated VirusTotal API. [chrisr3d] + + - Parsing functions updated to support the updated + format of the VirusTotal API responses + - The module can now return objects + - /!\ This module requires a high number of + requests limit rate to work as expected /!\ + +* Adding references between a domain and their siblings. [chrisr3d] + +* Getting domain siblings attributes uuid for further references. [chrisr3d] + +### Fix + +* Using the attack-pattern object template (copy-paste typo) [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Fixed cvss-score object relation name. [chrisr3d] + +* Avoid issues when there is no pe field in a windows file sample analysis. [chrisr3d] + + - For instance: doc file + +* Avoid adding file object twice if a KeyError exception comes for some unexpected reasons. [chrisr3d] + +* Testing if file & registry activities fields exist before trying to parse it. [chrisr3d] + +* Testing if there is some screenshot data before trying to fetch it. [chrisr3d] + +* Fixed direction of the relationship between files, PEs and their sections. [chrisr3d] + + - The file object includes a PE, and the PE + includes sections, not the other way round + +* Fixed variable names. [chrisr3d] + +* Wrong change in last commit. [Raphaël Vinot] + +* Skip tests on haveibeenpwned.com if 403. Make pep8 happy. [Raphaël Vinot] + +* Changed the way references added at the end are saved. [chrisr3d] + + - Some references are saved until they are added + at the end, to make it easier when needed + - Here we changed the way they are saved, from a + dictionary with some keys to identify each part + to the actual dictionary with the keys the + function add_reference needs, so we can directly + use this dictionary as is when the references are + added to the different objects + +* Fixed link in documentation. [chrisr3d] + +* Avoiding issues with non existing sample types. [chrisr3d] + +* Undetected urls are represented in lists. [chrisr3d] + +* Changed function name to avoid confusion with the same variable name. [chrisr3d] + +* Quick fix on siblings & url parsing. [chrisr3d] + +* Typo. [chrisr3d] + +* Parsing detected & undetected urls. [chrisr3d] + +* Various fixes about typo, variable names, data types and so on. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +### Other + +* Merge pull request #319 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Add `make deploy` to Makefile + +* Added docker and non-docker make commands. [8ear] + +* Add `make deploy` [8ear] + +* Merge pull request #318 from chrisr3d/master. [Christian Studer] + + Updated cve_advanced module to parse CWE and CAPEC data related to the CVE + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Making vulnerability object reference to its related capec & cwe objects. [chrisr3d] + +* Add: Parsing CAPEC information related to the CVE. [chrisr3d] + +* Add: Parsing CWE related to the CVE. [chrisr3d] + +* Merge pull request #316 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Add web documentation via mkdocs + +* Fix Bugs. [8ear] + +* Fix Fossa in index.md. [8ear] + +* Delete unused file. [8ear] + +* Change mkdocs deploy method. [8ear] + +* Change index.md. [8ear] + +* Merge branch 'master' into 8ear-add-mkdocs-documentation. [Max H] + +* Add: Parsing linux samples and their elf data. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Parsing apk samples and their permissions. [chrisr3d] + +* Add: Added virustotal_public to the list of available modules. [chrisr3d] + +* Add: TODO comment for the next improvement. [chrisr3d] + +* Add: [documentation] Updated README and documentation with the virustotal modules changes. [chrisr3d] + +* Add: Parsing communicating samples returned by domain reports. [chrisr3d] + +* Add: Parsing downloaded samples as well as the referrer ones. [chrisr3d] + +* Add: Object for VirusTotal public API queries. [chrisr3d] + + - Lighter analysis of the report to avoid reaching + the limit of queries per minute while recursing + on the different elements + +* Add: Updated README file with the new module description. [chrisr3d] + +* Change contribute.md. [8ear] + +* Update index.md. [8ear] + +* Add mkdocs as a great web documentation. [8ear] + +* Merge pull request #1 from fossabot/master. [Max H] + + Add license scan report and status + +* Add license scan report and status. [fossabot] + + +## v2.4.110 (2019-07-08) + +### New + +* [doc] Joe Sandbox added in the list. [Alexandre Dulaunoy] + +* Expansion module to query urlhaus API. [chrisr3d] + + - Using the next version of modules, taking a + MISP attribute as input and able to return + attributes and objects + - Work still in process in the core part + +### Changes + +* [documentation] Making URLhaus visible from the github page. [chrisr3d] + + - Because of the white color, the logo was not + visible at all + +* Moved JoeParser class to make it reachable from expansion & import modules. [chrisr3d] + +* [install] REQUIREMENTS file updated. [Alexandre Dulaunoy] + +* [install] Pipfile.lock updated. [Alexandre Dulaunoy] + +* [requirements] Python API wrapper for the Joe Sandbox API added. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* [pep8] try/except # noqa. [Steve Clement] + + Not sure how to make flake happy on this one. + +* Updated csvimport to support files from csv export + import MISP objects. [chrisr3d] + +### Fix + +* Added missing add_attribute function. [chrisr3d] + +* [documentation] Fixed json file name. [chrisr3d] + +* [documentation] Fixed some description & logo. [chrisr3d] + +* Testing if an object is not empty before adding it the the event. [chrisr3d] + +* Making travis happy. [chrisr3d] + +* Support of the latest version of sigmatools. [chrisr3d] + +* We will display galaxies with tags. [chrisr3d] + +* Returning tags & galaxies with results. [chrisr3d] + + - Tags may exist with the current version of the + parser + - Galaxies are not yet expected from the parser, + nevertheless the principle is we want to return + them as well if ever we have some galaxies from + parsing a JoeSandbox report. Can be removed if + we never galaxies at all + +* Removed duplicate finalize_results function call. [chrisr3d] + +* Making pep8 happy + added joe_import module in the init list. [chrisr3d] + +* Fixed variable name typo. [chrisr3d] + +* Fixed references between domaininfo/ipinfo & their targets. [chrisr3d] + + - Fixed references when no target id is set + - Fixed domaininfo parsing when no ip is defined + +* Some quick fixes. [chrisr3d] + + - Fixed strptime matching because months are + expressed in abbreviated format + - Made data loaded while the parsing function is + called, in case it has to be called multiple + times at some point + +* Making pep8 & travis happy. [chrisr3d] + +* Added references between processes and the files they drop. [chrisr3d] + +* Avoiding network connection object duplicates. [chrisr3d] + +* Avoid creating a signer info object when the pe is not signed. [chrisr3d] + +* Avoiding dictionary indexes issues. [chrisr3d] + + - Using tuples as a dictionary indexes is better + than using generators... + +* Avoiding attribute & reference duplicates. [chrisr3d] + +* Handling case of multiple processes in behavior field. [chrisr3d] + + - Also starting parsing file activities + +* Testing if some fields exist before trying to import them. [chrisr3d] + + - Testing for pe itself, pe versions and pe signature + +* Removed test print. [chrisr3d] + +* Fixed output format to match with the recent changes on modules. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Checking not MISP header fields. [chrisr3d] + + - Rejecting fields not recognizable by MISP + +* Using pymisp classes & methods to parse the module results. [chrisr3d] + +* Clearer user config messages displayed in the import view. [chrisr3d] + +* Removed unused library. [chrisr3d] + +* Make pep8 happy. [chrisr3d] + +* [pep8] More fixes. [Steve Clement] + +* [pep8] More pep8 happiness. [Steve Clement] + +* [pep8] Fixes. [Steve Clement] + +* Fixed standard MISP csv format header. [root] + + - The csv header we can find in data produced from + MISP restSearch csv format is the one to use to + recognize a csv file produced by MISP + +* Fixed introspection fields for csvimport & goamlimport. [root] + + - Added format field for goaml so the module is + known as returning MISP attributes & objects + - Fixed introspection to make the format, user + config and input source fields visible from + MISP (format also added at the same time) + +* Fixed libraries import that changed with the latest merge. [root] + +* Fixed fields parsing to support files from csv export with additional context. [chrisr3d] + +* Handling the case of Context included in the csv file exported from MISP. [chrisr3d] + +* Fixed changes omissions in handler function. [chrisr3d] + +* Fixed object_id variable name typo. [root] + +* Making json_decode even happier with full json format. [chrisr3d] + + - Using MISPEvent because it is cleaner & easier + - Also cleaner implementation globally + +* Using to_dict on attributes & objects instead of to_json to make json_decode happy in the core part. [chrisr3d] + +### Other + +* Add: [documentation] Added some missing documentation for the most recently added modules. [chrisr3d] + +* Add: [documentation] Added documentation for Joe Sandbox & URLhaus. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #309 from Kortho/patch-2. [Steve Clement] + + changed service pointer + +* Changed service pointer. [Kortho] + + Changed so the service starts the modules in the venv where they are installed + +* Merge pull request #308 from Kortho/patch-1. [Steve Clement] + + Fixed missing dependencies for RHEL install + +* Fixed missing dependencies for RHEL install. [Kortho] + + Added dependencies needed for installing the python library pdftotext + +* Add: Added screenshot of the behavior of the analyzed sample. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #307 from ninoseki/fix-missing-links. [Alexandre Dulaunoy] + + Fix missing links in README.md + +* Fix missing links in README.md. [Manabu Niseki] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #306 from MISP/new_module. [Alexandre Dulaunoy] + + New modules able to return MISP objects + +* Add: Added new modules to the list. [chrisr3d] + +* Merge branch 'new_module' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #305 from joesecurity/new_module. [Alexandre Dulaunoy] + + joesandbox_query.py: improve behavior in unexpected circumstances + +* Joesandbox_query.py: improve behavior in unexpected circumstances. [Georg Schölly] + +* Add: New expansion module to query Joe Sandbox API with a report link. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'joesecurity-joesandbox_submit' [Alexandre Dulaunoy] + +* Merge branch 'joesandbox_submit' of https://github.com/joesecurity/misp-modules into joesecurity-joesandbox_submit. [Alexandre Dulaunoy] + +* Add expansion for joe sandbox. [Georg Schölly] + +* Merge pull request #304 from joesecurity/new_module. [Alexandre Dulaunoy] + + add support for url analyses + +* Support url analyses. [Georg Schölly] + +* Improve forwards-compatibility. [Georg Schölly] + +* Add: Parsing MITRE ATT&CK tactic matrix related to the Joe report. [chrisr3d] + +* Add: Parsing domains, urls & ips contacted by processes. [chrisr3d] + +* Add: Starting parsing dropped files. [chrisr3d] + +* Add: Starting parsing network behavior fields. [chrisr3d] + +* Add: Parsing registry activities under processes. [chrisr3d] + +* Add: Parsing processes called by the file analyzed in the joe sandbox report. [chrisr3d] + +* Add: Parsing some object references at the end of the process. [chrisr3d] + +* Add: [new_module] Module to import data from Joe sandbox reports. [chrisr3d] + + - Parsing file, pe and pe-section objects from the + report file info field + - Deeper file info parsing to come + - Other fields parsing to come as well + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #300 from cudeso/master. [Alexandre Dulaunoy] + + Bugfix for "sources" ; do not include as IDS for "access" registry keys + +* Bugfix for "sources" ; do not include as IDS for "access" registry keys. [Koen Van Impe] + + - Bugfix to query "operations" in files, mutex, registry + - Do not set IDS flag for registry 'access' operations + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* New VMRay modules (#299) [Steve Clement] + + New VMRay modules + +* New VMRay modules. [Koen Van Impe] + + New JSON output format of VMRay + Prepare for automation (via PyMISP) with workflow taxonomy tags + +* Merge pull request #1 from MISP/master. [Koen Van Impe] + + Sync + +* Add: Added urlhaus in the expansion modules init list. [root] + +* Merge branch 'new_module' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'features_csvimport' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'features_csvimport' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'new_module' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'master' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + + +## v2.4.106 (2019-04-27) + +### New + +* Devel mode. [Raphaël Vinot] + + Fix #293 + +* Modules for greynoise, haveibeenpwned and macvendors. [Raphaël Vinot] + +* Add missing dependency (backscatter) [Raphaël Vinot] + +* Add systemd launcher. [Raphaël Vinot] + +* Intel471 module. [Raphaël Vinot] + +* [btc] Very simple BTC expansion chg: [req] yara-python is preferred. [Steve Clement] + +* First version of a yara rule creation expansion module. [chrisr3d] + +* Documentation concerning modules explained in markdown file. [chrisr3d] + +* Expansion hover module to check spamhaus DBL for a domain name. [chrisr3d] + +### Changes + +* [doc] install of deps updated. [Alexandre Dulaunoy] + +* Bump REQUIREMENTS. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* [doc] new MISP expansion modules added for PDF, OCR, DOCX, XLSX, PPTX , ODS and ODT. [Alexandre Dulaunoy] + +* [init] cleanup for pep. [Alexandre Dulaunoy] + +* [pdf-enrich] updated. [Alexandre Dulaunoy] + +* [Pipfile] collection removed. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* [doc] Added new dependencies and updated RHEL/CentOS howto. (#295) [Steve Clement] + + chg: [doc] Added new dependencies and updated RHEL/CentOS howto. + +* [doc] Added new dependencies and updated RHEL/CentOS howto. [Steve Clement] + +* [init] removed trailing whitespace. [Alexandre Dulaunoy] + +* [ocr] re module not used - removed. [Alexandre Dulaunoy] + +* Bump dependencies, update REQUIREMENTS file. [Raphaël Vinot] + +* [doc] cuckoo_submit module added. [Alexandre Dulaunoy] + +* Require python3 instead of python 3.6. [Raphaël Vinot] + +* [travis] because we all need sudo. [Alexandre Dulaunoy] + +* [travis] because everyone need a bar. [Alexandre Dulaunoy] + +* [doc] qrcode and Cisco FireSight added. [Alexandre Dulaunoy] + +* [qrcode] add requirements. [Alexandre Dulaunoy] + +* [qrcode] added to the __init__ [Alexandre Dulaunoy] + +* [qrcode] flake8 needs some drugs. [Alexandre Dulaunoy] + +* [qrcode] various fixes to make it PEP compliant. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + + Fix CVE-2019-11324 (urllib3) + +* Bump Dependencies. [Raphaël Vinot] + +* [doc] Updated README to reflect current virtualenv efforts. TODO: pipenv. [Steve Clement] + +* [doc] new modules added. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* Bump Requirements. [Raphaël Vinot] + +* [doc] asciidoctor requirement removed (new PDF module use reportlab) [Alexandre Dulaunoy] + +* Bump dependencies, add update script. [Raphaël Vinot] + +* [doc] PDF export. [Alexandre Dulaunoy] + +* [pdfexport] make flake8 happy. [Alexandre Dulaunoy] + +* [pipenv] fix the temporary issue that python-yara is not officially released. [Alexandre Dulaunoy] + +* [requirements] reportlab added. [Alexandre Dulaunoy] + +* [pipenv] Pipfile.lock updated. [Alexandre Dulaunoy] + +* [requirements] updated. [Alexandre Dulaunoy] + +* [PyMISP] dep updated to the latest version. [Alexandre Dulaunoy] + +* PyMISP requirement. [Alexandre Dulaunoy] + +* [pypi] Made sure url-normalize installs less stric. [Steve Clement] + +* [btc_scam_check] fix spacing for making flake 8 happy. [Alexandre Dulaunoy] + +* [backscatter.io] blind fix regarding undefined value. [Alexandre Dulaunoy] + +* [doc] backscatter.io updated. [Alexandre Dulaunoy] + +* [doc] backscatter.io documentation added. [Alexandre Dulaunoy] + +* [backscatter.io] remove blank line at the end of the file. [Alexandre Dulaunoy] + +* [backscatter.io] Exception handler fixed for recent version of Python. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* Use pipenv, update bgpranking/ipasn modules. [Raphaël Vinot] + +* [doc] Nexthink module added. [Alexandre Dulaunoy] + +* [doc] osquery export module added. [Alexandre Dulaunoy] + +* [doc] Nexthink export format added. [Alexandre Dulaunoy] + +* [doc] cannot type today. [Alexandre Dulaunoy] + +* [intel471] module added. [Alexandre Dulaunoy] + +* Regenerated documentation markdown file. [chrisr3d] + +* [onyphe] fix #252. [Alexandre Dulaunoy] + +* [btc] Removed simple PoC for btc expansion. [Steve Clement] + +* [doc] btc module added. [Alexandre Dulaunoy] + +* [doc] generated documentation updated. [Alexandre Dulaunoy] + +* [doc] btc module added to documentation. [Alexandre Dulaunoy] + +* [tools] Added psutil as a dependency to detect misp-modules PID. [Steve Clement] + +* [init] Added try/catch in case misp-modules is already running on a port, or port is in use... [Steve Clement] + +* Validating yara rules after their creation. [chrisr3d] + +* [documentation] osquery logo added. [Alexandre Dulaunoy] + +* [documentation] generated. [Alexandre Dulaunoy] + +* [docs] Added some missing dependencies and instructions for virtualenv deployment. [Steve Clement] + +* [doc] documentation generator updated to include links to source code. [Alexandre Dulaunoy] + +* Changed documentation markdown file name. [chrisr3d] + +* Structurded data. [chrisr3d] + +* Modified the mapping dictionary to support misp-objects updates. [chrisr3d] + +* Modified output format. [chrisr3d] + +* Add new dependency (oauth2) [Raphaël Vinot] + +* Dnspython3 has been superseded by the regular dnspython kit. [Raphaël Vinot] + +* Wikidata module added. [Alexandre Dulaunoy] + +* SPARQLWrapper added (for wikidata module) [Alexandre Dulaunoy] + +### Fix + +* Re-enable python 3.6 support. [Raphaël Vinot] + +* CTRL+C is working again. [Raphaël Vinot] + + Fix #292 + +* Make flake8 happy. [Raphaël Vinot] + +* [doc] Small typo fix. [Steve Clement] + +* Pep8 foobar. [Raphaël Vinot] + +* Add the new module sin the list of modules availables. [Raphaël Vinot] + +* Typos in variable names. [Raphaël Vinot] + +* Remove unused import. [Raphaël Vinot] + +* Tornado expects a KILL now. [Raphaël Vinot] + +* [exportpdf] update documentation. [Falconieri] + +* [exportpdf] custom path parameter. [Falconieri] + +* [exportpdf] add parameters. [Falconieri] + +* [exportpdf] mising whitespace. [Falconieri] + +* [exportpdf] problem on one line. [Falconieri] + +* [exportpdf] add configmodule parameter for galaxy. [Falconieri] + +* [reportlab] Textual description parameter. [Falconieri] + +* [pdfexport] Bugfix on PyMisp exportpdf call. [Falconieri] + +* Systemd service. [Raphaël Vinot] + +* Regenerated documentation. [chrisr3d] + +* Description fixed. [chrisr3d] + +* Pep8 related fixes. [Raphaël Vinot] + +* Make flake8 happy. [Raphaël Vinot] + +* Change in the imports in other sigma module. [Raphaël Vinot] + +* Change in the imports. [Raphaël Vinot] + +* Change module name. [Raphaël Vinot] + +* Allow redis details to be retrieved from environment variables. [Ruiwen Chua] + +* Remove tests on python 3.5. [Raphaël Vinot] + +* Make pep8 happy. [Raphaël Vinot] + +* Removed not valid input type. [chrisr3d] + +* Cleaned up not used variables. [chrisr3d] + +* Updated rbl module result format. [chrisr3d] + + - More readable as str than dumped json + +* Added Macaddress.io module in the init list. [chrisr3d] + +* Typo on input type. [chrisr3d] + +* Fixed type of the result in case of exception. [chrisr3d] + + - Set as str since some exception types are not + jsonable + +* Added hostname attribute support as it is intended. [chrisr3d] + +* Threatanalyzer_import - bugfix for TA6.1 behavior. [Christophe Vandeplas] + +* Displaying documentation items of each module by alphabetic order. [chrisr3d] + + - Also regenerated updated documentation markdown + +* Updated yara import error message. [chrisr3d] + + - Better to 'pip install -I -r REQUIREMENTS' to + have the correct yara-python version working + for all the modules, than having another one + failing with yara hash & pe modules + +* Specifying a yara-python version that works for hash & pe yara modules. [chrisr3d] + +* Making yara query an expansion module for single attributes atm. [chrisr3d] + +* Catching errors while parsing additional info in requests. [chrisr3d] + +* Reduced logos size. [chrisr3d] + +* Typo for separator between each explained module. [chrisr3d] + +* Making python 3.5 happy with the exception type ImportError. [chrisr3d] + +* Fixed exception type for python 3.5. [chrisr3d] + +* Fixed exception type. [chrisr3d] + +* Fixed syntax error. [chrisr3d] + +* Fixed indentation error. [chrisr3d] + +* Fixed 1 variable misuse + cleaned up variable names. [chrisr3d] + + - Fixed use of 'domain' variable instead of 'email' + - Cleaned up variable names to avoid redefinition + of built-in variables + +* Avoiding adding attributes that are already in the event. [chrisr3d] + +* Fixed quick variable issue. [chrisr3d] + +* Cleaned up test function not used anymore. [chrisr3d] + +* Multiple attributes parsing support. [chrisr3d] + + - Fixing one of my previous changes not processing + multiple attributes parsing + +* Removed print. [chrisr3d] + +* Some cleanup and output types fixed. [chrisr3d] + + - hashes types specified in output + +* Quick cleanup. [chrisr3d] + +* Quick cleanup. [chrisr3d] + +* Ta_import - bugfixes. [Christophe Vandeplas] + +* [cleanup] Quick clean up on exception type. [chrisr3d] + +* [cleanup] Quick clean up on yaml load function. [chrisr3d] + +* [cleanup] Quick clean up on exception type. [chrisr3d] + +* Put the report location parsing in a try/catch statement as it is an optional field. [chrisr3d] + +* Put the stix2-pattern library import in a try statement. [chrisr3d] + + --> Error more easily caught + +* Removed STIX related libraries, files, documentation, etc. [chrisr3d] + +* Avoid trying to build attributes with not intended fields. [chrisr3d] + + - Previously: if the header field is not an attribute type, then + it was added as an attribute field. + PyMISP then used to skip it if needed + + - Now: Those fields are discarded before they are put in an attribute + +* Using userConfig to define the header instead of moduleconfig. [chrisr3d] + +* Fixed input & output of the module. [chrisr3d] + +* Added an object checking. [Christian Studer] + + - Checking if there are objects in the event, and then if there is at least 1 transaction object + - This prevents the module from crashing, but does not guaranty having a valid GoAML file (depending on objects and their relations) + +* Fixed input & output of the module. [chrisr3d] + + Also updated some functions + +* Fixed typo of the aml type for country codes. [chrisr3d] + +* Typo in references mapping dictionary. [chrisr3d] + +* Added an object checking. [chrisr3d] + + - Checking if there are objects in the event, and then + if there is at least 1 transaction object + - This prevents the module from crashing, but does not + guaranty having a valid GoAML file (depending on + objects and their relations) + +* Added the moduleinfo field need to have MISP event in standard format. [chrisr3d] + +* Missing cve module test. [Alexandre Dulaunoy] + +* Goamlexport added. [Alexandre Dulaunoy] + +* Python version in Travis. [Alexandre Dulaunoy] + +* Solved reading problems for some files. [chrisr3d] + +* Skipping empty lines. [chrisr3d] + +* Make travis happy. [Raphaël Vinot] + +* OpenIOC importer. [Raphaël Vinot] + +* #137 when a CVE is not found, a return message is given. [Alexandre Dulaunoy] + +* Use the proper formatting method and not the horrible % one. [Hannah Ward] + +* Misp-modules are by default installed in /bin. [Alexandre Dulaunoy] + +* Module_config should be set as introspection relies on it. [Alexandre Dulaunoy] + +* Types array. [Alexandre Dulaunoy] + +* Run the server as "python3 misp-modules" [Raphaël Vinot] + +* Stupid off-by-n line... [Alexandre Dulaunoy] + +### Other + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Removed trailing whitespaces. [Sascha Rommelfangen] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* New modules added. [Sascha Rommelfangen] + +* New requirements for new modules. [Sascha Rommelfangen] + +* Introduction of new modules. [Sascha Rommelfangen] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Renamed file. [Sascha Rommelfangen] + +* Renamed module. [Sascha Rommelfangen] + +* Initial version of OCR expansion module. [Sascha Rommelfangen] + +* Merge pull request #291 from Evert0x/submitcuckoo. [Alexandre Dulaunoy] + + Expansion module - File/URL submission to Cuckoo Sandbox + +* Generate latest version of documentation. [Ricardo van Zutphen] + +* Document Cuckoo expansion module. [Ricardo van Zutphen] + +* Use double quotes and provide headers correctly. [Ricardo van Zutphen] + +* Update Cuckoo module to support files and URLs. [Ricardo van Zutphen] + +* Update __init__.py. [Evert0x] + +* Create cuckoo_submit.py. [Evert0x] + +* Brackets are difficult... [Sascha Rommelfangen] + +* Merge branch 'qr-code-module' of https://github.com/rommelfs/misp-modules into rommelfs-qr-code-module. [Alexandre Dulaunoy] + +* Initial version of QR code reader. [Sascha Rommelfangen] + + Module accepts attachments and processes pictures. It tries to identify and analyze an existing QR code. + Identified values can be inserted into the event. + +* Merge branch 'iceone23-patch-1' [Raphaël Vinot] + +* Create cisco_firesight_manager_ACL_rule_export.py. [iceone23] + + Cisco Firesight Manager ACL Rule Export module + +* Merge pull request #289 from SteveClement/master. [Steve Clement] + + fix: [doc] Small typo fix + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge pull request #285 from wesinator/patch-1. [Alexandre Dulaunoy] + + Fix command highlighting + +* Fix command highlighting. [Ԝеѕ] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Merge pull request #284 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] custom path parameter + +* Merge pull request #283 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] add parameters + +* Merge pull request #281 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] add configmodule parameter for galaxy + +* Merge pull request #282 from cgi1/patch-1. [Alexandre Dulaunoy] + + Adding virtualenv to apt-get install + +* Adding virtualenv to apt-get install. [cgi1] + +* Merge pull request #279 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [reportlab] Textual description parameter + +* Chr: Restart the modules after update. [Raphaël Vinot] + +* Fixed a bug when checking malformed BTC addresses. [Sascha Rommelfangen] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #278 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + chg: [pdfexport] Fix pdf export, by calling new PyMISP tool for Misp Event export + +* Fix [exportpdf] update parameters for links generation. [Falconieri] + +* Tidy: Remove old dead export code. [Falconieri] + +* Test 1 - PDF call. [Falconieri] + +* Print values. [Vincent-CIRCL] + +* Test update. [Vincent-CIRCL] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #276 from iwitz/patch-1. [Alexandre Dulaunoy] + + Add RHEL installation instructions + +* Add: rhel installation instructions. [iwitz] + +* Add: [doc] Added backscatter.io logo + regenerated documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #274 from 9b/master. [Alexandre Dulaunoy] + + Backscatter.io expansion module + +* Use the write var on return. [9b] + +* Stubbed module. [9b] + +* Add: New module to check if a bitcoin address has been abused. [chrisr3d] + + - Also related update of documentation + +* Sometimes server doesn't return expected values. fixed. [Sascha Rommelfangen] + +* Merge pull request #266 from MISP/pipenv. [Raphaël Vinot] + + chg: Use pipenv, update bgpranking/ipasn modules, fix imports for sigma + +* Merge pull request #259 from ruiwen/fix_redis. [Alexandre Dulaunoy] + + fix: allow redis details to be retrieved from environment variables + +* Add: [doc] link documentation to README. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #258 from HacknowledgeCH/export_nexthink. [Alexandre Dulaunoy] + + Export nexthink + +* Added 2 blank lines to comply w/ pep8. [milkmix] + +* Removed unused re module. [milkmix] + +* Added documentation. [milkmix] + +* Added domain attributes support. [milkmix] + +* Support for md5 and sha1 hashes. [milkmix] + +* First export feature: sha1 attributes nxql query. [milkmix] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Add: Added missing expansion modules in readme. [chrisr3d] + +* Add: Completed documentation for expansion modules. [chrisr3d] + +* Add: Updated more expansion documentation files. [chrisr3d] + +* Add: Added new documentation for hashdd module. [chrisr3d] + +* Add: Update to support sha1 & sha256 attributes. [chrisr3d] + +* Add: More documentation on expansion modules. [chrisr3d] + +* Add: Started filling some expansion modules documentation. [chrisr3d] + +* Add: Added yara_query module documentation, update yara_syntax_validator documentation & generated updated documentation markdown. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Add: Added test files for yara to test yara library & potentially yara syntax. [chrisr3d] + +* Add: Added imphash to input attribute types. [chrisr3d] + +* Cosmetic output change. [Sascha Rommelfangen] + +* Debug removed. [Sascha Rommelfangen] + +* API changes reflected. [Sascha Rommelfangen] + +* Merge pull request #253 from MISP/chrisr3d_patch. [Alexandre Dulaunoy] + + Validation of yara rules + +* Merge branch 'master' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #251 from MISP/rommelfs-patch-4. [Raphaël Vinot] + + bug fix regarding leftovers between runs + +* Bug fix regarding leftovers between runs. [Sascha Rommelfangen] + +* Merge pull request #250 from SteveClement/btc. [Steve Clement] + + chg: [btc] Removed simple PoC for btc expansion. + +* Merge pull request #249 from MISP/rommelfs-patch-3. [Steve Clement] + + added btc_steroids + +* Added btc_steroids. [Sascha Rommelfangen] + +* Merge pull request #248 from rommelfs/master. [Sascha Rommelfangen] + + Pull request for master + +* Added btc_steroids to the list. [Sascha Rommelfangen] + +* Initial version of a Bitcoin module. [Sascha Rommelfangen] + +* Merge pull request #247 from SteveClement/btc. [Alexandre Dulaunoy] + + new: [module] Added very simple BitCoin expansion/hover module + +* Merge pull request #245 from chrisr3d/master. [Alexandre Dulaunoy] + + YARA rules from hashes expansion module + +* Updated list of modules in readme. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: [documentation] osquery logo. [Alexandre Dulaunoy] + +* Merge pull request #241 from 0xmilkmix/doc_osqueryexport. [Alexandre Dulaunoy] + + Added basic documentation for OS query + +* Merge branch 'master' into doc_osqueryexport. [Alexandre Dulaunoy] + +* Merge pull request #240 from 0xmilkmix/support_osquery_win_named_obj. [Alexandre Dulaunoy] + + super simple support for mutexes through winbaseobj in osquery 3.3 + +* Merge branch 'master' into support_osquery_win_named_obj. [Alexandre Dulaunoy] + +* Merge pull request #242 from 0xmilkmix/module_writting. [Steve Clement] + + chg: [doc] Additional documentation for export module + +* Documentation for export module. [milkmix] + +* Super simple support for mutexes through winbaseobj in osquery 3.3. [milkmix] + +* Added basic documentation. [milkmix] + +* Merge pull request #239 from SteveClement/master. [Steve Clement] + + chg: [docs] Added some missing dependencies and instructions for virtualenv deployment + +* Merge pull request #237 from 0xmilkmix/export_osquery. [Alexandre Dulaunoy] + + Export osquery + +* Merge branch 'master' into export_osquery. [Julien Bachmann] + +* Merge pull request #232 from CodeLineFi/master. [Alexandre Dulaunoy] + + macaddres.io module - Date conversion bug fixed + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* Merge pull request #233 from chrisr3d/documentation. [Christian Studer] + + Modules documentation + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Updated documentation result file. [chrisr3d] + +* Add: Added documentation for expansion modules. [chrisr3d] + +* Add: Started adding logos on documentation for each module. [chrisr3d] + +* Renamed directory to have consistency in names. [chrisr3d] + +* Removed documentation about a module deleted from the repository. [chrisr3d] + +* Merging readme. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* First try of documentation for import & export modules. [chrisr3d] + + - Providing information about the general purpose of + the modules, their requirements, how to use them + (if there are special features), some references + about the format concerned or the vendors, and their + input and output. + - Documentation to be completed by additional fields + of documentation and / or more detailed descriptions + +* Added Documentation explanations on readme file. [chrisr3d] + +* CSV import documentation first try. [chrisr3d] + +* GoAML modules documentation first try. [chrisr3d] + +* Updated README. Added a link to the integration tutorial. [Codelinefi-admin] + +* Fixed a bug with wrong dates conversion. [Codelinefi-admin] + +* Merge branch 'vulnersCom-master' [Alexandre Dulaunoy] + +* Merge branch 'master' of https://github.com/vulnersCom/misp-modules into vulnersCom-master. [Alexandre Dulaunoy] + +* Fixed getting of the Vulners AI score. [isox] + +* Merge pull request #230 from lctrcl/master. [Alexandre Dulaunoy] + +* Merge branch 'master' into master. [lctrcl] + +* Merge pull request #229 from lctrcl/master. [Alexandre Dulaunoy] + + New vulners module added + +* HotFix: Vulners AI score. [Igor Ivanov] + +* Code cleanup and formatting. [Igor Ivanov] + +* Added exploit information. [Igor Ivanov] + +* Initial Vulners module PoC. [Igor Ivanov] + +* Merge pull request #226 from CodeLineFi/master. [Alexandre Dulaunoy] + + New macaddress.io hover module added + +* Macaddress.io hover module added. [Codelinefi-admin] + +* Merge pull request #223 from chrisr3d/master. [Christian Studer] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #222 from chrisr3d/master. [Christian Studer] + + Clean up + fix of some modules + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #221 from MISP/rommelfs-patch-2. [Alexandre Dulaunoy] + + fixed typo + +* Fixed typo. [Sascha Rommelfangen] + + via #220 + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #218 from surbo/patch-1. [Alexandre Dulaunoy] + + Update urlscan.py + +* Update urlscan.py. [SuRb0] + + Added hash to the search so you can take advantage of the new file down load function on urlscan.io. You can use this to pivot on file hashes and find out domains that hosting the same malicious file. + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #217 from threatsmyth/master. [Alexandre Dulaunoy] + + Add error handling for DNS failures, reduce imports, and simplify attribute comments + +* Merge branch 'master' into master. [David J] + +* Merge pull request #215 from threatsmyth/master. [Alexandre Dulaunoy] + + Create urlscan.py + +* Add error handling for DNS failures, reduce imports, and simplify misp_comments. [David J] + +* Create urlscan.py. [David J] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #214 from chrisr3d/chrisr3d_patch. [Alexandre Dulaunoy] + + New module to check DBL Spamhaus + +* Merge branch 'chrisr3d_patch' of github.com:chrisr3d/misp-modules. [chrisr3d] + +* Add: Added DBL spamhaus module documentation and in expansion init file. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Ta_import - bugfixes for TA 6.1. [Christophe Vandeplas] + +* Merge pull request #210 from chrisr3d/master. [Christian Studer] + + Put the report location parsing in a try/catch statement as it is an optional field + +* Merge pull request #209 from cvandeplas/master. [Christophe Vandeplas] + + ta_import - support for TheatAnalyzer 6.1 + +* Ta_import - support for TheatAnalyzer 6.1. [Christophe Vandeplas] + +* Securitytrails.com expansion module added. [Alexandre Dulaunoy] + +* Merge pull request #208 from sebdraven/dnstrails. [Alexandre Dulaunoy] + + module securitytrails + +* Merge branch 'master' into dnstrails. [sebdraven] + +* Merge pull request #206 from chrisr3d/master. [Alexandre Dulaunoy] + + Expansion module displaying SIEM signatures from a sigma rule + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* Remove the never release Python code in Travis. [Alexandre Dulaunoy] + +* Remove Python 3.4 and Python 3.7 added. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #202 from SteveClement/master. [Alexandre Dulaunoy] + + Removed test modules from view + +* - Removed test modules from view - Moved skeleton expansion module to it's proper place. [Steve Clement] + +* Merge pull request #201 from chrisr3d/master. [Alexandre Dulaunoy] + + add: STIX2 pattern syntax validator + +* Add: Experimental expansion module to display the SIEM signatures from a sigma rule. [chrisr3d] + +* Add: stix2 pattern validator requirements. [chrisr3d] + +* Add: STIX2 pattern syntax validator. [chrisr3d] + +* Merge pull request #199 from SteveClement/master. [Alexandre Dulaunoy] + + Added (Multipage) PDF support to OCR Module, minor refactor + +* - Reverted to <3.6 compatibility. [Steve Clement] + +* - Fixed log output. [Steve Clement] + +* - Forgot to import sys. [Steve Clement] + +* - Added logger functionality for debug sessions. [Steve Clement] + +* - content was already a wand.obj. [Steve Clement] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Threatanalyzer_import - order of category tuned. [Christophe Vandeplas] + +* Merge branch 'master' of github.com:SteveClement/misp-modules. [Steve Clement] + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* - Some more comments - Removed libmagic, wand can handle it better. [Steve Clement] + +* - Set tornado timeout to 300 seconds. [Steve Clement] + +* - Quick comment ToDo: Avoid using Magic in future releases. [Steve Clement] + +* - added wand requirement - fixed missing return png byte-stream - move module import to handler to catch and report errorz. [Steve Clement] + +* - fixed typo move image back in scope. [Steve Clement] + +* - Added initial PDF support, nothing is processed yet - Test to replace PIL with wand. [Steve Clement] + +* Change type of status. [Sebdraven] + +* Remove print. [Sebdraven] + +* Last commit for release. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add searching_stats. [Sebdraven] + +* Add searching_stats. [Sebdraven] + +* Correct key. [Sebdraven] + +* Correct key. [Sebdraven] + +* Correct param. [Sebdraven] + +* Add searching domains. [Sebdraven] + +* Add searching domains. [Sebdraven] + +* Add return. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add whois expand to test. [Sebdraven] + +* Add whois expand to test. [Sebdraven] + +* Correct index error. [Sebdraven] + +* Error call functions. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add status_ok to true. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct out of bound returns. [Sebdraven] + +* Correct key and return of functions. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Test whois history. [Sebdraven] + +* History whois dns. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Rename misp modules. [Sebdraven] + +* Add a test to check if the list is not empty. [Sebdraven] + +* Add a test to check if the list is not empty. [Sebdraven] + +* Add logs. [Sebdraven] + +* Debug whois. [Sebdraven] + +* Debug ipv4 or ipv6. [Sebdraven] + +* Add debug. [Sebdraven] + +* Debug. [Sebdraven] + +* Change status. [Sebdraven] + +* Change history dns. [Sebdraven] + +* Add logs to debug. [Sebdraven] + +* Correct call function. [Sebdraven] + +* Add history mx and soa. [Sebdraven] + +* Add history dns and handler exception. [Sebdraven] + +* Add history dns. [Sebdraven] + +* Switch type ip. [Sebdraven] + +* Refactoring expand_whois. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Add ipv6 and ipv4. [Sebdraven] + +* Change type. [Sebdraven] + +* Change type. [Sebdraven] + +* Change loop. [Sebdraven] + +* Add time sleep in each request. [Sebdraven] + +* Control return of records. [Sebdraven] + +* Add history ipv4. [Sebdraven] + +* Add logs. [Sebdraven] + +* Change categories. [Sebdraven] + +* Concat results. [Sebdraven] + +* Change name keys. [Sebdraven] + +* Change return value. [Sebdraven] + +* Add logs. [Sebdraven] + +* Change errors. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add expand whois. [Sebdraven] + +* Typo. [Sebdraven] + +* Add categories and comments. [Sebdraven] + +* Add expand subdomains. [Sebdraven] + +* Add expand subdomains. [Sebdraven] + +* Change categories. [Sebdraven] + +* Changes keys. [Sebdraven] + +* Add status ! [Sebdraven] + +* Add methods. [Sebdraven] + +* Add expand domains. [Sebdraven] + +* Add link pydnstrain in requirements. [Sebdraven] + +* Add new module dnstrails. [Sebdraven] + +* Merge pull request #198 from chrisr3d/master. [Alexandre Dulaunoy] + + Sigma syntax validator expansion module + some updates + +* Updated README to add sigma & some other missing modules. [chrisr3d] + +* Updated the list of modules (removed stiximport) [chrisr3d] + +* Add: Sigma syntax validator expansion module. [chrisr3d] + + --> Checks sigma rules syntax + - Updated the expansion modules list as well + - Updated the requirements list + +* Updated the list of expansion modules. [chrisr3d] + +* Corrected typos and unused imports. [milkmix] + +* Added support for scheduledtasks. [milkmix] + +* Added support for service-displayname, regkey|value. [milkmix] + +* Initial implementation supporting regkey. mutexes support waiting osquery table. [milkmix] + +* Merge pull request #197 from sebdraven/onyphe_full_module. [Alexandre Dulaunoy] + + Onyphe full module + +* Add return handle domains. [Sebdraven] + +* Add search. [Sebdraven] + +* Add domain to expand. [Sebdraven] + +* Correct bugs. [Sebdraven] + +* Add domain expansion. [Sebdraven] + +* Add comment. [Sebdraven] + +* Correct bugs. [Sebdraven] + +* Correct comments. [Sebdraven] + +* Add threat list expansion. [Sebdraven] + +* Change method to concat methods. [Sebdraven] + +* Set status after requests. [Sebdraven] + +* Set status after requests. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Pep 8. [Sebdraven] + +* Correct bug. [Sebdraven] + +* Add datascan expansion. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add forward infos. [Sebdraven] + +* Add comment of attributes. [Sebdraven] + +* Add comment of attributes. [Sebdraven] + +* Error loops. [Sebdraven] + +* Error method. [Sebdraven] + +* Error type. [Sebdraven] + +* Error keys. [Sebdraven] + +* Add expansion synscan. [Sebdraven] + +* Change key access domains. [Sebdraven] + +* Change add in results. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct error keys. [Sebdraven] + +* Test patries expansion. [Sebdraven] + +* Add onyphe full module. [Sebdraven] + +* Add onyphe full module and code the stub. [Sebdraven] + +* Merge pull request #194 from chrisr3d/master. [Alexandre Dulaunoy] + + Removed STIX1 related requirements to avoid version issues + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #193 from sebdraven/onyphe_module. [Alexandre Dulaunoy] + + Onyphe module + +* Delete vcs.xml. [sebdraven] + +* Correct codecov. [Sebdraven] + +* Pep 8 compliant. [Sebdraven] + +* Correct type of comments. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Add domains forward. [Sebdraven] + +* Add domains. [Sebdraven] + +* Add targeting os. [Sebdraven] + +* Add category for AS number. [Sebdraven] + +* Change keys. [Sebdraven] + +* Change type. [Sebdraven] + +* Add category. [Sebdraven] + +* Add as number with onyphe. [Sebdraven] + +* Add as number with onyphe. [Sebdraven] + +* Error indentation. [Sebdraven] + +* Correct key in map result. [Sebdraven] + +* Correct a bug. [Sebdraven] + +* Add pastebin url imports. [Sebdraven] + +* Add onyphe module. [Sebdraven] + +* Updated requirements to avoid version issues in the MISP packer installation script. [chrisr3d] + +* Update countrycode.py. [Andras Iklody] + +* Add: mixing modules. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #190 from chrisr3d/master. [Alexandre Dulaunoy] + + Updated csv import following our recent discussions + +* Updated delimiter finder function. [chrisr3d] + +* Add: Added user config to specify if there is a header in the csv to import. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #189 from chrisr3d/master. [Andras Iklody] + + Using userConfig to define the header instead of moduleconfig + +* Merge pull request #188 from cvandeplas/master. [Christophe Vandeplas] + + ta import - noise removal + +* Merge branch 'master' into master. [Christophe Vandeplas] + +* Merge pull request #187 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - minor generic noise removal + +* Threatanalyzer_import - minor generic noise removal. [Christophe Vandeplas] + +* Ta import - more filter for pollution. [Christophe Vandeplas] + +* Threatanalyzer_import - minor generic noise removal. [Christophe Vandeplas] + +* Merge pull request #185 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - loads sample info + pollution fix + +* Threatanalyzer_import - loads sample info + pollution fix. [Christophe Vandeplas] + +* Merge pull request #184 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - fix regkey issue + +* Threatanalyzer_import - fix regkey issue. [Christophe Vandeplas] + +* Merge pull request #177 from TheDr1ver/patch-1. [Alexandre Dulaunoy] + + fix missing comma + +* Fix missing comma. [Nick Driver] + + fix ip-dst and vulnerability input + +* Merge pull request #176 from cudeso/master. [Alexandre Dulaunoy] + + Fix VMRay API access error + +* Fix VMRay API access error. [Koen Van Impe] + + hotfix for the "Unable to access VMRay API" error + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Merge pull request #173 from m3047/master. [Alexandre Dulaunoy] + + Add exception blocks for query errors. + +* Add exception blocks for query errors. [Fred Morris] + +* Merge pull request #170 from P4rs3R/patch-1. [Alexandre Dulaunoy] + + Improving regex (validating e-mail) + +* Improving regex (validating e-mail) [x41\x43] + + Line 48: + The previous regex ` ^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$ ` matched only a small subset of valid e-mail address (e.g.: didn't match domain names longer than 3 chars or user@this-domain.de or user@multiple.level.dom) and needed to be with start (^) and end ($). + This ` [a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])? ` is not perfect (e.g: can't match oriental chars), but imho is much more complete. + + Regex tested with several e-mail addresses with Python 3.6.4 and Python 2.7.14 on Linux 4.14. + +* Merge pull request #169 from chrisr3d/master. [Alexandre Dulaunoy] + + Updated GoAML import including Object References + +* Clarified functions arguments using a class. [chrisr3d] + +* Add: Added Object References in the objects imported. [chrisr3d] + +* Merge pull request #168 from chrisr3d/goaml. [Alexandre Dulaunoy] + + GoAML import module & GoAML export updates + +* Merge branch 'master' of github.com:MISP/misp-modules into goaml. [chrisr3d] + +* Merge pull request #167 from chrisr3d/csvimport. [Alexandre Dulaunoy] + + Updated csvimport + +* Merge branch 'csvimport' of github.com:chrisr3d/misp-modules into goaml. [chrisr3d] + +* Removed print. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into csvimport. [chrisr3d] + +* Merge pull request #165 from chrisr3d/goaml. [Alexandre Dulaunoy] + + fix: Added an object checking + +* Add: added goamlimport. [chrisr3d] + +* Fixed some details about the module output. [chrisr3d] + +* Converting GoAML into MISPEvent. [chrisr3d] + +* Now parsing all the transaction attributes. [chrisr3d] + +* Add: Added dictionary to map aml types into MISP types. [chrisr3d] + +* Typo. [chrisr3d] + +* Merge branch 'master' of github.com:chrisr3d/misp-modules into aml_import. [chrisr3d] + +* Merge pull request #164 from chrisr3d/master. [Alexandre Dulaunoy] + + Latest fixes to make GoAML export module work + +* Add: Added an example file generated by GoAML export module. [chrisr3d] + +* Added GoAML export module in description. [chrisr3d] + +* Reading the entire document, to create a big dictionary containing the data, as a beginning. [chrisr3d] + +* Add: new expansion module to check hashes against hashdd.com including NSLR dataset. [Alexandre Dulaunoy] + +* Merge pull request #163 from chrisr3d/master. [Alexandre Dulaunoy] + + GoAML export + +* Typo. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Quick fix to the invalid hash types offered on all returned hashes, hopefully fixes #162. [Andras Iklody] + +* Explicit name. [chrisr3d] + + Avoiding confusion with the coming import module for goaml + +* Added "t_to" and "t_from" required fields: funds code & country. [chrisr3d] + +* Added a required field & the latest attributes in transaction. [chrisr3d] + +* Added report expected information fields. [chrisr3d] + +* Simplified ObjectReference dictionary reading. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: YARA syntax validator. [Alexandre Dulaunoy] + +* Merge pull request #161 from eCrimeLabs/ecrimelabs_dev. [Alexandre Dulaunoy] + + Added Yara syntax validation expansion module + +* Added Yara syntax validation expansion module. [Dennis Rand] + +* Added some report information. [chrisr3d] + + Also changed the ObjectReference parser to replace + all the if conditions by a dictionary reading + +* Suporting the recent objects added to misp-objects. [chrisr3d] + + - Matching the aml documents structure + - Some parts of the document still need to be added + +* Wip: added location & signatory information. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into test. [chrisr3d] + +* Merge pull request #157 from CenturyLinkCIRT/master. [Alexandre Dulaunoy] + + added csvimport to __init__.py + +* Added csvimport to __init__.py. [Thomas Gardner] + +* Add: CSV import module added. [Alexandre Dulaunoy] + +* Outputting xml format. [chrisr3d] + + Also mapping MISP and GoAML types + +* First tests for the GoAML export module. [chrisr3d] + +* Merge pull request #156 from chrisr3d/master. [Alexandre Dulaunoy] + + CSV import + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* 3.7-alpha removed. [Alexandre Dulaunoy] + +* Updated delimiter finder method. [chrisr3d] + +* Fixed data treatment & other updates. [chrisr3d] + +* Updated delimiter parsing & data reading functions. [chrisr3d] + +* First version of csv import module. [chrisr3d] + + - If more than 1 misp type is recognized, for each one an + attribute is created + + - Needs to have header set by user as parameters of the module atm + + - Review needed to see the feasibility with fields that can create + confusion and be interpreted both as misp type or attribute field + (for instance comment is a misp type and an attribute field) + +* Merge pull request #154 from cvandeplas/master. [Raphaël Vinot] + + added CrowdStrike Falcon Intel Indicators expansion module + +* Added CrowdStrike Falcon Intel Indicators expansion module. [Christophe Vandeplas] + +* Add: RBL added. [Alexandre Dulaunoy] + +* Merge pull request #150 from chrisr3d/master. [Alexandre Dulaunoy] + + RBL check module + +* Merge github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #149 from cvandeplas/master. [Alexandre Dulaunoy] + + Added ThreatAnalyzer sandbox import + +* Added ThreatAnalyzer sandbox import. [Christophe Vandeplas] + + Experimental module - some parts should be migrated to + +* Check an IPv4 address against known RBLs. [chrisr3d] + +* Fix farsight_passivedns - rdata 404 not found. [Christophe Vandeplas] + +* Added ThreatStream and PDF export. [Alexandre Dulaunoy] + +* Merge branch 'robertnixon2003-master' + a small fix. [Alexandre Dulaunoy] + +* Fix the __init__ import. [Alexandre Dulaunoy] + +* Update threatStream_misp_export.py. [Robert Nixon] + +* Updated __init__.py. [Robert Nixon] + + Added reference to new ThreatStream export module + +* Added threatStream_misp_export.py. [Robert Nixon] + +* Merge branch 'cvandeplas-master' [Alexandre Dulaunoy] + +* Fixes missing init file in dnsdb library folder. [Christophe Vandeplas] + +* New Farsight DNSDB Passive DNS expansion module. [Christophe Vandeplas] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #144 from attritionorg/patch-1. [Andras Iklody] + + minor touch-ups on error messages for user friendliness + +* Minor touch-ups on error messages for user friendliness. [Jericho] + +* Merge pull request #140 from cudeso/master. [Alexandre Dulaunoy] + + VulnDB Queries + +* VulnDB Queries. [Koen Van Impe] + + Search on CVE at https://vulndb.cyberriskanalytics.com/ + https://www.riskbasedsecurity.com/ + Get extended CVE info, links + CPE + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Add quick and dirty pdf export. [Raphaël Vinot] + +* Merge pull request #139 from Rafiot/master. [Raphaël Vinot] + + fix: OpenIOC importer + +* Merge pull request #135 from DomainTools/domaintools-patch-1. [Raphaël Vinot] + + Added code to allow 3rd party modules + +* Added default parameter for new -m flag. [Viktor von Drakk] + +* Added code to allow 3rd party modules. [Viktor von Drakk] + + The new '-m pip.module.name' feature allows a pip-installed module to be specified on the command line and then loaded into the available modules without having to copy-paste files into the appropriate directories of this package. + +* Broken links fixed. [Alexandre Dulaunoy] + +* ThreatConnect export module added. [Alexandre Dulaunoy] + +* Merge pull request #133 from CenturyLinkCIRT/master. [Alexandre Dulaunoy] + + ThreatConnect export module + +* Added threat_connect_export to export_mod.__init__ [Thomas Gardner] + +* Added test files for threat_connect_export. [Thomas Gardner] + +* Added threat_connect_export.py. [Thomas Gardner] + +* Merge pull request #129 from seamustuohy/utf_hate. [Raphaël Vinot] + + Added support for malformed internationalized email headers + +* Added support for malformed internationalized email headers. [seamus tuohy] + + When an emails contains headers that use Unicode without properly crafing + them to comform to RFC-6323 the email import module would crash. + (See issue #119 & issue #93) + + To address this I have added additional layers of encoding/decoding to + any possibly internationalized email headers. This decodes properly + formed and malformed UTF-8, UTF-16, and UTF-32 headers appropriately. + When an unknown encoding is encountered it is returned as an 'encoded-word' + per RFC2047. + + This commit also adds unit-tests that tests properly formed and malformed + UTF-8, UTF-16, UTF-32, and CJK encoded strings in all header fields; UTF-8, + UTF-16, and UTF-32 encoded message bodies; and emoji testing for headers + and attachment file names. + +* Merge branch 'master' into utf_hate. [seamus tuohy] + +* Added unit tests for UTF emails. [seamus tuohy] + +* OTX and ThreatCrowd added. [Alexandre Dulaunoy] + +* Merge pull request #130 from chrisdoman/master. [Alexandre Dulaunoy] + + Add AlienVault OTX and ThreatCrowd Expansions + +* Add AlienVault OTX and ThreatCrowd Expansions. [Chris Doman] + +* Use proper version of PyMISP. [Raphaël Vinot] + +* Update travis, fix open ioc import. [Raphaël Vinot] + +* Merge pull request #122 from truckydev/master. [Alexandre Dulaunoy] + + Add tags on import with ioc import module + +* Replace tab by space. [Tristan METAYER] + +* Add a field for user to add tag for this import. [Tristan METAYER] + +* Merge pull request #121 from truckydev/master. [Andras Iklody] + + If filename add iocfilename as attachment + +* Typo correction. [Tristan METAYER] + +* Add user config to not add file as attachement in a box. [Tristan METAYER] + +* If filename add iocfilename as attachment. [Tristan METAYER] + +* Merge pull request #118 from truckydev/master. [Alexandre Dulaunoy] + + Add indent field for export + +* Add indent field for export. [Tristan METAYER] + +* Merge pull request #115 from FloatingGhost/master. [Alexandre Dulaunoy] + + fix: Use the proper formatting method and not the horrible % one + +* Missing expansion modules added in README. [Alexandre Dulaunoy] + +* ThreatMiner added. [Alexandre Dulaunoy] + +* Merge pull request #114 from kx499/master. [Alexandre Dulaunoy] + + ThreatMiner Expansion module + +* Bug fixes. [kx499] + +* Threatminer initial commit. [kx499] + +* Cosmetic changes. [Raphaël Vinot] + +* Merge pull request #111 from kx499/master. [Raphaël Vinot] + + Handful of changes to VirusTotal module + +* Bug fixes, tweaks, and python3 learning curve :) [kx499] + +* Initial commit of IPRep module. [kx499] + +* Fixed spacing, addressed error handling for public api, added subdomains, and added context comment. [kx499] + +* OpenIOC import module added. [Alexandre Dulaunoy] + +* Add OpenIOC import module. [Raphaël Vinot] + +* Merge pull request #109 from truckydev/master. [Alexandre Dulaunoy] + + add information about offline installation + +* Add information about offline installation. [truckydev] + +* Merge pull request #106 from truckydev/master. [Alexandre Dulaunoy] + + Lite export of an event + +* Exclude internal reference. [Tristan METAYER] + +* Add lite Export module. [Tristan METAYER] + +* Merge pull request #100 from rmarsollier/master. [Alexandre Dulaunoy] + + Some improvements of virustotal plugin + +* Some improvements of virustotal plugin. [rmarsollier] + +* Merge pull request #96 from johestephan/master. [Raphaël Vinot] + + XForce Exchange v1 (alpha) + +* Passed local run check. [Joerg Stephan] + +* V1. [Joerg Stephan] + +* Removed urrlib2. [Joerg Stephan] + +* Python3 changes. [Joerg Stephan] + +* Merged xforce exchange. [Joerg Stephan] + +* XForce Exchange v1 (alpha) [Joerg Stephan] + +* Merge pull request #56 from RichieB2B/ncsc-nl/mispjson. [Alexandre Dulaunoy] + + Simple import module to import MISP JSON format + +* Updated description to reflect merging use case. [Richard van den Berg] + +* Simple import module to import MISP JSON format. [Richard van den Berg] + +* Merge pull request #92 from seamustuohy/duck_typing_failure. [Alexandre Dulaunoy] + + Email import no longer unzips major compressed text document formats. + +* Email import no longer unzips major compressed text document formats. [seamus tuohy] + + Let this commit serve as a warning about the perils of duck typing. + Word documents (docx,odt,etc) were being uncompressed when they were + attached to emails. The email importer now checks a list of well known + extensions and will not attempt to unzip them. + + It is stuck using a list of extensions instead of using file magic because + many of these formats produce an application/zip mimetype when scanned. + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #91 from Rafiot/master. [Raphaël Vinot] + + Improve email import module + +* Keep zip content as binary. [Raphaël Vinot] + +* Fix tests, cleanup. [Raphaël Vinot] + +* Improve support of email attachments. [Raphaël Vinot] + + Related to #90 + +* Merge pull request #89 from Rafiot/fix_87. [Raphaël Vinot] + + Improve VT support. + +* Standardised key checking. [Hannah Ward] + +* Fixed checking for submission_names in VT JSON. [Hannah Ward] + +* Update virustotal.py. [CheYenBzh] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Training materials updated + Cuckoo JSON import module was missing. [Alexandre Dulaunoy] + +* Improve support of email importer if headers are missing. [Raphaël Vinot] + + Fix #88 + +* Remove python 3.3 support. [Raphaël Vinot] + +* Fix python 3.6 support. [Raphaël Vinot] + +* Make PEP8 happy. [Raphaël Vinot] + +* Add email_import in the modules loaded by default. [Raphaël Vinot] + +* Make PEP8 happy. [Raphaël Vinot] + +* Fix failing test (bug in the mail parser?) [Raphaël Vinot] + +* Add additional email parsing and tests. [seamus tuohy] + + Added additional attribute parsing and corresponding unit-tests. + E-mail attachment and url extraction added in this commit. This includes + unpacking zipfiles and simple password cracking of encrypted zipfiles. + +* Fixed basic errors. [seamus tuohy] + +* Merged with current master. [seamus tuohy] + +* Merge pull request #85 from rmarsollier/master. [Raphaël Vinot] + + add libjpeg-dev as a dep to allow pillow to be installed succesfully + +* Add libjpeg-dev as a dep to allow pillow to be installed succesfully. [robin.marsollier@conix.fr] + +* GeoIP module added. [Alexandre Dulaunoy] + +* Merge pull request #84 from MISP/amuehlem-master. [Raphaël Vinot] + + Fix PR + +* Do not crash if the dat file is not available. [Raphaël Vinot] + +* Fix path to config file. [Raphaël Vinot] + +* Merge branch 'master' of https://github.com/amuehlem/misp-modules into amuehlem-master. [Raphaël Vinot] + +* Added empty line to end of config file. [Andreas Muehlemann] + +* Removed DEFAULT section from configfile. [Andreas Muehlemann] + +* Fixed more typos. [Andreas Muehlemann] + +* Fixed typo. [Andreas Muehlemann] + +* Changed configparser from python2 to python3. [Andreas Muehlemann] + +* Updated missing parenthesis. [Andreas Muehlemann] + +* Merge branch 'geoip_country' [Andreas Muehlemann] + +* Removed unneeded config option for misp. [Andreas Muehlemann] + +* Removed debug message. [Andreas Muehlemann] + +* Added config option to geoip_country.py. [Andreas Muehlemann] + +* Added pygeoip to the REQUIREMENTS list. [Andreas Muehlemann] + +* Updated geoip_country to __init__.py. [Andreas Muehlemann] + +* Added geoip_country.py. [Andreas Muehlemann] + +* Better error reporting. [Raphaël Vinot] + +* Catch exception. [Raphaël Vinot] + +* Add reverse lookup. [Raphaël Vinot] + +* Refactoring of domaintools expansion module. [Raphaël Vinot] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #83 from stoep/master. [Alexandre Dulaunoy] + + Added cuckooimport.py + +* Added cuckooimport.py. [Ubuntu] + +* DomainTools module added. [Alexandre Dulaunoy] + +* Remove domaintools tests. [Raphaël Vinot] + +* Add test for domaintools. [Raphaël Vinot] + +* Merge pull request #78 from deralexxx/patch-2. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Alexander J] + + mentioning import / export modules + +* Merge pull request #76 from deralexxx/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Alexander J] + +* Merge pull request #75 from Rafiot/domtools. [Raphaël Vinot] + + Add Domain Tools module + +* Update requirements list. [Raphaël Vinot] + +* Add domaintools to the import list. [Raphaël Vinot] + +* Fix Typo. [Raphaël Vinot] + +* Add domain profile and reputation. [Raphaël Vinot] + +* Add more comments. [Raphaël Vinot] + +* Fix typo. [Raphaël Vinot] + +* Remove json.dumps. [Raphaël Vinot] + +* Avoid passing None in comments. [Raphaël Vinot] + +* Add comments to fields when possible. [Raphaël Vinot] + +* Add initial Domain Tools module. [Raphaël Vinot] + +* Merge pull request #74 from cudeso/master. [Raphaël Vinot] + + Extra VTI detections + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Update README.md. [Raphaël Vinot] + +* Merge pull request #73 from FloatingGhost/master. [Raphaël Vinot] + + Use SpooledTemp, not NamedTemp file + +* Use git for everything we can. [Hannah Ward] + +* Ok we'll use the dep from misp-stix-converter. Surely this'll work? [Hannah Ward] + +* Use the CIRCL pymisp. Silly @rafiot ;) [Hannah Ward] + +* Travis should now use the master branch. [Hannah Ward] + +* Maybe it'll take the git repo now? [Hannah Ward] + +* Added pymisp to reqs. [Hannah Ward] + +* Don't cache anything pls travis. [Hannah Ward] + +* Removed unneeded modules. [Hannah Ward] + +* Use SpooledTemp, not NamedTemp file. [Hannah Ward] + +* VMRay import module added. [Alexandre Dulaunoy] + +* Merge pull request #72 from FloatingGhost/master. [Raphaël Vinot] + + Migrated stiximport to use misp-stix-converter + +* Moved to misp_stix_converter. [Hannah Ward] + +* Merge pull request #70 from cudeso/master. [Raphaël Vinot] + + Submit malware samples + +* Extra VTI detections. [Koen Van Impe] + +* Submit malware samples. [Koen Van Impe] + + _submit now includes malware samples (zipped content from misp) + _import checks when no vti_results are returned + bugfix + +* Fix STIX import module. [Raphaël Vinot] + +* Multiple clanges in the vmray modules. [Raphaël Vinot] + + * Generic fix to load modules requiring a local library + * Fix python3 support + * PEP8 related cleanups + +* Merge pull request #68 from cudeso/master. [Andras Iklody] + + VMRay Import & Submit module + +* VMRay Import & Submit module. [Koen Van Impe] + + * First commit + * No support for archives (yet) submit + +* Merge pull request #59 from rgraf/master. [Alexandre Dulaunoy] + + label replaced by text, which is existing attribute + +* Label replaced by text, which is existing attribute. [Roman Graf] + +* Adding basic test mockup. [seamus tuohy] + +* Adding more steps to module testing. [seamus tuohy] + +* Added attachment and url support. [seamus tuohy] + +* Added email meta-data import module. [seamus tuohy] + + This email meta-data import module collects basic meta-data from an e-mail + and populates an event with it. It populates the email subject, source + addresses, destination addresses, subject, and any attachment file names. + This commit also contains unit-tests for this module as well as updates to + the readme. Readme updates are additions aimed to make it easier for + outsiders to build modules. + +* Merge pull request #58 from rgraf/master. [Alexandre Dulaunoy] + + Added expansion for Wikidata. + +* Added expansion for Wikidata. Analyst can query Wikidata by label to get additional information for particular term. [Roman Graf] + +* Merge pull request #55 from amuehlem/reversedns. [Raphaël Vinot] + + added new module reversedns.py, added reversedns to __init__.py + +* Added new module reversedns.py, added reversedns to __init__.py. [Andreas Muehlemann] + +* Merge pull request #53 from MISP/Rafiot-patch-1. [Alexandre Dulaunoy] + + Dump host info as text + +* Dump host info as text. [Raphaël Vinot] + +* Fix typo. [Raphaël Vinot] + +* Merge pull request #52 from Rafiot/master. [Alexandre Dulaunoy] + + Add simple Shodan module + +* Add simple Shodan module. [Raphaël Vinot] + +* Merge pull request #49 from FloatingGhost/master. [Alexandre Dulaunoy] + + Removed useless pickle storage of stiximport + +* Removed useless pickle storage of stiximport. [Hannah Ward] + +* Create LICENSE. [Alexandre Dulaunoy] + +* Update README.md. [Andras Iklody] + +* Typo fixed. [Alexandre Dulaunoy] + +* CEF export module added. [Alexandre Dulaunoy] + +* Cef_export module added. [Alexandre Dulaunoy] + +* Merge pull request #47 from FloatingGhost/CEF_Export. [Alexandre Dulaunoy] + + CEF export, fixes in CountryCode, virustotal + +* Removed silly subdomain module. [Hannah Ward] + +* Added CEF export module. [Hannah Ward] + +* Now searches within observable_compositions. [Hannah Ward] + +* Removed calls to print. [Hannah Ward] + +* Added body.json to gitignore. [Hannah Ward] + +* Added virustotal tests. [Hannah Ward] + +* CountryCode JSON now is only grabbed once per server run. [Hannah Ward] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #46 from Rafiot/master. [Raphaël Vinot] + + Make misp-modules really asynchronous + +* Add timeout for the modules, cleanup. [Raphaël Vinot] + +* Fix python 3.3 and 3.4. [Raphaël Vinot] + +* Make misp-modules really asynchronous. [Raphaël Vinot] + +* Improve tornado parallel. [Raphaël Vinot] + +* Coroutine decorator added to post handler. [Alexandre Dulaunoy] + +* -d option added - enabling debug on queried modules. [Alexandre Dulaunoy] + +* New modules added to __init__ [Alexandre Dulaunoy] + +* README updated for the new modules. [Alexandre Dulaunoy] + +* Merge pull request #45 from FloatingGhost/master. [Alexandre Dulaunoy] + + 2 new modules -- VirusTotal and CountryCode + +* Modified readme with virustotal/countrycode. [Hannah Ward] + +* Added virustotal module. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Merge pull request #44 from Rafiot/travis. [Alexandre Dulaunoy] + + Add coverage, update logging + +* Add coverage, update logging. [Raphaël Vinot] + +* Merge pull request #43 from FloatingGhost/master. [Alexandre Dulaunoy] + + StixImport now uses TemporaryFile rather than a named file in /tmp + +* Improved virustotal module. [Hannah Ward] + +* Added countrycode, working on virustotal. [Hannah Ward] + +* Added lookup by country code. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Fix a link to the STIX import module reference. [Alexandre Dulaunoy] + +* Stiximport now uses temporary files to store stix data. [Hannah Ward] + + Set max size in config, in bytes + +* Merge pull request #42 from MISP/pr/41. [Alexandre Dulaunoy] + + Cleanup on the stix import module + +* Merge remote-tracking branch 'origin/master' into pr/41. [Raphaël Vinot] + +* Add info about the import modules. [Alexandre Dulaunoy] + +* Make PEP8 happy \o/ [Raphaël Vinot] + +* Move stiximport.py to misp_modules/modules/import_mod/ [Raphaël Vinot] + +* There was a missing comma. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #40 from Rafiot/master. [Alexandre Dulaunoy] + + Remove bin script, use cleaner way. Fix last commit. + +* Remove bin script, use cleaner way. Fix last commit. [Raphaël Vinot] + +* Merge pull request #39 from Rafiot/master. [Alexandre Dulaunoy] + + Use entry_points instead of scripts in the install. + +* Use entry_points instead of scripts. [Raphaël Vinot] + +* Pip --upgrade must be always called (to have modules updated) [Alexandre Dulaunoy] + +* Added STIX to setup.py. [Hannah Ward] + +* Added STIX to reqs. [Hannah Ward] + +* Merge branch 'stix_import' [Hannah Ward] + +* Added tests, also disregards related_observables. Because they're useless. [Hannah Ward] + +* Fixed observables within an indicator not being added. [Hannah Ward] + +* Stiximport will now consume campaigns. [Hannah Ward] + +* Stiximport will now identify file hashes. [Hannah Ward] + +* I can't spell. [Hannah Ward] + +* Added STIXImport to readme. [Hannah Ward] + +* Threat actors now get imported by stix. [Hannah Ward] + +* Added docs to stiximport. [Hannah Ward] + +* Added stix import -- works for IPs/Domains. [Hannah Ward] + +* Update to the DNS module to support domain|ip. [iglocska] + +* Small change to the skeleton export. [iglocska] + +* Merge remote-tracking branch 'origin/import-test' [iglocska] + +* Added test export module. [Iglocska] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #37 from Rafiot/master. [Raphaël Vinot] + + Update documentation. + +* Update documentation. [Raphaël Vinot] + + Fix https://github.com/MISP/MISP/issues/1424 + +* Merge branch 'import-test' of github.com:MISP/misp-modules into import-test. [Alexandre Dulaunoy] + +* Merge pull request #36 from Rafiot/import-test. [Alexandre Dulaunoy] + + Pass the server port as integer to the uwhois client + +* Pass the server port as integer to the uwhois client. [Raphaël Vinot] + +* Merge pull request #35 from Rafiot/import-test. [Alexandre Dulaunoy] + + Add whois module + +* Add whois module. [Raphaël Vinot] + +* First version of an Optical Character Recognition (OCR) module for MISP. [Alexandre Dulaunoy] + +* First version of the import skeleton. [Iglocska] + +* Added simple import skeleton. [Iglocska] + +* Merge pull request #33 from Rafiot/master. [Raphaël Vinot] + + fix: run the server as "python3 misp-modules" + +* Added category to the return format description. [Iglocska] + +* Merge pull request #31 from treyka/patch-1. [Alexandre Dulaunoy] + + Refine the installation procedure + +* Refine the installation procedure. [Trey Darley] + + Tweak this to make it more inline with the MISP installation docs, start misp-modules at startup via /etc/rc.local + +* Install documentation updated. [Alexandre Dulaunoy] + +* Merge pull request #28 from Rafiot/pip. [Alexandre Dulaunoy] + + Make it a package + +* Also run travis tests on the system-wide instance. [Raphaël Vinot] + +* Fix typos in the readme. [Raphaël Vinot] + +* Fix travis. [Raphaël Vinot] + +* Make sure misp-modules can be launched from anywhere. [Raphaël Vinot] + +* Proper testcases. [Raphaël Vinot] + +* Make it a package. [Raphaël Vinot] + +* Merge pull request #29 from iglocska/master. [Alexandre Dulaunoy] + + Added skeleton structure for new modules + +* Added skeleton structure for new modules. [Iglocska] + +* Fixed a bug introduced by previous commit if started from the current directory. [Alexandre Dulaunoy] + +* Merge pull request #26 from Rafiot/master. [Alexandre Dulaunoy] + + Automatic chdir when the modules are started + +* Automatic chdir when the modules are started. [Raphaël Vinot] + +* Merge pull request #25 from eu-pi/eupi_expansion_fix. [Alexandre Dulaunoy] + + [EUPI] Fix expansion for empty EUPI response + +* [EUPI] Fix expansion for empty EUPI response. [Rogdham] + + Offer no enrichment instead of displaying an error message + +* Merge pull request #24 from eu-pi/eupi_hover. [Alexandre Dulaunoy] + + [EUPI] Change module for a simple hover status + +* [EUPI] Simplify hover. [Rogdham] + +* Merge pull request #23 from Rafiot/master. [Raphaël Vinot] + + [EUPI] Return error message if unknown + +* [EUPI] Return error message is unknown. [Raphaël Vinot] + +* Merge pull request #22 from Rafiot/master. [Raphaël Vinot] + + [EUPI] Do not return empty results + +* [EUPI] Do not return empty results. [Raphaël Vinot] + +* ASN History added. [Alexandre Dulaunoy] + +* Merge pull request #21 from Rafiot/master. [Raphaël Vinot] + + [ASN description] Fix input type + +* [ASN description] Fix input type. [Raphaël Vinot] + +* Merge pull request #20 from Rafiot/master. [Raphaël Vinot] + + Add ASN Description expansion module + +* Add ASN Description expansion module. [Raphaël Vinot] + +* Merge pull request #19 from Rafiot/master. [Raphaël Vinot] + + Fix last commit + +* Fix last commit. [Raphaël Vinot] + +* Merge pull request #18 from Rafiot/master. [Raphaël Vinot] + + Improve rendering of IP ASN + +* Improve rendering of IP ASN. [Raphaël Vinot] + +* Merge pull request #17 from Rafiot/master. [Raphaël Vinot] + + Fix again IPASN module + +* Fix again IPASN module. [Raphaël Vinot] + +* Merge pull request #16 from Rafiot/master. [Raphaël Vinot] + + Fix IPASN module + +* Fix IPASN module. [Raphaël Vinot] + +* Ipasn module added. [Alexandre Dulaunoy] + +* Merge pull request #15 from Rafiot/master. [Alexandre Dulaunoy] + + Add IPASN history module + +* Add IPASN history module. [Raphaël Vinot] + +* Merge pull request #14 from eu-pi/listen-addr. [Alexandre Dulaunoy] + + Add option to specify listen address + +* Add option to specify listen address. [Rogdham] + +* EUPI module added. [Alexandre Dulaunoy] + +* Merge pull request #13 from Rafiot/master. [Raphaël Vinot] + + Fix eupi module + +* Fix eupi module. [Raphaël Vinot] + +* Merge pull request #12 from Rafiot/master. [Raphaël Vinot] + + Add EUPI module + +* Add redis server. [Raphaël Vinot] + +* Add EUPI module. [Raphaël Vinot] + +* Skip modules that cannot import. [Alexandre Dulaunoy] + +* Skip dot files. [Alexandre Dulaunoy] + +* Value is not required. [Alexandre Dulaunoy] + +* Cache helper added. [Alexandre Dulaunoy] + + The cache helper is a simple helper to cache data + in Redis back-end. The format in the cache is the following: + m::sha1(key) -> value. Default expiration is 86400 seconds. + +* Skeleton for misp-modules helpers added. [Alexandre Dulaunoy] + + Helpers will support modules with basic functionalities + like caching or alike. + +* Option -p added to specify the TCP port of the misp-modules server. [Alexandre Dulaunoy] + +* Intelmq req. removed. [Alexandre Dulaunoy] + +* Argparse used for the test mode. [Alexandre Dulaunoy] + +* Deleted. [Alexandre Dulaunoy] + +* Intelmq is an experimental module (not production ready) [Alexandre Dulaunoy] + +* Merge pull request #11 from Rafiot/master. [Raphaël Vinot] + + Fix test mode + +* Fix test mode. [Raphaël Vinot] + +* Fix install commands. [Raphaël Vinot] + +* Add Travis logo. [Raphaël Vinot] + +* Merge pull request #10 from Rafiot/travis. [Raphaël Vinot] + + Add basic travis file + +* Add basic travis file. [Raphaël Vinot] + +* Merge pull request #9 from Rafiot/master. [Alexandre Dulaunoy] + + Please PEP8 on all expansions + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #8 from aaronkaplan/master. [Alexandre Dulaunoy] + + initial example of intelmq connector/enrichtment. Need to change to u… + +* Initial example of intelmq connector/enrichtment. Need to change to use the eventDB RESTful API, not the postgresql DB. [aaronkaplan] + +* Update README.md. [Raphaël Vinot] + +* Dns module test with option added. [Alexandre Dulaunoy] + +* New modules added. [Alexandre Dulaunoy] + +* Dns MISP module - option to specify nameserver added. [Alexandre Dulaunoy] + +* Slides reference added. [Alexandre Dulaunoy] + +* Add missing requirements. [Alexandre Dulaunoy] + +* Merge pull request #7 from Rafiot/master. [Alexandre Dulaunoy] + + Make loader more flexible + +* Make PEP8 happy. [Raphaël Vinot] + +* Add CIRCL pssl module. [Raphaël Vinot] + +* Make loader more flexible. [Raphaël Vinot] + +* First module to test the freetext import functionality. [Alexandre Dulaunoy] + +* CIRCL Passive DNS output attributes updated. [Alexandre Dulaunoy] + +* PyPDNS requirement added. [Alexandre Dulaunoy] + +* CIRCL Passive DNS added. [Alexandre Dulaunoy] + +* Tests updated to include CIRCL passive dns. [Alexandre Dulaunoy] + +* Test file for passivetotal updated. [Alexandre Dulaunoy] + +* Merge pull request #5 from passivetotal/master. [Alexandre Dulaunoy] + + Rewrote the entire PassiveTotal extension + +* Rewrote the entire PassiveTotal extension. [Brandon Dixon] + +* Return a text attribute for an hover only module. [Alexandre Dulaunoy] + +* How to start MISP modules. [Alexandre Dulaunoy] + +* 2.4.28 includes misp modules by default. [Alexandre Dulaunoy] + +* Types are now described. [Alexandre Dulaunoy] + +* Debug removed. [Alexandre Dulaunoy] + +* Convert the base64 to ascii. [Iglocska] + +* Module-type added as default. [Alexandre Dulaunoy] + +* Return base64 value of the archived data. [Alexandre Dulaunoy] + +* Merge pull request #2 from iglocska/master. [Alexandre Dulaunoy] + + Some changes to the sourcecache expansion + +* Merge branch 'alternate_response' [Iglocska] + +* Some changes to the sourcecache expansion. [Iglocska] + + - return attachment or malware sample + +* Cve module tests added. [Alexandre Dulaunoy] + +* CVE hover expansion module. [Alexandre Dulaunoy] + + An hover module is a module returning a JSON that can be used + as hover element in the MISP UI. + +* Sourcecache module includes the metadata config. [Alexandre Dulaunoy] + +* README updated to reflect config parameters changes. [Alexandre Dulaunoy] + +* Removed unused attributes. [Alexandre Dulaunoy] + +* Sample JSON files reflecting config changes. [Alexandre Dulaunoy] + +* Config parameters are now exposed via the meta information. [Alexandre Dulaunoy] + + config uses a specific list of values exposed via the + introspection of the module. config is now passed as an additional + dictionary to the request. MISP attributes include only MISP attributes. + +* Sourcecache module added. [Alexandre Dulaunoy] + +* A minimal caching module added to cache link or url from MISP. [Alexandre Dulaunoy] + +* Typo fixed + meta output. [Alexandre Dulaunoy] + +* Minimal functions requirements updated + PR request. [Alexandre Dulaunoy] + +* Exclude dot files from modules list to be loaded. [Alexandre Dulaunoy] + +* Example of module introspection including meta information. [Alexandre Dulaunoy] + +* Module meta added to return version, description and author per module. [Alexandre Dulaunoy] + +* Authentication notes added. [Alexandre Dulaunoy] + +* Passivetotal module added. [Alexandre Dulaunoy] + +* First version of a passivetotal MISP expansion module. [Alexandre Dulaunoy] + +* Default DNS updated. [Alexandre Dulaunoy] + +* Add a note regarding error codes. [Alexandre Dulaunoy] + +* Handling of error added. [Alexandre Dulaunoy] + +* Merge pull request #1 from Rafiot/master. [Alexandre Dulaunoy] + + Make PEP8 happy. + +* Make PEP8 happy. [Raphaël Vinot] + +* Output updated (type of module added) [Alexandre Dulaunoy] + +* Add a version per default. [Alexandre Dulaunoy] + +* Add type per module. [Alexandre Dulaunoy] + +* Format updated following Andras updates. [Alexandre Dulaunoy] + +* Default var directory added. [Alexandre Dulaunoy] + +* Python pip REQUIREMENTS file added. [Alexandre Dulaunoy] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Iglocska] + +* Minimal logging added to the server. [Alexandre Dulaunoy] + +* Debug messages removed. [Alexandre Dulaunoy] + +* Minimal documentation added. [Alexandre Dulaunoy] + +* Curl is now silent. [Alexandre Dulaunoy] + +* Changed the output format to include all matching attribute types. [Iglocska] + + - changed the output format to give us a bit more flexibility + - return an array of results + - return the valid misp attribute types for each result + +* Basic test cases added. [Alexandre Dulaunoy] + +* MISP dns expansion module. [Alexandre Dulaunoy] + +* First version of a web services to provide ReST API to MISP expansion services. [Alexandre Dulaunoy] + + From e99caf75f1039f0412b86806ddc9096e52cbe5d5 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 09:49:20 +0200 Subject: [PATCH 202/476] fix: [doc] Travis button was on the old master branch fix: [doc] Travis button was on the old master branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab6d34d..8d970d5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MISP modules -[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=master)](https://travis-ci.org/MISP/misp-modules) +[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=main)](https://travis-ci.org/MISP/misp-modules) [![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=master)](https://coveralls.io/github/MISP/misp-modules?branch=master) [![codecov](https://codecov.io/gh/MISP/misp-modules/branch/master/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) From 8d814b9b252df70125a1e69825db7d0deb1370ec Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 10:22:10 +0200 Subject: [PATCH 203/476] fix: [doc] build script --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 1cff13f..b946a35 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,12 @@ .PHONY: prepare_docs generate_docs ci_generate_docs test_docs prepare_docs: - cd doc; python generate_documentation.py + cd documentation; python3 generate_documentation.py mkdir -p docs/expansion/logos docs/export_mod/logos docs/import_mod/logos - cp -R doc/logos/* docs/expansion/logos - cp -R doc/logos/* docs/export_mod/logos - cp -R doc/logos/* docs/import_mod/logos - cp LICENSE docs/license.md + cd documentation; cp -R ./logos/* ../docs/expansion/logos + cd documentation; cp -R ./logos/* ../docs/export_mod/logos + cd documentation; cp -R ./logos/* ../docs/import_mod/logos + cp LICENSE ../docs/license.md install_requirements: pip install -r docs/REQUIREMENTS.txt From ce63706ff012042a1164a4be20b602f714c766bb Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 10:27:45 +0200 Subject: [PATCH 204/476] chg: [doc] fix path of mkdocs output --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index b946a35..2d07388 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,12 @@ prepare_docs: cd documentation; python3 generate_documentation.py mkdir -p docs/expansion/logos docs/export_mod/logos docs/import_mod/logos + mkdir -p docs/logos + cd documentation; cp -R ./logos/* ../docs/logos cd documentation; cp -R ./logos/* ../docs/expansion/logos cd documentation; cp -R ./logos/* ../docs/export_mod/logos cd documentation; cp -R ./logos/* ../docs/import_mod/logos + cp ./documentation/mkdocs/*.md ./docs cp LICENSE ../docs/license.md install_requirements: From 99646eebb1b258b06a948fc9afc62c5092b8152f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 10:34:40 +0200 Subject: [PATCH 205/476] chg: [doc] README cleanup and historical stuff removed --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8d970d5..3d21bef 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ # MISP modules [![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=main)](https://travis-ci.org/MISP/misp-modules) -[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=master)](https://coveralls.io/github/MISP/misp-modules?branch=master) -[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/master/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) +[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=main)](https://coveralls.io/github/MISP/misp-modules?branch=main) +[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/main/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) -MISP modules are autonomous modules that can be used for expansion and other services in [MISP](https://github.com/MISP/MISP). +MISP modules are autonomous modules that can be used to extend [MISP](https://github.com/MISP/MISP) for new services such as expansion, import and export. The modules are written in Python 3 following a simple API interface. The objective is to ease the extensions of MISP functionalities without modifying core components. The API is available via a simple REST API which is independent from MISP installation or configuration. -MISP modules support is included in MISP starting from version 2.4.28. - -For more information: [Extending MISP with Python modules](https://www.misp-project.org/misp-training/3.1-misp-modules.pdf) slides from MISP training. +For more information: [Extending MISP with Python modules](https://www.misp-project.org/misp-training/3.1-misp-modules.pdf) slides from [MISP training](https://github.com/MISP/misp-training). ## Existing MISP modules From 6cd99c03e481d1db51bca8b57283d2c2439d1aee Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 10:46:07 +0200 Subject: [PATCH 206/476] Update yeti.py refactoring and add Url neighboors --- misp_modules/modules/expansion/yeti.py | 43 +++++++++++++++++--------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 1028f0c..05909d9 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -70,38 +70,53 @@ class Yeti(): values = [] types = [] for obs_to_add in self.get_neighboors(obs['id']): - object_misp = self.get_object(obs_to_add) - if object_misp: - self.misp_event.add_object(object_misp) - + object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) + if object_misp_domain_ip: + self.misp_event.add_object(object_misp_domain_ip) + object_misp_url = self.__get_object_url(obs_to_add) + if object_misp_url: + self.misp_event.add_object(object_misp_url) def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} - print('results %s'% results) + print('results %s' % results) return results - def get_object(self, obj_to_add): + def __get_object_domain_ip(self, obj_to_add): if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - domain_ip_object.add_attribute('ip', self.attribute['value']) + domain_ip_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + self.attribute['value']) domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') return domain_ip_object - def __get_relation(self, obj_yeti): - typ_attribute = self.misp_mapping[obj_yeti['type']] - attr_misp = {'value': obj_yeti['value']} - if typ_attribute == 'ip-src' or typ_attribute == 'ip-dst': + def __get_object_url(self, obj_to_add): + if obj_to_add['type'] == 'Url': + url_object = MISPObject('Url') + url_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) + url_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + self.attribute['value']) + url_object.add_reference(self.attribute['uuid'], 'related_to') + return url_object + + def __get_relation(self, obj, is_yeti_object=True): + if is_yeti_object: + type_attribute = self.misp_mapping[obj['type']] + else: + type_attribute = obj['type'] + if type_attribute == 'ip-src' or type_attribute == 'ip-dst': return 'ip' - elif 'domain' == typ_attribute: + elif 'domain' == type_attribute: return 'domain' - elif 'hostname' == typ_attribute: + elif 'hostname' == type_attribute: return 'domain' - return attr_misp + elif type_attribute == 'url': + return type_attribute def handler(q=False): From 69a5584dfea5d0c912720445eaaad74afcb6d3a6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:00:55 +0200 Subject: [PATCH 207/476] Update yeti.py add relation --- misp_modules/modules/expansion/yeti.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 05909d9..756464a 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -84,7 +84,7 @@ class Yeti(): return results def __get_object_domain_ip(self, obj_to_add): - if (obj_to_add['type'] == 'Ip' and self.attribute in ['hostname','domain']) or\ + if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), @@ -96,10 +96,12 @@ class Yeti(): return domain_ip_object def __get_object_url(self, obj_to_add): - if obj_to_add['type'] == 'Url': + if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dest']) or ( + obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' + ): url_object = MISPObject('Url') url_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - url_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + url_object.add_attribute(self.__get_relation(self.attribute), self.attribute['value']) url_object.add_reference(self.attribute['uuid'], 'related_to') return url_object @@ -116,7 +118,7 @@ class Yeti(): elif 'hostname' == type_attribute: return 'domain' elif type_attribute == 'url': - return type_attribute + return 'Url' def handler(q=False): From 07f54c1b8681451360749b64da5aefa90e89f132 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:03:39 +0200 Subject: [PATCH 208/476] Update yeti.py correct typo --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 756464a..75af573 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -96,7 +96,7 @@ class Yeti(): return domain_ip_object def __get_object_url(self, obj_to_add): - if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dest']) or ( + if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dst']) or ( obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' ): url_object = MISPObject('Url') From af01db860ae27551f18ce70675c1f6e4407d519b Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:05:16 +0200 Subject: [PATCH 209/476] Update yeti.py add log --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 75af573..6a86e82 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -104,6 +104,7 @@ class Yeti(): url_object.add_attribute(self.__get_relation(self.attribute), self.attribute['value']) url_object.add_reference(self.attribute['uuid'], 'related_to') + print(url_object) return url_object def __get_relation(self, obj, is_yeti_object=True): From d4a8c88ad337453df106b05f4df39ba0a81cb3d2 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 19 Apr 2021 11:05:22 +0200 Subject: [PATCH 210/476] chg: [doc] Makefile fixed --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2d07388..b37670e 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ prepare_docs: cd documentation; cp -R ./logos/* ../docs/export_mod/logos cd documentation; cp -R ./logos/* ../docs/import_mod/logos cp ./documentation/mkdocs/*.md ./docs - cp LICENSE ../docs/license.md + cp LICENSE ./docs/license.md install_requirements: pip install -r docs/REQUIREMENTS.txt From be212097a759cb6e39a2ca763921dc144b8f19a1 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:08:21 +0200 Subject: [PATCH 211/476] Update yeti.py add log --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 6a86e82..55c5fe0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -112,6 +112,7 @@ class Yeti(): type_attribute = self.misp_mapping[obj['type']] else: type_attribute = obj['type'] + print(type_attribute) if type_attribute == 'ip-src' or type_attribute == 'ip-dst': return 'ip' elif 'domain' == type_attribute: From 4634567b23df811df185c37937674e890be50433 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:09:38 +0200 Subject: [PATCH 212/476] Update yeti.py correct bug --- misp_modules/modules/expansion/yeti.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 55c5fe0..82a20d5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -112,7 +112,6 @@ class Yeti(): type_attribute = self.misp_mapping[obj['type']] else: type_attribute = obj['type'] - print(type_attribute) if type_attribute == 'ip-src' or type_attribute == 'ip-dst': return 'ip' elif 'domain' == type_attribute: @@ -120,7 +119,7 @@ class Yeti(): elif 'hostname' == type_attribute: return 'domain' elif type_attribute == 'url': - return 'Url' + return type_attribute def handler(q=False): From a29779eff6f758d2f22ecd3bc5395f85bd9f6b8e Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:24:01 +0200 Subject: [PATCH 213/476] Update yeti.py add check --- misp_modules/modules/expansion/yeti.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 82a20d5..ed4d02d 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -100,9 +100,16 @@ class Yeti(): obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' ): url_object = MISPObject('Url') - url_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) - url_object.add_attribute(self.__get_relation(self.attribute), + obj_relation = self.__get_relation(obj_to_add) + if obj_relation: + print(obj_relation) + url_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) + obj_relation = self.__get_relation(self.attribute) + if obj_relation: + print(obj_relation) + url_object.add_attribute(self.__get_relation(self.attribute), self.attribute['value']) + url_object.add_reference(self.attribute['uuid'], 'related_to') print(url_object) return url_object From 559533ea783e57b25015e3283f24f6a48a85e874 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:25:50 +0200 Subject: [PATCH 214/476] Update yeti.py try test --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ed4d02d..ab840b5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -103,7 +103,7 @@ class Yeti(): obj_relation = self.__get_relation(obj_to_add) if obj_relation: print(obj_relation) - url_object.add_attribute(self.__get_relation(obj_to_add), obj_to_add['value']) + url_object.add_attribute('url', obj_to_add['value']) obj_relation = self.__get_relation(self.attribute) if obj_relation: print(obj_relation) From 8a24ed7fd6549ac8d7849d1337fa203db7014cdc Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:27:33 +0200 Subject: [PATCH 215/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ab840b5..f8ebe36 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -103,6 +103,7 @@ class Yeti(): obj_relation = self.__get_relation(obj_to_add) if obj_relation: print(obj_relation) + print(obj_to_add['value']) url_object.add_attribute('url', obj_to_add['value']) obj_relation = self.__get_relation(self.attribute) if obj_relation: From e3fc3a3f38609b53e0af3a91589e811ac89f286e Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:47:06 +0200 Subject: [PATCH 216/476] Update yeti.py test --- misp_modules/modules/expansion/yeti.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f8ebe36..b53f653 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,9 +73,9 @@ class Yeti(): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) - object_misp_url = self.__get_object_url(obs_to_add) - if object_misp_url: - self.misp_event.add_object(object_misp_url) + # object_misp_url = self.__get_object_url(obs_to_add) + # if object_misp_url: + # self.misp_event.add_object(object_misp_url) def get_result(self): event = json.loads(self.misp_event.to_json()) From ef6596637df513fd3c59b1d45916a41a4e82506f Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 11:49:24 +0200 Subject: [PATCH 217/476] Update yeti.py remove tests --- misp_modules/modules/expansion/yeti.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index b53f653..f044f76 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -73,9 +73,9 @@ class Yeti(): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) - # object_misp_url = self.__get_object_url(obs_to_add) - # if object_misp_url: - # self.misp_event.add_object(object_misp_url) + object_misp_url = self.__get_object_url(obs_to_add) + if object_misp_url: + self.misp_event.add_object(object_misp_url) def get_result(self): event = json.loads(self.misp_event.to_json()) @@ -104,7 +104,7 @@ class Yeti(): if obj_relation: print(obj_relation) print(obj_to_add['value']) - url_object.add_attribute('url', obj_to_add['value']) + url_object.add_attribute(obj_relation, obj_to_add['value']) obj_relation = self.__get_relation(self.attribute) if obj_relation: print(obj_relation) From 53cc15adcda0986ad50f19cee58dce52d9910463 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 12:12:32 +0200 Subject: [PATCH 218/476] Update yeti.py remove print --- misp_modules/modules/expansion/yeti.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f044f76..2f4afa6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -102,12 +102,9 @@ class Yeti(): url_object = MISPObject('Url') obj_relation = self.__get_relation(obj_to_add) if obj_relation: - print(obj_relation) - print(obj_to_add['value']) url_object.add_attribute(obj_relation, obj_to_add['value']) obj_relation = self.__get_relation(self.attribute) if obj_relation: - print(obj_relation) url_object.add_attribute(self.__get_relation(self.attribute), self.attribute['value']) From 1e98f1d5752632bfdda81a4aae503dce3c0e27fb Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 12:20:25 +0200 Subject: [PATCH 219/476] Update yeti.py try typo --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 2f4afa6..1d2c99e 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -99,7 +99,7 @@ class Yeti(): if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dst']) or ( obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' ): - url_object = MISPObject('Url') + url_object = MISPObject('url') obj_relation = self.__get_relation(obj_to_add) if obj_relation: url_object.add_attribute(obj_relation, obj_to_add['value']) From 0da40b34eeca5b63af0753dcc314ae2fed660fda Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 13:45:29 +0200 Subject: [PATCH 220/476] Update yeti.py add param --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 1d2c99e..96de599 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -105,8 +105,8 @@ class Yeti(): url_object.add_attribute(obj_relation, obj_to_add['value']) obj_relation = self.__get_relation(self.attribute) if obj_relation: - url_object.add_attribute(self.__get_relation(self.attribute), - self.attribute['value']) + url_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + self.attribute['value']) url_object.add_reference(self.attribute['uuid'], 'related_to') print(url_object) From b46a3a8885169218498701ce0b1620e9a7ae307e Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 13:47:45 +0200 Subject: [PATCH 221/476] Update yeti.py fix bugs key error --- misp_modules/modules/expansion/yeti.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 96de599..c0004b0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -103,11 +103,10 @@ class Yeti(): obj_relation = self.__get_relation(obj_to_add) if obj_relation: url_object.add_attribute(obj_relation, obj_to_add['value']) - obj_relation = self.__get_relation(self.attribute) + obj_relation = self.__get_relation(self.attribute, is_yeti_object=False) if obj_relation: - url_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + url_object.add_attribute(obj_relation, self.attribute['value']) - url_object.add_reference(self.attribute['uuid'], 'related_to') print(url_object) return url_object From 5e6aec4162238ba909b97aa550aac0b7f6d4b37d Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 13:49:02 +0200 Subject: [PATCH 222/476] Update yeti.py remove print debug --- misp_modules/modules/expansion/yeti.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c0004b0..c8ed0dd 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -80,7 +80,6 @@ class Yeti(): def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} - print('results %s' % results) return results def __get_object_domain_ip(self, obj_to_add): @@ -108,7 +107,7 @@ class Yeti(): url_object.add_attribute(obj_relation, self.attribute['value']) url_object.add_reference(self.attribute['uuid'], 'related_to') - print(url_object) + return url_object def __get_relation(self, obj, is_yeti_object=True): From 21b52dda155e7dd9a64e9d3e69b422699d350468 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 17:10:47 +0200 Subject: [PATCH 223/476] Update yeti.py add related observable and AS --- misp_modules/modules/expansion/yeti.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c8ed0dd..bc2b107 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -1,11 +1,12 @@ import json +import logging try: import pyeti except ImportError: print("pyeti module not installed.") -from pymisp import MISPEvent, MISPObject +from pymisp import MISPEvent, MISPObject, MISPAttribute misperrors = {'error': 'Error'} @@ -23,7 +24,8 @@ moduleconfig = ['apikey', 'url'] class Yeti(): def __init__(self, url, key,attribute): - self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url'} + self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url', + 'AutonomousSystem': 'AS'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) self.attribute = attribute self.misp_event = MISPEvent() @@ -76,12 +78,27 @@ class Yeti(): object_misp_url = self.__get_object_url(obs_to_add) if object_misp_url: self.misp_event.add_object(object_misp_url) + if not object_misp_url and not object_misp_url: + attr = self.__get_attribute(obs_to_add) + if attr: + self.misp_event.add_attribute(attr.type, attr.value, tags=attr.tags) def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} return results + def __get_attribute(self, obs_to_add): + attr = MISPAttribute() + attr.value = obs_to_add['value'] + try: + attr.type = self.misp_mapping[obs_to_add['type']] + except KeyError: + logging.error('type not found %s' % obs_to_add['type']) + return + attr.tags.extend([t['name'] for t in obs_to_add['tags']]) + return attr + def __get_object_domain_ip(self, obj_to_add): if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname','domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): From ee7c06579551f89296d60a1929357d637d5c9389 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 17:16:59 +0200 Subject: [PATCH 224/476] Update yeti.py change tags method --- misp_modules/modules/expansion/yeti.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index bc2b107..a719270 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -96,7 +96,9 @@ class Yeti(): except KeyError: logging.error('type not found %s' % obs_to_add['type']) return - attr.tags.extend([t['name'] for t in obs_to_add['tags']]) + + for t in obs_to_add['tags']: + attr.tags.append(t['name']) return attr def __get_object_domain_ip(self, obj_to_add): From f7ca8bf140d3b43f7c284edfcb1c1b18ec5d36a9 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 17:19:23 +0200 Subject: [PATCH 225/476] Update yeti.py test tags --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index a719270..18a900b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -81,7 +81,7 @@ class Yeti(): if not object_misp_url and not object_misp_url: attr = self.__get_attribute(obs_to_add) if attr: - self.misp_event.add_attribute(attr.type, attr.value, tags=attr.tags) + self.misp_event.add_attribute(attr.type, attr.value, tags=['test','toto']) def get_result(self): event = json.loads(self.misp_event.to_json()) From 43672ee9a95a18fb72eb816e0b2ce5e386c6d7e6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 17:20:13 +0200 Subject: [PATCH 226/476] Update yeti.py remove tag --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 18a900b..841dcc0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -81,7 +81,7 @@ class Yeti(): if not object_misp_url and not object_misp_url: attr = self.__get_attribute(obs_to_add) if attr: - self.misp_event.add_attribute(attr.type, attr.value, tags=['test','toto']) + self.misp_event.add_attribute(attr.type, attr.value) def get_result(self): event = json.loads(self.misp_event.to_json()) From 5d80b79bc499a6bbd407d7196751ee48ed3cacae Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Mon, 19 Apr 2021 17:55:29 +0200 Subject: [PATCH 227/476] Update yeti.py add tags for attribute --- misp_modules/modules/expansion/yeti.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 841dcc0..08ae8b9 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -79,27 +79,24 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) if not object_misp_url and not object_misp_url: - attr = self.__get_attribute(obs_to_add) - if attr: - self.misp_event.add_attribute(attr.type, attr.value) - + self.__get_attribute(obs_to_add) + def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} return results def __get_attribute(self, obs_to_add): - attr = MISPAttribute() - attr.value = obs_to_add['value'] + try: - attr.type = self.misp_mapping[obs_to_add['type']] + type_attr = self.misp_mapping[obs_to_add['type']] + attr = self.misp_event.add_attribute(value=obs_to_add['value'], type=type_attr) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return for t in obs_to_add['tags']: - attr.tags.append(t['name']) - return attr + self.misp_event.add_attribute_tag(t['name'], attr['uuid']) def __get_object_domain_ip(self, obj_to_add): if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname','domain']) or\ From 8ea3d5c5c7a5e6e7c281347f01915fdfcfd4acdb Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 10:41:44 +0200 Subject: [PATCH 228/476] Update yeti.py add file to add in attribute --- misp_modules/modules/expansion/yeti.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 08ae8b9..ecb647f 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -25,7 +25,7 @@ class Yeti(): def __init__(self, url, key,attribute): self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url', - 'AutonomousSystem': 'AS'} + 'AutonomousSystem': 'AS', 'File': 'sha256'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) self.attribute = attribute self.misp_event = MISPEvent() @@ -80,7 +80,7 @@ class Yeti(): self.misp_event.add_object(object_misp_url) if not object_misp_url and not object_misp_url: self.__get_attribute(obs_to_add) - + def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} @@ -90,7 +90,12 @@ class Yeti(): try: type_attr = self.misp_mapping[obs_to_add['type']] - attr = self.misp_event.add_attribute(value=obs_to_add['value'], type=type_attr) + value = None + if obs_to_add['type'] == 'File': + value = obs_to_add['value'].split(':')[1] + else: + value = obs_to_add['value'] + attr = self.misp_event.add_attribute(value=value, type=type_attr) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return From 385af28a0ad62e5e945dc36f8db0f77349aa3ff5 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:07:06 +0200 Subject: [PATCH 229/476] Update yeti.py add descripton --- misp_modules/modules/expansion/yeti.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index ecb647f..a27f5eb 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -39,8 +39,10 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: + links_by_id = {link['id']: link['description'] for link in neighboors['links']} + for n in neighboors['objs']: - yield n + yield n, links_by_id[n['id']] def get_tags(self, value): obs = self.search(value) @@ -71,7 +73,7 @@ class Yeti(): obs = self.search(self.attribute['value']) values = [] types = [] - for obs_to_add in self.get_neighboors(obs['id']): + for obs_to_add, link in self.get_neighboors(obs['id']): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) @@ -79,14 +81,14 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) if not object_misp_url and not object_misp_url: - self.__get_attribute(obs_to_add) + self.__get_attribute(obs_to_add, link) def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} return results - def __get_attribute(self, obs_to_add): + def __get_attribute(self, obs_to_add, link): try: type_attr = self.misp_mapping[obs_to_add['type']] @@ -96,6 +98,7 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) + attr.comment = '%s of %s' % (link, self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return From 1a67f8ed96c971c9c9c2f21b7c3187718bcdf7f6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:08:59 +0200 Subject: [PATCH 230/476] Update yeti.py add log --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index a27f5eb..9212470 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -40,7 +40,7 @@ class Yeti(): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: links_by_id = {link['id']: link['description'] for link in neighboors['links']} - + print(links_by_id) for n in neighboors['objs']: yield n, links_by_id[n['id']] From abba63f32fcae805a674c0ff5a703f17f6568745 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:17:17 +0200 Subject: [PATCH 231/476] Update yeti.py add test of id --- misp_modules/modules/expansion/yeti.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 9212470..093c30b 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -40,9 +40,8 @@ class Yeti(): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: links_by_id = {link['id']: link['description'] for link in neighboors['links']} - print(links_by_id) for n in neighboors['objs']: - yield n, links_by_id[n['id']] + yield n, links_by_id def get_tags(self, value): obs = self.search(value) @@ -73,7 +72,7 @@ class Yeti(): obs = self.search(self.attribute['value']) values = [] types = [] - for obs_to_add, link in self.get_neighboors(obs['id']): + for obs_to_add, links in self.get_neighboors(obs['id']): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) @@ -81,14 +80,14 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) if not object_misp_url and not object_misp_url: - self.__get_attribute(obs_to_add, link) + self.__get_attribute(obs_to_add, links) def get_result(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object')} return results - def __get_attribute(self, obs_to_add, link): + def __get_attribute(self, obs_to_add, links): try: type_attr = self.misp_mapping[obs_to_add['type']] @@ -98,7 +97,8 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) - attr.comment = '%s of %s' % (link, self.attribute['value']) + if obs_to_add['id'] in links: + attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return From 507e56228f03efae5628bf15975f41faa36fb49c Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:19:43 +0200 Subject: [PATCH 232/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 093c30b..07a87bd 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -98,6 +98,7 @@ class Yeti(): value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) if obs_to_add['id'] in links: + print('%s of %s' % (links[obs_to_add['id']], self.attribute['value'])) attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) From 37867f89eea61d6236aca0a9730cd57ff8e48d23 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:21:56 +0200 Subject: [PATCH 233/476] Update yeti.py add logs --- misp_modules/modules/expansion/yeti.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 07a87bd..215456d 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -97,8 +97,9 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) + print(links) + print(obs_to_add['id']) if obs_to_add['id'] in links: - print('%s of %s' % (links[obs_to_add['id']], self.attribute['value'])) attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) From 9cb1a83e5432b158ed73964742392e936405c192 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:24:34 +0200 Subject: [PATCH 234/476] Update yeti.py fix bug about id --- misp_modules/modules/expansion/yeti.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 215456d..f90d22a 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -41,7 +41,7 @@ class Yeti(): if neighboors and 'objs' in neighboors: links_by_id = {link['id']: link['description'] for link in neighboors['links']} for n in neighboors['objs']: - yield n, links_by_id + yield n, links_by_id[n['id']] def get_tags(self, value): obs = self.search(value) @@ -72,7 +72,7 @@ class Yeti(): obs = self.search(self.attribute['value']) values = [] types = [] - for obs_to_add, links in self.get_neighboors(obs['id']): + for obs_to_add, link in self.get_neighboors(obs['id']): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) @@ -80,7 +80,7 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) if not object_misp_url and not object_misp_url: - self.__get_attribute(obs_to_add, links) + self.__get_attribute(obs_to_add, link) def get_result(self): event = json.loads(self.misp_event.to_json()) @@ -97,8 +97,6 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) - print(links) - print(obs_to_add['id']) if obs_to_add['id'] in links: attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) except KeyError: From a2741e8eb701c502fef4dac8e5adb67f1f8514ce Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:30:22 +0200 Subject: [PATCH 235/476] Update yeti.py fix keyerror --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index f90d22a..fb2aa88 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -39,7 +39,7 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: - links_by_id = {link['id']: link['description'] for link in neighboors['links']} + links_by_id = {link['dst']['id']: link['description'] for link in neighboors['links']} for n in neighboors['objs']: yield n, links_by_id[n['id']] From f7012560083ffc2975948d50be795f502094f092 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:33:46 +0200 Subject: [PATCH 236/476] Update yeti.py add src --- misp_modules/modules/expansion/yeti.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index fb2aa88..672f76a 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -40,6 +40,7 @@ class Yeti(): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: links_by_id = {link['dst']['id']: link['description'] for link in neighboors['links']} + links_by_id.update({link['src']['id']: link['description'] for link in neighboors['links']}) for n in neighboors['objs']: yield n, links_by_id[n['id']] From e0506ee31e3e6fbe013320ff6e35d165fed17cec Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:40:01 +0200 Subject: [PATCH 237/476] Update yeti.py filter by id --- misp_modules/modules/expansion/yeti.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 672f76a..87fe1f8 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -39,8 +39,11 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: - links_by_id = {link['dst']['id']: link['description'] for link in neighboors['links']} - links_by_id.update({link['src']['id']: link['description'] for link in neighboors['links']}) + links_by_id = {link['dst']['id']: link['description'] for link in neighboors['links'] + if link['dst']['id'] != obs_id} + links_by_id.update({link['src']['id']: link['description'] for link in neighboors['links'] + if link['src']['id'] != obs_id}) + for n in neighboors['objs']: yield n, links_by_id[n['id']] From e037c4c767c6926e29382116e8cf3945dca8d955 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:42:49 +0200 Subject: [PATCH 238/476] Update yeti.py remove tests --- misp_modules/modules/expansion/yeti.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 87fe1f8..fd9cb52 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -101,8 +101,7 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) - if obs_to_add['id'] in links: - attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) + attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return From bb1cd7c4de4b312ca426a155801ea39ac619d2f4 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 12:43:43 +0200 Subject: [PATCH 239/476] Update yeti.py fix bug --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index fd9cb52..bd59bc5 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -91,7 +91,7 @@ class Yeti(): results = {key: event[key] for key in ('Attribute', 'Object')} return results - def __get_attribute(self, obs_to_add, links): + def __get_attribute(self, obs_to_add, link): try: type_attr = self.misp_mapping[obs_to_add['type']] @@ -101,7 +101,7 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) - attr.comment = '%s of %s' % (links[obs_to_add['id']], self.attribute['value']) + attr.comment = '%s of %s' % (link, self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return From cec06ed26d89bd11f2c961e2cf001f20eb3372f5 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 13:38:45 +0200 Subject: [PATCH 240/476] Update yeti.py change loop --- misp_modules/modules/expansion/yeti.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index bd59bc5..c60c6a6 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -80,11 +80,13 @@ class Yeti(): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: self.misp_event.add_object(object_misp_domain_ip) + continue object_misp_url = self.__get_object_url(obs_to_add) if object_misp_url: self.misp_event.add_object(object_misp_url) - if not object_misp_url and not object_misp_url: - self.__get_attribute(obs_to_add, link) + continue + + self.__get_attribute(obs_to_add, link) def get_result(self): event = json.loads(self.misp_event.to_json()) From baaaa81ec36177e006840709839b27078a2060b1 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 13:53:06 +0200 Subject: [PATCH 241/476] Update yeti.py add ns_record object --- misp_modules/modules/expansion/yeti.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index c60c6a6..9ae29c7 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -23,7 +23,7 @@ moduleconfig = ['apikey', 'url'] class Yeti(): - def __init__(self, url, key,attribute): + def __init__(self, url, key, attribute): self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url', 'AutonomousSystem': 'AS', 'File': 'sha256'} self.yeti_client = pyeti.YetiApi(url=url, api_key=key) @@ -85,7 +85,10 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) continue - + if link == 'NS record': + object_ns_record = self.__get_object_ns_record(obs_to_add) + self.misp_event.add_object(object_ns_record) + continue self.__get_attribute(obs_to_add, link) def get_result(self): @@ -139,6 +142,15 @@ class Yeti(): return url_object + def __get_object_ns_record(self, obj_to_add): + object_dns_record = MISPObject('dns-record') + + object_dns_record.add_attribute(self.attribute['value'], 'queried_domain') + object_dns_record.add_attribute(obj_to_add['value', 'ns-record']) + object_dns_record.add_reference(self.attribute['uuid'], 'related_to') + + return object_dns_record + def __get_relation(self, obj, is_yeti_object=True): if is_yeti_object: type_attribute = self.misp_mapping[obj['type']] From dfa46b551a0c56c9788c45ee7dd460254a390391 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 13:55:36 +0200 Subject: [PATCH 242/476] Update yeti.py change params --- misp_modules/modules/expansion/yeti.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 9ae29c7..7dddf2e 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -145,8 +145,8 @@ class Yeti(): def __get_object_ns_record(self, obj_to_add): object_dns_record = MISPObject('dns-record') - object_dns_record.add_attribute(self.attribute['value'], 'queried_domain') - object_dns_record.add_attribute(obj_to_add['value', 'ns-record']) + object_dns_record.add_attribute('queried_domain', self.attribute['value']) + object_dns_record.add_attribute('ns-record', obj_to_add['value']) object_dns_record.add_reference(self.attribute['uuid'], 'related_to') return object_dns_record From fd76e55093b0644e00e4cae215cdebfb99f72b66 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 13:56:45 +0200 Subject: [PATCH 243/476] Update yeti.py fix typo --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 7dddf2e..1288838 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -145,7 +145,7 @@ class Yeti(): def __get_object_ns_record(self, obj_to_add): object_dns_record = MISPObject('dns-record') - object_dns_record.add_attribute('queried_domain', self.attribute['value']) + object_dns_record.add_attribute('queried-domain', self.attribute['value']) object_dns_record.add_attribute('ns-record', obj_to_add['value']) object_dns_record.add_reference(self.attribute['uuid'], 'related_to') From 3426ad13c5de981bf50dd8c58277e44517ec875e Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 14:05:51 +0200 Subject: [PATCH 244/476] Update yeti.py fix edges --- misp_modules/modules/expansion/yeti.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 1288838..e7ee859 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -39,9 +39,9 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: - links_by_id = {link['dst']['id']: link['description'] for link in neighboors['links'] + links_by_id = {link['dst']['id']: (link['description'],'dst') for link in neighboors['links'] if link['dst']['id'] != obs_id} - links_by_id.update({link['src']['id']: link['description'] for link in neighboors['links'] + links_by_id.update({link['src']['id']: (link['description'], 'src') for link in neighboors['links'] if link['src']['id'] != obs_id}) for n in neighboors['objs']: @@ -85,11 +85,11 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) continue - if link == 'NS record': + if link[0] == 'NS record' and link[1] == 'dst': object_ns_record = self.__get_object_ns_record(obs_to_add) self.misp_event.add_object(object_ns_record) continue - self.__get_attribute(obs_to_add, link) + self.__get_attribute(obs_to_add, link[0]) def get_result(self): event = json.loads(self.misp_event.to_json()) @@ -115,7 +115,7 @@ class Yeti(): self.misp_event.add_attribute_tag(t['name'], attr['uuid']) def __get_object_domain_ip(self, obj_to_add): - if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname','domain']) or\ + if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname', 'domain']) or\ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), From 26bc02617f64c9c23483023ccfcef4010cae4420 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 14:08:31 +0200 Subject: [PATCH 245/476] Update yeti.py add test to create result --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index e7ee859..eea593e 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -93,7 +93,7 @@ class Yeti(): def get_result(self): event = json.loads(self.misp_event.to_json()) - results = {key: event[key] for key in ('Attribute', 'Object')} + results = {key: event[key] for key in ('Attribute', 'Object') if key in event} return results def __get_attribute(self, obs_to_add, link): From 8683c9e5cec8efe077e84e55c69957e539a270b5 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 14:13:16 +0200 Subject: [PATCH 246/476] Update yeti.py add ns record dst and src link --- misp_modules/modules/expansion/yeti.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index eea593e..d048faf 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -85,8 +85,8 @@ class Yeti(): if object_misp_url: self.misp_event.add_object(object_misp_url) continue - if link[0] == 'NS record' and link[1] == 'dst': - object_ns_record = self.__get_object_ns_record(obs_to_add) + if link[0] == 'NS record': + object_ns_record = self.__get_object_ns_record(obs_to_add, link[1]) self.misp_event.add_object(object_ns_record) continue self.__get_attribute(obs_to_add, link[0]) @@ -142,11 +142,17 @@ class Yeti(): return url_object - def __get_object_ns_record(self, obj_to_add): + def __get_object_ns_record(self, obj_to_add, link): object_dns_record = MISPObject('dns-record') + if link == 'dst': + queried_domain = self.attribute['value'] + ns_domain = obj_to_add['value'] + elif link =='src': + queried_domain = obj_to_add['value'] + ns_domain = self.attribute['value'] - object_dns_record.add_attribute('queried-domain', self.attribute['value']) - object_dns_record.add_attribute('ns-record', obj_to_add['value']) + object_dns_record.add_attribute('queried-domain', queried_domain) + object_dns_record.add_attribute('ns-record', ns_domain) object_dns_record.add_reference(self.attribute['uuid'], 'related_to') return object_dns_record From 7e5238e8be3fcdbf4ea861d9e839100d968c2d7f Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Tue, 20 Apr 2021 14:35:18 +0200 Subject: [PATCH 247/476] Update yeti.py add tests --- misp_modules/modules/expansion/yeti.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index d048faf..758b560 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -87,8 +87,9 @@ class Yeti(): continue if link[0] == 'NS record': object_ns_record = self.__get_object_ns_record(obs_to_add, link[1]) - self.misp_event.add_object(object_ns_record) - continue + if object_ns_record: + self.misp_event.add_object(object_ns_record) + continue self.__get_attribute(obs_to_add, link[0]) def get_result(self): @@ -106,7 +107,7 @@ class Yeti(): else: value = obs_to_add['value'] attr = self.misp_event.add_attribute(value=value, type=type_attr) - attr.comment = '%s of %s' % (link, self.attribute['value']) + attr.comment = '%s: %s' % (link, self.attribute['value']) except KeyError: logging.error('type not found %s' % obs_to_add['type']) return @@ -143,6 +144,8 @@ class Yeti(): return url_object def __get_object_ns_record(self, obj_to_add, link): + queried_domain = None + ns_domain = None object_dns_record = MISPObject('dns-record') if link == 'dst': queried_domain = self.attribute['value'] @@ -150,12 +153,12 @@ class Yeti(): elif link =='src': queried_domain = obj_to_add['value'] ns_domain = self.attribute['value'] + if queried_domain and ns_domain: + object_dns_record.add_attribute('queried-domain', queried_domain) + object_dns_record.add_attribute('ns-record', ns_domain) + object_dns_record.add_reference(self.attribute['uuid'], 'related_to') - object_dns_record.add_attribute('queried-domain', queried_domain) - object_dns_record.add_attribute('ns-record', ns_domain) - object_dns_record.add_reference(self.attribute['uuid'], 'related_to') - - return object_dns_record + return object_dns_record def __get_relation(self, obj, is_yeti_object=True): if is_yeti_object: From a277cbb8bfa199830d4ddad5cf8865d585759203 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 14:45:07 +0200 Subject: [PATCH 248/476] Update yeti.py add input --- misp_modules/modules/expansion/yeti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 758b560..4ec92d0 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -10,7 +10,7 @@ from pymisp import MISPEvent, MISPObject, MISPAttribute misperrors = {'error': 'Error'} -mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], +mispattributes = {'input': ['AS', 'ip-src', 'ip-dst', 'hostname', 'domain', 'sha256', 'sha1', 'md5', 'url'], 'format': 'misp_standard' } # possible module-types: 'expansion', 'hover' or both From a76978d6c64c8024ccec410e5d2ba09efec5cb36 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 15:40:46 +0200 Subject: [PATCH 249/476] Update yeti.py remove tags and entity --- misp_modules/modules/expansion/yeti.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 4ec92d0..6ef597e 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -47,31 +47,6 @@ class Yeti(): for n in neighboors['objs']: yield n, links_by_id[n['id']] - def get_tags(self, value): - obs = self.search(value) - if obs: - for t in obs['tags']: - yield t - - def get_entity(self, obs_id): - companies = self.yeti_client.observable_to_company(obs_id) - actors = self.yeti_client.observable_to_actor(obs_id) - campaigns = self.yeti_client.observable_to_campaign(obs_id) - exploit_kit = self.yeti_client.observable_to_exploitkit(obs_id) - exploit = self.yeti_client.observable_to_exploit(obs_id) - ind = self.yeti_client.observable_to_indicator(obs_id) - - res = [] - res.extend(companies) - res.extend(actors) - res.extend(campaigns) - res.extend(exploit) - res.extend(exploit_kit) - res.extend(ind) - - for r in res: - yield r['name'] - def parse_yeti_result(self): obs = self.search(self.attribute['value']) values = [] From 1b9d47dd3328222982040d848b6c4f70f1499f73 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 15:41:20 +0200 Subject: [PATCH 250/476] Update yeti.py pep 8 compliant --- misp_modules/modules/expansion/yeti.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 6ef597e..efb781d 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -39,7 +39,7 @@ class Yeti(): def get_neighboors(self, obs_id): neighboors = self.yeti_client.neighbors_observables(obs_id) if neighboors and 'objs' in neighboors: - links_by_id = {link['dst']['id']: (link['description'],'dst') for link in neighboors['links'] + links_by_id = {link['dst']['id']: (link['description'], 'dst') for link in neighboors['links'] if link['dst']['id'] != obs_id} links_by_id.update({link['src']['id']: (link['description'], 'src') for link in neighboors['links'] if link['src']['id'] != obs_id}) @@ -91,7 +91,7 @@ class Yeti(): self.misp_event.add_attribute_tag(t['name'], attr['uuid']) def __get_object_domain_ip(self, obj_to_add): - if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname', 'domain']) or\ + if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname', 'domain']) or \ (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): domain_ip_object = MISPObject('domain-ip') domain_ip_object.add_attribute(self.__get_relation(obj_to_add), @@ -104,7 +104,7 @@ class Yeti(): def __get_object_url(self, obj_to_add): if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dst']) or ( - obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' + obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' ): url_object = MISPObject('url') obj_relation = self.__get_relation(obj_to_add) @@ -125,7 +125,7 @@ class Yeti(): if link == 'dst': queried_domain = self.attribute['value'] ns_domain = obj_to_add['value'] - elif link =='src': + elif link == 'src': queried_domain = obj_to_add['value'] ns_domain = self.attribute['value'] if queried_domain and ns_domain: @@ -178,10 +178,10 @@ def handler(q=False): return misperrors - def version(): moduleinfo['config'] = moduleconfig return moduleinfo + def introspection(): - return mispattributes \ No newline at end of file + return mispattributes From da9d6a7dfd2f7acb623621311851ea8f154b8834 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 17:34:40 +0200 Subject: [PATCH 251/476] Create yeti.json add doc --- doc/expansion/yeti.json | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/expansion/yeti.json diff --git a/doc/expansion/yeti.json b/doc/expansion/yeti.json new file mode 100644 index 0000000..3ec7789 --- /dev/null +++ b/doc/expansion/yeti.json @@ -0,0 +1,9 @@ +{ + "description": "Module to process a query on Yeti.", + "logo": "", + "requirements": ["pyeti", "API key "], + "input": "A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute.", + "output": "MISP attributes and objects fetched from the Yeti instances.", + "references": ["https://github.com/yeti-platform/yeti", "https://github.com/sebdraven/pyeti"], + "features": "This module add context and links between observables using yeti" +} From abac4cfab76c722c1eb307225443d908fee3bb48 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 17:51:22 +0200 Subject: [PATCH 252/476] remove import unused and add package in requirements --- REQUIREMENTS | 3 ++- misp_modules/modules/expansion/yeti.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 3abe64c..d76a7b4 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -44,7 +44,7 @@ importlib-metadata==1.6.0 ; python_version < '3.8' isodate==0.6.0 jbxapi==3.4.0 jsonschema==3.2.0 -lief==0.10.0 +lief==0.10.1 lxml==4.5.0 maclookup==1.0.3 maxminddb==1.5.2 @@ -107,6 +107,7 @@ websocket-client==0.57.0 wrapt==1.12.1 xlrd==1.2.0 xlsxwriter==1.2.8 +pyeti-python3=1.0 yara-python==3.8.1 yarl==1.4.2 zipp==3.1.0 diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index efb781d..9136b26 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -6,7 +6,7 @@ try: except ImportError: print("pyeti module not installed.") -from pymisp import MISPEvent, MISPObject, MISPAttribute +from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} From 9f5a4be9d7d98d3d11341e77f1dda002fbb7471c Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 17:54:01 +0200 Subject: [PATCH 253/476] remove variable unused --- misp_modules/modules/expansion/yeti.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index 9136b26..d16f355 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -49,8 +49,7 @@ class Yeti(): def parse_yeti_result(self): obs = self.search(self.attribute['value']) - values = [] - types = [] + for obs_to_add, link in self.get_neighboors(obs['id']): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: From 7ab2e099f43ea077cc850a60a0792046a75db622 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Wed, 21 Apr 2021 18:15:16 +0200 Subject: [PATCH 254/476] fix typo --- REQUIREMENTS | 2 +- misp_modules/modules/expansion/yeti.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index d76a7b4..7541f90 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -107,7 +107,7 @@ websocket-client==0.57.0 wrapt==1.12.1 xlrd==1.2.0 xlsxwriter==1.2.8 -pyeti-python3=1.0 +pyeti-python3==1.0 yara-python==3.8.1 yarl==1.4.2 zipp==3.1.0 diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py index d16f355..3eeea95 100644 --- a/misp_modules/modules/expansion/yeti.py +++ b/misp_modules/modules/expansion/yeti.py @@ -49,7 +49,7 @@ class Yeti(): def parse_yeti_result(self): obs = self.search(self.attribute['value']) - + for obs_to_add, link in self.get_neighboors(obs['id']): object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) if object_misp_domain_ip: From cb091cdbdb4c6171dd45f04d27275e2bc492d7dd Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Thu, 22 Apr 2021 11:45:43 +0200 Subject: [PATCH 255/476] add pyeti package --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index ba5b5e5..34c15f3 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -106,6 +106,7 @@ python-socketio[client]==5.0.4 python-utils==2.5.2 pytz==2019.3 pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +pyeti-python3==1.0.0 pyzbar==0.1.8 pyzipper==0.3.4; python_version >= '3.5' rdflib==5.0.0 From 4448bb324b947f003fb5cad61d1f27eceeec81ea Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 22 Apr 2021 12:45:26 +0200 Subject: [PATCH 256/476] new: [logo] yeti logo added --- documentation/logos/yeti.png | Bin 0 -> 316869 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/logos/yeti.png diff --git a/documentation/logos/yeti.png b/documentation/logos/yeti.png new file mode 100644 index 0000000000000000000000000000000000000000..46b77da03276ec116a72ba63767a330ee255ff18 GIT binary patch literal 316869 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 N&zPLY=AXhv{vZCp1fBo@ literal 114641 zcmXtA2|UyP|M%;wQmI^JMP!av?)xT;+?xBAv)nCL?h-XoC1?Xr4vV(Ch-=diINk#!rNX=Jx{{ z8o5*&8rH{|%`gSvH_kZd+=J2_QGdKc7bXGUIqR#Xr+#+s%oRp48ILQqw}HP*qXktl ze)?m1$}iQ)B2f7c#X9AQ=MAeYzlRo1DZH8w;1^W>drqsPN=N(hL5JYen@=n6K0Za8 zVqk)_F}rvm*jIjpCnJuzW`l+MS+!Kvv1NN9Y4`*I;>1#0k(b`P=blLvuCri3gg-bzP zbo)=(yPdh97D#g~lR9LvtE&a7?nPl!OHog&mKlYu|JrYyv48Dj%bOc5&@X9X zQi2q~W!Y9tk^HRw!+Gvyn_bTPs0zISp4~>Dr4FX?zvuGQ&rf{SOa;u0TImHEJbMXwh{UG<=I78M5Gdc2BSRsMHw%uW?;@~ZpWW&*@KjPXzON_v}y$kjL8v)5$t$G*>N zv$^6RdTa37lvzVieMP=OEyTcE=LZwaBsR_as{`)D zIWQ-xLd6(+&%Pv8igrD>i=0i)`9f(eCdo*j%OzdxZ0w+%*(*-g9`KvG^Iq^G^@;T7 z{_Uy#XArlE$!&TyHKV$$SmU)uhbrIFQb^A|*wa=4{+??Eva-ehY1_-F(*4}CRiyvi z;$+dLgIbVp$=b3hb6GF%c<|Vay+;Si@-qN<7ieg<)&9*{>XY^rIdNaL+i!J(+Hv?n zki24|ZgzI>qCS(V?uEfyEb6!W;&MeW->RLGtU_N$GO$G3+dZ~Tc51pF^)uTg@6gJ7 z<^Uryz_y3BCBSzX8R6jCTeu|Q!vL=YYkUMa=JvdozNMyj3 zD^d?yFVNq|rF6vutV%bVc^Tw*AVP;~$r?0)vmgAZEahjbv&_eOHN-x;+fK4R-tBuA z{++UWB~vw9dbxK-W~PFM^jD)!5e0(8z&brv;2f6|CRJj^@AEG@E?UvJJjm~sgTsqF zzwVe|%gb@a0ri$;Ewhkf1{i{Xrfx=j$iK}vj2Z3JcGd!Gp_0-IveNsBL%Idxh3hg( z7N+yel6pfw?;CBa!P$KXlr3?LSNz=ekD$7sz;;}VDsukx5E~u1Hv4$#O#hZH^Tq9H zIV8>$!h*GD$@T;-c28KZSo3M&V;-r(Sagsd1UXa7H*T@|zN2ifhJhUa_7P4qp2MV? z@5rCyk|8PpkvIcqe=?{x82Cx{GVM7o(E>3oQ{LFyNS=~vo+6|`36kgbS(8I?E?RDI zYzz-qWbH0xlv9I;(XlpJ`Kvkkf1Ev4GjMBe%;GM3dUQ&EuP43ys2E2c+e2sHgNBr} zr%=~FLvymFk4GF4uraBk1^NvSKKZoX1^t-WUk-SEg>i`in}{z+kkKP-bo+9EjupC{ zRh1#Zaqx72)*Br}6GGI$LEr(Br3Gwdk~AKgDjI-kD6c2p=6f zd#1!*kT|c!7|+sCGo>_oJ!2<;eK1fLYRjTt=T+!)+i^KOklha5+9<=RVW0FZh+2mp z=%~$HqHf2%vgBu`!+xQ`Rn|&V^<*DeR@QWsUwSTNs}U!SkcpoYp>I)$w}Os1AxDtT zO}tu$STdyqZQC##JpF_rdQ>K!jprkO|C0s<*`+6g>J8Z3u!>usMJ%({C}Aox*6qTR zdJA$^2df3HZ?ZJ2J%sLM`QQ8P|Kr@Cx-BX{H@8?_4;zPaPC*tK!(gKxEb0~5cs)u}e_ufB z#dE7Mzk`U7s;BP@+#WJIwg9E(#+Oj(VZ~~Oh)cD;KVd9^FFGD5#eZ%AC2jp`Zc7oZ zpIoZNA9yv8n_u`dYBWQ2W(oVD?Z77W;G`7 zseICh8_o6}I6uW6P|~BitO36B^Vb|%)M4z=9buU9(J~hj>y-cA%ZM(remm!P#zRYL ztz^H=&`5o+KQVesrVg;ixtf^h<0KBMigXv1kURt0$hXOtR&>OKR2f*oOsd-m(S(>Y z|KV(WGY>r#;=N6b$);F|RksE!vT4om<^50Z^KKg3B_!iA7!wCUHAYKsZ6GKngckFQ z=fR~jvoaR{kfsp?aTP z-JYdKPYZd6r^}%M+m??b5x&lC`*%vLe)BCev9OH~8G021;iD~k>9nB8C5oAM63d_0 zQLn?g4V~{W5EUei=n4fO!TeY_J1Z|HF0S~;^0TVVDAu$3^_z-Acw+M)#o6M}zRs|z zia-)%fIXue@84p?zbQgWMhBV;y!lZ&l)9weS3G<+P9Ths)S|XOM^Dx2o(`OyQ115o z#&gce;g2{k5+$hNv`Xd6m@|#aoR_tbnsi+KaSG1qV^wLoi>bO&0lMrxEweJy`5%7| zCZi-A1)pE;{Ps6=_0H@pF`F1_h^=i|X*{Uc3%xHu-Kb&OlY-?DSd!cy<)C%>)Dgl% z=;(`+SYWurGLIfsEYEhRPtji&`kr_Zb+$bCKgaKW=>;|faxDetUY9RI&kvoS4GZy+ z`zWY4R$UtF&}0on?^D9%!BM{hh5q^gF$_HzdGE$&am*LLERBZIuXEPee%Fv5q?XGH{K z*+wLjeSfqgQ#X9nVP55?sNfeJ?+lW~(T?VM18K#Z8x861<+MYMzHt3!nO<|_)2j9O_sn1M~a40br%Bh}9 zb>t{5{xK(rSBi~!n`pu&uAu;=6uRQB@obrRZ_g1ov!~ND($V&l-#sMuW#VPuukJGb zd`HvP10pdFgB_Q}G!`hMq)oANa^hJ7*(utE28@}j4#-*~Z0-DSu8(Z!s}?Y?>y0aI z5c-}_S6~t}GdCaIKCYcs(OH^rNHV5v=B?pMc8yTe`LoxW;meTVnjSd&(-$2aTwUJ0 zTFnKpim7oA39q=hr<{!NNjpxosS>G5535jaekaF)ciCqaqBJBiV06Vq&tqgA3S-%5 znKFYE@2=pznyy_r#$XwA$Hzf4J~AkOq|m&!#{WTAD#eIp;eSmbKYM}VdW*lWR-pf- zq6drWWAJrg?AE!B@KVU{gv_wjG0VE@FHMhT!>%8GQ?aWSLH5r3x;i+Rfg&kb-vbBv zL>VoIuY8!=&9H0SbP)%8Ta%jt;9Xb)_8P^XT7PG5p49UPMwaKeH=hJLn2y$+O-F6A z;Po>*KsxM$^`Z#TxVhA)>wa{f@HqF zb6|gVMw`rm1)=W}2j<{(W0r0w#KnW3Fi>>LwC{mmf(yb#t@bT-+;QW7xvan;^~_Fo z#r&)88u5wc7gsC-Yh5i0wUEB!L!9R$-u2IIYYgs4z78U%9N4a=_>0NfRhY^$UXqVe ztGV9BU)<-bCmvH}RNb^6YE(258uQCT57(eoEpSkjy_)GWOs-Y_JJP;OBDVfC5$*|Q z0!Dt2)bYLu_@oi>FBwJqe>U}(K)n?7h`^%$BbX;`el@FxHIC*7c4xulVedI+E!ew1#WKf ze$tp_x`#VjCwqfEsL*aa^51&Rv*2SBA6(O6*{L%1=IKvO#gaoJb3e+5nGJ`5RMiKY zhUOZ_$i875J%7yyAenDIgcVZ==$>{sBlbf-vb4UQbtrAZgR=KyLStru_h`dH*E*Ap0$;~}+2 zht3@19wzIzhsPF>(4oOwh~OsbIDgLmTc)NK5~@mfJ82**S@KSFe?OrtDFy=AKH1(3FnqRQMB2#HXrOcyKgs0T@^C-wj36-NLh8D7Z$eo0L_ zJ59SV=iSHOm$Z;0ufxh^;uQyXLRu#FuM+>J1W&D$O?frwK~GVR;V{kP#-HDesne1X zFfE2#@FitwJrqxn(jzq$IFnrvy=({8_8>VpyB&7bubto~)y@?4^Tvygn_$%|Kz9!O zhq(0b?SG8LVtGVS0tWg@;H+LH8|>yDf1HEY#yYLaw@V>MM3tFv_dwUBd(#gpQ|=EO zqc0lA2$UH0A(dRFd$q*#fv;(^>>w;T6>OOQO!W9Y=GW=CW+8FEfm$6tD|4ugwr%P2 z%RJBZ=(yQmoIQn6w>U~jyEVG~a<1Gj{0ALZ_BuA( zq_<7|0(V}iFibw#Y9e;09R5!EHT3Th=kFXhgb!@KPtZ4o-h$mRP>@R2QntapzTjjr zU8zJ?r2`OL1MTypZVmL`GXIjm8$h0IKdxJ!T>fE=F(~XxT%P%DmRE%Z*fdsrY*#0X z$$P5^U^h?7rq$__vunJ^pVn-8CuKEf zV8QMk8%FJlx~P>@Y#NBTt%0BKgoQ+Q4{#Y% zQ) zd9+?yj|xTJ91P6EyM_mdfI=#PB$p-7|3ZYW2fe^OtsOJ?>+a9j8qm1nJ8|}@arWtP z&bQ{FVnrC3Q&V};g-(%v$80{PGmJ&5Z!n-D=m#;3>Cs56=xfn}>i^p9BF~0Fc$hl+ za<~|yRPTQQorZpW$V9qR{eA3Wo^!ej4uGFan|aSknCVZiLkJ0t42+DY`IS$#w@~-y zlgrB!d=@sO4FLd&K3Ph4y~1c|1A9e%(CaQtUL7{SolU{|m+Zuv*6f6KN=)guD6R-{ z!cA?}Uc?y2<$hR>%+lsD0&-RoI5(FVXrvIY69J88)Dew!cCygtFHRqmP(*(hiaEz+ zT7oyT+gCPS3JdVQ^!IG|VR-mM#5pii#5#oTg)JyD3lb-n+2hFtO^K01^5Be3Y`#l) zPApNZro0M?GWtW5)|Ea-cJOCuZtBz@7~MU|DD6f9DMh1?#+i+b473Zyhk#-%poRRP zmSy&sqoq8!X>~8hA~R?245Q#qoAL_T%M~FC#>7N^V^L2VyXZJpzdT_qr)WRn|J=tm zCimkf*&*h<2!a07dRXylfs#4fy&$?lbq3lgNZfVRm@|&0Lj6ySV51r!+B*G~y2(`v z5e;-H^qsO?(3f;%x8s@B{>#j(mamy*<+{lBl@JamC$ffh+%)L%xM(LSfqf{QNvS>W~nBFX(sL25^cq(-7FL2RgQtKHB zcV(E)b(|)GouEpN0yC;IUhVA!zo`t6W4om8dbDjti*czwpHvN5I^>XNsPw zi}fMzMKZJ>`k!eF7h}wFuw3-g!+wYAg2A*THdQ(>->l5mnevufai24cOq9l#?#pPwMjUe?Ke&3={B3YP9-AE^ zVlYsU3P?ax_lI!r_i3Qn_bD0P_5?-aEMuWH78MsPmwI1NB&hqaFWT2gt(Y`4d7YrV zhsvuvT~V4tUW7xSBinSC5{Y+4+%VkqW$)2%$L+=ASKC`G%dBtoz`v0;G3co(tKI=# zJ?z&sPrP9pF(((Yb|BWYf4aEXi#3AP$pQc_JWJ8=t_=%99E*vhv7WpJoty@pewxRi z&ckXyjoOhV-|{5TUVb@SN>FyoR}dQm>~7?r<1RCd^Q3;nGnJ5av=`RAM?ZwM+M#cp9L(Y zr%JXZbg$DBA6Dc#L1cF`37*+AAyC>ZEi4Z;8}Lo>zkXe0H~Z|Pj@``4U+YSXh0c~j z;s(F_9r)_uUOi&;nU9^50X43WyMCSL=t(g{rG(*0TV4tzg!rzRP3UH0%5lwhJn4~U z=*+THKX^4H38MOhzq-^685wWBxumg>37~_=t`+!$1`YJqRLJ`ofv-cHlJW84 z@v~iBt_tzOBYtzwQO;yAW<$+$z(-~*_>W>3JJ3_AmowzvLo_ob1tA3jWQl@>gp!?X z+@;Qs%s|+wJWPW_XQkI7hjyqR|?i6Fx|I}f+F!op(`rGk9wq@*w3FJb+ zT(rH_s&U|||HAL+!dQ@RkM>%M-E^@MV@tJqIQVxsd!g3-Xe|LjEkjGxLTxU@RSzeQ z%7XlAwq?jHbQnzHfg)p&NP$8Y^>u!+S6m5{Y^se_+uW3cAk1PRMa7nKS-taXQL46dRRfgPxtL*ib2+E`M63lS zRsXEz7{pQWlYc%j7<9(7quW!z{iwvhW%HsIG7Rq~b)!?F5gULB4LnX$3^$L(1({Qj zVr@8!R#V7fsYB8J^-c*+zW(a!>77{_f192imps!@E6^F-?`AHyx*v@Vf##+42(5f< zl&(}T)43q)J6U0Ga*MGDQTLIZWjCGF|Mn8}v8K8IY?hO_34qxJc>f{?uo;$BC1<&Vceq%JR z3zOOJc*$!hm61eyPM-cVGd)&DHf1Qs1GET-vkx&i)}$9KTwW-Bp~e*%1F(;F6($7J z5@V&JrJ$MM=|*8LYHXDbHuFHnN2+K z&a({3boeM<@gE>2C%rI>yUq zRsglstRy`wix}8|D@jHJ*r;MABrOKO8zjnETztj8Z_KYJ;N}qCHwL8UHo=Uc)h`Qc zEx8Z{3pzP`Z7Cr8RcX|jVp2WQ7Y708Tw-zu;(1J7> zgbY#C1H_H7F)k|gW!?oF0Vu=yy~7)1jXATbnf4LCgR#EvxoqlH2KUBavfYbIro^WU zvjBy>|2b!7jwatqivB}=R-OW0t@Jm}>NbjWe%#p=KtPK&coW1W^;(KX-QxGCTolbG zxs#W3Top)!{lr*Ne}5snr)pwpA&@e0Kt7QHB~vM+?0)Y!JS;+L#@K`s63t&cWE8!r>& zOiKuUY7bTK4~ihfUoEVmCG?bE#te@5h5B>fAt-wPDat5sKa46akbS6ywFkcJizg4sm#=Rngl*LXC@rd7mII%fVK$J9 z^=cBxTEOssItqy6#W9T?~vgbCu86v`%qJLKK>%5YFn%$7|jc+lg z=K3db41jOD&K3FYmdeBnO9+ybnhUPPXzq40TdisV3Q0RIxXBa0+I;xKJw7HpfjY-~ z+$SL2>eJQ@dDk$nb}2>i^^Z`oO}w+!*Wp_XR6Ydahsb{HJxAo|gyWNvzzYgpp- zXOXw(qdv#RI{p4x;HiieLCjrCdiy$DN&^~^E3)jAHnBneSj z^#K>hV)Hv_p{(Bhe86_i*qOQB^qlxQIGBVIX8AbfCMutp+Bg5i zz<|#v!Ng=!0_d1thY7(yee%o9_$;y?y&9}+V{6@-7IPiWp0H>5>1qdv+X4w$v>tF0 z?{V^p@`?F{go?qdaz6q^_p@xk;uiVfY=5p!`DcmQKWE-LoGdvv{iC_mw3hXJ)MVHENX{+n z5^H(^Je{X^QA3$EVeZ+5s&6F!Fmm&X*|lNkejOb@uxdZZyynHUFqh*p%D*Hu!xK+9 zzrU={^$P~H@k|yd=FC?*myagesPlN-`2I7sHF}VA8>J29iPy=mIZD?q6Lzbh;G=DsJjAS?$Qt!?6R1X& zwq;?wi+}Y1EplbN%4T_@CSWqHb`e9}OhV5089PEeqicWa6nF0Kd-N_!Td*|& z7=aH?cl`Wa9o8x&^nyQ>ldu4Z3S*H4AXmQ(q79G*cN6Di8oZh=P^D-Znv7E?B%a5q zG>>T8o%#msJ;F|Wl6cc(Fo4>+NwPG?bd2%`hm_*v1zf#VnY*tV>+}QnO%EW_n7@eV z7O?Gl00qhvoECyCcI)w+fBsQ5Ce>$p$xmK6K5tvus%&gwNE=tHefo2-pt_Z)q|8ym?G5)5sW~ zqz}xax|H?#uV2xC)FCg>-!}9+-0GDGom@F7Unx97l zd>>)FcRufgO3n0Pr0uxzd^Nn#v@B$Jy|siYuRf-`bG#}K_7i0W#Eh+ui5Um9f>80L zuPyXgg#bnSmeoKVAZ~5|{uoDm{pw?{rkw(~x921NJ?B_xZsq_nCrkff_ItMbd{0`cFI`v^idiyQ*Dnz9(CqZzG(*8Pbw#|egW9=uKkF0 zfT8UM$k|O1dS$?+@c068vI8xAyd-x0lYP_hko3sOPCKa4mD;n_!v$2-R3Bja0HKXk z_q%}?%;BB5C)X+Qg%X15busv|us&2Ruy-xJJmr|fjrsg|=z+*~SdHxw59|I9{gxXH z@BQdco*#B17K*5r2pSi-xNxNQx)7SCE2n_1E$P>(D8;!E8a%Bw_6~r(f>aAI6BQHz zmVjHJKP=lBPZY;|c%3T$=YW?$X`e2|wU0j<5q3sIWv;`$k8=x6Jow-Ic@j057^`}h zmi8(l$s|v1pFqFBrG-sP@aZF%QEB2N*-xIZ zu6Q(e!DlbLh!n&*x_mrwk$+WP<3U|@=o7cy2oEWWl8v;!mHW6*BtskVpt-tr|GNg- z{~F^tA*t}w(vAp_W9(Ae#93aWA~Uvvz+xV)-|q+e1D7wJc~P=AHT|+>YB1n@w_y_Z z|7#2Xc&k)V%tzzwcOrCy+7HE6rFGYRG2`h$aTmD0P|he@SX%EFn$`pkJU^;!>U73{ zrs}pg3UgYp=(^YLnA z`c6DVp#SyP_wvTY{Ne{fRZ0svD5C3=BGCUs@%2LH1#gjU+q&xgIAFLN!;8u^Bh><6 z@J<^sD;(Zt9u(^Zx(srupmb3VP7~JKCO?`e6Wr>;bgX7x9P=(TGC?By5meS+)m zqD>Kho*$>VPw6K}5tNiXy=YlwT+O1Mb^g?mtv@(0$5$@2`DXe}F0r=N&<0pVyF%8$ zauaDwUdr!NDchOTZNkJ0QQ|<-QBFf`YO2G&s--0X3CI3vaLvT_8);BT+r*<A4P8L$SSTQp6v*tswXn-HU`BeiLRG+KMZ%Y5+q|Wht#>M_&?NcROkK~e^ zpRX>km?#1sAjdN=Is%lpSC5pA-u5VmP3r6?v6%2$pk6x^ZEQQ;IS}iw)>j;n%@grx zDPOO1$@}}>B@bR_51L$W)jN3K=~BIxjf{cZ?td~YF`z1ze5atMDOaE$a681oS%^^# zff#cbYN54&blSuuDRccnApGY*=DM^Qe=^*g%9zqT=)ZgU#NP0L7kZUn*$=!s+&5H! z0p%Ir(TfvEdFaxhNT@9(x;NX(bh&rj=xO@SNq^``XhRd6p?Z4YhJngr;q6a z8uydZM>EEotk2BIm^9v7Bk$iTm#C>^iR77MC}2@x7-26wYVxnytOB?-D{vYUTF5e; z;lTD&IVjqmJl@ogn0wl{e&!b7#LxyODl}PVj}JC|q2od#M6FQH$)Xy?#Y~QfOChB` z(ww$4|53e6G|w(RKT%D_5TY7@NPw-Wxm-)`VgnGG04BAS+ULiI5RL-TmVp6ZcaD^1 z&m~Zl*M}3n4|CL4)JNGP7R1s#n#_d^)a{>MC+=GVXih}X9T_8WOqYpj90km;tadig zQpcjXqi8djecd*Y8iuwk~;(uC5ZE=DUKBqkt& zOB|~J8)CF;wuq!6T0W^ii$Q(Zi>Vebf^bYW?rY9~&DlyFKb_%3Rs$J|rR91k-D|f0 zI_QBvtOjUZV+)ixDa+uoPza&DdCCio29Sx4G(F`}$!A+d0bH%XL_HbG5Lu|JXF!n7 z=+DtX+~|*SG0__UMfZXnKN=pt%;WPXq5DbE($fwATATpNL-XhEJ0H zf7k^8ZD?|SK0XElV7N&yv>}Ae)pJXUj;&&%N?hYaf>=vj7`jbNtSwbR5<+h-)XivYqE4uL5<_9rD`i_Yk6J zn_%NDR;@GFfvpbfS)vfowT(}2Gpe@{u2ZgF2HI`FrR3TiwmkCn>uDgRPOHZFNZ2S_ zz~1_Ws~vAPjnu7^vwYlOxFm6|gBb`M;jgUc!z&tzNWOkHiQP--7{4-~}sOa?~=05!RU8vMJsbDilK)ZCa zQ=-pQ=xEJXYR^L*h9so{I04-;g93{8Vo=#`ou|BiP{Y)d^~Q#VpQd}&?&+wB`p_PI zq3stQ_%MX)#4RS6A@Tzu3O7fOH?#U*S-A?G%05j(i~@KKXfY6g7KHkwXw1K_7%2<~f*1ob4>_?!u+k?jD zWXdlLlHlw(4BCadtIx`!J)c+9Pz%N8eDAOY9JEv#i+oZ1)HLd^qROSHW=pt=UR zhOMCE=OzPrrhNLUbstWVJes%q+>JX$^o8|w6*O?K&whz}(p+3TmYQ-aMw7kqaD{_o z9dImXV|_!zX99J~Ol!tgH{IHZINI2&j2GiS;EuENgUSD2|D8IZ&HAs8nfa)AX}76_ zd~d9e(%R%zxLyvp_j>2_W!?wxMC ziJ92vS49A6I34idjNPOwHq{L4G>Yl7R z3=;2{Z=C(~X_a-@t8&tg~&WfOI$?NAFFkRKQksgfPse$9@ ze#%id{*(E;msD&0CzwE*HjKRoa5T+UMH%i~Y%b5K%nqD|oIf)?lQFumAPsZ^r1;3n zfV%E@*K~XUhtG1SiAiXweL5>7&H>?eG1KQ~;ItALo+QxQ0Q}hus{zdGwp9XC4?O8n z>&wa$1H!6W)X8Yt$H&1=USGL`E?>TNkOgeWkfmE`a!4?82FgNj9niiS+-@jI{_bDn=ZH3)>X)rxg4HHh z9Cw(X5-%M)20y_dX}U;akR?2KW5fFWwww*_;h4AqOZ01?ntGSx!#TOf%5fxWn+a^5 zwC|dtoe-)IU?-KtvIdmYOzN1OEtE>nzF(7xr-kv;?JELS)0D39glmq{Lc&5)fCrqJ zu}6`*E}BncC$($_VgzCN;&+2PMOX>Q+-OVOCeV5_NB^AGDBImy$j>*hM3FaxrU0C4 z19J2ovv@d6ZXmRY+X>j@l6J)f@JfI&fTNr^2N*Kw+z?e(d+3z~vdj9}>Rjt3Iep+& zfI=T#Ic6a$ubiMcnK&mO+3StvFoBeuoL;9R3+(21OCkf+6CquD{WVTl=xaFOaxx^eJH?X;3x+rycUPYq}W8M9b?om)6X|X z)D=GCKJ`y@hJw?;T#Z>nthR3lU2Kb8gS^Uo=mxtVh%}bs$Za9^VJl`(7VkPh!Roy4 z)6`l7>3dPLv+v{E*?1TB_N#_6?zubnDZ=HeSz$-=h^p05REoE+^+Q{5+^nGgN#i(U zV1z+a2c?nOe-d>H&SBC0y^B!zeJRB?9c4>mKThHY@9;~lrIr?LY4zqNQjQ3Hr2`3o z`E>y}rlIQPb}gQy%Zbji4NRZCL1A}!{~ToeC|i_H;|XmrEfav+OWag#0Z~VI#(m|V zSY=&h%r|uHSJacGog&}gyrgsZIhn2Ctif=}i~+Oce&#*7EGa;pZ)~V{xv)pn7X%DQ zQ{P^BpkPAYKZAT%~hv2uH(j$5l1d!kG25eJejOwKOaa^$5oRH9uBgK4QL^8Nl8Hbrl zWdx5lfA$|lo0e=AxuCbsaCI40;Mgej(I`zm*O?uS_vQ-9$=XLRvNWv)`ky?>TVz!Q z*vGOqY`et9iy;{I&4vOW#VmQ!2N->&H3){XX!f|DVD^TxyA`EDMGXNYW8K9YKw*`H_zP%X`&iw9$Oz&tF{%e)j7q* zZZ6!57dtCgf~O7GHh=Uy{Te>)CK(E*J$XI<6rNId-&{ThpV|9o?5C*H5hZoQ$eZ{}ncfX=85psQ(JUz3exh+ZYbPbqEa z;AwRzc_1V_RlD%ZH@)AK;Cz6pzJM&+@G()(dRG_P_UDLE6&gQhO$vUIAoY85^=e#q z6gprk>fK2d9y_s@f4U013Yw1-`IB!=19|Pp66NeCI2Xt+4^TO3uP&^6XJ@9bEaO`q zPFn5enHFy)11tkppg+h)EII5AkJjS*ueT#-R2Y_5DM2}_wfLN0wU&EgP3+!Mzvrff zjw8TBMMmNZ@YRD?)gBpV$}>`@+U8aPX%CCLUJvL4{+4Coc9xbQ?qXRh%Y=pi>NvVs zFj$+4=~IpGY>G{Z=-ayEGnHAQRc_Hoa2lidInQ^_r0j%nxizFmR{mSgg_GKMwU(*A zL>ynQ2xPCeyD*ku>SFe?{P(cQeQQ>JHr`Thb#U*cgrHeFg*0EajO^6({T`t0G&V8O zc`3$8%-qWkFab;|=4jJ{A1^p|-z-WW?U6=E{yk`uLcelw(Es0SAu5LC+LB}-g> z!pGv~P(epoBD`>F*P+ZZ^foc1cZt%2&Qh+w2L|7^6UYV_=jli3V=tU7#>V7xsNRQS z;HHH^w922@{O&0ESjgvt6T_#+Tge+Ak3s5O3cymE-^t4Ebt1IJSK4d@qd9A>$Yxnj zFcuk79u3Urz~C|k(Z4ZkUGw4N{Ix|77O( zPw1%1D5q+RS$M0WwCqmMl*piUzd09e;Pi~ylr3?ANLX##Ydb3QejO|yK*htsk=nGMqF*~y|Bi^s`it{#$PC#!pbZ^UJy3_t7ZIMoxoyyZ97)Y|V zQ3bAldAyF)4M-G2yjqsnqW3B@b~v)H?ao&C-Y37Iko`H=8j}EV%p-jKjgeB^L%xE7 zBS02^SPYcB)ezN~ae(?*kUIzv78E-4J~j}sQKXKCnxTv4SfQ@W>hAmdA2jmHy$DUD z)4&UTv0C63P7Lt3p#cc54p>Wod!20)EB`awt*h~s3jP5wpCmnOGZgv3kM$*BpM9Kp zSeU-K`%<2~Wm7Hi3KEAw4+z>X)ZGLlm+n4~SA|v=xW>6!R@sn$YATqf8)_iJp?KcAp24~RfC4DlCVe+lG6@_x3l9Kgq?T#4(x0KoJN z0ess~5RplhjzFn!A8}s=t|pl2;L{HO_7n?DX&E5M(onU4f+sA{RQ zy!a&C1J7i%{%|^0!cl-*>xl;7>Hus#NjxS<9upMsGp`Bi%4<;#ID1cK4_89q7un0Q z#QzZ$V&=ww!Y8k))}DsF6m`=lL9bKas=xf)^x&$+xv+)UqM~~) zViVz29(yC3gIClOiNP$#YtzW(3#Sr<46l zB!LsT7p8nlR$0&x+ep%jv!a{9tViu*W#=`)E_3(i7^qV^d`iEs%nr+6|+Rs6Y zvw%5?QsF7}+xsKHNk2qfjL;hsBR;k~h<=t^Tm*=^t+|k%?dqdUELod64NmJmw2hY!1y^!cWY z0d`|uxBmwQ)T{cY7Uiwx;ipPB2%58J@U_M@#fvV9f&bzc^1J2t(1$kA5sSdd#*|~{ z+C7PUX9wR9sg#zR8U0y; zjWU3;AK?XB$h&RLX$p!4TIrQH&O3|1Rbv~pWzz_t7ew6Lo>Dn;?|1NV|Bg9(QtkL0 zZ!tktSspfcA4vn=e7K;!8v`v_zhv`w)4`sS%dO=~0-pT}0U`Rs?`u_UZKH@H;L1pM zy0b~Ig+$a1a!0;{(6a(*&uWplbx=5y+nw-fZz4Ixx>^vg>HNK0gdT7Y`dpS2Ao+sR zVJy77THm!>Ho3iz*rG)1zn@i#i)7G&vrG+pNrqpi?VvcTH|1B?&NINE|J;{SXHI$y zJ*YJO`4Bron-5XBP<$c2l=)pcwpB?2PW`%9>+8y?*=gs9#6=9c?jqnfRV~uobkh??Y2$%LGK2OY zP%OE*J-3(_liC522k%xUykdxmWO&YyOWfF#-fg4UI4s}N@$m_u>&OsgrJJVau9-Lg zj21km7bb2M7IG#Ju`0b=+WmSx`c+s3WdPXDY|eYbxvP8BN%AnAb3ojX7M0u-?ls5pfq~+1d6(3Z{ z0FG+)3+t;KAY+EPUjt-Bz2t@bhd{dI$DmV85TbXI`{x6v{{k)vD`e3~9>}rJlE|nU zIi*k30m`9X=DHPdO9klWxNy-ikgVQ57>FZfV1WY#XuzL9@;cZ}Eeubzsc7Dn==aR` zh6n6Hwt%4D#!TChUq0u1q5IURyPt6z6?A{P|1b5NLWq8s7)VV`57QCKIg-~xMwg$u z-1%>qt2$eiLcCQBUlY?y3ycX+Z!?)BXrCKUm#08r$Ea?De6 zg7G@Go9W%s?YqfVa@*GDepra5RhLDEA`6xb0RQ&oL?>5M)Rk8t?jKHj^53GPE^tA> zx!dnJJ7Q=>nV<;lQK;&tn3zNc-O|G>O)xkr#tDqP<|yWfkeaio$n+7CsknG%#Ux9g zxZbssa3@(iDduz8{xo$l&xTK&`64a|QMt_x@sF?y8(4bRoqy+OQp zcukh3Oh&#pz)ys7Hm{_YH0TWtwh1QdE88pD17+53)Q3pmDqzR+eHq&T_%q-Iz(w2tISq*G@G?uZN#cSC zA{XB3L=Cjc)BhBt8fztk%=IL`!a`;H^s${z(}VL|P{0W}_IdJnM*4?Bd!B|XVKk7h3@+yv0R^diSptwVT ziw)ojEG?*>M{C!T`1j0n1!T&XnVMa`i@qoHy|_ z(6`1cygB-X>pKp&hd>#d3aczyNPWOzbL;lm@_f~^mLrG{(ie#empcDQ0TL&!6sIit zc*;tNl6-V2=g*gyulK5{`RfzkiMsPZmnoK3HomjolkhhMfWidep3^0HsrX!dz%e+y zKY2K`@I-bPqX3s`zD%4_dt>F}mtCo>K1wS($IXyq^od_YH~Vj9`+M)OP5zetq$Imaa@SI4 z{G7rf*>vxP&)!zso#fsP%h#Ck;0*pa)oOvlhk*11)PvoZeo^G|V4afDkcG9`S!w#t z8Q`LRX|Ux5>ctIpILiVx=>wOEvCOeu>PVpAHAeVjG#?9{B2+NvwaBnGNV08~SobvP zn$%?gx8`p&3JG5|%C)?4q|(gRKt5{8MDp}5#8!{2%3|Y+GgF3GSDekqZY#tG{2y6w z9uM{UhYvfYl4P%@Y*|8O-**RtWJ}rC##plNWG_1nLSz?;>>_)p$dWCIAv@tnOo*|B z=RNrTe$VT9{;F5!%zW;-KllA!uj_hWFO(?a{G8g1dUFw|YQ7VhAKvd7=a26jR`%Bd zC5|z>{is5GoWCNVBs<^%gwtxT{I4ks#dCN1;R7CxhW^!#h?;KPr0iz7Ns{GEdYWXc z^d|0J!Ji^agKDfqI7pvVr$z??nj-Ky`P+P^rOcs^8f={&J5UL05=-lnRuIL=>gfo( ziDe0r1SKt;FTHCqr?;%To(lcddz8e!4``~wE>{HyZOPxrm@wgbt{Hc2+f>c`l75nZ z_q0@ck{e*H8@_w&WEq(n?g*gm0U+|`V3g4Bd(?l#6y!69K%>cx1E{es02iVtNY%aK zX^$XI^l9A0^9Fn>YWh=gNha{u<4gw*C>DE1#^%uLHVx~qY%}`0LVG}Y-W82RuEj+a_A*lh%)&CNGY7`p4V&(Tcy51OsOJp1B;bxc414gnx}{P*>Nwez z-CCr8oW>-ICgEP}=ec#9u$tSh;Q|2e!hl>6Z&lNIORF$1i>2$XLA-?}YnCPnXqz-T)~qv3uFI5*$p#8jop0O25y~w@ zN+*wEM3T#SDoqPElAbF*HWCTmCB>ZI%h7=7{`7U`;{cFcfC$pEF*`vDne6kv$r|m< zt*4fw`K2Cz-+MUO4K48&XeTwRBhh6;OrCv63(Y>qhT)2mOHgkxClFx$$UlhV{Q`N< zuBK@;Y|KK3K|vk6P@h3Qc>`-xX^x4rF$9t%N`Jl)njaK*Y3G`vax(J@f2JBS?*Zq6 z^h99Rz*6A5aYz5Waoc6HJse@_&OeTd2z*fU`%;;8z_K%hZE}_4d45prh-e67Sn{2? z+o0@EBj3727ui8m|qoU}GZcji%P@Rc?Qu zQ0KbaFurrAXylzjJR4BTYikbMvUFs}N2fS!X+W^D50HYmBnxr=ZZT%!x|sEZ?Yg}_ zE$t2P6T(BEhh4pc#vZ4oq^J8-W~j;N#lIBZXx{X9Du6zPD};Z229d}ge|*rRUD5{U z%{kcfH2}5C1aBb$I>HXEWAY?ail`p^Uo$XYyl%aLUtVJyLQdXkx7wI|Z8;L=_#ekB z!4!_s$R9wP9pUb(ct_R895Qth+gLcd{4RIg)_>ufV6QXp?i_D>qX*&i4F7xl2Cl}b zQL}!RZa^Qe>#S@eb#m-2OY(H4X<2YCL!!9i8x< zFZXp2VLciRd!P4w@qY0UK|Ov=i5l;Xw&uXhwa(Ai#szgRENWXm^Tg!y z^8@uxP5OSXYz!%eBN!)K=)J&Hc|i1epZ0WfF?NYT;){;em{Az0z1)gtYt-h!0bwcy z5($+;@C>%U0iT9KbbEYX#$$^HHB*uXAAEyO=V2w9{=`vAAFkD;|577A;d`AMRuTZr zZea|U6yrv1g-j)C0wLPM3@tor{;8P#A~LfgFU>?A&*h zWznNxfVD-BDu|@La;&i#sl6BbN-4_ULtV1j8j3z~-Mj zaZm}A7+$<@q>NT5)8^)>JnUE8OqoaAr;js>aB)4^u2*`g2+ z|JBzSL^SRl9udalod!;z#fYb;x$RHcgwAgY;S86y_L~e#cE&&_BG|~W-o{?eK_Vm1 zvF4_FPq$R=9j?ZETF=G|+axs(zAH8Ej~RmT)E9B4&?Q%T}bkurb1xO->V0$O64mX--YW@AsUmH@w(G|`qJ2|W}IrtNqhf6Bi#$g`h5r^{D(pUO5k@d zXiCHYH5@9414;o#kPfuU2{;~jz?J0FGzu^)PX0K z!RxOeRp{(Hy_-q5TiF(a)>>Qhh1F#}xzYZU%|+w(P4}S=2QdE>a$)p$$-dz@BH32Po^IX)Pt3$&xmdt=AnxMB0p54^iS z>;f#$*}wb#nq)y!c^~fcRd0+|tEaaQ2#$LB0W?55zJyr{llywmvBs>YcYt9$Z~4ZHT&3 zyS{EmUp1DLzjPqU6U%EaCy`zl{+YKugzej}Jy8Hs?tSR9vzmHSWq6Nx~ z#C+{6W0~!D@s=1GdE!RL1=;%X74BKGA+naMllYB{c6zvS8d49qQIfHQp<7YQ7+7x2SBZ9daqR$Z`WGt_aA>JOvPi3v3oW^0GXWmI~FTs!gQ5V zTB5F06^X>~FT54(+Zrna4$4i^S8Jd@v16w`Ftov#U};db+&X(fv2$H4z@xH%>pYr_ zX`ZlFd)KA??_7kx{XIaSwKLOS8p{Oc6xzlrpCo0T+31FB z&Em@Zr-XY0OgAn*q2ORK7zp2QrX?&Gaq{T;(REZi7^Y|GfsJDY4p2f^u@ZDQX^8ig z={9!$Hc9)oRqy*w;sc)b%*VWO*iEc2?JKq{#`$8s8ZxkctG<&a`XyWAge&pA=3RfQ| z&M)lSxuEtJ0T?8RLU>|@FQe5&F@mZz3An8E%z*k*Tc2!w;4B^1;9`%Fndkpl2k!IL zuhi&e+~G{x2kO~)3xh>0ZCa~t^$;sj;qh*u`o~toyYkOZ^(= zBe{4bdglr3WOJeI6$%lRn<;~yVz5mMd0!W6(vm!~*;JM!dISJeyNqwvFB_bgv=uJ9 zCa>vGYhA&Wz|}=a8}8j(>^?`of(GJcyV1 zfc2zuZ?O08{vH!|(qFpuPaliUxA;9`Q?c8xep5;}=N{H*Xs%YKdjnVF0J?$DwmrRq$-eWKX9+Q}q&$Z|h<7Hvd=d5}yh&xqhm)VNn-s6Kx#w0Xz_ z{U7090PbR&_;VBr{`RN_DQUsoDZlLBk2k`WrD9mIE=_OV*8WcK3!FBZ1Z_oUlq2~E z_TsMFWr1??V>$+gJ}Q-_f%gz$Zc8bugKxE25`9#%ArirP*H!jOKOfp%KEz85>mPSf z{{g(kCl|jwOM~Yf6*-jWFMN&yG*?wXvsZKuW}&*9k8I69OI^KBYM8HtqvTbWB7zu{ z^;Tnai@Y6fBwp#-Ie409gG8Or zvSVFDxrl!F`;D%ymy14L0gea0b(A#_;$uN#aGoMmTc>InxrRd|{GoHIomP)$6K-o1 zC7jTIkI-k#147Y1t5Si3$fG5^{EWH9bM5p>(|f#(TbZvJrS{FlH^qBzD|>T{Wn=+s za-an*q4L=fO7p4nGNblFO}bo(5Az2uckNKX(cmK+0aDUQH&`&1u6no0%%;ZB$zJ42 zS>N2bb7el;veCYF&LIZk+QVj`U*gj+=$AQwJ4koy#Y)8HaOOFT_N8T}_=h?oQnYVK zuapq(J^jY9BRkQCQ15fhy<6u8daSW=bJM+7E~F>m&X^e+8oygC?BZooO`~o@m~5m? zK7d+)H$a6Ye;uVH>$aBL!3Ao0dPTa*O`8p)=cwKk6fB;D>(K!I*+qJNt0~YI+N=2x zd^pJ=HX))`ICmLDnGCysbI7cALh)~70i1T3TW=%uMQ%npa!~iBrKbj5Msw+8CjaY8 zU|c-nKV~hE*pKD`l;S#F*fwQXg(f3=x+Nx#iC7fs17(RE?59hYVl0O83GI?)) z?k=AtUO<6ki-pY$6k9-3j0&r>G7|&JDI-n8dLnzV&A_f?1;`SU>jBzDI%Ya$I%O|T zGPt$X^NRUwo%!DNw3O}~V1*h@?Jo_wv+n})4C~GpR9F}ZMMHB&w?LPGY3Zn(hg!72 z!8=?j!x7PkK4__|E){fkTlspjcSGHJam6|}&EC>P-YRZ%SZ5ya$fzGLl@hL8=FhW~ zeaQU}NM$t_58C_v`6JjzDx$y%=m1~w3#xPDkY|s>sc6nDAEzVR&+mVIpipwRE}gQv zC3&k!S&M#2DdMtz6r)!A;2P=ahn-~Nv zwNw3SSX|j2#VbJ@bG7fLoJkW_hC}{C^aRuk`Ir+hMxQ_XOygC-?>|a3bw9?oBK#;BmVy zEGcXNuH61kk#w8A6aVfmPgbA~u!~=VKe-J!Kytv~nn5J@Dc1LE!pghl`83$d;j_#@ z2z**t7`*4Z>6Zh{abZz!ccl=D=X#3o!RaV2kb#WqC%&FJMrD+DTftTR$ zKq{aK2~mFe?9Sdq&1laMH`7C0LtBMo@2P9|7S}-vBf;i8J_v=_uZHA4NB;)E@K*GP zG~B0xW8B#l8Utj(F|Fr-!+#E8i2u}0D!}o^4J`Q=4A?fiySm!;H3$9?DZ12?B!oCq%G|12>Yffj0TkObUSW^Tvl z(0HLS?nK;fmDs%5JNzE6JA_RgSnf{hK|7s>JDf6_gKx7bZbyGCAFvgX8G4N^E7K`r zHN$^c3q9c>$>0Himc9-PLEdMUBZQn++-qmAtje%Qugyiut7QY5UBMu7jhPs-?|lfx zn!YT$n^K+rux7aM#bfpzBo=8r&A+gc6?NINmkwR{{}_|eYF#;_PK}=+-~LdKQX``o zCS?Z4hwE7$^<8%2J?QCBFl|F*c=vh>NelW$qEacWT12HTl`aL84cZ52#kY;lrt>RB z`(ywVmRH4Epe)|}9BC=dV19r(c5)7&D>RC z&Oxoo^Xzt?O^uO~K;o6-EA!x}Ff?>E?$#G|QDa{IoHJMQyu10(A(XANTNT@TyMe9{ zVaC3@ZH)B*aM@jN*ELia%2*1#OvrCzydZ!LQlIpSJG``$L7*{FpQ!6%D!CJS8ll0J zO;KPna%MXdKMPKNZP)bSv;&h5uAyJ)boH}De32+{`}4mqZ%T?U^cuDm6{dF2yB_d~ z3-3W<-p5fzNdex&PylQ>jJCNM}STY5l_0qH~Ejc~YTML*g7LZ9%#o>1KbZ>SY zNC^x3w_p#JZjy|mRH@~^eCsZ*LBuPg;{xfy-5ZI0!s^GF{JEn} zzVK7F$Xj3bAe*op=GQ{3xG*dPrbh4Rf1H3Lsrc1>R?CycWxgCe!|CeRw`&hQ4jZWM z6f=8RdaK+3#=<9!;l4yR6_YOgNxV}T4{vj!R@uSk&q>qJa)#=+@B%nfZWDCBCI@Y5 zWcs}6ODzFl+AuKET_hdI_hjf$%`p7T(ORGc^m=sh_4eIWe$1O}4JKOo)@9Enqee%s z>txtx(GDb_@*a0fEnhIjny>9GGghq$w`U8%livB37h*BWO^!Jyv65N5cR;=svf@TH zt#88DLYi>g!nReSLw18qBT3v~?Q}UpURX71R9g;0Td5fWR@|yEed&7yE8s0^rTDjN z_DuUk`V9{ufi1^G!@D;!@_?fpR=TvH`qjBc3m70OU-XzZYB?}cRaTgOe_SB5CA0z_ zqmRY`9EtAI3Hte(i^Fmlh94phf;iQk|ikDJK66Ni5Xvs zmKd}hTmopx&5wNV(A?+?I^5qqXLLYa<_|vbXC?F-U|sL2P8}7RDSw5iAMDiYX@UX- zkdJ<#+Cosn96U{XSl)*qM(Y^u-dMqPuWZy31cRRg<7KFPHt2ns&%_iOxBo@i#9B>f znjp1{MMIuPQOUJbW?^8eI_Wu0etNQ0J86bf*c0s+@8Azjm}?RaF>} zQ~Y7v^gF6~uZ!aX)`yaxa0&mq9GQs~f+bs)NUFvSd*>7uE>KAF{NC#VZ(sU%CSO+3 zrCYgv;%=Q!{uu$gL@MFoXwyz&Q4)XfC!y~1NLKw=msvz|KxnbvuB_kd*LRP&yroc7TPwg!w6=1eH_vbE zPW(>Qi*awPM}1lQ8vo9rJ?0E#zbkxu8JE#Q2(o$O_U*N^4Vo+CKI_q}ChH%T?&t{f zS32x=k&TP_a-*gD(r|Ajo$RYp^<-D#C|Exz zPIhX&TkkdM9Pt%t!uHXt9EI~^!JUgXuJj!FHajh03@zf#mG$rbCg7W9OWr1(JTLkY zKT(d*@UkF@Nn43Ws?L?*)15v+brln zsvwl8S^;b}2r9OI0H>ft9Wq~tFvk{A_A$Rwq{ZES_q~1$KRTH|Xgwg;^dM`k^<}&A z*iZ;Se@aK8ZC8Nd_kF!V`T>`=C9{x-&J8eOcr(w ztJY!$dZj8ae_GWaI--pJdnCOvrFoY&G=y?gVC0woWwgS$q@v3^PU3^?;tp0bC!VZ) zkOq$f#Jpfz*cF;~mlDuwoZ-d=WQoS;3gn@H`H;JqlJdk}aurjRK7mj~wJb_HfjYhD zr1$PJtJ%@ddjH|*?fpGl=a)&{`6D>ufo%tK&VcQnQ^R2KR;K9JsvA-AJxVPd7ouXH zS$Mk+y8t~%653j+UX62bkZ^^|4W3#8DXG;ooq>0SOT>QFip8`z=I^e8b#F?$#SSX| zkV_I0KO!RCBZIlc3Jo>eS2=TQ+q<7D(&??#=oNVqhD8GdwuR-aL;m4IV@O|71Eso> zR?+(r7lj_g-*S@ktItjUM(NefKHvZl7*O;gE!XR;htKX#5Z>8SoVTo<$WNxOxpNw2 zqYT?ex~fF`N955*vLD}a38<|Tx4ldVTXvnP?;V7n(AI9cMoAic-@;BuClL}cTj-ZQ z&0A_eKYFDN|Bgv7DXDb3V|P*&5*Yi&qOU1r(3z@)!uCB#y;1FoT5pGe(eS*}0%t4o zlhy1n1t)qxeuRp37A3@%{%0UR)O^mi7=k+S>trly(n&b2t7qpw`TLOjs%hMPqn(;) zxgFOMAVvxBtI%mtoLB#+LC;F@ijC5*!qF1T)drALnhd^8fH+<}7KXVjq($%G@widd z+5aSu4vVwb@dZ4uj$NFmD-}K8BBnebyjL@ z1mG=2l_qDU?Jin2@62^5*tH>~rijt3OscdS+jqXt95fuqI?UC^UU^tw2QY09o)ulq@dbQ%YFIjDT%WgTJq)H+wN1U zcRYOHBj009L5hwFwZQ!dWv%QxVw?Yd+L8`mNOzlY@#`rot#j#Je-~G(hjll{WF)J- z;zf9pE%<3R>h9v0{1!%8%N%PQ(h3tvRjpkqG}z*wlSw+xz4*q<%iVpTDUm?6PvZOI zkX1rNcHBc}Dz{IQSznD^e9UCb)>XmZ4MwAA&~^?>(YzJVD$ca%bIl+RlH3O>@oOzo zrX*A~Y0)@f&@1zWefjQT0%B9!NP$&RC=3slhDQJ@AkB90bKsA2pEN*ZYP_rk1?)`YVbGECR=~fFqAqA)+mT>0WOX^XS3w~=M;~XaM!aRW(5!Lkl_q&Jx zz4bkLLDe$eVp|JZ4AQ?4y>&Q=J>Dv#lADnvXI>pq5%Z1-GP1wx4t69?$<;zx6&>#V zZYmwBy)cx>Bu43>{tYz7bz5p~eS251O@rPu9V)JH@Y7<_G8sn<^#CYSV$t!E#s zXD6y1SYaNJ9Nvp!aSJ)3$dnr#U+9x~2?x;x%f)@9#d+~okDWc7SAz-vXFh!`TEI98 zxo&?{EG)bjcDY4-A?V40qi|Y@VUhW_Z_1@pCa@Tm&}UAzxLSE%>|xBCPlc9)$LYuK+8`y_#s?p5R8 zzN%lPCx`gk9`HFkEqXRIr=+J|%ykS*;HCZVlI;E}z(g`%7ykUxSqH_c^2y}@fG0+I zNiN5g9w}|y=RPh`A+a9jNJ+95DXU@9U(ixp`V<rkRIOo|sWL&IT~ClL>W;JBTpZ^wDPArL3(lXDF)=xA1-5k&g2H zQ)mq1-`~o2n)D?U0Pe_#mg*~mF-kGAE;S^|5AXl%?iNYSOyORvcUk=s98&uRxZYhq z*VZ~(mO{71zq&6^03R#})sEDv9Rme(0cpVjcN4FdONVEfNT1>;gShE#lF#cmfA5-s zmIj>E%rksSk8x%VVxl$128LH`BK*60LH z-=&s!R}+mHIcx>swwqt;-8^WJnz18PY@ljvdaOWOZUBnJ6*&(;DTxMw#?!Bn$`uxx zGK72(@Y?Da>I9hwiIN9}o6anE!!NT&dy@?p zdQpHxp|BmamCfkH*k>S-pbC*ACZV7+_=HX6%FmX^Vo_rtfrDLsyPGQV&Aa??*FYTU z_(2^NTz7?q8QNE`E1ahcVl!y!@)#clsgA=f^DI)_mS2@oi~rh!iOlH$4;6l}w&|th z*eqK?2nV8-GH$bCU~4Pk zfY`b7*q6Tj%>ZuF4_2s+)k`2@m`2LVexJR zGZILDrZ65tX-tD%9TE}R-ffMXY>Br|DQ5!HHk29-m`omVt5BOf?EfSrEbW$KlZ{5qnnb=VCq30%m3{`tZHxn9dex1Qh_2rz-fdWQE7= zcqB#R4=QcWBn@31kJJYd!6yFAE#7{gRvWy|a0V0N%+*>SSQ3Uu)-$LcL7ff>Q9~s8@Hzq5X>q4JgU^=_?#!#%{W&8Aw+zI<-gdEUzR)?uqzVt!yh;)JfX~pTcd+2do5@de6R6} zjR$3Lez>?3FxQUm;-&d<&r1FZ5696r2?8U=pjw$B)jfMiIBb%L${FGu?F6Otb+_FT zZ3%x~MJ?(U%&LF09A+Qi?bdsqJ|FJs|MxLEIxv(bl`1jJArP1d+(-aLidJ}-1}v5p zz-$_r(sEaU+yx+(ykk^&1x;%K+R*8<>Fbp+)TUim1j7&FLZVNAL{XjE6Ib1IwEx2o z4r|hna#Qn`EI{Bqd3}s8_EONf@h?sXMa|ozd}PXc;u=V`_+bP22-I#3-oxZzIhe=i zeaA&k6>8}5O${}(VJH%i=Uex_t18n}=uh{q&>5(HYJ#E3%&;E(U1fv>eV6 z6eCk;f0I&)F7|CUX^$wlan|QkVPWT2kALM*!NSCPbFEZ%)eTe3DS1Ih zC0gJi=+c%pt=%?BN(96TZgo|j#2mBiMxPH|1_(M#uqsI}6I!1-I7QszjPkiab?T&( zkpKJz#q2YGM-({Y)Ep~mB5A@eLpt~khc6XdX{EXO+VPN!^@#PKL)$-9o;+TiLA+2| znAfN<@Ya_!%78X>8BE@82&F9J;1wN$8uTwVIrmtd zEhG}kQ#v|zbKP!z7xc_rKHVC6fMECEA2?vv)KH&Pj%Rc0K$Ym`t^%>rS^r2(j-Kl1 zqK2U{{dEgw|CSE$7NvSd5=>V$W7zZwbk`bZu-*WlO56{rv-~Y!hrWnLA1a#*rV3W)I_A6~v;;j&LJ44HD8Vv)#V);58s|;yfWKz^# zXPx|0XLkV{mf%o;a`Y0w&(l>0)@YI%rUoV zXn=_=m|A-2!E2%n4{*Y3oVzu4^%_w*YOPw@jPq~?z6vc{F(ZASF`2$DydAV&8ObU5 z<0;?o;H-`Mj0YA^j!u|Z_wg>@Bd7Pfv7W3+)z3HAOB;&fNbB+xTVOTFeaY!Q=fsnn zybdE8!fh)#REmM;bBkh2NIikN)53sKo$Q`CV`%om_QXC~Q|xih19t<@8;LA1HYy_` z%+?pA$Mr-pUAVy2ll||Gc-S$BLuYlr#U@pW8kjfsuSvb+kT5rtc1upGLYMnY;ct)0 z_3HDIO7TA&X~Pn=PK{vrKU=sx>zN}A$ebLgLJ=e-5_NOmj5$^*RVcBr7{ottLCJMm zxpAn*yT|VBL`I}HxtSD=yq<8Kjb=4EM9C4opFSc8h@{)3KI^rxP}B)4biO3tnkkxG zhP7ig$}NOmd;OH3XL37`hRA|`o@D$p#lxgCN~e;8-`nNrs91)1c_pZ!TbLVrrcT~d zVsK3QAKQV9hiBVxH=oYdO}oa5(M5L{1KKe}Xc_@Dul6w8d365yE%xgPT{pvQ$VXeC z!TCT7Q}`}}+>i6A8oRJcQW)u&_<~l=XiCFgQkt^o{ldaR_fAE8<;lrWar>tw9k;KM zwajU4I@Q>x0l`A7ce|A@b|D>5s*VqP=q7%hVzuu(N_qb8^E&4vsSLtU^9M}6UJM)t zx)bOBiZASN<82wnGd#SK#w}eq{w;qYcS0_R#+drn)qjH;h-*HLU$i#Br!Zt~mhxbi z7WU9SA3vV!ULMIbk{)Pwl1cb+a^ss+etkpUj#r<*MsmAgn;&y47ehJ^P2@usl@xo8 zdpg|OQyR#aK_<2HJN*pFg*I1IjBjrRlwSuYOGz7Xf8T^@$CybeuDoQLT`gRjm1t@i{m5 zWt!3$UynJggk^Mn>}2Vs@fdr-i}~&%bkEsr(8=w)O}MwIJ$tx-QKRed&}%9=8D7gz zg%u`Qc(amrYxtCY`0i%{ow`n`kx?b~@Qo2^9Tj7WR-$&tv!wcXNtj!8+p{T>7$ zn+k2mA$RQXvB11>XU~0WRAPi+-EgM36m*d-vJW{3N(35G+qB=S(7sAqgUAly4f^(! zC|9*7*-LCLnHL@>g95c@QzLE{8u*z{aQ?UnT;SeP$Ij8sk2n&o(f5G6HMgF9(rdKh zXK=t|!rU#{RA@MP^}Lf@#{>s!kau09-guqY?WU50^V_qtcb(1S7rc1RLyu+Qou+)Z zH`VEtNQl2Rci0jo7$VwH;9LvbKs!%}bO|8iXWY z`}L`#P=X%K*Fvx;F{B1s@@H0>aM<1PQk?!~`KYPjx8TbDYb>M}YR@r0_=3~vPF_R~ z=5lrY8DQG~w}RX5=7Q8Op1)xZ2KTCI4APF?d)xQgoY#@suSV~SsJ8`f7g3L|W_pA_2ss4rddo*26DY*4B%4V|60b@X-g zM&*aA(}lrcq@eT7SVQ4ze6B z_1~9#hjJB!mBJ(?nz)PAO7U~-RNKQFf0Zk8?lcU3z82qE&e3_=c&3sTHI=Dh-RVKE zKKRX*aPP2g4SU?+{HT2Q#d|x0V+o(5>QvA(Xd=uNWjrJ~^p*)%k$64dI=c zmiN@{_hobw;6OBehum0}R)4wmvBI$IisDuUp3fKLyIsO!UmPyX+3%whq2f_qD7Mgw zfG^9&y}YMgg&)h8PRWt@wXXjjk$aWWh8bBKY#sWWIuf}KW&0<^?R^1jvli!1&(iMa zJj&(#T$~r)w0(4Brjmo=2n|BQ^1@Hx;a!GO$|ue3e|x+~GKP!cH^+RX73lV~Z&<30 znXPKP)j)=%lyHXV@%e4*ByIKR3gyFvJ?c0*(K;Rv!X>q88CIGW3}TifVrH*8H`6I0 zF{@;uW78{Q8kLjFTNTtk@qLAFJ1^hV>S$nxU|GI-(oL%G|Myj&C>SFO&dFuRoAu$( zY~G)8iBa(i4C0Sx%cN%ZiuKLJ{-W4vx)>sj-pHIaHcwZ*Eb-8PiZ7(x!8d#G0kM_T zSO?+sLd=Lhe^~X>*EtjHW_7ot@A6|Dg?+o{wd>lY?@Bu=(yf?J;@{)bbenO?-dAn7 z7||6h)|}nsUUIZs0gc$DQ&CZeTLiw#?+D9OWGgO)jg;?pw#EcqMbuU=M?Fx^F7}sy znqzy}e45&wIcWZUg}-9-%D-P9NcFw-&mO9Mk_fxRC(1JssH+ z*n1zz7J?8fU5etnr!qvvOl*^y`ts>||0%762*18{)+PQpH30*yuQ&B|f+J2a9Ugn= z9Od(I5vWVL7oLl`MBbeCvN{LCTvthQ&PBzZk|&A3plHoC7D}R2tc(oME@NFt-)YRu zv9T4fhz$}9;B&^WRvnV#AI;JnZ_=-+1833$@s>++lqAey<2$J=#BppY)8QF{^OSKB zKRqlkS`Fh-G;h9CKB{FCj=V)INBMso#Sx{gD9S}C-7WHC_l8UdXhX?Q?OPLfR&DwMbJ0>EcWcWn@ay`=dgn-*+ zeRFu4@&3#1EPe7ZJ=gvq1e%9Rag&9I>0!}R%52|fY@Oo`zL%!$2o8scsQu>gXRG{l z3z0Wdreop+0wdMrok^wdhAB(5WJE*|UpGH>=@grRCk#q=Kg8`55h0J5KVX8y`B@@A zk~49v1rwngaVuZo46%j!Q?X7?_li>)_20TI5%u*2ERIM8DW{#ySuwEeeq&w*BdaXuIk31|(b1YpYtOzp~lw6ZB&~eNtT&EQ?1m!F|M$ z)z`fsxz#Mc?6W^BV{Pxfe=b@7!{e8&oZrQ_y3RC&jcfCUkdSMTQx6}Goq!+9ef(qR z&d5;l$Nu-*XozAte%^Ryn&V3`9V43SkEaI}Nhp6Cn@SXWj|?K!_e|M2dd3A~78agP z0sc11`onYl-sP+$VcOt*ol|oEviz2&rWN5z5?`QR*wT0HSmSYyjrdzG{FsE6#azpz zR-e4vBT#DMo%}9g!rss|BAihOu8HK%E7{&{-*93hnM6QP&l7V2WS zZf2kOsqolW+l!QhIl`qn{_@HX@1|7@hg4GLo(1s=pH!YrO#9608NoJf!w;ue^{LoH zD1nk072yb2sJOqcfSpH~10#G^ZmQf(+TYxzS@)lGHNkUW-W2FoivPkA2v9LJ$H#^H z%nD;Dxp@kg3bpdoem(*X<4kUL-R>Zz+RiRW&4c2h>F~Af%;!MSSJa|({rDyM&G1lM z|C<`Vwwacdx!O+=b)`$>JHde{WR3C$*0%7r9Ho8drKqxR=Vy^SMqX$6+s^Fm%NLCd zw}@w5**p{~Za*qdmlv*hCR>5A$6QZWP3I?G@oGn~PU16y>6{fp{tFU{dKm8eMw@Y~ zY4Z8p9j5CBl*E@=X3|x&mFI|xMSAPlZr&yXmTWaPTC(HG$^4(IEUwvvY2BmRA!9hf4}*m$q!>qdF5A5 zU1EzzvaLE#-8ANY@UM!FV( zWjUNLIc+hBMO0I_d_?A~*vY>0zPW^6-TP_Oq4Z^O;Z>3dD!0htX|Gx)wJ}STq-#9P zA&ru45%i;u)Mv9I$aiP>+P+qBsWN+|l|?z`b0czb_3ozfbS8{2=p^OLtM6 zp?)rQ0x$ak;SC&kx$F~Oz20qnWCmIvd;OXhd>Tu?oX=G`(>xTeJ}9hFeJy62(J!Gdz_-Qbg^&V}&pBF`4==X=|ajid0a^1=|3TO?FIVUi2R zI@&r(R3G=RGk2{2JspbZQ9!b(xVG`Bs|>vDFnr6E<~Ql|#np2|l)ueFk*77mrF5}> zgM>)oDlrw>AL}96bg8HIVjJSqtcw8DWmUdTAIMRG$(5eOpV5Nywp4uEyhwWE|L>afD0uZ)6r3HpLOZv>*h29X=m;0KR#U;z(iZE zpSm7*TXBSyi0mKhVw|@r_MCj9^cWh$U;j4%&%vXzT8_3CoAqa@2#WB5sQ%H$KgZGG zB>p-{5IMU0?D|8Mcx@$GrmV3?@An*&D6$;xb}+0I=Di{lWKToQ7nGT&A%*CwmDRD8 z!KSjzC(;eiI=`EZ2WW}sRJf0CZ96bKCJuZWer%hvxX02TeZ9`O>c2VTeta}kJXpN(|TK}m#qxWiaxA9Ft z^Cg2=BFe_#19IYxnr7U|xKk@#l{3PV>k4O9;<@k<53YV>C?{0(C`ki~pl<(2=K}Eu z*Qs6z^fQ<8E~5$d@)ik;L6So3Gb;IVxxlC1lN>S^3}Ryghl4pU#&UzB{^@v{`4*Kt z#@tkZj0PPdnwrZ+67*tVk<0IQ^Q5925>?ICg+%7zcI)_J&6+sB)XfCoDUPG|1gT$y zNMUM=CFH8kfR8-MP5Wr3EgP2jS~lhleRkx(R$LSJxyH!7SmLGnxSc+~;w&6bO$_y3 zlPU7g>QUO$!|1;}!$?0%{JhqtZN~a@g+2Y|2YLNH zM<-Jx!UDtynif8VP@ZZVMopgapTtXMXp{^rA~!P$nd1NJEPeSA7X8@4z=8FL+-nv} zSdxVbsmGU}K75EjDudrL9VEHc2R<|3W@AZx5p3hhwy2dq&OBN%rk2^43dXQSI+LoP zzSQZd<+Z3yqWzqJX5Vl@JLzyL$AYt6>tipZBmyc>ZA}`;@bhDl9j^9vy|E9{$*2G{ z!sfz=#>}-qW)fstHee7{EC=h-7dV3zN=26Mixd%S+`zU38{~I4xeCVGtgy6Si@O3 zY4`84ZkLMH*Gd#)pV;$+#qJ?cgKa~gPc+;{A&jw=kq;b){poL77_j%PKbW28w!T?G z|Fe{+EqTs+zj!GuRix^M`Ks7<6H~&4I?9zs#Xk;Rh94UUu%BX)qvQM2ev}>Sl7^)H z@*x8oNQ35j#Yy^{m27P9>Qi?EZ$&A_z+seVJt=jJLtrZZri7vv%Sh-X4i7_Nd;n8B z@PTO0NwhQh<>eh@(;bXGwiG>zM2evOoCsx+TRMXR)?Dq^3a;p60aaaFowY4lNI=B% zMyS+DP<5M1SNEmLz`hsHck7kSI(_nHHs@^-?bueI(j{G&X+oT%OLu5G#BNAo9Vp{8 znNN7}tYT2f@j0*KHbnp1;AD(7sz=R35_2vtWN4tKjRuSd=GFFD)|duS}mZ!7A)2d=$g^X4V`bjdYD(GY~E)(apKtfG6ZD z&azx8x?h#LpJ|&sDVA;bIN7&urLfsS)m^|5bW|p_dgQqQC7Sfq#!v)p{g_JE_Lxa zneu*!A zGQ6pl?6Q}>t|pNH_1b~BKO{tWwW5)iAKrha%eySny~!{-(ZA>}-&j+6T1O``;@f*X z$6;$Lb3s_x#OaKj1tE2RFL8u$*B#$nJVh-pblqaAw7?c30Pc)Vdv|kP!?=qt{h;8%=u~Wm?UXqqmXS^EUi#^eRbS z2YU&b^x$n_Lj#Uii?tOl&?@rT3vd##hy+Z7m?EOqDEObMQSNqp<2GL`46#+>5&FJd1eh^9VIxv7{@@pT&YiMXIh&l24PyyYkJ zHwlWAY9S?YFy2${8=ZbXJzpb+s{gEf#GNw=4>Pfm9MpmhE8nRs4_Bmdydu&6@C73e zwn}HA6n;7G<>L2;B56;GmD}HRu1kd@YoEdt7#PL$-@df3zQwGeRBUg{vst@~pjLsN2K-|ahrbfq*JKFXv2*s7s>`4 zmA|sWvWt0-@}@!WGcER6ZZfLiNMP1_YEsFd9WZmZAI|K`H2xVZ^8f}M<>r*sBp!N7 zu|l@lzuYJzQy;~zS2kV72c4BWhW_J6L@wjt)$ zysuoQO9RbBZPL{VR^-3&TuvN0r$(z;mvjb%;xBB!yh`$wfC46QSC|YKqzJsSI7|my zs4shLgw6#$;;G%D{_2iq2LBovMsh+S{w36TB-U3LY2@!z_P?;LGW4Ri7U}N2#j~m= zk--@2YW!ru8;QKoyKOw2v6Z=$@&2;v5>>B@9&M>`#yZ)0D9;@@CsFqxHr_Io7ByTiH$3Pn>|>N81;VMth`K=_eO@ z(va8C?zv=Tae`2rrVHHbGE05N`aMz;`OQ%TLb2tG@*xt_nzCY>RxLDHJ3@D9uf;Pq zjPsmjdG4~Q%0gPzC``$MM$9*Y02>=5iejPWk!>983H6S~w1g%pwfrw8{UH&|A7dbVmHj(<)1|6%I7uP&=+M4`TQf^}%>#uT@0DOoNUf_fqzeypsk z%$9fS0I+j*R;s=e*Ej?#9&ojH$Uedlky{oX?*GP2?_z7V4wv+g{Uf=z0U|+U+4+-( z#yj&K5|`%jQH-C|FVBqPF+!ck1|2t$xV_Yhhd($ISq5GGmPb<@2La{!^`-F>&Kfn} zD<@acsnw-%b<6RRl-2p;G0)p+eO=`ZGOy^vFNI8mm@I?ygHddDvFpy0@XlAhcW%dP zkPJnzKnCMO@w7~bJk7M}%0=;3K6cV67PBwZ61{?vnyd;6$jh^rRIai0DaFWC2(_QNh zop-ycou+q3B`HkNSVFbG#C7zr=c`#{ilVPT|&%dT&x)+;;qCbE}y9o3+B z=6*qzsgdQ$fRtTIh>2kGQVldxs0y}d!k}1s|0U*uZFXy(M@28P6ec8 z-TXqu0C~lU{Oz)bO$+1O5n1^na$e^`xwTHvYW{Gy5e(ysO zV(2$d(UJdsJv`Izqm7=$@Sf&h+4s-CD|m+djoF%~!q{E=LW668pP!#QJi16MhPbB< z*oAL*TFp#*R&ul|2w=HPrnZ5JWADNHOlK%WKT3FqAfsDJ;yzNHJ$HNABnE zlxvS)V?@n$NB#S9a!Q4w%raEvEZ?|HGwgo}AWL?bW(*>Xze;oi+$H;cI`n7Zpp+%l zGtharxVX4-hp{CxOl-%`Ng?y$^nbl`W!=}GfV@JhWaN!(nJa@r?4XIw=^F+-YYap; zQdK2}Yx{7pE$1A}6se~COZ%RbgjU9#f78(`M*}4#x~}}qe|SEolczlFDq#A9)bUVD0Bvd~9x?3#QP?J=>f_l}J ziyObu_sGc4HX#w(i4I4h_hnLBn#S-LG93|JGJbBlAGsp>Ykd23V)ljLw~M`E>`0u* z(b7^zK{;0_O`5YBtkCLkTrqR4Cx5Lg=Q>`?R_1vicbO@Tmx5D$^MTxO{uqRnkg^He zHN1#*J^Df4PsI#2_*&*}%nGI+T7Izcnbt|hyf^bDB(ef<2nIxm3lD!gJ;*SdP2O4x z>YM-bUF})l;*Dre7W-z@_J)OmIKQ3Y_xqYF8P;Kgf0eBnJta)d})i|zoiV@ zC!<)LW0>%h>T4J ztXDvGBskAwPk%g-{$Q+ zD?F>>9a%!>>sIm!ztXDh@1MN!YJcB&BHs*QN2$*kHwjIXORB7Zs@g*~iqnuFGe&br zYf$h|m1!vi-@;##dnQaCJgHktBRQ61pO?yXz&P%p|42wVlB>Jcx6HFo!y-mUj@dix zlF?Hq!RnsYYK$O$47l#x)X7#b3Q za45R@D&6$JfOBSc)88WV^;ns*@(xfHUuiBj0k+3yop9SMj1@;_0{P<)Sex&VgK(PWV4i@kl03+f2FZ zCA^oooQK55VMJYGxsYT_-(=du_}wSJE{rD_NHgeW$jLoE{?+j%Y-RxCdPG(o;?e}U zcu1Kgqkl&0i>Ip9GqpHqLU!dY@Mi_%Hz#(xezuG(Dzo)W%@>+P3~-Cg+_YM+<%BcH zAsB#j1npiiP#h(HyU!C>O*-u;)PD>F`=VB9`0+;}&_7`6Jo1p|Rw18{mvmh>Redl& zh5M#TAMS8SOFJ_AepaBF1)GS&I!Lp*5va;b`i#I}3PVzcT1pZGn)6=LqM*#zGhC`o z2mUXJ5)St{2t@b$`m;q=@Ab0~nNQvx7!?t6tAjgrCaHAzUIc==5nvB8r7AHA(;or? zO7)>FXI(aY*r=ISR%5iR4{k1#B| zN!oW-rv#S6V4W5pg=RSpN%n3OQvHX0%nTd2nDl=OZ(iu_?d4ds+m_T-*D$fM>nON9 z;Fg!_UWXM`eY5fhz6t*0EgMy5S#hiAg&QY%tqHv&)qJ*vE^1AVshobQm}11HN}eo? zwpB8nU;fL}*IeBxS#+GJed+ivi+c4BMqq2ks2u4)g?d5AGwI*4qAZdnAvsdbHCgHP zT4(_m@Izdc)h?~DFq$sqt>oITA=M5ZkLT|n3<(x;@vy))U#q$9B|lHuypbdSM!gvv z#`r*T(7#s)+>MaG&L2&5hsqw?N5q&-iKwbw9~bfaek!=}0UkJh2FeROL;PNqko;Mn zWA=Y9B*>{>pwkq{EtwN620EG#;-d-+M1sZtdqYKZhqj`2I=oXWKQiG%?!?oFHB*Nq z{G)`rOtyvFVW2@;1l3N4EMan5QfAU(f$eGXAZbbMp-rN`31)|n+oXydX;DSS&$nQu zac)4JBRV3Ly>oCb^Ryk4GhN=T2fiyY(E$hVjEE&}*}3h_lsa9BjEc;7cXMgcqy=(? zSvc3-V9$SZKeKNIkG+5F_*+suCaJArsRca5strkWP2aBVh^cQcz~K5Lhd0Nvv8lVd zxVE*QjxxJYQ7on3algJp=0)~@CL=bb_9>9;GgG#52p}?*88`rfTy6eN^Ph?mWj3_) zMXt)|gI~u+!^1qz+wGnZ-)zbjm&O%;pJ|2iNh9CIz}#)D$WO49be(y7v3`H5x+tT+ zzh`=TgW-U2@H#5Qu7hQSp1IzjsHBq8{8jX65WsSU_9>Xo@AphP%%||{p zkV4NG)%fV+0pee-;x0?vBD3#;XWVLO^m@;6Yjf-?d|L%sp8*pR*T3`I=ZL-7M$a71 zad@>wp9;~+z^EftR{Dfy{>=MXex9IrZNX=4YV?pe1Ce20UnVB)5n+hd&0C!=OEW3D z_-P4L$+z+{?l7B~>0i_K(i#`KyXGOe28t0e<|5;Qx7cGwh|0L3`C#8`FtK!of)UA?!z6VpmXyAcH{f~6Ivo?^{yx9 z4$RKfQ!|Sr`FgLk4int@7iOz@uUUUvvZarB-TiazzcZzHhtooa@%n98Le>ZAkVf(+ z(pS0EQxpPbF1X^WhNHqY>6bLwbTc&*DKrW?~BrN0p%X-dl&fR(zkk^|f3U zY6)xyZ;(cmJ#4 z>x)(mIQJP9|28XtIW+A9pjR`KPIGau!o=ny%Us3oboI{%Nm&>4q41TA6%6DfnZh`r zT?`Z%LN1oFLJPNtt5!|U{uA4y8 zD)|E;fgR4Gdts_i;f3&_CE{nOZs&{Oyx-Ao+NL2^E^RoL6HY?=@=n0B;%m-hA6YnK z;Sg%tD0ZX|_f}TQo5|HwlbG42L#I?*1SiL+$z?C@S+B|c9B`=+(37N(uC#iNQis>b zj>p4q$16hl$5bfhFpGK)_x1E%LNBV4u%mNfXd}dt3DMe&VPlah@>_t+* zkLZe5GhBaZ(~0c#fllB*wFv!~YhG4wXJR7w*9|;~(Y`EQXA}&_SnsLZfYDC~KFKR;XnZXaH4gtHiM#SfH;n4c`%b()&FN?ug zjtkGnCuBQEsz}_Wl#j%qOK{}As${n4S}Ac=A}wmcym{XQM|TV=E2qrTUfzI4!x&Qslu;N=uHPfkyUInRe2Sj}sG`e$@3DnqXi^7rcnt z&DdE8RYq|Kr#3ZNYvbMhxqdvm9M> z>#*>}`!gc#`ZkjZ1ok0@tg)V3uaA?XGN0KF#IBLMJ0ZdHN(>&BIOn%hJ z6708(CRr|<%*Dj43G_*`mm855JpKR!Rmt^>=YTw8)bj58b6l8!h1gN8uQdLPI1j!O zn{f=jGLFgfEjq!JKGQyH&8r3MJJpw?NYuMMdPt3&--Ev=M!QV-$<%|LjJ8^fU%d~OG z`j7|TnP=xOQ6z0>k{Cu8sr}(LU<>`xRJkLO&wrV@7_*47(4#%d$M=tP9}?aPG1;lg z$vK9IfPcru`@Ezftn^=~uols&k12}>T%coWg+dG=@jdm}fRNnAvWzS%wac8RYkni9PaYTe96IL8rK%;7 zdt^bA{#{|iuEMyd0u)O3CNMWbtYd|!re__5N`NAonNzJp81oDBuidoeV+;=^MxOfq zz2D$={N$TXiws@`=LOD3=~yHLR{C=%DSD-&?@d-@-K^vj=|F{lX@uol?w%+(6K{NB zn76cCH86M^y?Gjs)O@<}r?N6a&bg+S`EcP_p$Ng9C!q!5Z9lTiQgH88y=#w znh4BbLNPlba>KC78R*i4V&+`Y=#nl|HANu!Wy|rR>tUy1~{s16GOqB^TdlGB=j~^Q=gZp7_0mOD(#f z&|7}I?i21j$fk)QcLdnYYhK8?7Vd_?^t}>0!rGk+^ z-sckhD_vRq=rs%rziH$QF1t$@vt~V%SQkU@f?4B#-o?51{a*Y_c*kSbn^>EIV*BD= zBZyEb#i<39Hy~$vEA?<6mz)#hob7jp&KANBf3V`R%GSd7!MeV~h3A%uEq8Za4%o5+ zEuFc1H6vXd@b(PaXm%b#eb^s~%2Ax_&^&+X$)AnpizkZJus0~t?3-P^2sFMK4g2NE zU-RbLw$8eT_JZ9zb=kDAeJN# zW6%x!to)V+a;sx=lm?S}#9$O$pZN*!TX}8jV|~571dM3&C4G>#SaNL#c}lK*Z`(a< z=X8DtCPX0d7Ne#ds0GZ*&|R-?lUI*|RUIVuJ*gi_j$`)at@pvMdCJ1uqGp=P-U98% zcd$0jAUzk@82FhH$^^V(mrnKvV&LZ+#<)#Ee1aaiDKV2-M30WIe$CXx&3hlOOl?Tg zP*dl47rR$rL@P|(Yn5VIh;OXAAYb?OwqMD-ouz#v=-u@xZ1zObVq>-a@y#BTACloe zM$2~7;K8pC%o}G78y~#~2N2tU4-*Fwn7XP`w^vz~F2OBIm&3n==x_&PpbG2?#7MxwjpsG*`YL=b5?jA8aX>bEPq;vG7>kprw=@7EkMY zyy~`l&E&`$e>~<2j1`SaVOxGuko~{O?4d?6VW7;ur;b0{6?Wnf0>)!j^GQHf~*WW7* z0b^JavnYvy&rh&*w*G36DT%D+#-KTgI<>T=WK#NNN|0ELFQLRUxF^f^cY;k9f9fzD z$@bOKWO>*XEjHU3YdnVD&1{615K9YHKn7kmLbZvNn8cI+CiRPkx8Ssfums1uq2(IJ8IDT1TPgk?bAv_V@N3Aj+xy z##QCu6z#+vR%jd6%Oqw$e9Z0FPrK7}91jkT9VP{EvwU_Zh+WKupm*R@^X+HLv_{EP zJ-;#uI@Q%sCW&7-t1wg8265pA!OBzx*iS5}DTI{@pjn6b7>qcgscL2U%Z zwu#h|p);1j8Ps6w9IDhy{Hlf)C0)ST`j&@%^TrmeF`oA)tJEtVO(x3saA*!(+M2{d zrWEK#f2?{lGTl>`hdSL2?(@}f07KQ;JY@^?_^&#|ZE@+f9vw;lIYoaSgRw@pg7TdL zIVO`@1g#e~Ial4SAj{mP_WXxJcjxgs|KGz2sQ?Ad6PJAmuz~IK0UIZ#g zJVx!&n>D~7=evzI#ABIKC%A*&$wSCTN-_3w%oX@35)^VZNDo8vWSG|t#}X`J;AE}R zD)9Am_ui|67vidH(L`z5!gpIqDYxh8zlW{pO3wx2>Jjy1)d^00LrFcTjkcdxfV^%^ zFClz34Io-$NkgpkZdtUQl2v)hu&dOtCtKFt^EvKK6D#gblC@5#hnKELvR|(B!13sg zZH0o;tiZ$vl1|!#cWW6Sb>PQ-rsIGAzn=U8fKoz8WuwAnpRQwqoQ);kJW0TmvT;6# zmnS)w+PWDR@b&H)g;@W2an<}6;M>9)qdbESJlyQDv0iRFbR7e`M`+wqiIC$YVqeWBg9M8&eA_Ax|zW8;VQ z65M?9hP?VMaP`JkHpfSqo6TMrBG}<-H(lG&1h~*&ZOadd?+KUP>+xxmnVWdz`#1Vz zsDJ2MZwR5f`xd%Q%vv|O2o%a)e|-7!D_5hI&N|;4RTc0~&&@h_40FV0M`E@7%Qw^W zo|pO6f1W)+pw*dT7Dft3NX4RDx)p7N43WS>7!9pd*8CI--GY)xO=Ddo#!Mb7CHQ_kEH3kC*Dpq<2@AFBiO@kUFWYcUdKqd&BM*(-^o>fnO?qt-#n?mFno!oM6U&BY|TPZn>E?-0m(=ulFb zu>`#v{JIc$yY}F<`MvPq;%l=1nN1;+Qj&HRx#&qH9bsAWXE*`t<#5fR+UYA|=u8LV z%d$Jg@`pZAW=MXj&Co#+xav>FC)Pb7(CTkgR8&@K?WQp%U(j^n``3aL7VN_9cqnyC zpm{5hlr8o~?R|b1aDSXJQNVvUuF03$g_4mxVlxS2#)#(jp9c$3UZIn-ythh9omXaMi`elVvX*JM10+o8r4orcCd2xmdO`9uW!W!`Rc7g7mq1F=))nJC*SRk2`)`nmZSbB^6}5DjLeP>l9k zfe?~DNN0jwS31Sx2!4<_K-QsaE`l~X!9w?v{uF$jRa&~!YcD*SU2ZnwTlfQ^KP~W+ zr>Bv50iNvw=OevW(4cQsj%4Y+MNWX*@9B`Cv5vKoxD?-QQLkHaJnc3U%qJAVk2eo$ z(hhuJ(lxyziMESfzcKXBNl zN)dX1W|EiRM@uEv;gDI3Wif0BKuTvfaWV$I%Q#xNU-_~0Hwx_9$&nl9I15CSH&Qif z59ZT69Ap;#Nqxy=Jwy>)0Wz4Jm>9Hq`9z*lY<3X5&47j0))^Hy@h0-RQqIqZl%MOP zlA0${%LXs%WQVtE7xo2ccBI9s{YI8IHzR9ieTN=i^1@&8j{e^du~+pv<7Lx;nxUo} zf95*OUig;)Xz!9)aHyIEC+okOXA(&Ka{QI6Jd$Auy|8j&WS& zHr43^b5IC{4s3Cj_^oYN0_>KKz?hj}B*$h(^2eGqZc_LJ(qB@73w~a8k{o(byI3y= zESH{L$L#~C|F1S#yg<_OwKmgR>uKF-k6r_pU2_JRK?)=))$2CX#0ROyu*Jc&vgP@G zUs`I8A;Zv6&)^^$5YJvk8)~y2zMhWx_24lB+`esW9fH(H>=f<+7X`F~@a29vGq|`( zYpzRgr~vz_AW+#&uT4t&P;%Ug4W+0SXulcP9Rn`4x6Rh>ld0#6tTPfe7?t4C^s2m9 zG;(f3uM5xl(%;LD2i#)4An$C%22wxanvF2Hoqz_Q?)Rr7zk+M2Wi=d7hG0U_`Y>|9 zA3W{UTdUP~?R7N9Rs6PlZOJsd%)y<#-s>VW6E?!LrX=U~A8BwZ#L`7~WW?}ZHEN-P z4`8@7@yxR?dxz5S>hdb)4mm!)=7v$U3H*cun^P+a^t^PZm`AACD^`lvnl&@@{gkiz zwXd>L0+`w0w*_8Ubq*J+@Jl_&X{ILE*4h{nsy_d$Dr9dtVs)cf2faf4v1u8{%E zVUMR>TZqz3LPjF^m$vE}wCKH3vkDUtPe}aVs~;PD7@2m^oVPBEW9#}Li&F2M?ttu{QYxic~o=Bv8HD~3aXV03!d(lVXR3=~h!e&Ju z6Vk2!0bF`S+fT~kO;vbYj?1o-jaT&he!V_a@h)w#1$B8T_(~E%hIXH5JItfM{1Qu5*n;iSD-qDa5jnGkgEb6hoy1 za^G!zeZ8zlAGGmLAGwi=#{mQsVj0qV=c<1Z2YQ2*DT$c3xbp(z}N8d(tal#%AbRqGau0Igdw%jmvZnoU2N!!$x*l_CM;^hHrZ*Rgb^sNh@gtRZL4E^OS|}Ln>~wGaY&o6xJYY*eH^_ z?Uk`xD~7PvGe4wP;~*w>?F**t1y8FncZoD)k)R}m2Ea^#)Sb#LP<{aOD!+R zUKZUsMnlpCvd6pvB*S+N@ki08A1B ze`&&C!3Fo|UWIy|LrHzNQ!2xL6N60y5!zr>aHTWYl)u>omHS{{%IG6PY3yKr%ysUN z{$nFJj(vi+xn61=a;G`JGz;f@5(@6s@9;J8B>gMlR@m<@AEl(vl>8%4d-&}UlLr}%3S@1 z@3RR1suzh)#4iv5a+fLjl5Tr!=dj^r-Io@vv)6-ap$D}nFlPVoVKh(BoO6+g;a!>4gIPk&_|jF6WhVaPwp8wfkX=3vNC#Z`0C`j#g@BUzPq5)exO@1HJGi5)1(Lv^!P0QEQ>g(_Oy)pUlB_ zO$=@dgDXH{k@yH_4!Q541tt+m@NP2*sq`wuUiIqlcs=)BrAJxCuNk5lCvXjuiWzsc zs|M_vezy;P{R*;@+u+w;ns^ptAe_hyoQy~F;au&a-MrtL=RsF|R1EnYGM&KBB1=_! zQ(E_Ixq5m@gz~`v`Bq+vszl%e@9B9c+N$&owT+nsxtBE@4pEtp;h0}5VefCsTe)&zJ5zo za*Li!_Mvd%2Grjs2zogJ)#)Do`bT7W5(5l{GXjXvl14WvLL0esVA&8L;)#Ww9ahK? zxVz^0b1;6@4mN(f%l#WfWpLg|oMj@%>${|QwWhVV&9M$goIfD6w5_A(?tBL`*J#MB zPx+vfIctP3p`!$UI+@a3yV>%1(L@9Ww_g*CCz@Ck#95P6jguAgn6bD*UjHbr?z-Y3 zhhsrI5S|o3F!#8jgnLAr>DpHx>Ga`3?N@E4qnpDoq6L?#j<@}qYvJ9|5`r)WqnKVa z^2wC@4^a4g!9V|=^0@uAWmR#;fF$NJ8MW1=+(U!&|cEWg@rp)Lko#qvS z5(4j8G#A++yW;t^Vhg^VKzrQ`Wce0B&4A8Y6<(0?Jo5zPvhA8)z6eGHLUdC{^5ZlL z3HM*O4f@ekC9^0D_&4b4>1BB|;R5~oH>9!Rs+@KpvBRa0e_Zo7-kpuM4o=be(GN3} zhIW;N%lA+F_^3o*B(``{?5eg3du#zEH0Q{pDdQuX)_b@*%2ny-54ae1iXv5%rN!cU zo9>TARz&^saRi7ux4iUsA#}l*(lOVs-Nrb1z}_fXV++v0dW95&6VmKTrHnxV*XmS- z&)7HKKO|L=TqW*L5uyvR(5>A1VsF%pJf3@p%mB^T`ZFOo1W?Pf;c})aS@|CF6D3$L zfDj7CR*Xt8d!$#j{bb*Y>#CcUbIGiQNBjO(do{OCXLd1jQ0mE)aA)kW!P}HWUZzYd z=iPt=7VCTLnO)^YZ9muYqN1WH-B-ugyqW5P`PqKEy?D<`ArMZG)6T}0k=thv4?&Dr%wE&2OS=xH! zdx&3>eUe|Ah8LENUcEs8!rP(go=sJm-zAs8*k)1}FtZlDVnuZZ`AIv$g=|gL;>m=q zYaLF7CK%JQ@i`D7ceU+$<?`f(7}hf{S)6dgbRQ z#N{qVLb_^#<@?<-W@_HMa^N)9wrjfPhl-2qhrlwbB8nLkbtiTQY`ezU^wJ60`!5Pbg84Z>|3TCBAhmODH`nYTv(R#IC7i#$jd> z(40nmrq*-jmq`4Z^`w^^7{2=Ip@W`H$3Vu9%yx!c^vxcUG2)I+CNH#vT-z%+xVp1s zGshu!(0JQVW|POGm9Kw<AS-lwo7dO5@ zT3?ikesvR!kn0dHPTeH`EPA0%HPt2OA(wQK=^{7Yujbod?O3IBU9clZN`6Z;vkrlR-pB06r+w9_(Fy7>mJeoB|om zpG|j_CEWSV@P0q*v3Fzp_TTsK0JNTfg2YPJB*jI+peL@@1+p`$`=LPV)o_l_(Ra_U z_lI?$*uPu}hYDrnR&N-4Ek{^FV1r>xZ_BU=D-!+73nHi4Gz$`=)Rdb7I<{A=E|Xi7 z*P8H>M)AY22!#ej?gbiNzk+jO21pl^{pr!ZZH`*9g#4xFWb`2d9)iga57z?(ms#oc zZXNDf$#j1~g^$sMIBhF(6yG`SgRD&%eKpZcp{f96DJ4*$r=Fc~p`Vfgra&K|Gz*MM z{PYRciFDg97YxtEvZNJ%9mpU73vmBtq-|9)!-ii8b+u~3T*Za9!7KG?Q4s^IAM$2w z)Vb21sxgTE?vpRx-j1L4dghVp!X2Y5EpE)^Z|dyaiWH)CyCN}jgUkQ7GSQ=Ap0w01 z%Oiof?nYhhkuqj49&&;fnv4FTG6EYvB@qA+ zq|8^jqoZQ&b(L84`tElq;%@Ld;A1;aW}=& z9F6EssSBb zE9TuYls@ZBw?7nx5^OMVEe<5nWUU;FF6bh;OW_zfpbHXmOB8qFBiWc;%4 zlCJ0wEDCz%$cLbMdMH;|rON#AbFXv-eO7O1R%BGVm#H%pMRrnyeYrAgya; z9+iw3d3RbQBJWkYx41(}ircE!=E8XcFL%jw&$O)kE1U%$cKf69?~jbb<+3bEWE*?& zt!$CCU9s;&{QvDJLCqPH_Y= zjyY|M&_;TA)X(rzD9tVPUH3pFkzEZ5hOY+C)>tc1Q4;M+%*(eg5EQ|p?gbM;gPpF@F zQ}IUngC<7$X!bH&@2wFVZKka6RgT_6BTxdofa5$bOE4QFNof|Lr84!l7kvz|o=qjX zC5Ct8Voj)8jo2;{L3B#a<)mD(CX=E0MDy}mHTJm9(Al`s8K=}kU>71cTm&2wExdYz z!T7gsHw1%fbKYeQ540sYY@gdtAF>gW5r#WCbY%-XX>(~$xDQ*SOdXanH#K_d>-&{3 zCXwZ~<0R`x?4+%Zn;J7>pk)@(dem%_;KFV{lu(QXflEIs6}mgrGx*bSRl57X-ti3rHKCmJQR~_X99hlk5;CbdY&WHyWzNp|awx#2w#- zQ?U}@9VXduR)~%A{M1bLl5VQ0%BZB#%in$5r<`TV;Ugw8M*V8AWPcpcqwz z*T9ibpDUgjtBV&mO#;Yg26}p8efCag@kHJO%?cxAEUckneHxz%>2G4O2iO^bp`qhR zyJ6%n(Y}@#Y4~*@bnFI1*ZAA{{uF>-{LGc`>`toIe?E59&XtrE(Y7aalF%MEg7is2 zfFj_x6w%Zfq(|M#HqLfrNnqZ}s`;LrEsq`gGCNGzT0Al=^uUs^;!|eKrX*}fay;fY zf*0F@nUDV1b?d~PY~Du^6$GAtmo8Ily+AReGkk`&Jvz(E zbyg`FL1t4U{>{f=H+R?!0-CAtuWeSVsP0VSTWfMzsh#um;MJ1;fwo=D1Z%!)E7|{{ zCb_p?2vb!7pBWV6!6?ixIYVmkO?RXhBbyIJdNJ&mh*Szf(HI9 zu}q(QKcZ}vQ?RixB?9K$#%J%4*(6G!CDWDj(k-au*9rUE8}7qKOPco{brWjbnEv9P zNJueA#re(3pkItMK6qm#of0yz?+x&!ccbddAPHgq-70{o(c5)1j^{te^tu_hYpHN% z4=z&9UkL7Zn62Bo26DD94mecDdcRo_JbF|31@A5@&o|=Re)ye&$sl^X36j|N&g^eD z&AO)wQCD9fZ(Oc&d;l=DiYH!9$D&h3^zGH;#}LW)kHI?eZj zb|S}PWry({Asz)#NTj2+(P+zz`*OzmdIk}`i0Y!7zkKMYN}Yx(G!{2~%VswcolO#X7owW_=+zwxN*WUr5AppbBv6A!k|F|! zM0RJT_NdG%y)cj9NDE<6i0-=fs^p>e7FXY{)NJzVz7Z@qA0m(#zsjkV!@3bWEh3a) z6j7=Yi`IC9fO)et(H+MzO0ng!d*IvWXW_Kw#r)oE4Cyq*O*jR&_x4>QD~Hi9P>7mY96;Ajd^ zV;lc8V48f6uCCcj~2{WF76$sK)D2n+6wWi1J&qW-)MPv zLALAxI7)*U*C(!;;Dtp^p^$(2;MJ|22?YQQRG@*JtjsJY)#2hK=R*rKL zS2ssu7juR(OC0GX{W0sB67kXitPCjZ6#WP#9wZ8gyKE#BAIC$AWq5EZj*j33{27^2 ztFgYZo392v=-8onfR&d0cxepmbK>6un8usI(1H7dQ0R(G0=A)eb*c# z34}JgG_eW6-+nWZ7pSs_u-f^kz~IQ|o;Cv%UIn{rtFDYp>yjmoB%PbOY=L9-KG#$er`>h5fw1z% zn%R{rq*L9o{}T@ z$r3DPv`Zct>we&Atb{w|TXtiJV(K1ts2Y|n+bjaXS0R)ZSwh%R_OmhZKY~}yUj9!~ z2o@%OYP0(4Y;bmTfzD-W#K7E>QnpW#~!D!Y^u)&RE$HKy3`rvzDV8-~gM*lH)Uw^Y; zT4zs>vKq<{FHasl`v>-U)&p4l_>L&ijr0WGgd_cgxrg;UfuFEFy*<(u(M0;}L4M$^CHj&0b`vGI?yI;g)*CqYLkvP!htFp z$cDzcfY)S)MgbmV1TsKTHv=9~-@ehH+w#u`aPxZ_oj15Bpg0$!6u$5RWOg?>74uzg zv|M=kslpyp2l=@JK)#fKHq8N)mgC(rMIdVd43Z~0O8Qm???FnTbsT2_B`{(`yI%Iz zi{QY4R4?FSvcs<#xShbEbZ~%yIZs83u;XqPb+im)50A$U0uZb)EKgKz+>#{_8jCzC zRfMEgXhj93+`j(8~HYWl>n;6GC7{Kg73D zvTGLf&sO>EKa}mB`&VhA(xSULXK*pm`L8z4(%pNBTCVc_#8bIh2|5-h)fZ%viT#dz zz2jFjlX?Wqb!U6TjJE`0eUTnPWW@O3A?R1mXb%PG>KAft?;lj$PTH_!EOfBmI+>+&9p4Vh)#VcFc*9V+WV^&{sFQ zXlVd4R9kz?eu^GXvp=Gz_Oi>=*(=Q|oG5ieptNYW zCY#|K4^U5F<&PK;{hcSM0$BHE%)kIAD*Tt`#a7RJy7m3F2hjZi*ez}98b|oWek7-h z8&(h=^>5@py}sfrn}H%9d3E58_DO#RDf3VU<3&nXB)CJ+vhE zI48VpNzRFYSRvhg?hL)_)L8SuS(?#%XLd9Tv&a%X%Ou6!3$kwZhqa*|KQMSTFfhKZ zD))topJ`pH-$SaTODx0PZXe-Y>>Y^_75Ng|SufuEsCmYrR_@o8>k<-(<8^1!KFUPV zM5Xud3+*SEUtlxhAF%Pl2xdieLzu6xpf8VW{OH(dP^z zE4D;^s1Oi1w$pz^lCd}%b@#k$u0T=|0`oX~FbVy%&cBI8A?ba5Ju;2#1>tG_ClOmP zOt|S4PeH)eouRFimyDvNl^@3!ar=f$O9M2sL;(wKEKG(8Ii75Z(K#9gEl-}LsWOR5 zP^hJvwVTo^gi(>V?Qk&o?u~)$v<^{UKVxG!H@Ot;}`$UarQ!Jg*a)j=Y# z{k0S*3sFr_gh%5fvB~Zqgx<`GS#4$q__7_Yv&(qdv8DKAWZj%AtpZzFn#etU(&Z_f zDw8h@K15VMDWo}KgAD;X6!GWZg;^~syoWO!+a zc||iE8W!h&ejOj5E6kOW)2upgTW6FVDDg2AV23fM)SQ3A?)B*y#%7BrX4j2idBNlS zUUzvRz(v0OSb`Twa@oqW>i2&(l;jtJw!A@0oSDn^UszNnB)IiTxjYNlc0s=<&9GRr z?32zD^nkDZvO(f`$^{0>KZGY`= zzeCoK;sPDHxwZW#9fTbC;0ax5;}1kqyzDnIh8yx!^_MC%JT|b=89;eg6Lod3ELy-@tu~~=|)?2_qPZWaIg?rSd8}ZtrNWM%z-}O2gE(* zRiP?hyR5Ofu6?M#*6NWTYQKr_bO0j(302J92(gH-CaDt_G>3hrTr|7==cE}{NHCr1WGS}sQyeHX&t%nj& z0ccc}oN4Ba4XKYc)Rt4W=T5BK9DKJ69S1m#cN$)=w+)VIXBn4Kr?YLA-a``XT`@E}Bq5?w8C)_3jy0NFXOsL{B>QOz$&~?=wbhH9raJ*>niLi%=`301UsY%Q({ix;SK!ac;lH@iX%bFTfk5+23W(Tu7k z{S(a;paKb$?)Alv(+#^@a4s5ycF$7M2QlR+NW+^hU3z>a8F7B}3E!Kep+&(eJ#I5+ zRQs6a?TN<^%8NpZNlpiR%NH>c5fIukLgFNS+a-kGT1K1;lrAXLdyq4P>zpHge7k)$ z$7WJNLoW0=!UHzi)5(O@9l@AbP@CNq+NhB%p&j$$DcAz7|IS3d}^X{ti667`a+u;ZLXK<_@sZc zhZ!`kWwbSR6CNvAf00U|tKF>5c2*6N;(PxLMM#;lCcU-S6&T6Mp>&w={wWfGOEIPw zx%0!j?4U{*ls5{szCUDdd>^YKNi~fhh7yT z`s1`o_xRG;VK}6{6*$s%J;3X-m;KVqPan9s8~yy<=X=w!r1q);W)XlEX5VQJC;`Ug zePM3e|KR{Xc46!rn|0sl?a+Sq(TFR6RB6pqGKH6d{rXfb6GgPtcto2TYt}`yfdoZI z)kS?Wf+n&ol-H`khlz${^8HMVXbm?Hk5&-bnJg6NQwS)cwn|gk-(C%eMwXpDt{`B9 z#0(W9nTXwQgwEl|(%@jge`J7YiY(9JQI#UyKLpbEk7jS#!WpTM4O>BKm=Gsq>5pu5 ztpKr$OF!Yu?|Dk`UElU(1Z`{K(MQN;?(l#Bm9qfrR*yt*@iaX3_5JzDzGl|hAUF)u znTgeJf6ztwDg^D#j>%nn4iW9V@|D3(!ibxN08EbU^wW8(_`++}uWuT0o$BIV&9H4% z#)H)3+^NN3?(X%4@8pE74!Hcrb0H>nRM#^+UjU_fU;WLm7|CetelJYIpLc5~YS6FS zwx@e~N)z#0$fda_%YdlCoi7Al>A0Qsg@sU71=Y|3h|H^*+8qT;vh=+CC0|GowK=PXb?(LZ2r%M-aGpN8G(P^%+c?k2M4yV<}`fzdFZmdCBd(ZCnZO|B8l%JYSyaQfu`HS;wI ztZ5zC@!*zpB-ftx?UJXR|Gp0@t&(OR%cW2I7l-VCTmU`|uK!8z-|jYN@GBu`B+LQa zd&-gKZ!mu5v>y^%qhCA*wD`VXVeW3V1xZc-bVSa3)ZiUa4;fE>;AtoGjCBj7F(6V( z0hPp2XxOu`B`3(XJI!P`R9QAqR;IwyY2}&j(}Y;GqRFj&;e;TM>7gQa^ZZ?ADJF&s z|LS%dq!2-1FJoTyWGgYWAgUsJ1t$b=a3XNt{74UH(Wz)JMl#7Cb%U)oHI!11hlldLA1-BMTIs%r*6!(1ge#uYZh6R=D1II z=LJ^cWqt=0hUkVK!2Sq8-_9iNM20wk)?U}n102A}Cn_&BBR7Ii!yb@@1+1Fx zTl$qSg!Vy1E8DzdjIVbFqOiQ$p+v)ukY=KiaAeSGX2 zO!{hEWtp=-;0j_z#KU-uK#=YaX@Y0Fv1=d0OHFj*2XzVGPw4!b?k>sL9!qAra3K#Q zmVBVOKa%D-eltUz;XHlFt|p9#u%4GME8#!f1%-u4Rk0{s@0*wd#c*pyOpng*0P6Bx zhY7vfqRcZi%A}T!`?n|H0kNkp1xaC-RAYJhWL-zMTdak45G_VOd^@f&l+uS33MYJ+ zR$9xnsNPW;+dTFAwF%bDnuKPIw?uK^E4wb)#HI%&BGvf4R^}Q8CWFY*#!}e)1noaPQNB{ z;o4S%N~`oC1DMmZ|X`jvhvUcK0!u=QB z{EzQpI;W~qDn{nC6}EoX1+A229`_I1U&|u@x0d7h!g$rtE}!csn?bI|qP z^@j>|UX2*NibflzX}a6lA%BoJ*e$O4dsF2uCv^u)or{YtR zFaPV+Rb$Q3G7jpIv(gmmM+#H=K(XhXd6UZsTW8rV^DZ=2Ih&0otM z%;^T7*p{ggJcga594$DPx0H70?BsU$82jq0PDeM{cQ2T!B9gggnLLLS>9$?qvT!&NCy6TnqlSWCzcy#?2F{sGV55d0MoOmSe&E}v2qll?OF;>C+icUs2TpAe5e`u9Gpdg@r&)=66tbEhgG z-yXJ#6ssL-`0=JOklog!hH17o=y=aR*S*Q3qb~={ugc3W#ra$nlS}WqHFW5;Irl#! zaryd+88@#A#&s%aCQkP8&U|E2;X{C44G4tYoE0Nv;fRQ)LFvvjMuV@DXlLqsUk)f; zbF5a8;PRqy(Ly9pBXRQnXSuN@zfRjF3&0JwzM+IBD^fcxi$icYAp0$(iYF?*D3~2Q zsqm0CpiGBFlR0f`7o>vvGn46$Y|kHE@ftEogV_0YU{GJv91{PJx2-;}d%kAjE-=)~ zUC7j85s?nophjBziI>~2Jg>!0hO59RZn0-E%=^XVuL*XH(55Rn#bb)5jjY0ba-^^pHgx8#QixacX%3oD1ChRI0hZ4}t)a;Mu6sy8U$f|3j?@MO!#JtNiYFwejx;7TxlRE-1KQ=@d9tMJ7(kug(uIQA>HR z0Nmk!1-$O;B{<%<^7C87wAlhd5$(*ka*Y9OT$X?|wQLIWc1L_mSFMB_SYb-PRfCOj|m+ z6R<1YI9=i2FuDd)vO4;PQ7}enqiGOcC(-16uf+};eyn&x*MH1!fBg8o&JTLP5CdI6 zKby=7L=@M4E{Rp|w2tj9q%csro4z7ODm-sovJly^11uGs)Z5XsFkm+hIV0aWC~Rw+ z8?20ai!owz0*(yE^*Uj7aOVFo9O>JsuyzfkRhNJTOT{kOw;65$#AY1c6D}aqhy!wd^*PnsD;z0$49MF z5fYg0(N3sV94*cInhFt12|HZ7qWJNC;O<9M5N7!S?-NbQJxY4lEdYPlo7ej{ijF56 zg;1ur8V*g&~D;NJ?b4j9#}V%7sbZ~!Yzt(5rIS|({v9Q;?{ z;E8GTWB}Ss8ocWBHnhf&7vU!Q%0<-pxFMgJtj5^dR-67vv6$%bI#G^ClhnVV7+QrF zWE9M8#_1+^gdnHmVtHo@SJnsFwd%pVU!I~dr*k50Cpx5Pv z3DkDt39SHc7+Ffnm*18?G=vof%M8Pg&aMFb;3tMeYayuPZXyY!J(rZJ3#X^EhVJ7) z7s9!+S!kP=*QkQ(!Wfe=cfj%1%5LiS2D?DGhgB72W1v^phKa@4Cw-8qg~OrN9OhMN ztu@PFFAx-Ltn<52S}qg^Y0Pid8vX*vUwz(d>w2eOVB+8>f7+U(<0^NolA=9qt~ua> z*hnTj+F0%ew_91|rRMsc(y0yrz42YxlKy6yuUY;r97N(UIU%nFu46ktlbXnT)i;#3 zZ-4lWyZdbFx`D^}hd7v5Yr@2f8}*`FOFK~I_HD9znx(kQ4`3!>$ugkD|4nlzN?Wpf zS>Sa;CUeU@$9(U!)lW_pofID;UVG2mJ0#bI0z<2l;n|9)zH(upWEZWDP0DFeO6kXd z3zlhIpdTbmDy=&;x^Haqb?@nZs1aQ-$XCZtoY?yh3LKA`u8=d>0M$Z#xs$s3p1x4@ z&#|ECc_+kuKoeSb*F2X~4C|Ns1K`+CkvLoZt^+cst`4PxW#+CY5NYCSOuGsU3Y*PG zZb4Qke*A^D;(R$1(9(Sn;M@2Z3@2Kg|m49cEO(k2Dym^z-Gyo24&aRed`lyo=|+mv`CoEI#D-Y z)eTXNp63f)DJpEy@YHj+p3rYuPXOXDN;dLH%T0vbBQk22zJ+5WW4bP*u8_Q7db@Z? z5xnqLL04jwsPHq1b|rMz-Z9dW?H(wBeL562|8GwYgO+jEY@qyzW}o&^lkO|DVM$V? zw#H9ilKkl6e1&B9&Zk;lcdaqfkv-O@DX3;2;hvBh{Nz+Rak!>d;rXd6OXyw;%tfv-}@B5q| zl_su@JPBHR|LVm549|Rg2?0?@SJe-_jhy!P9!yLOVp)GH&ZjbJW^Ba4aNZPwIl=CP zH+&ida_MKB+PtM1(`IQJdFRq@@^&A2bSETR;B?o9&Q`h_!#8=n0u9Ul{<$j&SUU^6 z*@}%*w1?Fyc2H}B|Dp+5dR1Fm%+pDe7Lc=imWFFXKh8wMwS9_7Vq;s))F2p4Zp2|v zs`LH6>UK4i)FcXclX5Jt4WS#JHmLi|3q%@=N~_ncjAKpLkYfp{Xu?a1D+xFe#bOCJ zMn6LA^W}QTaKyd2co)p|%5ui2d)ICcSa{1*C@@})WzG)io?rVyQN5m@>o5hAMZRuq z_g$1BuWtU)lPcVN*&Iy1@KVPZx_$X~yNY{GMNYXtm znS6gDzp^}Dm@R@D#UHC}+V;is{Npj#3PpJ!nm55nu6j_>-^_1#^8OaF3j9ajHGNQ4fJxPZd zif1)eoBE$pw;HX;bzDOmY8AR0*>kl+E460P49Yak)SJaW_m2s0EJ09Ne^l&6{$E?# zP>aqD9vdGO&S!$kSWc!6*Evm-^);PL5~Y9g?X-<(eW{Fc9B{mp&{eOPp`oakXak52 zsbn4v7{rh7-{1M$7@I?j-D-n-26oi3lZTzZly4kOTQX$}&ZGL`$B|``OFNMz4Mf#I z|H6UVPR|DU*qMoUz2EOL9|{gAiEbU*xwmlYRhhF`tLcz*V7I)oY@}XU&9-2uL&lGq zg;Q#YRRsl{(WSEIAH%A1TMXPg15W69FtxC4dB%O{?Q07e+JiE(*$15IuHAvnMRDnh zA4S+=_bZS@gEaeOi(iZ`)f?mu_>meL{1yMxApE4I%kk}mUCX+u%sc^J9))@{%bwun zm;Dzau)7Rq%R?ZZ7#nevp}q*|(+zE?znwsu3{&48&aoPIn~2r_o<`EyZg_fp46F{Q z{-=%vh_;^~j|qhG0~fTsT9Vw{?&i2%py zn~|@+3&U`YspvfI$w>CU&P%2(#q+9dfBLyC0Ha6dL+JqPFFhaI`+4V6Q*CXzlqRZc zadm}utq+tA&R5L6S$~~^v07#liG4Iz01c||N|)O({1LXz%~Q;5o7(mx%F!;ZyK0c#1AW@CrHW? zkXNtQXjE^3h^ZH!-Zn4DjiQM1o)tR(_#QW;Gpq)ke_zh477<=x@aT;NEbsyIJiQ8f zg8`49DGZM|Syt>BmcCI}{Z2=gyvi21qB-Ol>M+F`W<41B!J~2dq**sN%fn~!Cw+B? zqCPH&F*JLck=)Z$RhYN^@^v>HatyYjPDensA9eSBO4}Cbwy_86*Wke=Rl7|8v-9LS z?`(asCM76}cM09_v|NpzWd=9qIt3f0WmFo z($UY=Z_}(z-><;j1kvjLwBdcuqF>B=UoX(XGT!c^3Jd?faJOV#4fW!+^nZ^*h?XwTss5r-Qy86WWoKE8RWCDt@H7LaG9)rHGiv4!4mm3HQ^&iY?yf@ z5gd%q?!39U`G>QWM9-lUX*l}GONc8J4vA-Ers{A39*34F?bQCj>P394@VOn1jm0QgQ^hONJKsR2^Pd$(6|9H+fT-pT zF2rtR?3T-!i~n9NjYizn=}ucoP#O=>L--eZ#M^I{ikmr zV{j$iQU@KT+n$=1ks--A&LXI^Qhr~?zed;bokV0m{m0SZ%C|~}eWp&La%$y+a=nNw z916|LMnJHr#ot7r9azBcL6}7p%~!Z50;cQlKVgJfE*;+~Gr&ZgM}*qDIIyT6Z*V5W z6XGQe*C^fPn$|0OGO#J%C1S1MopF>olWEw#9_?u3t6fZX3cFd_(@27=Mpo=ELVSoW zx=U&A&wK;n=+l{L+pjaxX7@zqoQPN;L_Gcd{oNVy#);kGD8(VkT zXa&Ec`fDZYMbI^?=Q{YcmWdK87S{Z#yzA1}xIS0yEur%r+0xA~P?+QqQU>EE;}G~IcYw5i5*Bi(iS#9=0`_2#?z6*F{Nw|IPWH$sLssGG_}-2Ni)*XjYMn4Cj~ySY23hwfawfQh1>wOPjl$VWw5A zH%FdjWW*#)mR4X}jm6uhm#F2=^1&i=t?pdlo)az7(cPpXc-uibHD{rh;-R1&|8c#) zqeC5#SSJw@r~If3pF7v_M{k)5g@vi+#^#M9WBDod<3pAUaqKD0ePwLh~JBf1sDa&18Xb^+#WYUR5%YanCCdgYA-l$zVX|C z*jf*C(cy$xDaVTbF3;}3>oQ5f4VE1FR>P`nDmz+rD~6=W$tn;MiHnOy)tY$ErTM4x z`!9T%bQ`Xm&#y7v1t7?qJ!~Vrl$^0c$@%w%q!kq} z4N{pFsMTFL;U9WWwoBM1e0=6$yr7!GyL{i>C-b6O8n1irEp!4@L~eisOhPRK^iH>M z!|X?tWhNrcI8z;NYZ}M?OL+obN_`=|w|69fzBS!=A(gZfs@r}g(FJAs*#-1_uM7-E z)5Y0LASvrKwrU}fn)hOin%|b6e|Y-n2c-^c$)@LwKkBA7{~J32@|}K_{+8&^ec8+x7b3JIYK>i z9Txt1^tMx&L>dC%pSmR&?3QC5ku9Jobz68yjrL9*-|vdAf3GRx$gQy=4Z2Xfr<&cn-vN68t?ow=*#;Ktz8KW~ zSYAsoA7sDL(^(0505=xrNs|N$I5C6AdpqLYi#+%o|@r^hBdoLuQG;V`Eo!`(>WyZ(V zY=PNj{|0eGLxWNF$KTe(>b8Tv$u_MHTvqg9-xy>0g^2B(@*sre=Z7J~#c?@5b~C6H z+4Qb7n`gGFPV+ciPJC(Ci#DS;-W~)i?&kCOf52YpZXKmo*(tDrn&;{)ede%XVv>^% z+iexziOV$Knz(&N?j4+Neti9cW)uIpow+7I`x5<4;cjg+k5_N)m=6v3Rcv;BcoGtv z&}Hqvf^q4m)ZVbN8tEOm zV4zAN`ooLiEXI${-|Faa_05^~*S@StQiySJB<29IdjRqU3_W3@{z0Nsi%TVEVK&rj zB8r<_d5pO7cpPcx+t_p=uFbh^>S$c3Wn`<4)T!3RXSm2Sp_gpswc1KwjTbcsOY*A4 zK34t|{@q@sTt6X8DA(b(X5Xt-{|1i+gVZ^%k*yG(&+M&>Z;^Qar$dvQG!8`$>MJ;| z++%$enmJX;Egy6xQ@no6o#N738+Av*=#{>~sDZIquqo>AkhgdGDVVY*jFVs@TJOo- zMHL_%5g=9MN>-Gks3n_dd1_~Hfq`%^&|9f&ES(#3CGv>KDivP0WP`Wb8ygxjsom`A zfA>kXH1mkGxTk5yRzI&0!@aD}((jV!tal+p-d9 zP|hV7&$x4e@ZZ5v6wBhkftEhj=lr?S>@s7{7uO2MPTQQGd9O2X?|k}%kyUwdq2Cnf z?r-Q-_pdD0C=m*^3EAuCdIE4*6v^(k(bzLjRcj5$ZWHwtzazDZ&Bv-IZBQtWnzYB3 zKL9wq5gnzy-8fgvB&pFS7vpl#or_-iSB@jW<2KuqJvSTQ8o_rrr!21^B4t(H$6n8> zpZ{Dr>6bCT)tJz3J+CihGmN*w4cc;qYQaBTty;0~y<&N_VtMiQI_`;YST`lYKGjF^VkmN$X+*+G{N8+Uv=ZX?>$SHWC#=NS&Txzz6NOohdWunb_l4yTy^9kt7cwb@4Q!^NtIi$Dr`^{ z(=}^4?a0d0)>Ku384VIiONsW^DeYeZNjE7NsmvolkKN ztTiBRn-!0lq&!ROg*_=}K@x7-gUin@&C-5Z+L7`>Noj>Xh1YJ>8;%L>neW|Al?Git zSH^Wt{Vq;U$=JM3u2d&`r(vrIS7lg<70`QH_(E;u4xYm0j7_}Oh+hk#cmX8F$RJ2Xi8>+=3l^IrHy5c(01fD5@~{208N z3Aqlrcr3g!e^a#9PAnas9_6He`|gee2et~IqKg(GXN=Th$(QT(XR89onvD3rV&>p} z(W#-7^^Z9iZQl8$#QdZuI5FweUe_EvF-{0|AhD$v2I=VY2?W$b; z1A!j7v8eH)paKuSC|E>Pq@DogN_RLy@#8-IX7WO4LEp}~QGv|OiPpYQ8%3I>$^ew+ zAt_Be4)PENYRPTj%QmT6t_L%nMcxasF-hlPxIw|veqo;A!7tQ7t6hwX(W*-yYxJBJ zHgu{@!dvOpl4nfoNY=_~j$8zcB7>Jl6s zP%Wnc<(zJxBv2R~lG-`a15&OpZ*ubb~8@3rlhW#kuOV|=2ujD~i+9&l_d)HUA) zBTZ{>>Zn4h*fTw}noLq^JNrM{;7!vs@4L$vYWcZ&Bq)~GJ(iaQ;>Z!$+42R#n<`38 zi^6V}53ioo5`P-9sxOz`Ho3G`Dl!M|CyQ#i4)aos7XV`~8o_SO2mh#b1y|wd+8TH& z)dv$u+8+hhky5i*Z!*3thzO$e&dT|5p+eRtmO0>MeP`j#L#3vP(ydq9U+aeOwf?R3 z;w>#L@7+ZPW|qB9wYCH+#I|qr^EFL?LjDvmYmj}FwiGB^MaQg!17R0 zSI)8bQkrV9?7Q$1<4BI>Em@TN^0~e5NdPTa*JNfusr#u}qH^Yu%I+f|`>rybZv$vhkQZ+NtE{FO!5)DjhI=H0sJ ze1l)@lVe3=wW+z^Qh&$KPS341bY8>8pK^rw7rhQgLX>SC{Z`RKOXg{vHs_o;a+Q9r zg^we{$9)U|O;oKY{e6X0+E`{P=8fW=sz2R)&qvDtVk%aIq$nTPxs6t|@OfmJ!cMMC zH*wpsEnBRxZCE4)2@QOy+v?KsrWtZ6h0vmU?)(LHIzD02#&fQ6Ub|y*DR|0n)c0vf ztyNY9o=hC90NOJXyg6_?dWP8lIvSp^xbn`gCh8H?e||en(z@ zzDs^>ei%H2dcVAyet;IdvR3b}*3_5i*ihpV5U`yL`64rw^It#+lXF}&`pKZ&!kWKl z$nIBC_R7G~rNhP46~C>=I#lF8g(ncv+M3;_pm#V|5WlS}lwQ*zrKyd=Z-`;wbPIZj z9}8x6=3*MlM`3F8ZGXpfz5^w$Uwr$~m*w$uV@gTl^$Kvl`o8#h0fB(xmKxP^BZ-|| z@jr34Q;CU*)@67vC6B!qeKY==THV{R<8s}<750Kc9Y*-)cHT+Y->_V6=3#8CsMp{1 z0LY~4R>6tK4{;K|x%aksLmiC4jGbLmOH*M)n{X~SzV_WpJ+XD^MSJ%@AzyPTbqhXt z+;%m^HM*7rj~2NPUcb5coYv!dFHH0=r+RK|Urx|%l}?ezk3+0fZSH`5eT}Jktr{w} zGf1(T^A09XuTS2zJ5X0HZs%C{QkPPqBzNmNp0!mcp0_Q4O{GfT(4aB#$HXiz-rLZ? zp!VI%@ylJ`m?>DZVksGOhMZsLHv)DY^6yXmfzEe<-7;SHdfoXGDm~8!?6-F(mOE~b zZFN;u(<}^LKRmd5f1(9zph$e2ucF9-^=2iF44;&en4pm1GQ-;w^7d;ehPavdB;;@t z0@2X-E$x;dU#J6yaMz(_WoLTg=!V@$rDusl3csL_l2o>tlLGXcCY>#ND4p$d2#@*i z+iwGbzsMw7y0Io2H0t=VDE_AFT|dW*>0PF5Dm_*ZQjm}_?ZVFIK!`kXt}BR%N^z*# z8?Q`t+a&7CDRc|aFs-PAcO>o>8tMUSsO2tAP))oqwBy%`<&XCES7z=QaH?PeA!8HN z+^7#vo@grR8VK?YJ8NNxxoCp!v_@yg)#jCLelR?(v5^;yi5pd-P}hkw2} zYTDR{A@0Ia!RCB`lISb?`5Jhm-%fON5YYX99lNgZS(`w$;b>74w!8mq5Cgr>4oDQs zpd_u4D+6C+htmADT$+K$h9;FtdT_APnP*_+A z_wLu>%JB~1mEfU$_|AEkFomT@4Irz5UBNp#6{F;4Up8p)}^ z12bb@2j+FalJ|3PU!)&?e}aeBXBO@E&oWtyi|!6GbE*!`-xojhewGKFP~ar;`UJ1m z_qWg2DkeQP=4nWQUk3Y%UxSXfyS+h(-i6HWXgkl1tzrC*69{2-LM=5oLM_uLyxCbq z-MRQNb1Axx1d8J*97Gx|hgYj|1V&8EO`V;H{)oKpPJHJq?mtS~RB7^JSlhL#zJ?Bo z$iwXD4~JnPRkEIz)$G#?b?*%}$2g_)syTh4j`g}$>?(%mI6=d_X6`k%b=C$WY>uIq4+moca%bdwqZU>ri51!>y>z%(pQWdKF%VlV# zap>ic7rbzZ*#ekTF}pM6RN2yj|0w#QoWiHnF9R@04!LtriElO>Fwt}5$_T{W2%Im9 zCs@*iS1v40B7CZuXFUjZ3vsoyZMzDLgFVqoksYq!%$b8FBdZ`U4CjySVNsK@uN$Lf zq9iSDYGt;B^V-%Uy+o;mhAIb5hq||g2V&1$}bgCh}nunoThg#Y9&MYonNU*x7s?10z-B2XT zjH7k&31ahF_fq#IZJp$2nS?lA(D+rgs(D~-YPJcWQ0H!z!050=`O(h!UjG(Oj1Ri@H`DZmN#c^Cex>AghWF#|<6h(=FM!4r#}MRM`2V%Rfdv z>HYlB(T2}?V6Nm;m<{&g=f1^h&w4yZm}_pILz$G!Liq?0VCRK--_Zsz>2EOW9y{B* z7|)tq;!^j5@p`;&UVxG#@dObI4Gx95wWkS7PA?V}6&(e?&`lbyQpXC9q7_HmiN8we zh@9dJzX0IQRU7D)nYf1-qN?m^hC^8jg4Vi--ACmBwu*i+}aDO zz7u+SZi}W=cYfWo*PXb59$viW->}v(KenfNrPC?moO|%QkCRKreNyKD{@g&dV$WHp zwEUfDdGT>D<{L{-H01|t9;u%Em z?%05A^o1a?N*tRrSquVP?uuoKPkC(UaTr-x~*2K|b-o57duJJI#BP zL=wAsDrqu^QaZoA=&J1`YRR$SBF!1xfDHa+1*d(2sTh!*0X<(6rIe}xinjdw4FXL*Vfj0Y=HuI>PoZ3?@-GL zjlK?(%JeE1`DtJC^GV&>#)%3iReO9`TgS7l-$@aVw7PqQT0YAeopw4B@?4r@xrsk} z*Qus{c^=UH2C6@}IBI{Sou5+<<_DTKWyWD~ycR-H3RM90UL;jkWq$m33>l7r6LE@P z!|p{I@ca*;wQ1^GIP6md(Ca2D*g&pIdDs>OTAz7v@Bw_nqKQVTU( zjccv^2Oc*oNT4q)ej^d7%+*RUFD5f=hWIgut_UzXVfeX;EB`uiw`XPg^JHIR;SPU! zEB+9gmstl>?uB|kh`{5j(dDA(E9iJ(^e{RsC*A`f2~kpeU54ybUN2v(dntzBJl0;@ zY2J}r!U?{k#(dTij`PN#0ag=q%p<7@aMWx;!F-#5h#n#l{_spZ1GspPkRGxvC zlOKQZa(ekZUhVk#GhyS}A~z%|jY%-h`BddqB=RsUIQKgREB;{Gb*QN?7f5}LY6~-> z07Q4BPG}4-ZVs!Wq3q2s$5Bjb;e(TUNI1@MO=GBTcNoZXz88E5bGu1Bb$MB zQi{8uoMqMyCp)jQparK7h2+C612ou{GayD{EbSjZdYGlp@dCrD>hHdIu+v-HeTK1EVbJR&PFSc zCnkzubuZe`BiKcnicPQQ>tEtHv<4GGP`E~{>7ZTIVy$~iU&T74Bpo#Y#VU5R8mRlMsieLNo}DXel8=u&9)m7T9Dl( z^PbHT^+^sX)3q70HXNZ>X1y{N-bws`ivK`&_IR^|YyNFvSy+*&^bNZ%xi%H=Bqo;N zeDoma0Pdx~%&1qcrC%cDwfK4cv+$1o=5VEp9iW9e9D|47er+;rCk3bTE(U|)??Z+a z;!r8)8=w;;XFN*-e=!gFM?BR=D2u5)UG|zH+4G30SrW1*^@3gaK({FZQG!E3_Ap^+ zZZx-|alpO71j|Y_HWm|?J`=Tp)JlB9e;FRjy+04u<2^WP{P-U60`9X2$#)Qz_?$CY zaSyd*O02+V+vigpcTIrBcN6?`+#7G1zOA2^OdM~UMlo4lTM*kg zy#NCq89$~?WE;{MMXt7wJq(m zj#Q?fez%bg(>Cwp^gGeTBI3c7!}ed!zq4Pns@PnD4w&OZ@3Wa|2;-`#6e4uFD^Sw{ z6oa+o;wTyK-7jgyrrD?Kp(i!_I+7D@#!h}0=0hK!?mx3__j+Wo4pY0CtoGgLsZM{d znl3wGHrKMBvF{bQuX&W|D1Dk+naUOzu}hiap3$)NwQ&&SJfw^OtbS=27T6oLeYxa= zIst<9^st?}uY-f*UB}rW=;GaKio8c9+LL(ISXcZgP7r6bm!6rrHKc#BtoPN>5v8YJ zap$57<2kEb>LzMk1ryNGc1s(VloB|jv+X7E*&u&vNr+YJlWNrk^&f1oHeUx@pMd_@g_nL@$_$7*;Agx=ok^YHKo1#j16F3o5tJX*20_|^Vz`m4g@a_XH=3jV?9zd5kmU+`!vHH=YN?LZ3mU$H0_cYSg zgJTi27J;r+MUZbJzvTJVhy+YY=dGoCQG zS7ix9K84)_|<=uij79M=Kx$)6F-A96I1F|6hR^KWEory_Kxr=?&0N%eTy zQa7kpqf@*$^jvAZDdhQH^DLTh5piU?g7zJ%QTtbM-4kgd&K7}(7!mOP3kVypjV^WZ z52&WTz_O{p9=O!WtF{Y`&N@-6uECIF5jJ1CJCFAtfW&>YU~*bYYeFawE(75r_5p6Af>cNg^96kpVYWOxM~Bf&7w=QJa~w`ukb#GA9Ni+ zJ-KHyrriJl$O0jrbL4%&(+@iR+OgIU9$iwEhdbY6EQ%AXWbF=M`2Q znh+K>Q|h)t>7z4SyPl8?Ta2j;Y;;Ju&NK>@ISwfXMjdV{I?Ktfd7frAHa5zr&9p7r z2nU&b@Fi%jBC4XIV$o*E+lE&Diy7&_hrUbhQc1KK=Kof&&#%S`0?9Kfb9=x+A2TvF ztyWZvEx<8MzolJC=)sN5`{KCndQzPb5l-lh<8BSaXQC-4f;MT7WlyB@%5gAGReWSh zSs59E{J4Rz!8)3q;trv>`&Z5*yF08)yWP#a^CTm)l2WdSglFRi z{etU;x4r5po3AW6l#DQ@&fz!T*U<7VADq}93q6RDGj+U}N-|EgNssHC%!K|s1I&;% zavh8j{L=xqow(iVTb*R21hK80q|gX7ScEaSMmFllnmF=2L(SI(FvYl7AiJ;*uOA&%Ke z`&1qM@U8)EHEsxU#X^7(ltXn#&8~mf?%jff=cmdN#f;-%LcY5Ls<7KO97CWR_G%i^ zMlpP)6^Abh`&Hc8sBpN}SR_hwQ*iHXzW(gr09ru^9RNV?y^q$Kzax*UypZHrrosu< zLWXgC)-|uJ4nveuc_DsqTfYV$l&5BsW23hnoJ9x~SM6cKH(WHW@UHR|oF<3)chU@; zdJxd*!n`KXD)v33D{dWDk2qR)CaNWfB|ic;^@S7uAY|FWH|dp#sDDR#{qyAA&c)o^ zvu@xa4d+UWW{D2HVZ1;%Jve*mky(~LKe7yj={Fx)E( z@hvS~UF_k}5}HfNa7^3{b+85OfH%Mp9X5!8lj*pCxo)WY^P%}sU@{aBV1mg@Ujo68 z4=CU<5`WS>h>`RE_jU57(}8zAgxol0bz8BSIs%Dj3GpMYDYkUJ zK~u)u)3`$&gid$XxMf%HS|VRUgJXi~*Tm0__B%>>L633{NTi(m}cxcdT6C+IUu+YXOtr%Uv`mzYSSL_jvhzivtOt4)@GqN+a)-29b`~11|6z| zLxP%EAV)0xohsJ{*ac?8v{DeguSE)Bk)Q9hx{=JQRf?I@WxGLDT&rJF+8~GrKo53$MH@P1IyToHxpy#EXijFX!L$icz*Ol@?r6jM^rxPmq^;|6PorrvKowE>U z9(GgU>Fk@Q;3Gk}hW&9e>?SiKJyBoiHbi2i|KRNpJ6^8!ClUL+;`j;TUp=hhKW>#j z#(-JrLmV&SZn%KnaWki9h`Tsey)chsga8|kMoUhR9R`vlK>?5_+K1NG(zLsnm+L~T zAXHSUIH^Z`MvR=&!RxkPVr+)df+Z5Mn#Do|ulS=+zP}8nL4pr(`{w~VZ)0x33;_Zs z#0)y&K5~Ok&EA)nLv|?ANf_0hhtq8@il2O}`HLgD(%a{I-?3@Ckr(l-eNqXy&xOVQ z6Mh-UBLAVp!Hp%my)}&4=5|*9$fsgvtCSnEN`nela=<1^k4gL zF#k z;m~yVBJm7k{^)!%wSF8=R+(t(OJ2TlKf4vkd<1m<;fdcHq#gZP5h7L@^&9xIXh9Z2 zP|*aOHR&F7M(=M_$Ukm8rpDm<6LhgG!!9PP?D3Y*fNha`j3CxE;lU1d&_s=8^e(#Qtk^GzO}(*Z$k_hM7qJ3xoPTFcicxTpYg{4Vh2sg3<|{w%u?by-EtJ z_kUvP^H6toG=oZg?IK@RdwTX0{5W0eK7*C+-aoJC7l9_k788QbcMHe4aHwV(2}MOk zX|sW8? z8^?H7LZnU=t)F3L*?%f`t|PPAG^;mb2mF3*sZ2N(%@w@8^Bk-wo;h%mU0Rc|3T~3= zZ5p&&BEzO&dtMb@7yZBeS<>V1OGkfxgQ); z-&%SO~lMw(@6v<|=qFRKo1@s4Z9YG5QcVbF@?>*5kT_34lya zflVFErpuh=3CE9}u;4yhoUl71_uJdBRdt8DN1+4{ddt2s2jgOU)*`YCavk(V$mU+od2&D2QUHED9I#ow9iHFD}m%hqv^D0Az=I0zY+?D5E2q3PoOop@G5S$dy!3)@& z0X#8`NITVC3AKFHs9_Q>iJC*I#Tq$rI}ojiSOlguOzRPt-~pIYKBz#%8kR3a+|)*4 zjY`bKay>K`9HYO zywQAt5*-j`$=NO?QX--Ur8?Ip%ps+{RJ26IBsmet94~pbfHld=UjiIQY#MGb45jlT zgy%mAM(E5jd(h!;OQ=$4ANK#Jb$EZN?|)`Iu%+AoeEq;! zhW7al^FigIeU>=LUZQ=Z``>^5zdQ54Mex7ZL)d+X38x|7{2VpKS*ZrDy5W z7zpt=oFL+FmNt&iZIj?iK1aQN2D~pS0c--s3*{ z_0X%c5h5(^sQ2c94lGBaeN+$#E~f`pIWoVKrf?@%5;~_CVcu)Wk!F)J)eFf83{aIGqQB5~FuVETA~ zs}|GK;MH8o$gq6D9P-?$SfpaNM_PK(91Kuq+U{SJw@k5>Q)4x8a&aQMu=JqwZwa2{ z3}q1{yhGx*<_!va9jcPR_fVHj#U`CM0;p!g_&)QC^76$0E;F`iaP1e@$zAG+a+{?$Dp)hdF$!kn%=_fWcRY6lPIA6o1bnz%n%s3 zjUF)RoSFw~JbInkr!)GqQxK`{m`9nx-K=L>JB^Q`Nf^U~*dpXjhvb9%=dYYahZ%%k zlF%%(GhThO@+HGce#fiuc#>fvNlAwB z0uG4woui-Pbs=V}3Z{}vDhpF|FHy0uNOwlLG1hKiH-(LJ59d}ikHE<)UWr-U>F;QD~{Oy&Xywr z3FuyXsqOrknR)?iqgJdigkJB!tbZ6YS3f9s0Rf8MAuxBfe>ZT!^Rj5K9(pA~H;@H% zo>68LuPs%UnoH?zqmc6`G|-Oze5fl!C-!O-`_vypU#Vq&+qi@4_g9-VsJ7(#GRCkkLonD?0XN^NKBRiSYrmlN%Wsp&s%zbGTu+9*sC(*wHFV@C zKmYu(@nBPF!Ynb_VMYVFB43|jrIk6Edc`@74npj4(D4-g$H>$x{B?tAwK;y>Acnks z=jW`|=~AJBvfMX@q?o+l<1l2XiJ$cvbgXDunU?(bdT!byiEmHVx2X^ke(k5LvIRmI zWJn52w(B+>63UVb(la9{-mq7OB8@(t0Xu!>@3uIHefS`hs7DXs&;L04+lN_fd)KnQ z5SzFdTZ|6tYauZ9zTAaJ3ImQkC6$!1!Ih1rQl^h+M?p`iJof zjrp~{>7skQwS3AFwK-U?woyBkJ|CjGS)oq>nPzrx;`)^msZ!^*jr-Qi=mi0P@b=Td z;pjIbR4<*>9)jw3Ac^p^!YhI>Ex|w2J|1cHGFO{p&wFR$GCi1EUDd%k2(+Y*}BlC5qSTd zNXmoiMlnm#-R_bQT1|*zg%3q5e7UXA@Iq3@8X|-e&x3a7CR;gXw;jt9GN1RAr;{VZ z{oA|vLP)fcVcopsqGSZI|6my<=ivpePy^_%TkP$~JnZrF=0S)SB;$7isjmCjn?Jux zF=~4ugxhT@`kbr!pgVs6TGA#LB3J(%_CbGgR`8i#aSw7yyq({#+2&J|YVKDuw9^ji z3+3RIPMMv?{b8)?)`@}v6hb(-bav{KgYcDU;ey>j^M8`r3p%Ywh3>7m=cIPcUC+tM z_J5(@DqdR_7_lTyt{1jd5kkJH8#%aiT@S z`l}P&5-fU%^pZA~vXq2uc2+xq=U9D2$a+nP!Tziy{qgLvi2LA{_QKRHUQWJw9eU+n zaLtKh(1a67858DL$QKG21J8CNBt-9-p!BzkqNCfnKvjF_oiVTU#s11HP3gcgb~%$u zb^>On*gF6{)Q;LfY$yOfTE(Rehr%?RIhJe1-~_`1Fyy`{*xtr_ag#%!13L=+A%Fh4 z`pI*3&dVtfO&e@oZs>UW7f&|$OP7oZBN!h_zhru+*NNr_lFmAb0zd@|#nwvD-NKh- z*~=)C_y?kmvyCf3G&jot5`p6$k@wMMNtP?f*p4~RE8-~u(?dLVN?PYzgCVWc7MWVr z8{dc!u9APVBo{yPH{p2_n0{rb($XOL%&xspMAs8{p01r6(Y%iB37$~h+};o>)iDc)G3 zp3GTU2krSZJ>e_ke$E^O%%XV66g@lb8e2{pft+h&y6Fpez0T)T_775Lqrcf0zk8|& zkrt3%x0|sfo4e>eMlwN2-IaCt((3t>+*|FUb7vV(4&}e+CBrtRHKcjuji9bmfdxSg0m~KLv#8vSrw= zq3)qk)Htu?FRGi1RAwk-Cg9#C%fHbs*mzeg_^h8Ge7x?I%0i!WbvLPcrnIO&hqeob zCLH(2cUXt>kyhs;%L`_=w=V@UjDNR-DBH<@iS$Tbv20++=~E3SP3FCO{!2cIPg$xvkFG{Q&?8g;tzqu?6L6 zj9-2TeK!fKf7=RsC?j@)9A!pfiP2*%CH(Nq#n=NM41Y8SXnRLxa%tHvl6gt~0 z`(Y$dhEV-hzJtD5`rXx`&Fj1BMSaCR*Tuzx5yC!6Hl`Y&+xc+*^Qs;~n1I35sZFId zNdenNhZQxB150lz$X((H-0WHQ)&+Sn*jsZxS%#Bbjn?5SRGy;~#a@!>xaLRyG z?rHNR(GS<;LtOjo>y(ie7_Yt(!%qXZh`*I!W^mrkp&Yx5F-^V|y<3DZFE3KSMy!Q^ zVs`k9jj8cF`26oxPAd8R_>4D8y~5}wo8cuWlYQ(HO>dow1FR#!$FG_F{sb{SLXv+LUy`A{ydKYJ%z{Ej*`I;KRz zK7~zp1J<~ssW#`p?t*mcMZ%l+e5js8@#O$HOSVShqO|7BTZcDV{g|<87eD8=`IvtN z__aA1ffW+M-DZ*a75*C`pi#{kSx5BAM&WWZq{Oa?A;*zlAENIq$Ojw4G^Ns+<`<;0 zu?3R<*APx8Twplk&i5>?yLzd?#_=lZxVH&-TS?wj2WDAr;{3Gya9ben17L&9~i_`{fe@dk@E-YP?@|E5B! zjUP|jyhy>3@~^%UoKKo0G}}C~5Yw{2A~9~3=-v#XbE~9)71$r?WFl-+GLyv=vTMnQCCN->$H~wbxQ!j&4})3cXdkz!TajB`U!WJ_vFk=_)8;C&#N-wr=-Ob6rhS zLlwt?24l?sT<9F5sxD=t{i{l{1TpkG0< z;?~ruG~iMsS}XKiPetIZ6*e1_Z^kbXJ|zDV=+$GBO3^1+aW0~U9Z4see=CeSFAvGa zWDp4VtyU!39)NVoUJ#qp8%5TmR8%XuKTT5uab!Km3#}b%SKRGacTA+n|bqEEfchMVFJmH-kzpydw1BP^I82IOwg?HK2iM&4y0V$BU<}0Pm2dp;??YzN1xDoB_Uv)b%Hk)rNJ$e3ir2W{KV|{DrZqAOM(dNjk{mL zht~adppqwCwT$ST+TKjmF4`+j zpl@4-+_|&-?TKVPF|YNey9f_%m1?&VLf*5jcJ@zODGHf-aA;XJ{&u#2jaWdL1B^m;q$%!1swcZ-wd@is|Ri}21m&f~+;4v4a`eP@VC7D5wUwHWulj27BF zOza_xulLVq%WJgWDLzWTG|b4MRgx7(3?kH~Y7|MKpU6d%B#Ms;I{9O?guM^j*ivD* z9w$;&_uP>WJg0ctJOY0`r%i=5xyTTMzKm>baqW38oQJ_XkR?30+u#DzQ9)IM`SGO-=tz_e8p6JhO_O9=#B?@fI#t0?~K&XjzhX-+WCfKuCf~6V0 zbk4JLmOctgc#G?4D!a$=Tj3oaXs2GQo`z7-`-Isw8YsnTxhY2Hl3!MaUHo+?c~9Q8 zBk4v28G(ewm}TtYYS~y!q6uDTnBwsQ|vj z8<=h>Bfz}CT?zb{(ve^=Z!JG~aOi!qK3H?3kyp{9UgYf1(qu=EFR_xUf|)5oF)@-A z75LYPB1b^OeGk5J2vO8-qYuggp7M`5u3t zWiUGC<>IO$eZjY4RzM@j6|A*EL64^|!B}4*-V5h2I(Z|9U!=`L&;`47VI0HzM!RUz z!`*cmpRCW?cHqarZ$+IucR)xNrPZjxuK^`!RwL2eS)p4l)rMzXpsYiJ zg+vvv5~bYU3t2(%T;=;X>_nH$BP2 z-IKEW{LlnyoUu}S`NOayeX-uvDPKiD`0I(4Wc}7!a^TFinib}OX!g0tFD?9@Btva;=$6(0ofT+`dP^T*a+-q45ftgs!UektgquL@6g|vDO6)xO_<$(>Md~G}8PH z{f&(&wP(&#$IOipl!|+5(rJP7C>hcpV?jGb@7>AzU@W8R@Ap6)&qNeU_4Go!44b`q zRV1Z@+$Jda2T`ZEaQ(+EYtBgULs@zcLH}_AYe#M4Zi^1P$mvt@EJ;oHinX zaGNQfQlu{q?VATHPZlItE;PEXQ22KiW(x{dq%Xu}vNSV;gGrd&sp7?>aQby7OMxrW z^g7)@IvBUAgT-wYuKGGMtflj(kxO2V-M}3g=?d?RBmkcWj6)S5!p>=4EnfSBK1pXJ0o0I2|o;eCKxK!+?Y^sr;qUDosS zhqo32Yd|rBHZD==ob{w<5y)tFrIov|AFv|M*IE0&Z>!EOwHXy3!MM=mQfAl8l-g*m zBO_1si%VaXCdi6J@s7)uuRSUH%1TNrd%4K*dJiFNnw4w9pV-Z@1_t`c^Wk6eCDRwh zp|U=VDDLdlzV2+An%4a!#0feGEiGZ|q25z193%}nW(NMK_}AcXDHV! zTE3`Cm0@Y_m|Ms9Qhd-@Y6M5fvZivXP{Dgc5si}G+DE>W>S54s)lJGno5N`^rNc5l zLC2eY?o@pJaapbOR3oq!xn-pjF?RbuCengQX^?%jV0+*;u+FY~{`wMst=e^ba|qro z&VuCN%D?bD?zTbjEL*}?=?1n(t^lIN-FvsFdY-?O4iyZXKp9i+k*M^7TgoBPlmL8s z`x9O}T$MjHYjt$5&e zylta^#*sz~YNT()#utdR8$_b&`HOyYR_-W6GsCCr-rkP4;NG^r!!CcbEHkbf)FEIZry#`4+DM zv~1o{>JmPQV%=G21kIxU1c`wGbr4M|0MupQe>|Qi`~Oi}vRbH+kSgwa{{hzlE*jwL ze8ow7;N0PrgJ=Y(HF+P8ZZ7s_LCemns6X9K%Pn2%B=4KRz016NZw~EFA37cR?!CUl z{6_t7k>os8K7JjyA&BtfwhIXIT<{BB%jYBBym7;y@_{BH((+g%qsur193S|;jRq!k zO%R?$GAS-?K;KgKB?BQrc7OUkAk`KD6IQME&i(gY^lo-0lrxXsB>(LW-oW}$lE9pc zHGp@q?PiA{OS7j0XHW_79?S1sC4Dd!;W^)D-*?t$>%u?6Ri3{;Kc|Ble(P^0$q4B3 z-JoN^Ou!T-RF@PwupckzD`Dv$0XOST7&yAejZ^(G$2hC|wrVTKQGJ^{3X?wr_s>4b zRxL$3Md#a>_kN(e05moBUL)?}<@!;-S|$EOp#o$1rS4(4t5x8nLPHozELd2QT-xMl z500SZ;}r~q#@wW}C`~%SyZNEAQcAboBeiD2i*k%2FVU#W?dR@WqkCr8@qVIKffAgH zZUdB+(HdGexr-0#WB5fMs)n+)?FMMGt}Py-NGAvB3te!^se4#M+N7kUq?q_YYRlI) z>9Zf#42rz~r(|SSv-EU(Vt;SbBX#&lJjj15ht5P=8Je1!4r#2VkGs}wZv%l(8~|du z(M_NHZ;k6A{&sLp1dEF3znF$C6f7W%%vOq_sLr+KGLC!|$bQ?y0Bt;_f!SZV*H+DE zD8y!oYcTJg^=vaNU#k2MQSjclB*UQJK!+Mcmur+3UN9{2e8UUHO4 zTT_evMO}GoUpUFjI7`r2lF!T6m(YJKV%i8!+)eo>#%KPA8yW^*AR4!nnrZp#>2j!{ zvGLf>e|mmPMWs1(O3JLKO!S6S4Jm-&R+>yeFZ#-xw0S7XjxE8Y4l-se|Awhcp74R5 z&BJQp9EKy(vCu#pOgZNSz`nXNvWi#ZS|`$p2pFDH;}Y~(ja?7Wr#Dqm8{e8Xa~(46 zQ3d_3Ou#xWB>F7}H1B??BmJr#=R1BR%sK$kD#6m@k;Mcp2dhzarGI%j>(0tsYZvuT zkNCQR$PV4}L=s))tl)Kvaz%q1VxrK7*HTE6*gz__Nn)&u_2jWO{uq9+?*+gci8q7o zvI~wybE~!SM6<_2;SJLrIfq5Vi=Q!$z}&IfSaP4HzNG zI$ApTQi~F~LWlTz1qSJ7uIOvqK{!2A)9v3tFMeL?C3{1&|J##_p7Hu%nt>TA)uT{r zf166*@dvhO!!3x;C=338TUP2rQj9CMBj6de^^EyTCkj zTD*w>5?H}}OLNapfQIws%Qt3zi%;)K=LVv|#Kzqf5Ot)C@%{#KNeMVgq%0L#Y65?s z{L>$w0RU?Faqt}L>+a*0e=t3%X{i=4g4vhlWI4&Z^zb0)+ksjd9#rl<*f-sGS7$%P zPGg6K)_5XI6lH55D0p?nM2OwedfeCdZ!Zpdd%;*^RD-uG9oO^nUlo?-{GcKOr;Xod zb}SaS0+$=sr3MkR1)%n(Xe4qEz8$>C{1K32M7XXUiyDQ6Wd`-7+P~+`PS;Tp5DwOW zDK!#){{;djVL`@)?e1*HT1TMcV8?OtsqVd^mw%YT;*?ltmE;tWZ;6geWAF@(;H~U& z1&(XnOl{+2J#52{DIHPdlZ*6`p96;8U%xVb7A~ktZHYKM?-NM)i~Y;1$E;=DYutC! zNGzqnfwN!Bt^%(lDM=f^Z+|68b{u~8^5p=R$^RC` z0Tl*ccNH8(&|N$u^fJ&ulkai&hOq7Z=hwJIy}}X}yza%c?`-40EeH4YK9Z7uVF|jF zuVMdx2jqZlDsE%re$MtHIiddk=fa}oGd|JmcAdj-SL zpgTeTnm>e`o7=p9`pD9Dn3v@Tlad~EsVE*!p#@cAyloz6h-dlzW8!(}^|-hzU|7=g zJ1pzicCHrCvm#5j{khQBa)H+4MsN5M(&_vkT8*)Zv4z(oI?gZB>Z!YA&f5uK4BmB8 z`ZsZl2?%oHWo4xemswr}axcLTANer2A5z!wbZ}(k0roFj?>a+X70~MP1bSrvP1cw< z`hl*MSQ@(i&4-u{z0d`jhGipa4zWJvI}bdyh97CUqOr%=feva1Tm+uXO zI^PmZcA*2vHYc%V+3u(CZS`+`{dt+zhy(2I)$OW6qy^Pt`nCXLjDf5OQzkCo}fYiN{ZVDRd0)wqjXyGu@&}|Gdxob8FAezhf0h z9*Bbo$QSUHi4ZXHg3daSM<4_JHNqTxGgn#X!LO@F4gS?}|2{y`oIsl%7;0lPdj){G z83Gz13r!#?cn@=yK$LM{QEo@6==JNaTiDmKUW}?j_wOG+b9ZWYl8A-KjA0dUb-Fcf z0Cwn+bW-r-?nIWK;LxKZzt=@l&W+Z)1b%m@Q3mKJzH)K}uvo7NvpJQpu91OoBH!bZ zmz=1sv{{a^p$uIEk5_D$Pj>-yp+VMM1Wc%Px9XW+Uw(YJzkE;~Xl{co+uMGBH`~&h zPb)>;0J(VTh0~Q?F{P7^-y{0|_#j;H#MajsRxiGsE;4C3U~(wm6u1E5)feJwmL{tx zR7i1LE@-*yP&3Svgb@x`6*|7Y4%c>S8UAqzoY+)&26|eE56Ow%^6M{Qq&4@JG_Eg_ za*xRK$Y4!TXYN#Y9C-*w-^RPL63u!QoB z{fLyczE~hg!Mpsk?Civ#-Y)3@^1;&ta^0+Ng@$XS7Wqw?ZHoR{S;?gM%-I=yvN$`b z)&iyX`nF#|M%)fZNlHpu%rCS9YNmfX78B5ReQ~4SvKRnmV-R@1>Hes=D%Ao_&A!*T zs-9}IWMk{+Y-q(9kdvUMn3C*M{1*@=Ig z#9)ymj8f&@-dU7boC7~iX$=?#M*;Yafl+_d!>6lPie}GBB7{dVE}7=^y%jfT@C=Vu zH~JDEiT!<`W~Qe5x`Ig#M_>kaJ~kEI)!uBbPv~ZD+XvFC zu78BDm{q%`SkwfnmfzZBC+R#4x<&E95+6eH*&x*4A?|Ia3fGF9&g-J8G&Ntz5Mqz> z6&o8{OfGrvlkJCqQP~L`VXoYa5SNP4jyN67oK!sac@h{lE6i#-QeDP*ADa%{9=LEw z+dJ_Nd`JB-r_L1@u9`n&kE+_;YUL`>Lz8aSgpx8ZY>X-7OO!gI3P>xYN&5lPgrhVJ zcFeBs+kR%|_W4nkoEW9DpyxS=CHb^`9T><|>QQiN^no7>=ZSTw+|Wc=STj?5-u4Ms zIU02LB4VDo~Qr(Rl=;Ko#i91W6iqNt|YyONMw)>aLAeh z@ZVj=bKp!nZ25c9(nGfQ$VJazcXsMmf=$4voN7b}+#2 zG@}!{h7saCG-ErVgJR;1eMq7fljGx{u}PJuPeRJMt)QLlK9KblckDxIys_D43xgd_ ze>c}xOCw*F75w7ruU#GN>q`vRV-vqFx=VwEDBxnPz>pBg;>mQ9gbEz1_bI4+pEFXKUE+X; zcKc&cOr(1ePYEzflV`5C-F6a#u(GPh8MZzv%fyuulM?htQE_@ViVnoL_r!e5 zXg-vppV<8*2c`yry|B(HNhv8UTxS_XD^mP#D$8w$n_s6sw&5H?67J~@piN3bakZa* zS1EFE%N}+f*EqRIqV|Bw1wC|4*v>RHw~NC<9&1C8g#1niv!Pzx33r56Pj|XxQP)D{Ft(!@-wFF6KM& zR+lDlX`BCab|&?WE`GosaJ~Q{fSd4JjQel$RSf}C2zn|ib(n?*8Xmtht0xoqp>oKx zZK)>KDq{~S(IV>d=z3|(c9^C6Lve=zO1>+v`$W8mJ0BNcniAGeuGo74nx-nM?PFvi zB<206eTV~Ko@j{nvcK3gdM#n~f!L+XNXq_xa3I~o!(*xhNvVbCTLI}$m+VoqZ7TJu z>>M1pzcDhrclGR0vnL9wUnS`5I_CGwE!`_PC>x^3*6!A@INJqpSdV=6=BZ(`NeLE( z?Dhr$=;JO=-(T?>eMX(5En3ox7@4PUj^{_+iv&V@I2b5M0VfYc8vONig0tFcS6n9vmq5A&6SB%SQWAo$~6b*FabFFqaKX!+Eck_mxC9@>E=L8MJ?H`D?$H!SwIkgS(=(! zxP2y4j5y|`wF{6R#v*dX@2iF8)30SrNXncykyUO ziJ%bTOTH8; zaP4*W*TO=j7xoWuzEG9;5B_T1ho;-0)x!>9I&?Yyst%sbkDA`AW~jZ7A5QX?N1f{K z+EYgl(=r7#hES4Z`Q>IP9xQ?Hax>lAcHp6`YYqjJd^e%Bwa+rVo>P*169$be&G+DQ z{ITY_J*I?R`Pp==Xo5`NkX);x;QXA5`uFpJ^IhRy^*^b?Yq0p8%0%63pNUkEehD`` zEox zV1(evDsGg`B^@WJ%zGj&s|>YQ>(o@il4#!MvvS$9$3`Ge=vb1#_SCG2c`r8$lp@m4 z@+)nBERR%Ij*Eo`d9FcUP3dW4++Dp&*zib7Dl$|b0_LZ8@W5f&vk&*5T@%pwBL!6Q z6(nIa-k|fRXWB~Lx;6nb9PG&P`TTpL>wUqb`K}(GtxRa^rEI)-(tJxxB|Bs?6$SX? zd0&>mv%Cf@&Ht%{keHspaUVAtv|klJ!#0GpaLNW!nGU$*Lm%vsVJvI+HUxk5R4p~) zCS1dYF?OTKgWF^X312#pu~eLFeJQa_dpH2hf51MI%$ku0Eyyde@oJ@(b%UOpEY@8V z3)IG2C{AeQ0odkf8oZ4F3#DgY} zhk6Y>WRNaxZx_}m=quI~tXSve&`0D+m_HCs^IIZT#jdM8I$PIv_EbT#`O|qDjLrCF zRH0-#85BEn>0aDzst|DYbH6c=t`U954vA9u;q6CWs%iK1FP?CfMyE;%>gad;C&Vm% zgGH*H@e4zUamnBrmF!8t|LxymdC^D_TY&=xL~#(|8$XQyGf>oSdwfllkXW;~&vgvO z!^1ROXm0=kYFsBM{-`Q{SWSFuKQsy5jq0Aw-wWK_y$!vu2Z;hsCrc#7t|h^?Tkb=P zw}k3qTk~x^YyEIzcN(mJE~CzyFz|YXswy2q)?{>{xfR`i90E&QUHqN{(h0acQ?MP9 zs?ECaW^S%btgJm$@$NZK@$EmP;HJ4~lOM|uJxPRueg`*6F-i{K%m7SF0WcVtQ^)We z2w;b(<*Ocb8-=-Siamk2CE4*I>@O}LB%_T*_c zbk)P~xvZa3tnqyp`mn!{p^7y;>3>y{|cXi-Cby&cAcUJcTLRF1Kl zgW4Y@SbnbRgdpmOj*U?9hK4rIDv|IKX+4cFbjg}sf6sOAGc_3S(H!TFwQz8PB<2OL zx?T~{HPqh0YKjTJ_37IC9_BtQv{%gBaHhDe6#Cd8B!P1s`LZid{jUX6DrP-1gEuW1 zT-y{3ls_SRuKPkytbO}8`GTAiw@=)8pC&+2Hb402P~EtKL!{Ne*VDv7MW1F`oo(rK z2voUn zx*UH7UhNYB(7Sbc*vCn8Ez$tmNpRuW#QLSXL-K8t0vhkfmqI-DKR*xsX5(d*KME2Y znM#RcEf|;R{9hLc)ynCFOth3%e`C>XivD!KzI6>~Bv;cWscWHQ-|#ih^C7&nN=Bui796C2%vXhq%o6J0aQ%Ks<98WLq7yyR0|BB zafw%9l)dg#VeZ(MBQO^wwjRjRgVK&BR`V~k3|a$Fn_nbY(uU32JSGCkm^u@5GC>la z8b(jOo+I`yD6#(lGtF(gctE^#xciYrZG~RRUi)GyYJmJT(py#_GdB}kXp9QFc&vHn ze=Ewm^^4X(Aq-jD{jP_q3-btL!TX7t6a_7FpDi4se^g<`5$KpK38~# z^}F+uIttM2V%XY6zr&FZIw3!c)6+Siqn!nEAHBvN$nO~(SR6tn5IADRrL?@VHOTqK z6}?Y;U~8vUf%sjEY5DaKQna51UQgvoXKCg0ZL1kAPXNRPDV(HiB4#6+sI6|}RhJ)p z?MLlM{AFk-guvmJtTH55EM9iILJS|r2z?09eaY$7yE-Jp$BTGOyX zOGwYjZlo(r2By4WjQp(A-*@)4lvB$u0gd#+bRafLr{(Un^75XOfFl0#iRK1#lt+aY zKq^n~KJwWALFV;o2|hahT=Lo98N+J_Q%a8cH9cWg=s+vRh#itOa6rvA#fmQvmkgeQ zgc`T9ng%OQSNZIaSvc0F3?gg>y6AHA-bhgM`-7x_3bIm5r%@mo+vac2x3p~cu-`9u zZ$Z{jb#}I5Yqv=w;SJD(ll>5-7u>iW3X&O6UDmM0w9uq8x&~kP0$sQk(Jf%@R55g(mo$N;jmW777n> zMZzEQug;Lax4F|2n9HZyJsx>&7k?(ME6T~rq_zL_OsH@P^hBMj8d`$xeer60doa<} zZ(t9s`*6U}&zxPEdGMp2nC zB{IeRZSnf8D(ch|U0oe*=Zr!`eCYYiLAY^OX%$&zWmB|K35&(&LU$q+e+|E0C?jSl za?NdpN*hMi1j#4WIfJ~eE8Q@Fc5eqa{RfVRPllIjM&oA`C)c5Q_P>_^GMZp(ta%7M zl(_o&%)Uv5m1Gd8z^H?6bDEJdDc1eOD*<`|)A+5etLjAWN6k;EG!+3valO6>t}WtZ z_We0Ul6alwos-TYepjpj(3F#&GM}D)T&p=~F(9D?iYva2fX2|+{HH{j1MUIek@xd0 zIBYo8*IS00{#<8>SL2L?3wz&C`DX);iewKqRG>l6`d(B|XE&~tv_hLaQp*4p*paa3 zW5C)kD$<{~On5+(o2@b(AiW7jVb+$R+3_gb z$WSCDqzQz27Celq(&`T9vlt=NuS`=*M`t@^LCz6{%|>Vd5WS8>3ATb&<4)X>s__JM z&PaVBb{p7a6abQvv5{IM>ZF*0P@>l1cb|CWcjFIcIa)UE+@Ic_RAsFrpK(FP+KgA6 zO)>yYh{sT5HlF!&5B8c7HOO*vdDMj#vQVD0lG`{Gkqd};-!b}w5@RPVZT)AGk@|?7 z^<54G_gzYn8PabCvSY$CJsF08#~_f|75O(e4I6@|x&>r2j)BOGY9RiGh?y1M3kiMC zaSAt{f@&N7HrTh_8~ETo>v9_Ej^Bd zQ;)l7$jms_`|cg!HM5x=VR&s@AzW&A0#Z zb;L5npB>z89mXL=Qd>i0QnW2GlWQOuSg@_w=18*$@&9)utV@LD@(q^DBI4IW08SO6 z@6HzKm8#&1y?b(*MBR{$$A_|&IA2R`<&{&uapUiLp@u@f2F(ea21w;Yz?F`k z`GxV8SITaGqE2*XP@gaR98Ahl%DeLrW~AcgZUqu7_@^+}n1pVIqzJG^OSPXZz;NJ! zo9UI0SNJu~NH+0&?kyRn=%a^2q0*#_#^?Finf?i)$7o8gXK}`;>7~OXs1c!@p zsrOcIq)Lf7Y2Rsrkr?qh1Ghtfud#Sq+CIcO20d=9H$(`hw9n?IgM%Q@-L+dbB_H(L z7;Cb2I!uKOaSxuRJD57<+>Wpsajr4r69KI@?QT!7bQrrka;syIE}XF6Vma|waL@?m z8#o06)AW&Jz?@j4t6ib4P<;LN$WM@ZC@EYn(4T+Je-lpc9*KsK3TToLm*981TPI4* zNvwwGSpoCi9w*drRu7amtf-YFpuF_VaTXkB+1aDx8)@-rr60~Pg?w}+a?2N`&2>pU z&q{j6&&(--eLUndyitTL%X?8KB!bXqy>WHmVROb^R=qoSRRtuUa0)i=T9CP2OG$i^ zJv=G%A(EY%cz0axDZWEwUy}_Au4cK;sOU$$dXBq*DXxYrazpRdVT9#+`6=^91%2}& zGCY?m8Q2*9dCS(R`;A4N-|n`=o$}*li{>B7Ufk@d99iA-@k&V9w?lR z25i;r>j(VXyr#w{7uX4MFx=SGDZDC(EBg4+ZTvw8gV?DouiB}4%G>`4#L*AK;$F^y z)nL0{y)J4#E# z6?ZjGcj^9`a2N1hUhHI9&Wibd=AQ!$hCphRwP0&8BEC38BIl5mKg;DVc+2m(DyaQp zIKy~Anma(~&P@5MkHt)?X^d~I$FE@f+f{Zy-(&t133ug`N4J%u=NXHwzO=tKjNDB{ zH_Y&jSJ6?CO;hV7DF_j^V@p)&NVQAf$X<@JXZ&MDHS9KG+@vzO$c1)gsZR>}9IM#Z z*qO!7mr)L0Vl2FR740T{A@{_KwpVt=qWv{H6{&NFL#g&QGg-GU zrA5_^j%svo^98gVPey`5_H_K6_>=1H5u9qVJXga1xy2r)D;so-;VbqqP4zzl+0*Y1 zKdWZmrOKvn7?#le8L>_u;@P`;V@uw*)R-ZxMovb?Of)5C&sAE@K6*NhI%ut5^K{rJ zW+Py!12T6WlngHRUyb>`-y+A<`bJ4fX`>2ME%?T?w)?&Rif-b(ZGZgn}Pn_@kk|^qz&2o@|2TQCgH!hx@Q=@(P62;ppd~VsL207FC_~@m!w&~S3J`B9^ zmn%nnP@!Ie8`Bu%TZ{JN>$^KWs#;O(w8?=>YkU2}# z@d%JdtcY=qQsUGjd`a`q@Zih3agnc=f5dNIrEt>M!Tz0S5=Ps{#c zRyqN1B;yz1pX-+3%EC`6IT9dJ?R?>CnYW;qV}37#OWQGAaJ=rZckVwgLiYSyp_pRV za@EtdFn78pX<#68FHf(uB`Q^_XZ^>I+o#0RVj>8XsxiL6lrYH0(-OGQc#A!O?@aWx zvr?tq9laM2Gp}(Xh%WI?Jvh;~MD99bx{-29xt7#rkyCktP3Au6R~0 z_Dsr?^B?|Ee{qp>e$!i&`JhFKF`vGX*a}Vd2E)6Qxi708rx~Xh`!U+T*vbAme7}E8 z+2#1#9!gu}56`&{f5Z-ng#2JslBQ6-cL)7cBT-$GQ2%d#<)uKCWc=l1wS0@3yz-Gi zHY24nGf^^kMqF!Gg!wXM^-kWy>nS^18vK=XkM617DBc%#+5VfGw)v}i%!#InjLZ-o%Ie(zllXsJe`utkDbokmATBN}dv-A37-RsOR|FvEzF zc>g>&*24)xm^r<_@3mp#`v}}&HG(mg82RTPL9^>AA-}dm>P%o^N>AO;N&oW2DY1A! zL-7ZrUH#?CE!}2`i`?<0b6KZuQ~8RC_P3VNh8>N9Z!U$Wo>yZQ;7n?s`o<+xFy&ef zK``yz-IMfhtxTW(u&LSS%2NLrTujTx;`OhGwl0-Vq@F$)X{GG+$o=<{>gjK<$`9l2 zyS=)>(B1yAcMvThMo~mK40HHB^t+$0hZlLRoxri?KjF-aV$LCd5f9z8ev_TPe?Q+C zJF(v2T=Nt>u9}o9fUhKRZPb^o6r~8;`(FzGhd=v8=Z{B*#wpE#Es}zhrx;u&Zd=oT z2lMTdDVERgHC7Xsy$i9Tk%xa|ow?X%fVdm1k{Wv3zW7I0^F$|0a!dplw2HKjYu4&D z-^%5?FMyM7aQu^d;IppO2}X0N7vJ+#qfFw|_|whBVy6G8nY|W%I#VCB+S@MIV0Op; zFkFD`qtki4Bk3Otm5Rn^yt?Inf5zjDQLd$fB73g#YWC^ByyZ_Hi`cCjP3QBGU*g-$ zP*N94G13ZM|NP@eot+ZZpY|SiSnF-=3>?H8>sK7B9EY$Y)}?tTL;A6ysIlg5-Q-Q+Am*Kz!%2-t2J=t z_0e~f!>!@2&*NP|1?z}&cMsXM!I`ig1ygLl8ND~+_WuwfV3Er+W_6F%?Ln%df5 z)uw(Q{#eK}DwgWi4Jdw}S^d?_)jLhiPZW^RvSf*RTdkr8LP0plQG9a1MsPaPAy^=# zJ9`V#;!=Pb#;myGBEG`nHnb7`cCCYx%d`%bUFRoHeol9O z{&6Gxv}xjOh~Lq7=i&}NoAsa6MSlh*)W5#I)hXG{^?uAKwnzuH0{z!#ivMsy>@(J> zDaH%l46aPnkk%}sfTX3)EOxuf@myc}^S0RS-6HO`?#&nzsikChft~o#VqvAE^CJ}M zmGIABH0}gNuywBiOz(7tz|zF1^Wd}CL+8R%@!PTPBH7B9F2q`jXy^|gxIyM#s2W>=G@Gul=H^;sj!TuK z&aTeS-+p~C5dDe2E-}T~UuiM1)T+wXqAU8k;j>3p)FG9T+M*SXlj@&c{UW2()x~w$ zY_w_~kf=oClI^AR`QqGbA3Hn}52`7&GAo4UhYExTiSX(KsU^QBvbzd~GuK;X$=s|D zAXJNGs_?|$E1zTBVKNqC1j$veccW9??QS{dS2mWulO;>J^sT5p*GesM9J`cn$-j^3b=>giIL0QcN~ z-DzH>U#F8goB2j)|E}Jk9Jb$q;h$#()u+c)>}4-VT`|?To$v~qCuBg{p6?0HDvtQR zCY@W0usaeT+d6GRi1E}!KOOdH1-*lvj>6unrp^IFJoedXWGk!;H>8i;zTMov;kY4! z?e~WQHcyC`H}>jvNGJ5@zs0d@QTX@EG(I~&fY-nT8Ka+K`?sxqU6+r4EUS?ijsH$h zC*6_C?FvC7Q6YoW#xlvLjH=&nJyZyFf4X%pML+spe(&E^_vVX>|5WK~AAj-ICw5)2 z2l`*zOe=Vf0O!lkHV?G;wK-tUq(=0q9fI&NOnh#-~+zbZ_pFZb1UjSYGSx_=X3fB z^OBk7TQxPdmNLKG9J0@ci%-z?f2?J7RqfB8z01n*tnlW%-QCB%2?UI%BlIJe_kqBrZ>= z#HabGPmRw~qCgv{>mMmx;5l`dKXloT);rxK$3$AcCrh4Q#@}N+NJ0-e4JryIo@61d zf2QtbU1Wafr(78R%qk;2N_tX9xS(;<@Sc53I^X>>Y8ij8=sYL)nDd*t(D}&KPFJqG zeiiE(*V>riTH_IJoIn*Ht8HsPH25F@=oh*2wTp_KGEK zME^$F<a}y&uzpSIB8I-0! zwdF3mdqm9-FP$Bo=YV|Y$HH=wNFDNPp!8rwZ`X8I?$Zh;&1qp5Kj}CS`i0MY_nqsG z-Yf7^c%6jUTLZB)73T*-ofFUxz+$H1q!#az(0V4iM2jGw;}tK3-)HrCNQIGz#Yu+R z%$1wXa#1Gu<+v2m-sZ50NQ`IrM~61wqenCnhaBsDdyB;BBbiW7==%D-3qSofdEs(? zK8H|Dz+<#Dv=DP`$#b}~_XQdrD?@ba;dghPLVP;7NNcI;A?pN73w9j={M!!;s>FCb zqYXKznyEV4n!6^q*spD1PuY9?VEE@~FT-0CLE>sKKCJ!S|1tFyUQvBtyhF(l!bo?C z(j`dOjD&PZw-ORk(p>{cw=@U{NOwyp0wOSgfV7~9LwDypet+++_5J`^-nsYev-hVq zR+t+REs+=*-F!7c=$OaEO0e5K2pIzUaN*v@uN%J|Ow@VGuct@7ciV2}!SLr~sHbin zYp8MBgsvGWWL<~UQb2xeM7U;^Y}T+Kg-izq@ltYwuju zyZ6tcdmLM?et{M=04wirSg!SOer{fS{j9CODOq3XFfdDZur1(0Tu_dqZk@&TWX>-o zSnu$=9ga(Fo1rYP!3@rz&A;r=(S zy1JK(X=$pg$oEj@%+g!!AyQ^5{I@@vAlo74S6c&P>+ZrF<-RzieSB{UGv-XWnXw5c z#3wvDTbzBb_J{D8QA_3yUh&Ldm&f*e^w_V;&Cp*wJDTcr*iA_B!w+WL#B%n-G>JP> zkr!30gZg-}rX0~PY`yl8+Hk$e>4(XKj^OC$gKFzphV=2mmSrFJPC!av?1lEUxRSXn zx5i`1K2@1&e>)wSyBeHYoNOukA^-0{`jm3pU5JPXO&qZJ_`0%E1l_gV`rS z$UCfHUM}TFyhD-q5N5l6X4#tUv-Op6$=otyuO>w*%Ef=KyFbKu7qYUv`W%h*EDiPu z+nez^)l=1z)pV#q5Yc{X|0KYhBa z)LctPCYo+qeV+5!EHJB~cQE?VL1k&`Wq%}9Gg&E8%}arQx_u!IE!Yu7GeHrWU(sDW zTnF|O_?_9>?eoQrh3p$8YE_9Y%OHd_hPI|*UcZRy@z*fcRFEq|F`Pir1Q z>evY?ExkjH$puAStn=x$43uYq*Yd{;kYJ)$Y|_P%OYNPIvx>9G-+~`nTRinj($?s2uIIqduNh;uEfPT!HjVDfORttJdfI+) zy>Y7zm_7{Xr#Q$8V1r^}%O*z`ehk)be{WBO1DAa_)Pr5nDPS)AkS@+Pnf{vThTGi+4~+rHKfm(TZ4MlNU0m{89T4%W}MoV3S-&>zD=*cHZKDs20f7{ zCNS(;o9*@=f4+Qq$wB^us^nZ_F|ehcyL4r6vM+Bl?y}2EG}_T!vug4_l@ptE2fAHnO0p|xIo}eXqMJsW4D5!oUwulf^X^B# zAPN3@>4q~HKXss-10zA_K>;B<92>2Tl7@-LeEzGFiefgYpyIo-RL zpXniVe0u?|cH0bHsX-$uZQHi@GWen(kgRIj{jeX^Dn4Cagv@{1^w`~#Wy7hM<$k8j zN_Xvg8O8PQa!!52J(%4p3bsywA!44k>4bVq3gnGi%Op`#neYuBY%KPXAY`YHCP)V- z=lffnZ(X?aY_$}gCR7-Dty>Cpr+u5?TsAxNw$;Z=h zv;4#c|9rtZ_4{+RX^oAybcw9%Z{#?S$F~-?x(8OG>H<$Oj)^fKoKXD4ya(3)4A>0u zhQv8Nry$#DGry4i7I#(ql zE3@HH{Lc60F|{Q=B=&W`!n4fb22u2_R*l}SaMc)}NI%*YGt^!Blq^74~&TggCb z%U3P5sxalUa=Y7{rw?~?0n`EK&RgD>`z_QfG+LVKxtQ^}ZoAH=$W^|~Ajd+*>X;D` zGk&#uLSExDg5|Z~Id82>*3C3@@O9_67pg=;f+WgJRPga}fvu1pFF-AK?ren7b39z` zEa7m4D6?BZhWlqZPm?oaLz!71UwX&a2t?7NjxEN?H>@_;tv^im zZfFmow*_WoA`{eAE1A&n?Q`^x0l#DE9Jg+;t!vS#r82t>}L%zSVlXZ7@-9w!~wW{N9$8CcwO6%D)!C?yl-Fx)6wTost|}M?tTqOEYso4fg@-mFV^7=W^@R&o$YGn(*$B`u?IzqUkg8A2C&a?+^paqeqmb*zjwtRM|JEz#N)M^r z^pdz?V8(vKbhZ8TZ6f{pakr1rNA#d419sPns3pLgB|u2j{HpeI3F#2CxlpD(ecQWC zG-qAi8G0YyT|2yZB|#TBIbJ-wzCH>Kb@@=TIp7(SPQLoaiZei~CrnIj0<|IR{X6H- zv*NhIU-(kZbUOFWPdcVX4HwjN7w<3GxtZs}%tMHPQiM)BW1cn%;!RNyR@m=XUAf4E zfO_YlFY{WO7M+$%!0@cZ?o+G7e&L-`|K}Wp!d%8LX3pg|P*U6{k_~0bSkAHR4+zi5 z=kXipO<1`7=4QS}t(7bdsHd zHs-x+A=uNHLfd=wmLyjb0j-^GIqFoFu3Tik;U$~E#J90jqw6qDf?z1XJPsJ$1-}`^ zhY6>Isq!gvx8)|Y>P4puRlD0+G@*}syU zsN3=-&tRz>^q!wo%xn5mZB7aqUEVYXumWYtRL*ubGswX6OiNLX{B>J`O0wj8_HT8I z!rtjt=j>c$U7`{qm({l1!e*Q=q)yY2xbW;FgKvWvtZ)nb0xnMCG5us#49JJh-%w^= zh{b360_j;F4Jt@*!(l$?UQQ_qa1b1E?9uhSWKpl)$XRY;EtxZ7fATeaOHA@$(A&uQ zBPlaBm^S_)P>I&7WNH&#j|8QzpCF#z-PKQrAbMQ4M%)?%(;eESJ5@ODH!WPZ1xv&C((X;W0a zVCvNZg5z43Ie*EZN~aksIF7P)H4=+0RF+c5fv{i|Xu94Ekd6QbYg8L9`a@`B;yGXU ztt2$mv*SAVb=g^i+#~8g^|OIq#0A!N>ApLs_?R834@k@{V()J80;wY5gm>5OgXVb0 zC0`|0k}_RRa{t{&%iK^yQ_AOo9hSH1sb4yx z!>?2;X3Klc5BH$VjgpP?jl9AM zUi^Hbo+ReaTbJ3Q)X?2aEeO;rh9DFIH2n*6$F!j%*?DVT4fhZobt;%$vQUmmhvP_$ zWv^HPDJgzfxz0Dmn8LGWDFWIwPJV zinMl52ZG1Uoj+r>ZbmBm*iu_Hp*zF+wbx zl2WHMtM$VI{>wK^(7C*i5tj4Mz)druCwleg%M2B&5xxeQsf*gEHRhn~ei;3GPE+)X z0$hWBq%6=->#QHRkFc;TajRs``az-E1__gitUj+_8YVBkC}gKCNi%8keGCnSbW}7% zpWN-I(o{}?FGqU5r^%y1FW3ohkhUt)Ayfurv{6YWQss?-XBk)lZv{xBXJh1zUA1-sS z_Jnv?!LlySU^KwTjUHEZ=$lWTKBc@sTZbqDiVaV^m>R7~!GYIaF7B+VCtEE`KHUpG zo!k22O82sG$V~`2#?msh<;4i8M<$xv0QW+| z{KtOzN(!VAG{5pB8u(>9_#A*z&olHWpoRpdT|ICZpnok3-{5&Q7B*&$@Qm14-iNem zT=wPhqTnLKy+Wok<@z632P-1<G2hT9%8f2=?;Wji|p{)>GXA} zJ*NxmnJm*Jz&n3qcgb)p6M7-v#+j1rrGzqFC2IS+`MT^u;kG$1ss6^WD$y_@xz7}9 z)-U#R4pjg*bt_hHKUHL<$Wa&QMOuJkS*2G2ht!X)#BlL9|KL{xYfcxG=&IO3xf2$X zzJV*-#U^3G)gt36!E?rG$mkFC!5Z|{8R!-vvuRZES%!@49NZ`}PbUEam6yi#kKag}O$M8Cw?B}|6@ zKu+s3@-k2k8nU7xP7SiCpq4MDwMnpho)?Pp4z@N?BZiW8FF`d?i%VFt5AXGAqKT_1 z%epB6M-jh&<}2c4mh~SJI{G&!$i>O?uPIhon9s+OqGBY5tf|GTcKvtHsUiVC*DK_3 z?IeW2CBvYE&?K`y1}REG*$5~ZLAWt)WQ5EhRfj_Ad+!!+EwU#O&&`0MMFj2EmaVHB z=GiedEzN|~lyN~Z=Tbvynl3z|D?hT(By`srOJck>1wi=C(!!of<#~)I2tEDjQR=z&ORAEQ9@n4z zc~85%ADvg&3S9{6PUTHIJ~=XlsZEyG$XZ~s&?=K{ zJyM#u_D!FkCN%~jb^UQ5Ton+Dh?w4iAs#4*Yc^?BKljjf6(Y|7;7fHhj`X|sZ)onFHj_4R$GT$PD`~ducK?zIo=Iu zsdw@-^Xi9+|9ez%$lS<77nBspwYfg}@+Aletbjx@)97nmC=+{xUFUt0xV(3EzTF+6 zW1-_R*Ee389O?Zg103%2qbY8@mw7>xL!&-K@do!c?xVzFD`}eCX1Bni@;MKGj0txg z-2er9rb7$}gCLI^vvU{>F*J=i6!u_ZJsb(hS3&SE9Ov=tybE(iSEZ+%ngW+LspNI1 zStrV3Xpb*`t%qQ!w(|*g?e-d*pW5%4cvVg~jh;lGnw*M4#&mQyy(ZGDTv+i3-Ni?+ zo4Yo*@t85tS5Bjc3kpR)cWv$?iQXAi-5Js25@`;Yr{paDK0jaeV}-!bgLUX&!$9)J z`5EcTBeT(QZFoi6qtxiW?VLk1jdWJE=>%al)gR20&c?#dq3#b;s!~m;4&JgMb2A0uf5=)qFiQOWj(^xyepFm|47QEXm}hcrsD`po1yp zU+?_zZG6u+}Yp08PR{lHYH$Ph7({W*By4x4betFY+ zWXBggVns0d(@`4#`@il7u?2+@L1(Y73B#Q>5LVnr{ zEhW~J>mAIw$hj(t)_CI=vB#>d4q46OdtpT)&c22J#4&`u!IXLD+`Y})6G{ne#sD30 zYcfGe10G?lqLK$;>r<}B3D#9f2)cpH*N(5QTWo&xy;QXE3YO@<4TgrFP3{VUL&%JWZCQit3ln zc=|A5;p|H@AjX)HFobOas4jy1UkT1XC(w-aqr;eLJNg9stpM=ILl@U2oL7pE*@fP<-w^Ri073`SK|GIBdBK!E9cx$MsL1 z^&#Q!X=!#|&c`;RYLo5Dz$)X9Oi&26dIO@sLysL<@nft|Q4GEJ6^pjOfPDch8EA75 zVqQ032|QTK3fmis8)NAai!_kj`SaJN+l(VUkO~_C|4e{cC4L&9qKEy=*ic(|@+1eT| zs@{~G-QHD(767nchbWN*yI@Jp+>^m)5B_5QgrmNY&@<*xYLxtg%Vh-!)iNqw-1*mI z2J{1on1LqupW7B7XuxkzU0luyEBv5X@;$R?$!|O|_;(u}&ucQsyK&oK$N3g4^sLjT zSOKkxI7{%CL-=?0;>Uh#@}^nzGDqst9`~;T>&+-ZSy0J(zgyA%j32OyF-IG)fcY4P zP{Bph*_1r|^r*^&IsH-&EQzj~K2s#?JFfHoeSc!&8SR}rk>CWWPL}I_(5pze$3%Q$ zRHX)`{vot|q$#?vYr_XLF#u2vt={B=K-!FRRzwpA@%fIPw{s5>1P~xELNOt&)dc0`YCkrQFMV3ZIhkQ+H%a3L zTZvCuzwb8RM?!#Q%G+fnV6TWas0r|0fq=pv>5K=vHHpIS-%0`r4Cm+}4p3MAzvJWP z)&PrEV5pcXPZw|QYyv_|Y%9aSx7Oj(U?1N~lod(J&QS1XJHM#VLZxnn*G1RT289Yo zTt6u7Dt(2~DFY{9*Ljb};&Fss?qpS<9}HU->hsR5M(Up*X7Lqh@P3IB<#>OEYYw9s zoqlY#oJNB_9BIJq6w#ZJA{Rr8Gb3Ozg02s2m~F*_cy{Xo%$@7ooGo{tGH-fO>@QiI zg1%rkqL+Ctn8T_Xw{<3*W-IMZ#Xw+L*J@|9J48s7_j>c1IHbHBpn3la-B>8lWBShv zXJlu#73)=){=EzYPeqPxpY@lkH)(C2pe=_^gY{w&r;(WKK#ZN7AP6%!)5$fIDY$1w z(6a8#wa$Q!v2_az37c_QD}Y5Qm@9M8uTyOLnH2#fPk>)^#*^-4fpZAV2xFs(W~SNH zhGjF;1?(waHek6&O-;WIzRZni)NMMcy6+u*vQ@t76|!~)CMXhiQ23NJOKF*jyg=R( zU2^|sVR$$QIACt^{6Pe1EbGwb-Nmz+Lv<;iV}XJEF;FVOcL&|RhZ19b#t~#=e-N3b zy&e;?>$NDSYoQv`|6-SpiYCy9Ie$P+Cmr;dAyL0A!593?DW*vb&7|^u&Q{V>U08zc zH}`3&#)P}~Q9-0WZN#|=9M=BB3o4q=o)#U%Nr6ug;Da2)|K-C_IbZw9iw=EnzL{(B z1y28@UWM3e^fsWP!Sig?;GObhi+nozW7Q1Yj9r`ea>7dN*g#{xwY5cPvB-*~NMM34 zzkjCgsLPe6(KNrkbP~-5S~A1YShkc~5Ab*5m(|$*yNI$(gb9*tD|NZaq|JevodFv@ z9lC>Qx$naI+V!EJ%f{Dot(^6bUtCcIdR4wt_N#0;ht(3UBmjAwQJKgbhCk`;J!=V~ zfimx1QFdZSL_}&(Qb{xe&ENt^NDKM{(U@!Q9BTpn3M|L%D{AD^!q#vGy3JJN)8CwD z)2{lYh&6_fI0)PY^X_*|$~e4TSKq|ZSCrM8!X5Oi{3ZCR-c98A9ODL+O98Ub?caPY zi}>BG=Lr+VFZRC!gRy3fH{y+j(GLd&{Td%Z$QzO$Zi@fDI+D*~kqBv^{t(iy(dBE9 z$d&MOEaV(KV2-dhHL1~?F44AA{mAQz%jipm&bcj^vOl4_KeE2f&XCY z^jf{f(n_9MnCI}fEw|?%hoz%Y?}?~?W$ppcMNeNZXCNAhk<$nIqNyj?0Kt6g`wN(&qdjx%us;Tx4(VZQu zsUMW$g3jsnTe|TCdd;@k(=fJn`lnE4poe6W67~MU^rQQU?fAO8IN%#!I@w&rROxN{ zLe|;>pNR~wkVgHHm$~@ql>%sy4uXF#2;m1BA0X@FBPUq;7yPg%HM&lr!J(@*;jh7& z;uE#FzAQCD(kB)Pj@r42Qv>?4`yim(L9#g2P;YIu&R~n$fW>1}>SFK77yejK6kPpl zX4E^52f$&L;*(x+Upw}KgMJ?l>uErFt3x1hX2qpY=E5F!v)b{(6XI;bNr%Tk7?c14 zr;J0H)_moyVy(F+e2+nS80K%6o>71vhk%x7ozGt^J3G6x67Uq=!B5_lZ1SlQ6MigO zbmB5Fy7S+)s>Ylj>B2e(u9kf8^dd*?u9OczH2;st7yD-%tx12sTh9xF^4FowX}a6K zQ)0G{X<1RU|D_wW!qA^Xyg7D;;4D4|M7aXOZrYl;dL?zP>V#Ov|2(Z>6?h^42?k%} zxUr{4!>~herK;yKi09&0en-G;wJsx(5@7VSx_*1L%3cZSe~*EOrUR5Ge5!FB zA?;P>IDdL1t}xYj-*W$pe3OymF;MbmxSJQgp5-PxIF|rpg9iB3n%XgR)cj`4rz&pC zW?yNmf$Q>0epE=!c5+kC*J7C-;0pg_oJ7@|H_u*oc0At$+%UBvA1 zK3*zh)Iv0O#YH8r@D24)MU8$6!-pSd0fgl!O2XkGF4dBPfL6JrYPa5$$~=cJpZZ=5 zilHAH$PStyFV;Eul7SdEUg`#Wv@Z8{yKz3@#P^=5Nc@|=mED`!gg^^$9>T#SRjb}{ zH&)=K|K*AEFQ3M}uRimc9G9_^ zg1I$F3)n;c?Y)6NN)vxXhM&);r2XDl5-n*fydlzPye$J1mH;4OZp3~gf$F|DeVi5 zyFbGT=&2Mf_bEFsuW!REuHJrl>@a<2+w-v9rYLY8^K(>*9bYsM9=n<9CtJ5IjhMSv zYC;3|8}h%XaUBI3YQ?XSFRi;b0|tbzbDzg~+k%4{>6rk-w8DK}Z0>9&k0Gy{9I{J% za>nhi`%L7v+bb`Djk58>wx@Wz<2)=%?s{Qi!2{&PoObf2s**hcFCx_H(J>uLj7a^S z5z>D&%(to;3<&01qNrxG{Z#x=>+qi$PfKoaATA}8|1}F_C^0MaUs&It4Q3LqVY3N!ktAq`h{MM#Sg|(O{`f zAmtt%=jezZDr=GH2825;t3pGDdm!&8GIa~ttGC|{NFthp%jffm~%tAe;nr>9u zOhRqB#ld(av)isd8WLT}jysS%NX+)E?7rD$iO9+_S%G|sSxs0WJGfs1j6034-=lq` zroDIkGdypA)ZOq@@=EmozS8$#8c!Sz;Z|A!gvXH4$PcW}_$2bxRs$BF@uSHC}(nUb>YSbzDEMa*6g!zd%{+=wfYZ%Vpo{9BP`Y zX`q#+fLoZB-r~X`alR|16Dy=LkE#;&Yo}PjFj?9((1{pE-f>FdD+_j~N~;&Hb@^!;HL9?^wJeuiF{5U$+bViO!c@ONU-SvqJ+2 ztu>sNxq*A*1N69Y*79DMF!kN9OETDcq&6+`G&wb1j)k)C_dc-* zZJdGRctz~_0UR2l^AKy$ic=nf+9ub)xj=hX=vGZ{68QKaFG|psekd_I&oB4X1AUb2iXjM+|*GDmx}{^Ay_abIu|zUMrflk4?jc0gryAJB^uZ9hMZpCPwKe*Y{Um9x zTUA4yzsL0|dBXlNbEdk+zplKsTB148(#lYbId{;6K87tGH<-LlhME~$JeLT}QJtbR zF{XguaH+AB9IZ%IDITSGJ$ng6E{LCZ3dkd2n7#M!FN>q#gYJKe+MOgVZM$A?|hrKqt^@T#n@{HPa*=46^DD{1qFa648-ZP+D*9C02vmwPm<~H>DJ_1VT`A18$Oh+5&%81t^ zTz8i8O{grRpJzBLmrUe$|1H#I|U|HQW1q^Za(fDF*q9 zmaU<8czg+zTfM~T6It;}N*~^uROwY8N!Glq0~BuZbE6s{3D%#qZz^cW588=VZ6`%6 zSE8jU8GI~Oeu0{53b8ouP=k(01TM1waclEa3IDtrzw*ZyfX-7cq6hKdWKjP4`}Myc z#~vIbZVEujzn0GKY@f9~;(p8${k!}r>qUVarw5q}^kNaW@g?W#BP4=3$kX>gBJK71 zP#(I;m%gFseWI_jWagE-WRfU7NM;Ehfn@moNqxV@<94(k)6i=$oR~hV&_O!`k7oujT)+`x?8f8$x9c<298dpxs^lpvwiWbR%$4#(0(<#+W(C zf&5p%oekXpJN~v|I6&Q zZP`o_QlcmR;1Qe5VdIM`y=&Ws*|QNu@(xn7@WX~+a@mpoBdjO42{8NI{hWr&#nWrV zga;GSHtb0+U+k9`OYv+Zlre>(wTW~=`t{1{~i6c!Jk~2Cof--UP5X#&mfNIn1!PF{BQwS{zg$F)Y#nbgDidmAHM=|lM(f7}?|O}#D=#D%Hf zBJ8?E^Hc+51o_YMEsdLrGFAMWM%>JgSg081g%fGM`WuMEy7{gS(GB?28~S^C_afBSPE#BsnYW&YLNnckp3qDl{|Mc2*wTcW3 zx^wvjm5Cuo(pNNHY3gUkN^>3kJnJQoRT&H-yL_n*wwmos0`2JC3HN>0P@+cPPNIL~ z7(zOzY;k?~2>gt1fO+U~l4@s(0s9zOV4?8uH~gkmr31!vcW`-41D+>TCGK5u3=Fdm zaZ>`bZaF{?Ouw51dZP(VE0?7z9lxIqe8w2y^4%)t^)Ajk~66&VXyw zRWqg~imdrccsFPkU(rkzszqkKE_Ie-O?~5jI8t#ZB0{>Hw%@^1e<&~ytfvCWeMZG5 zb4EO;3#T*yAFNS;9%esa@cojMKuHjO`Wl6`$Zz(PV>`2l^1yI9D)9oAkgc7V@9gV zgQu)1=k~>~i&=*%banlN)maU?{_a}u`Wy|$u`&9r`GHrgTV9?g&%S-G$c6+&q{dsT za|=VQJX3Cp>gOzee{y$&y1kBz(~mnGq(*{j)P_jpmBc+PY}Xd+D|4nChP%1un;8dR zqJO3j*#r?l;2l$L4kE}g_4pMC^OxMr%o}peM-}TA19y8R9ST+>%b3{PpMTWUOSODp zcwq=QmMrV=ybse3yb$gUKUXfRPh)%bnq;eEM?K4mz-+_8{QhM(=sNf|kLQRZ^{Wop z1_mw{?;`tR0(uWLVJs90<^n>JS4*o` z3$sYs8KKw*&xnChAZ@s($7rJdrxd@?(V;E(4Thl>k-2Sst{V!3AC&x)s<#<@RGoHL zZ7%8paR310%K^e0=YPSK`#6;iy1I@}B$GaV(BZB&Ztz@8KEHeaAM`r{?DtIkCsuWu ztur1uY?q4+jX?n07P=Ra^eZVc`uwT`Sa#I>>f1vED1f-#BQqp~@#UR}pQqQ(*Qer$ zH;owspMZfwM-$j3dyDF3iZeq#IXh(Cd=7s&@0BXk#P}5iB1oi<{KSSB%wZIC_K4x4 ze1KTC6F{A}y5EYyG-__R1{8cSc~@|nx&mCh|6Dxf_LaA>*z-2jJL>Z#^4*CsgXYFp zO_vv^TiuDgF&2qUCq;ZQ8)!1BQdI8yJheV7>-pNB&du6Z$!E@C8JHO*H!IPvx_40> zDB{p}_8EVNs4WTRfJ3a@uwaiscSK58E0tC}7o{QI9Iz?I=M7)|YkuoHew_hj<`?CM zOb814il>OFiwrkVTk=h~2lOKHhPS^Rer&d!7eW8Esj1ehXc0)lDb}t7x;f~-M&|Rc z?_hR(`N+y8*NIB%rB7Lwr;TLhMZAzhIpgUWmwvA?B2=a(zlgGz z3kx(m&ig6qRke@uS9yJle*G1($@@$hM=4ohCF+kKFzoqcRo_<5elXX7&VI!x9(K)`3$ z-{2-l>23DHjh*gXLyPPgLBL%tvimRCukOg#jS8q9zQx_?xb>CSx=B@jY2!94Ml{x4 zEKvWnXCKUP1?44oCAw}a!-yrWxRnPRtdz`}5{n~)Mw_?yL5^FRa`BZ+-)kQ|R%}V) zQziMB-YaLGBvmOe4D*r7yXxqr0(~(I@u9@7h5(4EQL5@DPoSTu`C`UUvt-v!|G1k* z_9=(QK==vwbUI-Jy6U^(_bDIszcmXnX;efYWhIklvhuV2YA8KgkSs}FTZ5fo(Xd^6 zU~1*pNY3(;ZwB>;*$ClFTBT%>*T20aUk-dZ$9jBc{;@vWQ2jmpNDWoi&4;O*tk?E|8IO3J0fICIleK`uJHl&3=9cmHxf#1?G@Zy7Hb zZ3#Gn^>4)_Ur3{Xy7(-Vo6Eu7G-&&$YAsx4;HoJfrd>I`nNLl4#rEXa*9Z07&NC@~ z(r}By@_Nz-O5#8GWB-9;mt3m{9);{bfz-7enJBz9khv?7&1qX+0$y(G?&WCAmqNZI z)^n(`or1w~#D|VR-mcx3V78e8A?ijEQs({@l~OZy$PbqB zuV(4o=G7k%A%t3A3iG+01yUfkI*3RgYO8Kc#%;r2q7=_y?zcCeUvH>NN?Z_3}4s-QgEmNRJTV{Uj9Od&wo4&!-p{^i0eBI0Lg<6uY1^;4$GZfc`lCVOp3Y+Bbo9$jdLU;{h4IZg!kPFL9{& zR^Pd8p!t&!d=O1^&$J`3mveq6hjr*%W`rGsI%HUCq`;@z*lBW8UrjwW2zbgLH#;wW z-<83e;~^?9XUIhn`b#ataSsV^ZSx;4U_cJe>0k)&hVk|m6V7fAU~xV!FYhv(YJBos zQQPkmv{)7L2HZP>kY(VMFi~F5unT8MvOeEuf|lHgj5vt%EgD;I#E)O0z<7rvkvG$} zmoP|r2l5E=6$yK$mHOU^YOrZj8O65|c*T(OFX zoXRvAZQp}iU_elWvN4QkIzS%A^=QpK5`hT5mIy!^KO!$yIhxF(Z?ZFISlrj7>|rAosOw2 z71oqlo1#n)`i@_?@JKhO-uO#HT+fAsZxE(u2rEt~07sdhh$PbzNwYps)&}X_&l#{I zzXD2>Rmm?g!_OX=41oJ@X=G%??6NDt-+S}H?J)*-5RjzS4%yRcXr&t4H*EmqZ6ggR zbw`s~>G`0DQ8k5I24*A)LIsgvYDQ|}#JgN!LNRzYcKkVGvE7yHI zdQ3O!<~VxjxO579Q}lo+OpOj@dYW8G6=4^VAiA;kX49uPZ?m#M$Dq`H&Yp`b`Ly{K zEZiyw-SdlA^FN%U3TJY%bGJ|Pv5&#Xsgu0=>~b-_&pw}R0psScToV0!^KlmF1dK&V zu7k=;IuT^2f7Tb43R9!opI2f9dqDOcEuH$X(o{sSj6cF)e+CEUV{xQrB>o%wV_z!yg;h9=HqK?8}>$P-`58R29iJ5y=49|A;=RQ zR+4`Tsu*w~Xv5EttV#wcjyQW^^lr^i=JPs7W0~})51oOD;YSjG*5SF<}bOaU3{5 zm1Q!!66BrK;>{fZi&y)0ddl-=cj7_l23#-B*<@|=XZY|=eI!ym0zt1N0X=)zHh$*F zPIp5LXpe$a8VxVu0w$;&49O28xr5S|(T!!@^#+k&vvq&Mwa+%Q-kzT>dAJ-1-Qkpk zwlZS(*>navR4m>A@pupi#er^*>B2aPaK1ZkutXV?N#0Xd88&{3ZBIf=)hId3+a153 zq=FL@GEB&=7T+}R4q%8&u(~r8$g4(C!&fzx>=o3cKcAG3GNnl4M`v5ew_B86$wEv4L*@K5lcFT!*d^qD1(p})^eYY}mvI3M7*uv)kPpS(8hO$4g;M%OK%@CKpw;`eMJMYxla>r9)m(w5oXj)Wm-et4orikj3{)79;6Ln61y@T~1Dv}43Du4xZ^L_oB;C@lXG$1IH zzgKiI7zumk+TmNDJqM=R+;Tg@fAn0;~ z9?HDj?lkYV*l~EikZv+?t=neev~zY_=TB}Ved6~y;3uyJ8lNryXxQO)FEZPSii%EB zUn@0TDf)Fgd$dMS?dxD1_%h&L)!?uNkbdGcY~28yy<2|}$bRYC zeZ{&ty7o6|3WNh+<7wML6<75Q&EfQ!U7fJwFEVSjUwC{5hd zw^b4|)&G!(_mlPjW|MrsaiK_UX`V)I-MZw6!2QW9_>--_+3~v2I;%UjRC@pizJ~x7 z2?}`*c?cDEy|E#x4c+GSZ#`p_rf)!-=EqVKUPoLA<-jVGho?glvS3i5%P63>c?r1h z+Md%Malo0!LCLnz1p5eh+zBowsm=4MUW) zI4(ZAAN`v#dHrarIMl1%E{ktU?T{T6#$Fr>b^u-43r^t7p9ki+?FDqpLpd(b&Q~R%YkK;!! zi8tE2&!3$*nnyh#X~p{1C66J>>!@g}u_an_3WBLF7PXOidGsRlpPg=xZ?AF96e+;i zzSowSnQd*@W@53W+&}Xyt^fVls-WUfFE3tAol&QBHEq9I^L8xe9;Mvpr1Uq*jnPOKTUfep`Gnsy1gIYFDtKrv;Y zq2eym`c*nk4fL0#U1-N)^y@wY$q2DVd36{zWH?01F+i;q>*|>G6UIAvD0NY4Y>V*- z22+UJ4C5p234VOQ-q*aH@L`)@zKJb{kS~m=7gnAdukQ%dSn)24u1T!yXR+ zG(r@L0{M!M1p1NoWd``3b`nPIn5ZzeP^L41tw3y5EYvOrq-812l>2YWPITdwcJivK z5Q85DbK~Y<28^kmJHenJv6$1oU@5?W_bmRxcZz9Q`EFM+O~+qgTr3oqEv9*Uks7x za-_qjJ)He7n;9!*&R|a_j#GX)*K{IrLx#kHDwiDPar=2s>+eFm<=(Ci0D-=~Pfx-l zp2M@JLY_j9%GDlymE@fFhsRW>Q&#n+W^B+ZO3QJ?#T0&crhL2GCJ`bf&96A`=No`{43#S9D-Efsubpl_583FU8OyD>J(D&80p)rR>Fm$=n*?gG?E<9~{Sb2d9zJeM8qH>4T?|9hP2y{YSI!Fg;VXnn=Y@DMmauu1gI1?yw>T&X2+Fj{wVa91ROnsfqg97_CgE)o|g750USIsg6@KQ@b3B`Haf) zTXik%7Fo+_`u{USst_}ka%yO-1iF=iNUNWa*$XfP23AJU5b4i2>= zQKm`7SL-);M%GuqA{zdpK+|Ee+++0Aq1Mt9^P$=Q8Mti-By4kcs~Ds(YzPV6>NK%K zlF$86-Gk*e*EcsEFmF=0VENptz`&xQmBE5xiKj+pkkjiBfmc2$rD_|1o2m4Gd&Z)6 zUtLw$V8u|v@IlegX~pjSvn|p&dL(x(18z;wTBKs=DKc}>3ZF@-Vl0i1D%YK10d7w& zjk*5O`fXqI`s=sOR_(o+xBa%Gz?tV4KR6mY?f&t9&)3B-w))-eV_;xVEpd$~Nl7e8 zwMs5Z1yT$~28Ncp24=cOh9QQgR;C74re@j(Mpgy}!28#BplHa=PsvQH#I3=oa}f(r O1B0ilpUXO@geCxUa!>{U From 859d7d2a829bd9735104b85b06aea403b67e19bd Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Mon, 9 Aug 2021 16:46:33 -0400 Subject: [PATCH 309/476] update greynoise.json --- documentation/website/expansion/greynoise.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/documentation/website/expansion/greynoise.json b/documentation/website/expansion/greynoise.json index 4c61727..4988537 100644 --- a/documentation/website/expansion/greynoise.json +++ b/documentation/website/expansion/greynoise.json @@ -1,14 +1,15 @@ { - "description": "Module to access GreyNoise.io API", + "description": "Module to query IP and CVE information from GreyNoise", "logo": "greynoise.png", "requirements": [ - "A Greynoise API key." + "A Greynoise API key. Both Enterprise (Paid) and Community (Free) API keys are supported, however Community API users will only be able to perform IP lookups." ], - "input": "An IP address.", - "output": "Additional information about the IP fetched from Greynoise API.", + "input": "An IP address or CVE ID", + "output": "IP Lookup information or CVE scanning profile for past 7 days", "references": [ "https://greynoise.io/", - "https://github.com/GreyNoise-Intelligence/api.greynoise.io" + "https://docs.greyniose.io/", + "https://www.greynoise.io/viz/account/" ], - "features": "The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is \u201cInternet background noise\u201d, or has been observed scanning or attacking devices across the Internet. The result is returned as text." + "features": "This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days." } \ No newline at end of file From f5fdf343b838f9eee0cbbf346f64ca64d5de08cf Mon Sep 17 00:00:00 2001 From: Jason Zhang Date: Thu, 12 Aug 2021 11:08:09 +0100 Subject: [PATCH 310/476] Sanity checks --- misp_modules/modules/expansion/vmware_nsx.py | 34 ++++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/misp_modules/modules/expansion/vmware_nsx.py b/misp_modules/modules/expansion/vmware_nsx.py index d694c5d..4496268 100644 --- a/misp_modules/modules/expansion/vmware_nsx.py +++ b/misp_modules/modules/expansion/vmware_nsx.py @@ -44,7 +44,7 @@ mispattributes = { moduleinfo = { "version": "0.2", - "author": "Jason Zhang", + "author": "Jason Zhang, Stefano Ortolani", "description": "Enrich a file or URL with VMware NSX Defender", "module-type": ["expansion", "hover"], } @@ -111,12 +111,16 @@ class ResultParser: # Add HTTP requests from url analyses network_dict = result.get("report", {}).get("analysis", {}).get("network", {}) for request in network_dict.get("requests", []): - parsed_uri = parse.urlparse(request["url"]) + if not request["url"] and not request["ip"]: + continue o = pymisp.MISPObject(name="http-request") - o.add_attribute("host", parsed_uri.netloc) o.add_attribute("method", "GET") - o.add_attribute("uri", request["url"]) - o.add_attribute("ip-dst", request["ip"]) + if request["url"]: + parsed_uri = parse.urlparse(request["url"]) + o.add_attribute("host", parsed_uri.netloc) + o.add_attribute("uri", request["url"]) + if request["ip"]: + o.add_attribute("ip-dst", request["ip"]) misp_event.add_object(o) # Add network behaviors from files @@ -129,8 +133,8 @@ class ResultParser: try: if hostname == "wpad" or hostname == "localhost": continue - # Invalid hostname, e.g., hostname: '2.2.0.10.in-addr.arpa. - if hostname[-1] == ".": + # Invalid hostname, e.g., hostname: ZLKKJRPY or 2.2.0.10.in-addr.arpa. + if "." not in hostname or hostname[-1] == ".": continue _ = ipaddress.ip_address(hostname) continue @@ -183,13 +187,15 @@ class ResultParser: misp_event.add_object(o) # Add behaviors - o = pymisp.MISPObject(name="sb-signature") - o.add_attribute("software", "VMware NSX Defender") - for activity in result.get("malicious_activity", []): - a = pymisp.MISPAttribute() - a.from_dict(type="text", value=activity) - o.add_attribute("signature", **a) - misp_event.add_object(o) + # Check if its not empty first, as at least one attribute has to be set for sb-signature object + if result.get("malicious_activity", []): + o = pymisp.MISPObject(name="sb-signature") + o.add_attribute("software", "VMware NSX Defender") + for activity in result.get("malicious_activity", []): + a = pymisp.MISPAttribute() + a.from_dict(type="text", value=activity) + o.add_attribute("signature", **a) + misp_event.add_object(o) # Add mitre techniques for techniques in result.get("activity_to_mitre_techniques", {}).values(): From e36e3ea117b2b6562eaad2008f23a98c5b69f9e5 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 13 Aug 2021 14:11:12 +0200 Subject: [PATCH 311/476] fix: [greynoise] typo fixed --- documentation/website/expansion/greynoise.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/website/expansion/greynoise.json b/documentation/website/expansion/greynoise.json index 4988537..b01c9ad 100644 --- a/documentation/website/expansion/greynoise.json +++ b/documentation/website/expansion/greynoise.json @@ -8,8 +8,8 @@ "output": "IP Lookup information or CVE scanning profile for past 7 days", "references": [ "https://greynoise.io/", - "https://docs.greyniose.io/", + "https://docs.greynoise.io/", "https://www.greynoise.io/viz/account/" ], "features": "This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days." -} \ No newline at end of file +} From d2ed09d081ddef167b2e0095fc5660cdff94d187 Mon Sep 17 00:00:00 2001 From: Martin Ohl Date: Fri, 13 Aug 2021 14:55:08 +0200 Subject: [PATCH 312/476] Create mcafee_insights_enrich.py Module to expand IOC information with McAfee MVISION Insights --- .../expansion/mcafee_insights_enrich.py | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 misp_modules/modules/expansion/mcafee_insights_enrich.py diff --git a/misp_modules/modules/expansion/mcafee_insights_enrich.py b/misp_modules/modules/expansion/mcafee_insights_enrich.py new file mode 100644 index 0000000..8026d7f --- /dev/null +++ b/misp_modules/modules/expansion/mcafee_insights_enrich.py @@ -0,0 +1,239 @@ +# Written by mohlcyber 13.08.2021 +# MISP Module for McAfee MVISION Insights to query campaign details + +import json +import logging +import requests +import sys + +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ["md5", "sha1", "sha256"], + 'format': 'misp_standard'} + +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '1', 'author': 'Martin Ohl', + 'description': 'Lookup McAfee MVISION Insights Details', + 'module-type': ['hover']} + +# config fields that your code expects from the site admin +moduleconfig = ['api_key', 'client_id', 'client_secret'] + + +class MVAPI(): + def __init__(self, attribute, api_key, client_id, client_secret): + self.misp_event = MISPEvent() + self.attribute = MISPAttribute() + self.attribute.from_dict(**attribute) + self.misp_event.add_attribute(**self.attribute) + + self.base_url = 'https://api.mvision.mcafee.com' + self.session = requests.Session() + + self.api_key = api_key + auth = (client_id, client_secret) + + self.logging() + self.auth(auth) + + def logging(self): + self.logger = logging.getLogger('logs') + self.logger.setLevel('INFO') + handler = logging.StreamHandler() + formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s") + handler.setFormatter(formatter) + self.logger.addHandler(handler) + + def auth(self, auth): + iam_url = "https://iam.mcafee-cloud.com/iam/v1.1/token" + + headers = { + 'x-api-key': self.api_key, + 'Content-Type': 'application/vnd.api+json' + } + + payload = { + "grant_type": "client_credentials", + "scope": "ins.user ins.suser ins.ms.r" + } + + res = self.session.post(iam_url, headers=headers, auth=auth, data=payload) + + if res.status_code != 200: + self.logger.error('Could not authenticate to get the IAM token: {0} - {1}'.format(res.status_code, res.text)) + sys.exit() + else: + self.logger.info('Successful authenticated.') + access_token = res.json()['access_token'] + headers['Authorization'] = 'Bearer ' + access_token + self.session.headers = headers + + def search_ioc(self): + filters = { + 'filter[type][eq]': self.attribute.type, + 'filter[value]': self.attribute.value, + 'fields': 'id, type, value, coverage, uid, is_coat, is_sdb_dirty, category, comment, campaigns, threat, prevalence' + } + res = self.session.get(self.base_url + '/insights/v2/iocs', params=filters) + + if res.ok: + if len(res.json()['data']) == 0: + self.logger.info('No Hash details in MVISION Insights found.') + else: + self.logger.info('Successfully retrieved MVISION Insights details.') + self.logger.debug(res.text) + return res.json() + else: + self.logger.error('Error in search_ioc. HTTP {0} - {1}'.format(str(res.status_code), res.text)) + sys.exit() + + def prep_result(self, ioc): + res = ioc['data'][0] + results = [] + + # Parse out Attribute Category + category_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute Category: {0}'.format(res['attributes']['category']) + } + results.append(category_attr) + + # Parse out Attribute Comment + comment_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute Comment: {0}'.format(res['attributes']['comment']) + } + results.append(comment_attr) + + # Parse out Attribute Dat Coverage + cover_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Dat Version Coverage: {0}'.format(res['attributes']['coverage']['dat_version']['min']) + } + results.append(cover_attr) + + # Parse out if Dirty + cover_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Is Dirty: {0}'.format(res['attributes']['is-sdb-dirty']) + } + results.append(cover_attr) + + # Parse our targeted countries + countries_dict = [] + countries = res['attributes']['prevalence']['countries'] + + for country in countries: + countries_dict.append(country['iso_code']) + + country_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Targeted Countries: {0}'.format(countries_dict) + } + results.append(country_attr) + + # Parse out targeted sectors + sectors_dict = [] + sectors = res['attributes']['prevalence']['sectors'] + + for sector in sectors: + sectors_dict.append(sector['sector']) + + sector_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Targeted Sectors: {0}'.format(sectors_dict) + } + results.append(sector_attr) + + # Parse out Threat Classification + threat_class_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Classification: {0}'.format(res['attributes']['threat']['classification']) + } + results.append(threat_class_attr) + + # Parse out Threat Name + threat_name_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Name: {0}'.format(res['attributes']['threat']['name']) + } + results.append(threat_name_attr) + + # Parse out Threat Severity + threat_sev_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Severity: {0}'.format(res['attributes']['threat']['severity']) + } + results.append(threat_sev_attr) + + # Parse out Attribute ID + attr_id = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute ID: {0}'.format(res['id']) + } + results.append(attr_id) + + # Parse out Campaign Relationships + campaigns = ioc['included'] + + for campaign in campaigns: + campaign_attr = { + 'type': 'campaign-name', + 'object_relation': 'campaign-name', + 'value': campaign['attributes']['name'] + } + results.append(campaign_attr) + + mv_insights_obj = MISPObject(name='MVISION Insights Details') + for mvi_res in results: + mv_insights_obj.add_attribute(**mvi_res) + mv_insights_obj.add_reference(self.attribute.uuid, 'mvision-insights-details') + + self.misp_event.add_object(mv_insights_obj) + + event = json.loads(self.misp_event.to_json()) + results_mvi = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + + return {'results': results_mvi} + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + if not request.get('config') or not request['config'].get('api_key') or not request['config'].get('client_id') or not request['config'].get('client_secret'): + misperrors['error'] = "Please provide MVISION API Key, Client ID and Client Secret." + return misperrors + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type. Please use {0}'.format(mispattributes['input'])} + + api_key = request['config']['api_key'] + client_id = request['config']['client_id'] + client_secret = request['config']['client_secret'] + attribute = request['attribute'] + + mvi = MVAPI(attribute, api_key, client_id, client_secret) + res = mvi.search_ioc() + return mvi.prep_result(res) + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 209411c6fcd6af9127d744edd1b481ddae86e153 Mon Sep 17 00:00:00 2001 From: Martin Ohl Date: Fri, 13 Aug 2021 14:56:30 +0200 Subject: [PATCH 313/476] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 777fd8d..c2316c8 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [macaddress.io](misp_modules/modules/expansion/macaddress_io.py) - a hover module to retrieve vendor details and other information regarding a given MAC address or an OUI from [MAC address Vendor Lookup](https://macaddress.io). See [integration tutorial here](https://macaddress.io/integrations/MISP-module). * [macvendors](misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. * [MALWAREbazaar](misp_modules/modules/expansion/malwarebazaar.py) - an expansion module to query MALWAREbazaar with some payload. +* [McAfee MVISION Insights] (misp_modules/modules/expansion/mcafee_insights_enrich.py) - an expansion module enrich IOCs with McAfee MVISION Insights. * [ocr-enrich](misp_modules/modules/expansion/ocr_enrich.py) - an enrichment module to get OCRized data from images into MISP. * [ods-enrich](misp_modules/modules/expansion/ods_enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). * [odt-enrich](misp_modules/modules/expansion/odt_enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). From 431d0812275188ed6a1601241b45e16c87103387 Mon Sep 17 00:00:00 2001 From: Martin Ohl Date: Fri, 13 Aug 2021 14:57:15 +0200 Subject: [PATCH 314/476] Added McAfee MVISION Insights --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2316c8..66caa42 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [macaddress.io](misp_modules/modules/expansion/macaddress_io.py) - a hover module to retrieve vendor details and other information regarding a given MAC address or an OUI from [MAC address Vendor Lookup](https://macaddress.io). See [integration tutorial here](https://macaddress.io/integrations/MISP-module). * [macvendors](misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. * [MALWAREbazaar](misp_modules/modules/expansion/malwarebazaar.py) - an expansion module to query MALWAREbazaar with some payload. -* [McAfee MVISION Insights] (misp_modules/modules/expansion/mcafee_insights_enrich.py) - an expansion module enrich IOCs with McAfee MVISION Insights. +* [McAfee MVISION Insights](misp_modules/modules/expansion/mcafee_insights_enrich.py) - an expansion module enrich IOCs with McAfee MVISION Insights. * [ocr-enrich](misp_modules/modules/expansion/ocr_enrich.py) - an enrichment module to get OCRized data from images into MISP. * [ods-enrich](misp_modules/modules/expansion/ods_enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). * [odt-enrich](misp_modules/modules/expansion/odt_enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). From 05578b6a0dea60f2e904dff4d2806591fb976083 Mon Sep 17 00:00:00 2001 From: Jason Zhang Date: Tue, 24 Aug 2021 12:31:23 +0100 Subject: [PATCH 315/476] Update dependency files --- Pipfile.lock | 693 +++++++++++++++++++++++++++++-------------------- REQUIREMENTS | 161 ++++++------ pyproject.toml | 3 + 3 files changed, 496 insertions(+), 361 deletions(-) create mode 100644 pyproject.toml diff --git a/Pipfile.lock b/Pipfile.lock index 94f7879..fce2898 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f466a54a3a73ee9c0475f4955d374184cac4e3b799fea8ca4ead77f2e526cb9a" + "sha256": "53f7c8111e3655205f3816245250a528453b48cf0ea99e2e6b7ae83902949d0c" }, "pipfile-spec": 6, "requires": { @@ -82,10 +82,10 @@ }, "assemblyline-client": { "hashes": [ - "sha256:3403d532f9ce08ac19374ceaecba543baeb297257ab1ae56b23f2fe1b651d3e0" + "sha256:fd434694ecdfb58f86118ccbbdecf37bc753935c7ae43ef7a74bc5a22fa48d21" ], "index": "pypi", - "version": "==4.0.5" + "version": "==4.1.0" }, "async-timeout": { "hashes": [ @@ -103,6 +103,28 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==21.2.0" }, + "backports.zoneinfo": { + "hashes": [ + "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf", + "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328", + "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546", + "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6", + "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570", + "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9", + "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7", + "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987", + "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722", + "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582", + "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc", + "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b", + "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1", + "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08", + "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac", + "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2" + ], + "markers": "python_version < '3.9'", + "version": "==0.2.1" + }, "backscatter": { "hashes": [ "sha256:7a0d1aa3661635de81e2a09b15d53e35cbe399a111cc58a70925f80e6874abd3", @@ -120,6 +142,14 @@ "index": "pypi", "version": "==4.9.3" }, + "bidict": { + "hashes": [ + "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", + "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" + ], + "markers": "python_version >= '3.6'", + "version": "==0.21.2" + }, "blockchain": { "hashes": [ "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" @@ -136,57 +166,53 @@ }, "cffi": { "hashes": [ - "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813", - "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373", - "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69", - "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f", - "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06", - "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05", - "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea", - "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee", - "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0", - "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396", - "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7", - "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f", - "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73", - "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315", - "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76", - "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1", - "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49", - "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed", - "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892", - "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482", - "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058", - "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5", - "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53", - "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045", - "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3", - "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55", - "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5", - "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e", - "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c", - "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369", - "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827", - "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053", - "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa", - "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4", - "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322", - "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132", - "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62", - "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa", - "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0", - "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396", - "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e", - "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991", - "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6", - "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc", - "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1", - "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406", - "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333", - "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d", - "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" + "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d", + "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771", + "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872", + "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c", + "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc", + "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762", + "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202", + "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5", + "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548", + "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a", + "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f", + "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20", + "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218", + "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c", + "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e", + "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56", + "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224", + "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a", + "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2", + "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a", + "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819", + "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346", + "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b", + "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e", + "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534", + "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb", + "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0", + "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156", + "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd", + "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87", + "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc", + "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195", + "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33", + "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f", + "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d", + "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd", + "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728", + "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7", + "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca", + "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99", + "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf", + "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e", + "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c", + "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5", + "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69" ], - "version": "==1.14.5" + "version": "==1.14.6" }, "chardet": { "hashes": [ @@ -196,6 +222,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==4.0.0" }, + "charset-normalizer": { + "hashes": [ + "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", + "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" + ], + "markers": "python_version >= '3'", + "version": "==2.0.4" + }, "clamd": { "hashes": [ "sha256:5c32546b7d1eb00fd6be00a889d79e00fbf980ed082826ccfa369bce3dcff5e7", @@ -258,10 +292,13 @@ "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", + "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586", + "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3", "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" ], + "markers": "python_version >= '3.6'", "version": "==3.4.7" }, "decorator": { @@ -382,11 +419,11 @@ }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", + "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" + "markers": "python_version >= '3'", + "version": "==3.2" }, "idna-ssl": { "hashes": [ @@ -419,16 +456,17 @@ }, "jbxapi": { "hashes": [ - "sha256:2cdb8e935cb35c3af83209b847cedb3911b5f0b4d905ed89f76fa0e34d62ea26" + "sha256:5a1016282bf8a79032346dbe2abb9f597b7e7b811e0964f5bccce9da80eab1b0", + "sha256:99d748c9f48f410d858313d6e53663668231384f895d8ed574a02eada1244bc9" ], "index": "pypi", - "version": "==3.16.0" + "version": "==3.17.2" }, "json-log-formatter": { "hashes": [ - "sha256:03029bddba697d2f6c81419a80f1c58d3a89ae715336c6a88b370e7d2c983198" + "sha256:3644f30233f22746fd181d1340cc8096520a4f464d18877270b8664554e61f81" ], - "version": "==0.3.1" + "version": "==0.4.0" }, "jsonschema": { "hashes": [ @@ -495,6 +533,7 @@ "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83", "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04", "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16", + "sha256:64812391546a18896adaa86c77c59a4998f33c24788cadc35789e55b727a37f4", "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791", "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a", "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51", @@ -509,6 +548,7 @@ "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa", "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106", "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d", + "sha256:c1a40c06fd5ba37ad39caa0b3144eb3772e813b5fb5b084198a985431c2f1e8d", "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617", "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4", "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92", @@ -553,6 +593,14 @@ "editable": true, "path": "." }, + "more-itertools": { + "hashes": [ + "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d", + "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a" + ], + "markers": "python_version >= '3.5'", + "version": "==8.8.0" + }, "msoffcrypto-tool": { "hashes": [ "sha256:234f85ef59945fa1ebb618ca029f31f0cb43a637344dbda5c1bb8578b2d96a68", @@ -613,33 +661,39 @@ }, "numpy": { "hashes": [ - "sha256:1676b0a292dd3c99e49305a16d7a9f42a4ab60ec522eac0d3dd20cdf362ac010", - "sha256:16f221035e8bd19b9dc9a57159e38d2dd060b48e93e1d843c49cb370b0f415fd", - "sha256:43909c8bb289c382170e0282158a38cf306a8ad2ff6dfadc447e90f9961bef43", - "sha256:4e465afc3b96dbc80cf4a5273e5e2b1e3451286361b4af70ce1adb2984d392f9", - "sha256:55b745fca0a5ab738647d0e4db099bd0a23279c32b31a783ad2ccea729e632df", - "sha256:5d050e1e4bc9ddb8656d7b4f414557720ddcca23a5b88dd7cff65e847864c400", - "sha256:637d827248f447e63585ca3f4a7d2dfaa882e094df6cfa177cc9cf9cd6cdf6d2", - "sha256:6690080810f77485667bfbff4f69d717c3be25e5b11bb2073e76bb3f578d99b4", - "sha256:66fbc6fed94a13b9801fb70b96ff30605ab0a123e775a5e7a26938b717c5d71a", - "sha256:67d44acb72c31a97a3d5d33d103ab06d8ac20770e1c5ad81bdb3f0c086a56cf6", - "sha256:6ca2b85a5997dabc38301a22ee43c82adcb53ff660b89ee88dded6b33687e1d8", - "sha256:6e51534e78d14b4a009a062641f465cfaba4fdcb046c3ac0b1f61dd97c861b1b", - "sha256:70eb5808127284c4e5c9e836208e09d685a7978b6a216db85960b1a112eeace8", - "sha256:830b044f4e64a76ba71448fce6e604c0fc47a0e54d8f6467be23749ac2cbd2fb", - "sha256:8b7bb4b9280da3b2856cb1fc425932f46fba609819ee1c62256f61799e6a51d2", - "sha256:a9c65473ebc342715cb2d7926ff1e202c26376c0dcaaee85a1fd4b8d8c1d3b2f", - "sha256:c1c09247ccea742525bdb5f4b5ceeacb34f95731647fe55774aa36557dbb5fa4", - "sha256:c5bf0e132acf7557fc9bb8ded8b53bbbbea8892f3c9a1738205878ca9434206a", - "sha256:db250fd3e90117e0312b611574cd1b3f78bec046783195075cbd7ba9c3d73f16", - "sha256:e515c9a93aebe27166ec9593411c58494fa98e5fcc219e47260d9ab8a1cc7f9f", - "sha256:e55185e51b18d788e49fe8305fd73ef4470596b33fc2c1ceb304566b99c71a69", - "sha256:ea9cff01e75a956dbee133fa8e5b68f2f92175233de2f88de3a682dd94deda65", - "sha256:f1452578d0516283c87608a5a5548b0cdde15b99650efdfd85182102ef7a7c17", - "sha256:f39a995e47cb8649673cfa0579fbdd1cdd33ea497d1728a6cb194d6252268e48" + "sha256:09858463db6dd9f78b2a1a05c93f3b33d4f65975771e90d2cf7aadb7c2f66edf", + "sha256:209666ce9d4a817e8a4597cd475b71b4878a85fa4b8db41d79fdb4fdee01dde2", + "sha256:298156f4d3d46815eaf0fcf0a03f9625fc7631692bd1ad851517ab93c3168fc6", + "sha256:30fc68307c0155d2a75ad19844224be0f2c6f06572d958db4e2053f816b859ad", + "sha256:423216d8afc5923b15df86037c6053bf030d15cc9e3224206ef868c2d63dd6dc", + "sha256:426a00b68b0d21f2deb2ace3c6d677e611ad5a612d2c76494e24a562a930c254", + "sha256:466e682264b14982012887e90346d33435c984b7fead7b85e634903795c8fdb0", + "sha256:51a7b9db0a2941434cd930dacaafe0fc9da8f3d6157f9d12f761bbde93f46218", + "sha256:52a664323273c08f3b473548bf87c8145b7513afd63e4ebba8496ecd3853df13", + "sha256:550564024dc5ceee9421a86fc0fb378aa9d222d4d0f858f6669eff7410c89bef", + "sha256:5de64950137f3a50b76ce93556db392e8f1f954c2d8207f78a92d1f79aa9f737", + "sha256:640c1ccfd56724f2955c237b6ccce2e5b8607c3bc1cc51d3933b8c48d1da3723", + "sha256:7fdc7689daf3b845934d67cb221ba8d250fdca20ac0334fea32f7091b93f00d3", + "sha256:805459ad8baaf815883d0d6f86e45b3b0b67d823a8f3fa39b1ed9c45eaf5edf1", + "sha256:92a0ab128b07799dd5b9077a9af075a63467d03ebac6f8a93e6440abfea4120d", + "sha256:9f2dc79c093f6c5113718d3d90c283f11463d77daa4e83aeeac088ec6a0bda52", + "sha256:a5109345f5ce7ddb3840f5970de71c34a0ff7fceb133c9441283bb8250f532a3", + "sha256:a55e4d81c4260386f71d22294795c87609164e22b28ba0d435850fbdf82fc0c5", + "sha256:a9da45b748caad72ea4a4ed57e9cd382089f33c5ec330a804eb420a496fa760f", + "sha256:b160b9a99ecc6559d9e6d461b95c8eec21461b332f80267ad2c10394b9503496", + "sha256:b342064e647d099ca765f19672696ad50c953cac95b566af1492fd142283580f", + "sha256:b5e8590b9245803c849e09bae070a8e1ff444f45e3f0bed558dd722119eea724", + "sha256:bf75d5825ef47aa51d669b03ce635ecb84d69311e05eccea083f31c7570c9931", + "sha256:c01b59b33c7c3ba90744f2c695be571a3bd40ab2ba7f3d169ffa6db3cfba614f", + "sha256:d96a6a7d74af56feb11e9a443150216578ea07b7450f7c05df40eec90af7f4a7", + "sha256:dd0e3651d210068d13e18503d75aaa45656eef51ef0b261f891788589db2cc38", + "sha256:e167b9805de54367dcb2043519382be541117503ce99e3291cc9b41ca0a83557", + "sha256:e42029e184008a5fd3d819323345e25e2337b0ac7f5c135b7623308530209d57", + "sha256:f545c082eeb09ae678dd451a1b1dbf17babd8a0d7adea02897a76e639afca310", + "sha256:fde50062d67d805bc96f1a9ecc0d37bfc2a8f02b937d2c50824d186aa91f2419" ], - "markers": "python_version >= '3.7'", - "version": "==1.20.3" + "markers": "python_version < '3.11' and python_version >= '3.7'", + "version": "==1.21.2" }, "oauth2": { "hashes": [ @@ -670,67 +724,73 @@ }, "opencv-python": { "hashes": [ - "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0", - "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118", - "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44", - "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709", - "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc", - "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba", - "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161", - "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6", - "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23", - "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1", - "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d", - "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36", - "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611", - "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48", - "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846", - "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f", - "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c", - "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b", - "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba", - "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e" + "sha256:05c5139d620e8d02f7ce0921796d55736fa19fa15e2ec00a388db2eb1ae1e9a1", + "sha256:085232718f28bddd265da480874c37db5c7354cb08f23f4a68a8639b16276a89", + "sha256:18a4a14015eee30d9cd514db8cdefbf594b1d5c234762d27abe512d62a333bc3", + "sha256:205a73adb29c37e42475645519e612e843a985475da993d10b4d5daa6afec36a", + "sha256:3c001d3feec7f3140f1fb78dfc52ca28122db8240826882d175a208a89d2731b", + "sha256:437f30e300725e1d1b3744dbfbc66a523a4744792b58f3dbe1e9140c8f4dfba5", + "sha256:5366fcd6eae4243add3c8c92142045850f1db8e464bcf0b75313e1596b2e3671", + "sha256:54c64e86a087841869901fd34462bb6bec01cd4652800fdf5d92fe7b0596c82f", + "sha256:6763729fcfee2a08e069aa1982c9a8c1abf55b9cdf2fb9640eda1d85bdece19a", + "sha256:68813b720b88e4951e84399b9a8a7b532d45a07a96ea8f539636242f862e32e0", + "sha256:7f41b97d84ac66bdf13cb4d9f4dad3e159525ba1e3f421e670c787ce536eb70a", + "sha256:831b92fe63ce18dd628f71104da7e60596658b75e2fa16b83aefa3eb10c115e2", + "sha256:881f3d85269500e0c7d72b140a6ebb5c14a089f8140fb9da7ce01f12a245858e", + "sha256:8852be06c0749fef0d9c58f532bbcb0570968c59e41cf56b90f5c92593c6e108", + "sha256:8b5bc61be7fc8565140b746288b370a4bfdb4edb9d680b66bb914e7690485db1", + "sha256:8d3282138f3a8646941089aae142684910ebe40776266448eab5f4bb609fc63f", + "sha256:9a78558b5ae848386edbb843c761e5fed5a8480be9af16274a5a78838529edeb", + "sha256:b42bbba9f5421865377c7960bd4f3dd881003b322a6bf46ed2302b89224d102b", + "sha256:c360cb76ad1ddbd5d2d3e730b42f2ff6e4be08ea6f4a6eefacca175d27467e8f", + "sha256:cdc3363c2911d7cfc6c9f55308c51c2841a7aecbf0bf5e791499d220ce89d880", + "sha256:e1f54736272830a1e895cedf7a4ee67737e31e966d380c82a81ef22515d043a3", + "sha256:e42c644a70d5c54f53a4b114dbd88b4eb83f42a9ca998f07bd5682f3f404efcc", + "sha256:f1bda4d144f5204e077ca4571453ebb2015e5748d5e0043386c92c2bbf7f52eb", + "sha256:f3ac2355217114a683f3f72a9c40a5890914a59c4a2df62e4083c66ff65c9cf9" ], "index": "pypi", - "version": "==4.5.2.54" + "version": "==4.5.3.56" }, "pandas": { "hashes": [ - "sha256:167693a80abc8eb28051fbd184c1b7afd13ce2c727a5af47b048f1ea3afefff4", - "sha256:2111c25e69fa9365ba80bbf4f959400054b2771ac5d041ed19415a8b488dc70a", - "sha256:298f0553fd3ba8e002c4070a723a59cdb28eda579f3e243bc2ee397773f5398b", - "sha256:2b063d41803b6a19703b845609c0b700913593de067b552a8b24dd8eeb8c9895", - "sha256:2cb7e8f4f152f27dc93f30b5c7a98f6c748601ea65da359af734dd0cf3fa733f", - "sha256:52d2472acbb8a56819a87aafdb8b5b6d2b3386e15c95bde56b281882529a7ded", - "sha256:612add929bf3ba9d27b436cc8853f5acc337242d6b584203f207e364bb46cb12", - "sha256:649ecab692fade3cbfcf967ff936496b0cfba0af00a55dfaacd82bdda5cb2279", - "sha256:68d7baa80c74aaacbed597265ca2308f017859123231542ff8a5266d489e1858", - "sha256:8d4c74177c26aadcfb4fd1de6c1c43c2bf822b3e0fc7a9b409eeaf84b3e92aaa", - "sha256:971e2a414fce20cc5331fe791153513d076814d30a60cd7348466943e6e909e4", - "sha256:9db70ffa8b280bb4de83f9739d514cd0735825e79eef3a61d312420b9f16b758", - "sha256:b730add5267f873b3383c18cac4df2527ac4f0f0eed1c6cf37fcb437e25cf558", - "sha256:bd659c11a4578af740782288cac141a322057a2e36920016e0fc7b25c5a4b686", - "sha256:c601c6fdebc729df4438ec1f62275d6136a0dd14d332fc0e8ce3f7d2aadb4dd6", - "sha256:d0877407359811f7b853b548a614aacd7dea83b0c0c84620a9a643f180060950" + "sha256:0cd5776be891331a3e6b425b5abeab9596abea18435c5982191356f9b24ae731", + "sha256:1099e2a0cd3a01ec62cca183fc1555833a2d43764950ef8cb5948c8abfc51014", + "sha256:132def05e73d292c949b02e7ef873debb77acc44a8b119d215921046f0c3a91d", + "sha256:1738154049062156429a5cf2fd79a69c9f3fa4f231346a7ec6fd156cd1a9a621", + "sha256:34ced9ce5d5b17b556486da7256961b55b471d64a8990b56e67a84ebeb259416", + "sha256:53b17e4debba26b7446b1e4795c19f94f0c715e288e08145e44bdd2865e819b3", + "sha256:59a78d7066d1c921a77e3306aa0ebf6e55396c097d5dfcc4df8defe3dcecb735", + "sha256:66a95361b81b4ba04b699ecd2416b0591f40cd1e24c60a8bfe0d19009cfa575a", + "sha256:69e1b2f5811f46827722fd641fdaeedb26002bd1e504eacc7a8ec36bdc25393e", + "sha256:7996d311413379136baf0f3cf2a10e331697657c87ced3f17ac7c77f77fe34a3", + "sha256:89f40e5d21814192802421df809f948247d39ffe171e45fe2ab4abf7bd4279d8", + "sha256:9cce01f6d655b4add966fcd36c32c5d1fe84628e200626b3f5e2f40db2d16a0f", + "sha256:a56246de744baf646d1f3e050c4653d632bc9cd2e0605f41051fea59980e880a", + "sha256:ba7ceb8abc6dbdb1e34612d1173d61e4941f1a1eb7e6f703b2633134ae6a6c89", + "sha256:c9e8e0ce5284ebebe110efd652c164ed6eab77f5de4c3533abc756302ee77765", + "sha256:cbcb84d63867af3411fa063af3de64902665bb5b3d40b25b2059e40603594e87", + "sha256:f07a9745ca075ae73a5ce116f5e58f691c0dc9de0bff163527858459df5c176f", + "sha256:fa54dc1d3e5d004a09ab0b1751473698011ddf03e14f1f59b84ad9a6ac630975", + "sha256:fcb71b1935249de80e3a808227189eee381d4d74a31760ced2df21eedc92a8e3" ], "index": "pypi", - "version": "==1.2.4" + "version": "==1.3.2" }, "pandas-ods-reader": { "hashes": [ - "sha256:d2d6e4f9cd2850da32808bbc68d433a337911058387992026d3987ead1f4a7c8", - "sha256:d4d6781cc46e782e265b48681416f636e7659343dec948c6fccc4236af6fa1e6" + "sha256:bea2dd630416cd73cbf6e3e8a6d5b291ae7780f3fa2989e5583df12620c3963f" ], "index": "pypi", - "version": "==0.0.7" + "version": "==0.1.2" }, "passivetotal": { "hashes": [ - "sha256:32740c5b5a1f950320c0350aa002b0b35cda5941db7e441b22b01419f4923eec", - "sha256:3c2c7be55764930d7db83ad53baa42e69228d1534195451cc3a519f866a856c8" + "sha256:246b5a331e39f862dc195c650ede1f6968cea923cd2512cfd51d5e0d6746b912", + "sha256:7896269acfcddb5ee649a06878b1e237ae771ab2063ebdaca3bf46f60e333a3c" ], "index": "pypi", - "version": "==2.4.2" + "version": "==2.5.4" }, "pcodedmp": { "hashes": [ @@ -741,50 +801,55 @@ }, "pdftotext": { "hashes": [ - "sha256:caf8ddbaeaf0a5897f07655a71747242addab2e695e84c5d47f2ea92dfe2a594" + "sha256:efbbfb14cf37ed7ab2c71936bae44707dfed6bb3be7ea5214e9c44c8c258c7af" ], "index": "pypi", - "version": "==2.1.6" + "version": "==2.2.0" }, "pillow": { "hashes": [ - "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5", - "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4", - "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9", - "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a", - "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9", - "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727", - "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120", - "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c", - "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2", - "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797", - "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b", - "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f", - "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef", - "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232", - "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb", - "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9", - "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812", - "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178", - "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291", - "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b", - "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5", - "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b", - "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1", - "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713", - "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4", - "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484", - "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c", - "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9", - "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388", - "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d", - "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602", - "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9", - "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e", - "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2" + "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc", + "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63", + "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d", + "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e", + "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd", + "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4", + "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77", + "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723", + "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba", + "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792", + "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae", + "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e", + "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367", + "sha256:479ab11cbd69612acefa8286481f65c5dece2002ffaa4f9db62682379ca3bb77", + "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856", + "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4", + "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de", + "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8", + "sha256:75e09042a3b39e0ea61ce37e941221313d51a9c26b8e54e12b3ececccb71718a", + "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636", + "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab", + "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79", + "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d", + "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229", + "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf", + "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500", + "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04", + "sha256:c0e0550a404c69aab1e04ae89cca3e2a042b56ab043f7f729d984bf73ed2a093", + "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844", + "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8", + "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82", + "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf", + "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83", + "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0", + "sha256:f156d6ecfc747ee111c167f8faf5f4953761b5e66e91a4e6767e548d0f80129c", + "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8", + "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37", + "sha256:fd7eef578f5b2200d066db1b50c4aa66410786201669fb76d5238b007918fb24", + "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14" ], "index": "pypi", - "version": "==8.2.0" + "version": "==8.3.1" }, "progressbar2": { "hashes": [ @@ -948,7 +1013,7 @@ "pyipasnhistory": { "editable": true, "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "1f020c44c440988899a6798903fd6941e06f8930", + "ref": "a2853c39265cecdd0c0d16850bd34621c0551b87", "subdirectory": "client" }, "pymisp": { @@ -959,24 +1024,17 @@ "pdfexport" ], "hashes": [ - "sha256:81be4569199c117513d35d06f3cd46d5b412c1e8509ec1cfa0e6bfd19751ef4f", - "sha256:cf04fe19391fed4251cef1f267d80a19e37ed4b88602fb5f9790a3cd814d9d00" + "sha256:5971eba9a4d3b7f5ee47035417c7692fc0ec45d581afcaa63e3f7e2d6a400923", + "sha256:641e3db1af1010cff3a652df6eb51ac4f4e540b1801b811d5e009c59114bf26a" ], "index": "pypi", - "version": "==2.4.144" + "version": "==2.4.148" }, "pyonyphe": { "editable": true, "git": "https://github.com/sebdraven/pyonyphe", "ref": "1ce15581beebb13e841193a08a2eb6f967855fcb" }, - "pyopenssl": { - "hashes": [ - "sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51", - "sha256:818ae18e06922c066f777a33f1fca45786d85edfe71cd043de6379337a7f274b" - ], - "version": "==20.0.1" - }, "pyparsing": { "hashes": [ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", @@ -1003,17 +1061,37 @@ }, "pyrsistent": { "hashes": [ - "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" + "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2", + "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7", + "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea", + "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426", + "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710", + "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1", + "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396", + "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2", + "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680", + "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35", + "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427", + "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b", + "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b", + "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f", + "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef", + "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c", + "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4", + "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d", + "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78", + "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b", + "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72" ], - "markers": "python_version >= '3.5'", - "version": "==0.17.3" + "markers": "python_version >= '3.6'", + "version": "==0.18.0" }, "pytesseract": { "hashes": [ - "sha256:4ecfc898d00a70fcc38d2bce729de1597c67e7bc5d2fa26094714c9f5b573645" + "sha256:6148a01e4375760862e8f56ea718e22b5d13b281454df46ea8dac9807793fc5a" ], "index": "pypi", - "version": "==0.3.7" + "version": "==0.3.8" }, "python-baseconv": { "hashes": [ @@ -1023,11 +1101,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", - "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.1" + "version": "==2.8.2" }, "python-docx": { "hashes": [ @@ -1038,10 +1116,11 @@ }, "python-engineio": { "hashes": [ - "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", - "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" + "sha256:d510329b6d8ed5662547862f58bc73659ae62defa66b66d745ba021de112fa62", + "sha256:f3ef9a2c048d08990f294c5f8991f6f162c3b12ecbd368baa0d90441de907d1c" ], - "version": "==3.14.2" + "markers": "python_version >= '3.6'", + "version": "==4.2.1" }, "python-magic": { "hashes": [ @@ -1062,10 +1141,11 @@ "client" ], "hashes": [ - "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", - "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" + "sha256:7ed57f6c024abdfeb9b25c74c0c00ffc18da47d903e8d72deecb87584370d1fc", + "sha256:ca807c9e1f168e96dea412d64dd834fb47c470d27fd83da0504aa4b248ba2544" ], - "version": "==4.6.1" + "markers": "python_version >= '3.6'", + "version": "==5.4.0" }, "python-utils": { "hashes": [ @@ -1135,10 +1215,11 @@ }, "rdflib": { "hashes": [ - "sha256:78149dd49d385efec3b3adfbd61c87afaf1281c30d3fcaf1b323b34f603fb155", - "sha256:88208ea971a87886d60ae2b1a4b2cdc263527af0454c422118d43fe64b357877" + "sha256:7ce4d757eb26f4dd43205ec340d8c097f29e5adfe45d6ea20238c731dc679879", + "sha256:bb24f0058070d5843503e15b37c597bc3858d328d11acd9476efad3aa62f555d" ], - "version": "==5.0.0" + "markers": "python_version >= '3.7'", + "version": "==6.0.0" }, "redis": { "hashes": [ @@ -1150,49 +1231,43 @@ }, "reportlab": { "hashes": [ - "sha256:0cf2206c73fbca752c8bd39e12bb9ad7f2d01e6fcb2b25b9eaf94ea042fe86c9", - "sha256:0d670e119d7f7a68a1136de024464999e8e3d5d1491f23cdd39d5d72481af88f", - "sha256:1656722530b3bbce012b093abf6290ab76dcba39d21f9e703310b008ddc7ffe9", - "sha256:1e41b441542881e007420530bbc028f08c0f546ecaaebdf9f065f901acdac106", - "sha256:34d827c771d6b4d7b45f7fc49a638c97fbd8a0fab6c9d3838ff04d307420b739", - "sha256:370c5225f0c395a9f1482ac8d4f974d2073548f186eaf49ceb91414f534ad4d8", - "sha256:42b90b0cb3556f4d1cc1c538345abc249b6ff58939d3af5e37f5fa8421d9ae07", - "sha256:492bd47aabeaa3215cde7a8d3c0d88c909bf7e6b63f0b511a645f1ffc1e948f6", - "sha256:4c5785b018ed6f48e762737deaa6b7528b0ba43ad67fca566bf10d0337a76dcd", - "sha256:519ef25d49fe807c6c0402abb5fe4d14b47a8e2358050d8d7673beecfbe116b2", - "sha256:51a2d5de2c605117cd25dfb3f51d1d14caf1cbed4ef6db582f085eeb0a0c922f", - "sha256:55ef4476b2cdecfa643ae4d7591aa157568f903c378c83ea544650b33b2d856d", - "sha256:5b4acfb15ca028bbc652a6c8d63073dec2a3c8c0db7585d68b96b52940f65899", - "sha256:5c483c96d4cbeb4919ad9fcf2f262e8e08e34dcbcf8d2bda16263ef002c890d4", - "sha256:5c931032aa955431c808e469eb0780ca7d12b39228a02ae7ea09f63d47b1e260", - "sha256:6a3119d0e985e5c7dadfcf29fb79bbab19806b08ad901622b23f5868c0221fce", - "sha256:72bb5417f198eb059f01d5a9e1ef80f2fbaf3eaa4cd63e9a681bbbd0ed9fcdf9", - "sha256:8cd355f8a4c7c126a246f4b4a9803c80498939709bb37d3db4f8dbee1eb7d8f0", - "sha256:9517f26a512a62d49fc4800222b306e21a14ceec8bd82c93182313ef1eefaa7a", - "sha256:9945e80a0a6e370f90a23907cc70a0811e808f79420fb9051e26d9c79eb8e26b", - "sha256:9989737a409235a734ec783b0545f2966247b26ff555e847f3d0f945e5a11493", - "sha256:9c0d71aef4fb5d30dc6ebd08a2bce317a7eaf37d468f85320947eb580daea90a", - "sha256:9d48fd4a1c2d98ec6686511717f0980d36f5590e038d5afe4e5241f328f06e38", - "sha256:af12fbff15a9652ef117456d1d6a4d6fade8fdc02670d6fd31212402e9d03559", - "sha256:b2b72a0742a493979c348dc3c9a329bd5b87e4243ffecf837b1c8739d58410ba", - "sha256:bda784ebb116d56d3e7133c8e0942cf68cb7fd58bdccf57231dbe56b6430eb01", - "sha256:df2784a474028b15a723f6b347625f1f91740de418bed4a0a2694c954de34dd7", - "sha256:e2b47a8e0126ec0a3820a2e299a94a6fc29ba132249957dd32c447d380eaae5f", - "sha256:e4b9b443e88735be4927529d66d9e1164b4fbd6a882e90114967eedc6ad608e7" + "sha256:00e9ffb955972a8f6a3a0d61a12231fcaf5e23ee238c98421d65fecc29bd88a1", + "sha256:115177b3fc51209b5f50371735311c9a6cd9d260ffedbdce5fbc965645b7567c", + "sha256:17130f034dae50aaf22fce2292e0077a0c2093ba4363211bcafb54418fb8dc09", + "sha256:200bdfc327d5b06cb400ae86c972b579efe03a1fd8a2e8cb7a5d9aaa744e5adb", + "sha256:496b28ef414d9a7734e07221c4386bb00f416a3aa276b9f349ed9a328c73ec23", + "sha256:4bc378039f70141176f3d511d84bc1a172820d4d2edee4f9fcff52cde753dc08", + "sha256:4f357b4c39b0fa0071de47e8be7af44e07f375d2e59e395daccb7fd13b275668", + "sha256:57b39303e6dbe3de91e60a14269543ac058ac98a0ea6cf900f5403d9c226022f", + "sha256:6472478e597ef4a8f5c621d811d08b7ef09fc5af5bc85c2cf4a4505a7164f8b8", + "sha256:68f9324000cfc5570b5a59a92306691b5d655078a399f20bc72c2581fe903261", + "sha256:69870e2bbf39b60ebe9a31b31324e249bf314bdc2798e46efc58c67db74b56cb", + "sha256:6adb17ba89829d5e77fd81baac396f1af99241d7dfc121a065217334131662e7", + "sha256:7c360aee2bdaa05c24cadddc2f10924961dc7cad125d8876b4d307c879b3b4e8", + "sha256:7c4c8e87ef29714ccc7fa9764efe30d849cd38f8a9a1742ab7aedf8b5e23494d", + "sha256:8a07672e86bf288ea3e55959d2e06d6c01320318662241f9b7a71c583e15e5b5", + "sha256:9f583295f7dd523bf6e5619720677279dc7b9db22671573888f0591fc46b90b2", + "sha256:b668433f32ac955a94633e58ed7800c06c00f9c46d3b99e2189b3d88dc3184c8", + "sha256:b7a92564198c5a5ff4efdb83ace215c73343afb80d9379183bc736fea76edd6d", + "sha256:bd52e1715c70a96a116a61c8477e586b3a46047c85581195bc74162b19b46286", + "sha256:c7ddc9a6234267bbb52059b017ca22f59ffd7d41d545524cb85f68086a2cbb43", + "sha256:c8586d72932b8e3bd50a5230d6f1cfbb85c2605bad34253c6d6fe757211b2bf7", + "sha256:ce3d8e782e3776f19d3accc706aab85ff06caedb70a52016532bebacf5537567", + "sha256:f3fd26f63c4a9033115707a8718154538a1cebfd6ec992f214e6423524450e3e" ], "index": "pypi", - "version": "==3.5.67" + "version": "==3.6.1" }, "requests": { "extras": [ "security" ], "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" ], "index": "pypi", - "version": "==2.25.1" + "version": "==2.26.0" }, "requests-cache": { "hashes": [ @@ -1216,6 +1291,41 @@ ], "version": "==0.0.2" }, + "ruamel.yaml": { + "hashes": [ + "sha256:02f0ed93e98ea32498d25a2952635bbd9fabd553599b8ad67724b4ac88dd8f6c", + "sha256:aa1a5b8041bab0d0e8c514949fa8e11b02653061dcbc68365c820b263f8c6ec7" + ], + "markers": "python_version >= '3'", + "version": "==0.17.13" + }, + "ruamel.yaml.clib": { + "hashes": [ + "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd", + "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0", + "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277", + "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104", + "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd", + "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78", + "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99", + "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527", + "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84", + "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7", + "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468", + "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b", + "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94", + "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233", + "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb", + "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5", + "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe", + "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751", + "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502", + "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed", + "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c" + ], + "markers": "python_version < '3.10' and platform_python_implementation == 'CPython'", + "version": "==0.2.6" + }, "shodan": { "hashes": [ "sha256:7e2bddbc1b60bf620042d0010f4b762a80b43111dbea9c041d72d4325e260c23" @@ -1225,11 +1335,11 @@ }, "sigmatools": { "hashes": [ - "sha256:0c30884589dc4b3fd30ae7f4e335a0d1dc284ddf0998983c4736176bc9087447", - "sha256:841136694829069c92a21b6b9d6d9cef4bd53b4d25e50d35da863a2e5601f71d" + "sha256:55a528916c28f3d20ee6f034364053e281773959b7ad2b19335cbe1424f76839", + "sha256:f64302990e7329327dd916b0bd45760bdbd50edeb498679de9f5fa1bb8bf44e1" ], "index": "pypi", - "version": "==0.19.1" + "version": "==0.20" }, "six": { "hashes": [ @@ -1241,11 +1351,11 @@ }, "socialscan": { "hashes": [ - "sha256:3d0ca2b27d53fa4552312e07f60d3a3f513f7791a5f2bce16d3e0e3f295cd037", - "sha256:871cbc50f577b29f5f55d9c3ec5798d3abef31663f7cbe4d5c47bd5c380f6bae" + "sha256:47f042bb2ab1afb77c2cf2f31e6ab43afa91ff87849a79307cf753dfc7b84f20", + "sha256:d03eb63177c516b1b8eb1fbca3d25753bb6d68b56e7325a96414b8b319c5daad" ], "index": "pypi", - "version": "==1.4.1" + "version": "==1.4.2" }, "socketio-client": { "hashes": [ @@ -1287,6 +1397,14 @@ ], "version": "==0.8.9" }, + "tau-clients": { + "hashes": [ + "sha256:4a8e2a3ee27dcc48b6468343d898cd0d72d6b8c10d7f9e563053cca8c023513b", + "sha256:f57b433663f3fd7741c1975c3e0ad4f7b7977c35ee5e359650784371d4a996a0" + ], + "index": "pypi", + "version": "==0.1.3" + }, "tldextract": { "hashes": [ "sha256:cfae9bc8bda37c3e8c7c8639711ad20e95dc85b207a256b60b0b23d7ff5540ea", @@ -1344,11 +1462,11 @@ }, "tqdm": { "hashes": [ - "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493", - "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042" + "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588", + "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.61.0" + "version": "==4.62.2" }, "trustar": { "hashes": [ @@ -1367,10 +1485,11 @@ }, "tzlocal": { "hashes": [ - "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", - "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4" + "sha256:c736f2540713deb5938d789ca7c3fc25391e9a20803f05b60ec64987cf086559", + "sha256:f4e6e36db50499e0d92f79b67361041f048e2609d166e93456b50746dc4aef12" ], - "version": "==2.1" + "markers": "python_version >= '3.6'", + "version": "==3.0" }, "unicodecsv": { "hashes": [ @@ -1395,11 +1514,11 @@ }, "urllib3": { "hashes": [ - "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", - "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.6" }, "validators": { "hashes": [ @@ -1415,29 +1534,36 @@ "index": "pypi", "version": "==1.1.2" }, - "vulners": { + "vt-py": { "hashes": [ - "sha256:146305b799a991961dde97735d00605b9c335c15e0168050a5953ff9d69bdc28", - "sha256:d09b360549550abe669d70f962f60c696eae889c4ad7d5e8b9b47e71f1b81fb3", - "sha256:fa5a85d969734a58d9bedfba459002c272c6414196ab54207a05ef394af064c3" + "sha256:e1adfcb54b4ff3e86456b8a551827702650e25469e9d99bf030b71d564358b1d" ], "index": "pypi", - "version": "==1.5.11" + "version": "==0.7.2" + }, + "vulners": { + "hashes": [ + "sha256:94a26ee69989d4a863408d4d5765ef4e3279d8f3ccc1f34bfb9c76c862cea138", + "sha256:ba5ffa05a9995995b307beb6faecbe627207269982b0e6d9081212269f8a2903", + "sha256:de508bc6dd8031eb6f8b00f74f3d6197eb8cb86fe0353957284c17bc17b65f1a" + ], + "index": "pypi", + "version": "==1.5.12" }, "wand": { "hashes": [ - "sha256:540a2da5fb3ada1f0abf6968e0fa01ca7de6cd517f3be5c52d03a4fc8d54d75e", - "sha256:b752b2c2ee6ce04210da4b2e591013a4d9303fbed3fcbd3fb450930777dcb117" + "sha256:5ba497e90741a05ebce4603b04ee843150c566482a753554da54dc57d8503bba", + "sha256:ebc01bccc25dba68414ab55b482341f9ad2b197d7f49d5e724f339bbf63fb6db" ], "index": "pypi", - "version": "==0.6.6" + "version": "==0.6.7" }, "websocket-client": { "hashes": [ - "sha256:3e2bf58191d4619b161389a95bdce84ce9e0b24eb8107e7e590db682c2d0ca81", - "sha256:abf306dc6351dcef07f4d40453037e51cc5d9da2ef60d0fc5d0fe3bcda255372" + "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec", + "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d" ], - "version": "==1.0.1" + "version": "==1.2.1" }, "wrapt": { "hashes": [ @@ -1455,10 +1581,11 @@ }, "xlsxwriter": { "hashes": [ - "sha256:1a7fac99687020e76aa7dd0d7de4b9b576547ed748e5cd91a99d52a6df54ca16", - "sha256:641db6e7b4f4982fd407a3f372f45b878766098250d26963e95e50121168cbe2" + "sha256:2f2af944d2b4b5f21cd3ac8e01b2417ec74c60e2ca11cae90b4f32ee172c99d6", + "sha256:3f39bf581c55f3ad1438bc170d7f4c4649cee8b6b7a80d21f79508118eeea52a" ], - "version": "==1.4.3" + "markers": "python_version >= '3.4'", + "version": "==3.0.1" }, "yara-python": { "hashes": [ @@ -1537,22 +1664,22 @@ ], "version": "==2021.5.30" }, - "chardet": { + "charset-normalizer": { "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", + "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" + "markers": "python_version >= '3'", + "version": "==2.0.4" }, "codecov": { "hashes": [ - "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b", - "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8", - "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef" + "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47", + "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635", + "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1" ], "index": "pypi", - "version": "==2.1.11" + "version": "==2.1.12" }, "coverage": { "hashes": [ @@ -1622,11 +1749,11 @@ }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", + "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" + "markers": "python_version >= '3'", + "version": "==3.2" }, "iniconfig": { "hashes": [ @@ -1653,11 +1780,11 @@ }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7", + "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.9" + "markers": "python_version >= '3.6'", + "version": "==21.0" }, "pluggy": { "hashes": [ @@ -1712,11 +1839,11 @@ "security" ], "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" ], "index": "pypi", - "version": "==2.25.1" + "version": "==2.26.0" }, "toml": { "hashes": [ @@ -1728,11 +1855,11 @@ }, "urllib3": { "hashes": [ - "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", - "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.6" } } } diff --git a/REQUIREMENTS b/REQUIREMENTS index 120d7c1..6bd74c7 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -5,141 +5,146 @@ # pipenv lock --requirements # +-i https://pypi.org/simple -e . --e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client --e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client --e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client +-e git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client +-e git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client +-e git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -aiohttp==3.7.3; python_version >= '3.6' +aiohttp==3.7.4.post0 antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 argparse==1.4.0 -assemblyline-client==4.0.1 +assemblyline-client==4.1.0 async-timeout==3.0.1; python_full_version >= '3.5.3' -attrs==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +attrs==21.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +backports.zoneinfo==0.2.1; python_version < '3.9' backscatter==0.2.4 beautifulsoup4==4.9.3 bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 -censys==1.1.1 -certifi==2020.12.5 -cffi==1.14.4 -chardet==3.0.4 +certifi==2021.5.30 +cffi==1.14.6 +chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +charset-normalizer==2.0.4; python_version >= '3' clamd==1.0.2 click-plugins==1.1.1 -click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +click==8.0.1; python_version >= '3.6' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' colorclass==2.2.0 compressed-rtf==1.0.6 -configparser==5.0.1; python_version >= '3.6' -cryptography==3.3.1 -decorator==4.4.2 -deprecated==1.2.11; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -dnsdb2==1.1.2 -dnspython3==1.15.0 -domaintools-api==0.5.2 -easygui==0.98.1 +configparser==5.0.2; python_version >= '3.6' +cryptography==3.4.7; python_version >= '3.6' +decorator==5.0.9; python_version >= '3.5' +deprecated==1.2.12; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +dnsdb2==1.1.3 +dnspython==2.1.0 +domaintools-api==0.5.4 +easygui==0.98.2 ebcdic==1.1.1 enum-compat==0.0.3 -extract-msg==0.28.1 +extract-msg==0.28.7 ez-setup==0.9 ezodf==0.3.2 +filelock==3.0.12 future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' futures==3.1.1 -geoip2==4.1.0 -httplib2==0.18.1 +geoip2==4.2.0 +httplib2==0.19.1 idna-ssl==1.1.0; python_version < '3.7' -idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +idna==3.2; python_version >= '3' imapclient==2.1.0 isodate==0.6.0 -jbxapi==3.14.0 -json-log-formatter==0.3.0 +itsdangerous==2.0.1; python_version >= '3.6' +jbxapi==3.17.2 +json-log-formatter==0.4.0 jsonschema==3.2.0 -ndjson==0.3.1 -lark-parser==0.11.1 -lief==0.11.0 -lxml==4.6.2 +lark-parser==0.11.3 +lief==0.11.5 +lxml==4.6.3 maclookup==1.0.3 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' -msoffcrypto-tool==4.11.0 +more-itertools==8.8.0; python_version >= '3.5' +msoffcrypto-tool==4.12.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') multidict==5.1.0; python_version >= '3.6' np==1.0.2 -numpy==1.19.5; python_version >= '3.6' +numpy==1.21.2; python_version < '3.11' and python_version >= '3.7' oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -oletools==0.56 -opencv-python==4.5.1.48 -openpyxl -pandas-ods-reader==0.0.7 -pandas==1.1.5 -passivetotal==1.0.31 +oletools==0.56.2 +opencv-python==4.5.3.56 +pandas-ods-reader==0.1.2 +pandas==1.3.2 +passivetotal==2.5.4 pcodedmp==1.2.6 -pdftotext==2.1.5 -pillow==8.1.0 +pdftotext==2.2.0 +pillow==8.3.1 progressbar2==3.53.1 psutil==5.8.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodome==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodomex==3.9.9; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycryptodome==3.10.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodomex==3.10.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' pydeep==0.4 pyeupi==1.1 -pyfaup==1.2 pygeoip==0.3.2 -pymisp[email,fileobjects,openioc,pdfexport]==2.4.137.1 -pyopenssl==20.0.1 +pymisp[email,fileobjects,openioc,pdfexport]==2.4.148 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pypdns==1.5.1 -pypssl==2.1 -pyrsistent==0.17.3; python_version >= '3.5' -pytesseract==0.3.7 +pypdns==1.5.2 +pypssl==2.2 +pyrsistent==0.18.0; python_version >= '3.6' +pytesseract==0.3.8 python-baseconv==1.2.2 -python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -python-docx==0.8.10 -python-engineio==4.0.0 -python-magic==0.4.18 -python-pptx==0.6.18 -python-socketio[client]==5.0.4 -python-utils==2.5.2 +python-dateutil==2.8.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +python-docx==0.8.11 +python-engineio==4.2.1; python_version >= '3.6' +python-magic==0.4.24 +python-pptx==0.6.19 +python-socketio[client]==5.4.0; python_version >= '3.6' +python-utils==2.5.6 pytz==2019.3 pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' -pyeti-python3==1.0.0 pyzbar==0.1.8 -pyzipper==0.3.4; python_version >= '3.5' -rdflib==5.0.0 +pyzipper==0.3.5; python_version >= '3.5' +rdflib==6.0.0; python_version >= '3.7' redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.5.59 -requests-cache==0.5.2 -requests[security]==2.25.1 +reportlab==3.6.1 +requests-cache==0.6.4; python_version >= '3.6' +requests-file==1.5.1 +requests[security]==2.26.0 rtfde==0.0.2 -shodan==1.24.0 -sigmatools==0.18.1 -six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -socialscan==1.4.1 +ruamel.yaml.clib==0.2.6; python_version < '3.10' and platform_python_implementation == 'CPython' +ruamel.yaml==0.17.13; python_version >= '3' +shodan==1.25.0 +sigmatools==0.20 +six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +socialscan==1.4.2 socketio-client==0.5.7.4 -soupsieve==2.1; python_version >= '3' +soupsieve==2.2.1; python_version >= '3' sparqlwrapper==1.8.5 stix2-patterns==1.3.2 -tabulate==0.8.7 +tabulate==0.8.9 +tau-clients==0.1.3 +tldextract==3.1.0; python_version >= '3.5' tornado==6.1; python_version >= '3.5' -tqdm==4.56.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -trustar==0.3.34 -typing-extensions==3.7.4.3; python_version < '3.8' -tzlocal==2.1 +tqdm==4.62.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +trustar==0.3.35 +typing-extensions==3.10.0.0 +tzlocal==3.0; python_version >= '3.6' unicodecsv==0.14.1 url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' +urllib3==1.26.6; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' validators==0.14.0 -vt-graph-api==1.0.1 -vulners==1.5.9 -wand==0.6.5 -websocket-client==0.57.0 +vt-graph-api==1.1.2 +vt-py==0.7.2 +vulners==1.5.12 +wand==0.6.7 +websocket-client==1.2.1 wrapt==1.12.1 xlrd==2.0.1 -xlsxwriter==1.3.7 +xlsxwriter==3.0.1; python_version >= '3.4' yara-python==3.8.1 yarl==1.6.3; python_version >= '3.6' diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0471b7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta:__legacy__" \ No newline at end of file From f40fc7ebc4a0afba3d86126776e6e54f62a26d38 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 18:38:09 +0200 Subject: [PATCH 316/476] new: [hashlookup] new hashlookup module added --- misp_modules/modules/expansion/hashlookup.py | 93 ++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 misp_modules/modules/expansion/hashlookup.py diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py new file mode 100644 index 0000000..1a770e7 --- /dev/null +++ b/misp_modules/modules/expansion/hashlookup.py @@ -0,0 +1,93 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from collections import defaultdict +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['md5', 'sha1'], 'format': 'misp_standard'} +moduleinfo = {'version': '1', 'author': 'Alexandre Dulaunoy', + 'description': 'An expansion module to enrich a file hash with hashlookup.circl.lu services (NSRL and other sources)', + 'module-type': ['expansion', 'hover']} +moduleconfig = ["custom_API"] +hashlookup_url = 'https://hashlookup.circl.lu/' + + +class HashlookupParser(): + def __init__(self, attribute, hashlookupresult, api_url): + self.attribute = attribute + self.hashlookupresult = hashlookupresult + self.api_url = api_url + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.references = defaultdict(list) + + def get_result(self): + if self.references: + self.__build_references() + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_hashlookup_information(self): + hashlookup_object = MISPObject('hashlookup') + hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) + hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) + hashlookup_object.add_attribute('FileName', **{'type': 'text', 'value': self.hashlookupresult['FileName']}) + hashlookup_object.add_attribute('FileSize', **{'type': 'text', 'value': self.hashlookupresult['FileSize']}) + hashlookup_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hashlookup_object) + + def __build_references(self): + for object_uuid, references in self.references.items(): + for misp_object in self.misp_event.objects: + if misp_object.uuid == object_uuid: + for reference in references: + misp_object.add_reference(**reference) + break + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'md5': + pass + elif attribute.get('type') == 'sha1': + pass + else: + misperrors['error'] = 'md5 or sha1 is missing.' + return misperrors + api_url = check_url(request['config']['custom_API']) if request['config'].get('custom_API') else hashlookup_url + r = requests.get("{}/lookup/{}/{}".format(api_url, attribute.get('type'), attribute['value'])) + if r.status_code == 200: + hashlookupresult = r.json() + if not hashlookupresult: + misperrors['error'] = 'Empty result' + return misperrors['error'] + elif r.status_code == 404: + misperrors['error'] = 'Non existing hash' + return misperrors['error'] + else: + misperrors['error'] = 'API not accessible' + return misperrors['error'] + parser = HashlookupParser(attribute, hashlookupresult, api_url) + parser.parse_hashlookup_information() + result = parser.get_result() + print(result) + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From da6092f9e109329a1e17739fe2f50ec42c75b3f6 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 18:41:08 +0200 Subject: [PATCH 317/476] Revert "fix: [greynoise] typo fixed" This reverts commit e36e3ea117b2b6562eaad2008f23a98c5b69f9e5. --- documentation/website/expansion/greynoise.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/website/expansion/greynoise.json b/documentation/website/expansion/greynoise.json index b01c9ad..4988537 100644 --- a/documentation/website/expansion/greynoise.json +++ b/documentation/website/expansion/greynoise.json @@ -8,8 +8,8 @@ "output": "IP Lookup information or CVE scanning profile for past 7 days", "references": [ "https://greynoise.io/", - "https://docs.greynoise.io/", + "https://docs.greyniose.io/", "https://www.greynoise.io/viz/account/" ], "features": "This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days." -} +} \ No newline at end of file From 73e78463d0644995c5d18ac893510d0e8f2d63ba Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 18:42:16 +0200 Subject: [PATCH 318/476] new: [hashlookup] new hashlookup module added https://www.circl.lu/services/hashlookup/ --- misp_modules/modules/expansion/hashlookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 1a770e7..d71597b 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -16,7 +16,7 @@ hashlookup_url = 'https://hashlookup.circl.lu/' class HashlookupParser(): def __init__(self, attribute, hashlookupresult, api_url): self.attribute = attribute - self.hashlookupresult = hashlookupresult + self.hashlookupresult = hashlookupresult self.api_url = api_url self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) From 1a90237a211578dce682aca565476d16caf1843b Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 21:41:08 +0200 Subject: [PATCH 319/476] chg: [logo] CIRCL logo added for hashlookup service --- documentation/logos/circl.png | Bin 0 -> 19207 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/logos/circl.png diff --git a/documentation/logos/circl.png b/documentation/logos/circl.png new file mode 100644 index 0000000000000000000000000000000000000000..516678deaa5e34795300c98a9c2b49bdbd80528c GIT binary patch literal 19207 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 itF~&Zz*@Ci!~P#4a^MMU?du}|0000$oZa literal 0 HcmV?d00001 From 525678eab6a1963bb5f6bf2029500687a5d356a3 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 21:42:30 +0200 Subject: [PATCH 320/476] new: [hashlookup] documentation added --- documentation/website/expansion/hashlookup.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 documentation/website/expansion/hashlookup.json diff --git a/documentation/website/expansion/hashlookup.json b/documentation/website/expansion/hashlookup.json new file mode 100644 index 0000000..cb6da61 --- /dev/null +++ b/documentation/website/expansion/hashlookup.json @@ -0,0 +1,10 @@ +{ + "description": "An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL.", + "logo": "cve.png", + "input": "File hashes (MD5, SHA1)", + "output": "Object with the filename associated hashes if the hash is part of a known set.", + "references": [ + "https://www.circl.lu/services/hashlookup/" + ], + "features": "The module takes file hashes as input such as a MD5 or SHA1.\n It queries the public CIRCL.lu hashlookup service and return all the hits if the hashes are known in an existing dataset. The module can be configured with a custom hashlookup url if required.\n The module can be used an hover module but also an expansion model to add related MISP objects.\n" +} From 7645b97bf775accf66036e744e0624b28b18a513 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 25 Aug 2021 21:44:20 +0200 Subject: [PATCH 321/476] chg: [hashlookup] logo updated --- documentation/website/expansion/hashlookup.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/website/expansion/hashlookup.json b/documentation/website/expansion/hashlookup.json index cb6da61..713be83 100644 --- a/documentation/website/expansion/hashlookup.json +++ b/documentation/website/expansion/hashlookup.json @@ -1,6 +1,6 @@ { "description": "An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL.", - "logo": "cve.png", + "logo": "circl.png", "input": "File hashes (MD5, SHA1)", "output": "Object with the filename associated hashes if the hash is part of a known set.", "references": [ From 1d7f0ee1f0cadee76684039a61e7ec397f904493 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 26 Aug 2021 15:02:32 +0200 Subject: [PATCH 322/476] fix: [hashlookup] Fixed the errors handling - Since the modules system is waiting for a dict, we return `misperrors` instead of the actual value of the 'error' key, and the module will no longer fail when there is no result to parse --- misp_modules/modules/expansion/hashlookup.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index d71597b..82872a0 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -70,17 +70,16 @@ def handler(q=False): hashlookupresult = r.json() if not hashlookupresult: misperrors['error'] = 'Empty result' - return misperrors['error'] + return misperrors elif r.status_code == 404: misperrors['error'] = 'Non existing hash' - return misperrors['error'] + return misperrors else: misperrors['error'] = 'API not accessible' - return misperrors['error'] + return misperrors parser = HashlookupParser(attribute, hashlookupresult, api_url) parser.parse_hashlookup_information() result = parser.get_result() - print(result) return result From 82e0628fe7af522e538ec8aa5fab55966b624c1e Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Thu, 26 Aug 2021 15:19:36 +0200 Subject: [PATCH 323/476] chg: [hashlookup] Using the actual attribute types for FileName & FileSize - Following the recent changes on the obejct template to use `filename` as attribute type for the FileName object relation instead of `text` https://github.com/MISP/misp-objects/commit/d2b93f5aa69e0d9bfc549915b8f691cc5f62bf6c --- misp_modules/modules/expansion/hashlookup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 82872a0..728c312 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -33,8 +33,8 @@ class HashlookupParser(): hashlookup_object = MISPObject('hashlookup') hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) - hashlookup_object.add_attribute('FileName', **{'type': 'text', 'value': self.hashlookupresult['FileName']}) - hashlookup_object.add_attribute('FileSize', **{'type': 'text', 'value': self.hashlookupresult['FileSize']}) + hashlookup_object.add_attribute('FileName', **{'type': 'filename', 'value': self.hashlookupresult['FileName']}) + hashlookup_object.add_attribute('FileSize', **{'type': 'size-in-bytes', 'value': self.hashlookupresult['FileSize']}) hashlookup_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(hashlookup_object) From 327ee8e5c3fc2631f395974e8c217eca29a159a0 Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Thu, 26 Aug 2021 14:29:23 +0000 Subject: [PATCH 324/476] Fix github's security alert: fix * CVE-2021-28676 * CVE-2021-25287 * CVE-2021-28675 * CVE-2021-28678 * CVE-2021-25288 * CVE-2021-28677 --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 4057e4f..a54bdf3 100644 --- a/Pipfile +++ b/Pipfile @@ -33,7 +33,7 @@ blockchain = "*" reportlab = "*" pyintel471 = { editable = true, git = "https://github.com/MISP/PyIntel471.git" } shodan = "*" -Pillow = "*" +Pillow ">=8.2.0" Wand = "*" SPARQLWrapper = "*" domaintools_api = "*" From 4115b7607ed44ea6c0edfecef95efa41cabe7f86 Mon Sep 17 00:00:00 2001 From: Andras Iklody Date: Thu, 9 Sep 2021 13:57:29 +0200 Subject: [PATCH 325/476] fix: added note about the Domaintools module being deprecated - as requested by Domaintools, including a link to their own, up to date module --- misp_modules/modules/expansion/domaintools.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/misp_modules/modules/expansion/domaintools.py b/misp_modules/modules/expansion/domaintools.py index d952fdf..353b456 100755 --- a/misp_modules/modules/expansion/domaintools.py +++ b/misp_modules/modules/expansion/domaintools.py @@ -1,3 +1,7 @@ +# This module does not appear to be actively maintained. +# Please see https://github.com/DomainTools/domaintools_misp +# for the official DomainTools-supported MISP app + import json import logging import sys From e7488791d3fcfc4eb8565281560fa6b549c57843 Mon Sep 17 00:00:00 2001 From: Luciano Righetti Date: Mon, 20 Sep 2021 15:17:12 +0200 Subject: [PATCH 326/476] fix: add missing dependency (ndjson) of cof2misp1 --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 6bd74c7..010527d 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -148,3 +148,4 @@ xlrd==2.0.1 xlsxwriter==3.0.1; python_version >= '3.4' yara-python==3.8.1 yarl==1.6.3; python_version >= '3.6' +ndjson==0.3.1 From 9783113a1e476b386520655b75a8c3c4d46f4098 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 24 Sep 2021 15:09:07 +0200 Subject: [PATCH 327/476] fix: [hashlookup] FileName and size are not required fields and can be missing in a hashlookup record --- misp_modules/modules/expansion/hashlookup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 728c312..7155fb7 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -33,8 +33,10 @@ class HashlookupParser(): hashlookup_object = MISPObject('hashlookup') hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) - hashlookup_object.add_attribute('FileName', **{'type': 'filename', 'value': self.hashlookupresult['FileName']}) - hashlookup_object.add_attribute('FileSize', **{'type': 'size-in-bytes', 'value': self.hashlookupresult['FileSize']}) + if 'FileName' in self.hashlookupresult: + hashlookup_object.add_attribute('FileName', **{'type': 'filename', 'value': self.hashlookupresult['FileName']}) + if 'FileSize' in self.hashlookupresult: + hashlookup_object.add_attribute('FileSize', **{'type': 'size-in-bytes', 'value': self.hashlookupresult['FileSize']}) hashlookup_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(hashlookup_object) From b6e0c4ce5370ee5d7d1d6f420f1b9f45745cee1d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 24 Sep 2021 15:29:23 +0200 Subject: [PATCH 328/476] chg: [hashlookup] add new fields such as source, SSDEEP and TLSH --- misp_modules/modules/expansion/hashlookup.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 7155fb7..984d7b4 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -31,8 +31,14 @@ class HashlookupParser(): def parse_hashlookup_information(self): hashlookup_object = MISPObject('hashlookup') + if 'source' in self.hashlookupresult: + hashlookup_object.add_attribute('source', **{'type': 'text', 'value': self.hashlookupresult['source']}) hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) + if 'SSDEEP' in self.hashlookupresult: + hashlookup_object.add_attribute('SSDEEP', **{'type': 'ssdeep', 'value': self.hashlookupresult['SSDEEP']}) + if 'TLSH' in self.hashlookupresult: + hashlookup_object.add_attribute('TLSH', **{'type': 'tlsh', 'value': self.hashlookupresult['TLSH']}) if 'FileName' in self.hashlookupresult: hashlookup_object.add_attribute('FileName', **{'type': 'filename', 'value': self.hashlookupresult['FileName']}) if 'FileSize' in self.hashlookupresult: From 4162ccb52887963261f86215dfddc598e0b2ff4f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 24 Sep 2021 15:35:14 +0200 Subject: [PATCH 329/476] chg: [hashlookup] KnownMalicious field added --- misp_modules/modules/expansion/hashlookup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 984d7b4..a88de8a 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -16,7 +16,7 @@ hashlookup_url = 'https://hashlookup.circl.lu/' class HashlookupParser(): def __init__(self, attribute, hashlookupresult, api_url): self.attribute = attribute - self.hashlookupresult = hashlookupresult + self.hashlookupresult = hashlookupresult self.api_url = api_url self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) @@ -33,6 +33,8 @@ class HashlookupParser(): hashlookup_object = MISPObject('hashlookup') if 'source' in self.hashlookupresult: hashlookup_object.add_attribute('source', **{'type': 'text', 'value': self.hashlookupresult['source']}) + if 'KnownMalicious' in self.hashlookupresult: + hashlookup_object.add_attribute('KnownMalicious', **{'type': 'text', 'value': self.hashlookupresult['KnownMalicious']}) hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) if 'SSDEEP' in self.hashlookupresult: From be5635b0a4e5bb306bb596681180d0b96a751c26 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Fri, 15 Oct 2021 17:18:29 +0200 Subject: [PATCH 330/476] fix: [yara_query] Fixed module input parsing - The module used to work properly when called from a single attribute enrichment, but was broken when called from the hover enrichment feature, because of the additional `persistent` field used to define which type of hover enrichment is queried --- misp_modules/modules/expansion/yara_query.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/yara_query.py b/misp_modules/modules/expansion/yara_query.py index 3a75acc..e905de5 100644 --- a/misp_modules/modules/expansion/yara_query.py +++ b/misp_modules/modules/expansion/yara_query.py @@ -14,6 +14,12 @@ moduleconfig = [] mispattributes = {'input': ['md5', 'sha1', 'sha256', 'filename|md5', 'filename|sha1', 'filename|sha256', 'imphash'], 'output': ['yara']} +def extract_input_attribute(request): + for input_type in mispattributes['input']: + if input_type in request: + return input_type, request[input_type] + + def get_hash_condition(hashtype, hashvalue): hashvalue = hashvalue.lower() required_module, params = ('pe', '()') if hashtype == 'imphash' else ('hash', '(0, filesize)') @@ -24,11 +30,11 @@ def handler(q=False): if q is False: return False request = json.loads(q) - del request['module'] - if 'event_id' in request: - del request['event_id'] + attribute = extract_input_attribute(request) + if attribute is None: + return {'error': f'Wrong input type, please choose in the following: {", ".join(mispattributes["input"])}'} uuid = request.pop('attribute_uuid') if 'attribute_uuid' in request else None - attribute_type, value = list(request.items())[0] + attribute_type, value = attribute if 'filename' in attribute_type: _, attribute_type = attribute_type.split('|') _, value = value.split('|') From 58e4080b4f7d780856776cf1f030c786a9bce52a Mon Sep 17 00:00:00 2001 From: Kory Kyzar Date: Thu, 21 Oct 2021 09:14:13 -0400 Subject: [PATCH 331/476] Add libcaca-dev to apt packages required I needed to add libcaca-dev to make gtcaca. ## Before ``` misp@server:/usr/local/src/gtcaca/build$ cmake .. && make -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done CMake system name: Linux -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") pkg config path: -- Check if the system is big endian -- Searching 16 bit integer -- Looking for sys/types.h -- Looking for sys/types.h - found -- Looking for stdint.h -- Looking for stdint.h - found -- Looking for stddef.h -- Looking for stddef.h - found -- Check size of unsigned short -- Check size of unsigned short - done -- Using unsigned short -- Check if the system is big endian - little endian -- Checking for module 'caca' -- No package 'caca' found CMake Error at /usr/share/cmake-3.10/Modules/FindPkgConfig.cmake:415 (message): A required package was not found Call Stack (most recent call first): /usr/share/cmake-3.10/Modules/FindPkgConfig.cmake:593 (_pkg_check_modules_internal) CMakeLists.txt:69 (pkg_check_modules) -- Configuring incomplete, errors occurred! See also "/usr/local/src/gtcaca/build/CMakeFiles/CMakeOutput.log". ``` ## After ``` misp@server:/usr/local/src/gtcaca/build$ cmake .. && make CMake system name: Linux pkg config path: -- Checking for module 'caca' -- Found caca, version 0.99.beta19 libcaca link library: -lcaca CMake system: Linux -- Configuring done -- Generating done -- Build files have been written to: /usr/local/src/gtcaca/build ``` --- documentation/mkdocs/install.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/mkdocs/install.md b/documentation/mkdocs/install.md index 662e675..3eed0f4 100644 --- a/documentation/mkdocs/install.md +++ b/documentation/mkdocs/install.md @@ -14,7 +14,8 @@ sudo apt-get install -y \ zbar-tools \ libzbar0 \ libzbar-dev \ - libfuzzy-dev + libfuzzy-dev \ + libcaca-dev # BEGIN with virtualenv: $SUDO_WWW virtualenv -p python3 /var/www/MISP/venv From 4fd3323220fc503bb57dcd64a3266faf7b6c412e Mon Sep 17 00:00:00 2001 From: rderkach Date: Mon, 25 Oct 2021 18:01:05 +0300 Subject: [PATCH 332/476] Update Recorded future expansion module with the new data In this release, we added new data that we have called Links. It represents better and more filtered related data. Also did some code formatting. --- .../modules/expansion/recordedfuture.py | 495 +++++++++++------- 1 file changed, 316 insertions(+), 179 deletions(-) diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index ccea31b..9894968 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -1,8 +1,14 @@ import json import logging import requests -from requests.exceptions import HTTPError, ProxyError,\ - InvalidURL, ConnectTimeout, ConnectionError +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout, + ConnectionError, +) +from typing import Optional, List, Tuple, Dict from . import check_input_attribute, checking_error, standard_error_message import platform import os @@ -10,47 +16,63 @@ from urllib.parse import quote, urlparse from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject moduleinfo = { - 'version': '1.0.1', - 'author': 'Recorded Future', - 'description': 'Module to retrieve data from Recorded Future', - 'module-type': ['expansion', 'hover'] + "version": "2.0.0", + "author": "Recorded Future", + "description": "Module to retrieve data from Recorded Future", + "module-type": ["expansion", "hover"], } -moduleconfig = ['token', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] +moduleconfig = ["token", "proxy_host", "proxy_port", "proxy_username", "proxy_password"] -misperrors = {'error': 'Error'} +misperrors = {"error": "Error"} -ATTRIBUTES = [ - 'ip', - 'ip-src', - 'ip-dst', - 'domain', - 'hostname', - 'md5', - 'sha1', - 'sha256', - 'uri', - 'url', - 'vulnerability', - 'weakness' +GALAXY_FILE_PATH = "https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/" + +ATTRIBUTESTYPES = [ + "ip", + "ip-src", + "ip-dst", + "ip-src|port", + "ip-dst|port", + "domain", + "hostname", + "md5", + "sha1", + "sha256", + "uri", + "url", + "vulnerability", + "weakness", +] + +OUTPUTATTRIBUTESTYPES = ATTRIBUTESTYPES + [ + "email-src", + "malware-sample", + "text", + "target-org", + "threat-actor", + "target-user", ] mispattributes = { - 'input': ATTRIBUTES, - 'output': ATTRIBUTES + ['email-src', 'text'], - 'format': 'misp_standard' + "input": ATTRIBUTESTYPES, + "output": OUTPUTATTRIBUTESTYPES, + "format": "misp_standard", } -LOGGER = logging.getLogger('recorded_future') +LOGGER = logging.getLogger("recorded_future") LOGGER.setLevel(logging.INFO) class RequestHandler: """A class for handling any outbound requests from this module.""" + def __init__(self): self.session = requests.Session() - self.app_id = f'{os.path.basename(__file__)}/{moduleinfo["version"]} ({platform.platform()}) ' \ - f'misp_enrichment/{moduleinfo["version"]} python-requests/{requests.__version__}' + self.app_id = ( + f'{os.path.basename(__file__)}/{moduleinfo["version"]} ({platform.platform()}) ' + f'misp_enrichment/{moduleinfo["version"]} python-requests/{requests.__version__}' + ) self.proxies = None self.rf_token = None @@ -58,27 +80,28 @@ class RequestHandler: """General get method with proxy error handling.""" try: timeout = 7 if self.proxies else None - response = self.session.get(url, headers=headers, proxies=self.proxies, timeout=timeout) + response = self.session.get( + url, headers=headers, proxies=self.proxies, timeout=timeout + ) response.raise_for_status() return response except (ConnectTimeout, ProxyError, InvalidURL) as error: - msg = 'Error connecting with proxy, please check the Recorded Future app proxy settings.' - LOGGER.error(f'{msg} Error: {error}') - misperrors['error'] = msg + msg = "Error connecting with proxy, please check the Recorded Future app proxy settings." + LOGGER.error(f"{msg} Error: {error}") + misperrors["error"] = msg raise def rf_lookup(self, category: str, ioc: str) -> requests.Response: """Do a lookup call using Recorded Future's ConnectAPI.""" - parsed_ioc = quote(ioc, safe='') - url = f'https://api.recordedfuture.com/v2/{category}/{parsed_ioc}?fields=risk%2CrelatedEntities' - headers = {'X-RFToken': self.rf_token, - 'User-Agent': self.app_id} + parsed_ioc = quote(ioc, safe="") + url = f"https://api.recordedfuture.com/gw/misp/lookup/{category}/{parsed_ioc}" + headers = {"X-RFToken": self.rf_token, "User-Agent": self.app_id} try: response = self.get(url, headers) except HTTPError as error: - msg = f'Error when requesting data from Recorded Future. {error.response}: {error.response.reason}' + msg = f"Error when requesting data from Recorded Future. {error.response}: {error.response.reason}" LOGGER.error(msg) - misperrors['error'] = msg + misperrors["error"] = msg raise return response @@ -88,20 +111,49 @@ GLOBAL_REQUEST_HANDLER = RequestHandler() class GalaxyFinder: """A class for finding MISP galaxy matches to Recorded Future data.""" + def __init__(self): self.session = requests.Session() + # There are duplicates values for different keys because Links entities and Related entities + # have have different naming for the same types self.sources = { - 'RelatedThreatActor': [ - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/threat-actor.json' + "RelatedThreatActor": [f"{GALAXY_FILE_PATH}threat-actor.json"], + "Threat Actor": [f"{GALAXY_FILE_PATH}threat-actor.json"], + "RelatedMalware": [ + f"{GALAXY_FILE_PATH}banker.json", + f"{GALAXY_FILE_PATH}botnet.json", + f"{GALAXY_FILE_PATH}exploit-kit.json", + f"{GALAXY_FILE_PATH}rat.json", + f"{GALAXY_FILE_PATH}ransomware.json", + f"{GALAXY_FILE_PATH}malpedia.json", + ], + "Malware": [ + f"{GALAXY_FILE_PATH}banker.json", + f"{GALAXY_FILE_PATH}botnet.json", + f"{GALAXY_FILE_PATH}exploit-kit.json", + f"{GALAXY_FILE_PATH}rat.json", + f"{GALAXY_FILE_PATH}ransomware.json", + f"{GALAXY_FILE_PATH}malpedia.json", + ], + "MitreAttackIdentifier": [ + f"{GALAXY_FILE_PATH}mitre-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-malware.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-tool.json", + f"{GALAXY_FILE_PATH}mitre-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-malware.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-malware.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-tool.json", + f"{GALAXY_FILE_PATH}mitre-pre-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-pre-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-tool.json", ], - 'RelatedMalware': [ - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/banker.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/botnet.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/exploit-kit.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/rat.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/ransomware.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/malpedia.json' - ] } self.galaxy_clusters = {} @@ -112,33 +164,38 @@ class GalaxyFinder: for source in self.sources.get(related_type): try: response = GLOBAL_REQUEST_HANDLER.get(source) - name = source.split('/')[-1].split('.')[0] - self.galaxy_clusters[related_type] = {name: response.json()} + name = source.split("/")[-1].split(".")[0] + self.galaxy_clusters.setdefault(related_type, {}).update( + {name: response.json()} + ) except ConnectionError as error: - LOGGER.warning(f'pull_galaxy_cluster failed for source: {source}, with error: {error}.') + LOGGER.warning( + f"pull_galaxy_cluster failed for source: {source}, with error: {error}." + ) def find_galaxy_match(self, indicator: str, related_type: str) -> str: """Searches the clusters of the related_type for a match with the indicator. - :returns the first matching galaxy string or an empty string if no galaxy match is found. + :returns the first matching galaxy string or an empty string if no galaxy match is found. """ self.pull_galaxy_cluster(related_type) for cluster_name, cluster in self.galaxy_clusters.get(related_type, {}).items(): - for value in cluster['values']: - try: - if indicator in value['meta']['synonyms'] or indicator in value['value']: - value = value['value'] - return f'misp-galaxy:{cluster_name}="{value}"' - except KeyError: - pass - return '' + for value in cluster["values"]: + if indicator in value.get("meta", {}).get( + "synonyms", "" + ) or indicator in value.get("value", ""): + value = value["value"] + return f'misp-galaxy:{cluster_name}="{value}"' + return "" class RFColors: """Class for setting signature RF-colors.""" + def __init__(self): - self.rf_white = '#CCCCCC' - self.rf_yellow = '#FFCE00' - self.rf_red = '#CF0A2C' + self.rf_white = "#CCCCCC" + self.rf_grey = " #CDCDCD" + self.rf_yellow = "#FFCF00" + self.rf_red = "#D10028" def riskscore_color(self, risk_score: int) -> str: """Returns appropriate hex-colors according to risk score.""" @@ -160,194 +217,272 @@ class RFColors: else: # risk_rule_criticality == 3 or 4 return self.rf_red + def criticality_color(self, criticality) -> str: + mapper = { + "None": self.rf_grey, + "Low": self.rf_grey, + "Unusual": self.rf_grey, + "Informational": self.rf_grey, + "Medium": self.rf_yellow, + "Suspicious": self.rf_yellow, + "High": self.rf_red, + "Critical": self.rf_red, + "Very Critical": self.rf_red, + "Malicious": self.rf_red, + "Very Malicious": self.rf_red, + } + return mapper.get(criticality, self.rf_white) + class RFEnricher: """Class for enriching an attribute with data from Recorded Future. - The enrichment data is returned as a custom MISP object. + The enrichment data is returned as a custom MISP object. """ + def __init__(self, attribute_props: dict): self.event = MISPEvent() - self.enrichment_object = MISPObject('Recorded Future Enrichment') + self.enrichment_object = MISPObject("Recorded Future Enrichment") description = ( - 'An object containing the enriched attribute and ' - 'related entities from Recorded Future.' + "An object containing the enriched attribute and " + "related entities from Recorded Future." + ) + self.enrichment_object.from_dict( + **{"meta-category": "misc", "description": description, "distribution": 0} ) - self.enrichment_object.from_dict(**{ - 'meta-category': 'misc', - 'description': description, - 'distribution': 0 - }) # Create a copy of enriched attribute to add tags to temp_attr = MISPAttribute() temp_attr.from_dict(**attribute_props) self.enriched_attribute = MISPAttribute() - self.enriched_attribute.from_dict(**{ - 'value': temp_attr.value, - 'type': temp_attr.type, - 'distribution': 0 - }) + self.enriched_attribute.from_dict( + **{"value": temp_attr.value, "type": temp_attr.type, "distribution": 0} + ) - self.related_attributes = [] + self.related_attributes: List[Tuple[str, MISPAttribute]] = [] self.color_picker = RFColors() self.galaxy_finder = GalaxyFinder() # Mapping from MISP-type to RF-type self.type_to_rf_category = { - 'ip': 'ip', - 'ip-src': 'ip', - 'ip-dst': 'ip', - 'domain': 'domain', - 'hostname': 'domain', - 'md5': 'hash', - 'sha1': 'hash', - 'sha256': 'hash', - 'uri': 'url', - 'url': 'url', - 'vulnerability': 'vulnerability', - 'weakness': 'vulnerability' + "ip": "ip", + "ip-src": "ip", + "ip-dst": "ip", + "ip-src|port": "ip", + "ip-dst|port": "ip", + "domain": "domain", + "hostname": "domain", + "md5": "hash", + "sha1": "hash", + "sha256": "hash", + "uri": "url", + "url": "url", + "vulnerability": "vulnerability", + "weakness": "vulnerability", } - # Related entities from RF portrayed as related attributes in MISP + # Related entities have 'Related' as part of the word and Links entities from RF + # portrayed as related attributes in MISP self.related_attribute_types = [ - 'RelatedIpAddress', 'RelatedInternetDomainName', 'RelatedHash', - 'RelatedEmailAddress', 'RelatedCyberVulnerability' + "RelatedIpAddress", + "RelatedInternetDomainName", + "RelatedHash", + "RelatedEmailAddress", + "RelatedCyberVulnerability", + "IpAddress", + "InternetDomainName", + "Hash", + "EmailAddress", + "CyberVulnerability", + ] + # Related entities have 'Related' as part of the word and and Links entities from RF portrayed as tags in MISP + self.galaxy_tag_types = [ + "RelatedMalware", + "RelatedThreatActor", + "Threat Actor", + "MitreAttackIdentifier", + "Malware", ] - # Related entities from RF portrayed as tags in MISP - self.galaxy_tag_types = ['RelatedMalware', 'RelatedThreatActor'] def enrich(self) -> None: """Run the enrichment.""" - category = self.type_to_rf_category.get(self.enriched_attribute.type) - json_response = GLOBAL_REQUEST_HANDLER.rf_lookup(category, self.enriched_attribute.value) + category = self.type_to_rf_category.get(self.enriched_attribute.type, "") + enriched_attribute_value = self.enriched_attribute.value + # If enriched attribute has a port we need to remove that port + # since RF do not support enriching ip addresses with port + if self.enriched_attribute.type in ["ip-src|port", "ip-dst|port"]: + enriched_attribute_value = enriched_attribute_value.split("|")[0] + json_response = GLOBAL_REQUEST_HANDLER.rf_lookup( + category, enriched_attribute_value + ) response = json.loads(json_response.content) try: # Add risk score and risk rules as tags to the enriched attribute - risk_score = response['data']['risk']['score'] + risk_score = response["data"]["risk"]["score"] hex_color = self.color_picker.riskscore_color(risk_score) tag_name = f'recorded-future:risk-score="{risk_score}"' self.add_tag(tag_name, hex_color) - for evidence in response['data']['risk']['evidenceDetails']: - risk_rule = evidence['rule'] - criticality = evidence['criticality'] + risk_criticality = response["data"]["risk"]["criticalityLabel"] + hex_color = self.color_picker.criticality_color(risk_criticality) + tag_name = f'recorded-future:criticality="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + for evidence in response["data"]["risk"]["evidenceDetails"]: + risk_rule = evidence["rule"] + criticality = evidence["criticality"] hex_color = self.color_picker.riskrule_color(criticality) tag_name = f'recorded-future:risk-rule="{risk_rule}"' self.add_tag(tag_name, hex_color) - # Retrieve related entities - for related_entity in response['data']['relatedEntities']: - related_type = related_entity['type'] - if related_type in self.related_attribute_types: - # Related entities returned as additional attributes - for related in related_entity['entities']: - if int(related["count"]) > 4: - indicator = related['entity']['name'] - self.add_related_attribute(indicator, related_type) - elif related_type in self.galaxy_tag_types: - # Related entities added as galaxy-tags to the enriched attribute - galaxy_tags = [] - for related in related_entity['entities']: - if int(related["count"]) > 4: - indicator = related['entity']['name'] - galaxy = self.galaxy_finder.find_galaxy_match(indicator, related_type) - # Handle deduplication of galaxy tags - if galaxy and galaxy not in galaxy_tags: - galaxy_tags.append(galaxy) - for galaxy in galaxy_tags: - self.add_tag(galaxy) + links_data = response["data"].get("links", {}).get("hits") + # Check if we have error in links response. If yes, then user do not have right module enabled in token + links_access_error = response["data"].get("links", {}).get("error") + galaxy_tags = [] + if not links_access_error: + for hit in links_data: + for section in hit["sections"]: + for sec_list in section["lists"]: + entity_type = sec_list["type"]["name"] + for entity in sec_list["entities"]: + if entity_type in self.galaxy_tag_types: + galaxy = self.galaxy_finder.find_galaxy_match( + entity["name"], entity_type + ) + if galaxy and galaxy not in galaxy_tags: + galaxy_tags.append(galaxy) + else: + self.add_attribute(entity["name"], entity_type) + + else: + # Retrieve related entities + for related_entity in response["data"]["relatedEntities"]: + related_type = related_entity["type"] + if related_type in self.related_attribute_types: + # Related entities returned as additional attributes + for related in related_entity["entities"]: + # filter those entities that have count bigger than 4, to reduce noise + # because there can be a huge list of related entities + if int(related["count"]) > 4: + indicator = related["entity"]["name"] + self.add_attribute(indicator, related_type) + elif related_type in self.galaxy_tag_types: + # Related entities added as galaxy-tags to the enriched attribute + galaxy_tags = [] + for related in related_entity["entities"]: + # filter those entities that have count bigger than 4, to reduce noise + # because there can be a huge list of related entities + if int(related["count"]) > 4: + indicator = related["entity"]["name"] + galaxy = self.galaxy_finder.find_galaxy_match( + indicator, related_type + ) + # Handle deduplication of galaxy tags + if galaxy and galaxy not in galaxy_tags: + galaxy_tags.append(galaxy) + for galaxy in galaxy_tags: + self.add_tag(galaxy) + except KeyError: - misperrors['error'] = 'Unexpected format in Recorded Future api response.' + misperrors["error"] = "Unexpected format in Recorded Future api response." raise - def add_related_attribute(self, indicator: str, related_type: str) -> None: - """Helper method for adding an indicator to the related attribute list.""" - out_type = self.get_output_type(related_type, indicator) + def add_attribute(self, indicator: str, indicator_type: str) -> None: + """Helper method for adding an indicator to the attribute list.""" + out_type = self.get_output_type(indicator_type, indicator) attribute = MISPAttribute() - attribute.from_dict(**{'value': indicator, 'type': out_type, 'distribution': 0}) - self.related_attributes.append((related_type, attribute)) + attribute.from_dict(**{"value": indicator, "type": out_type, "distribution": 0}) + self.related_attributes.append((indicator_type, attribute)) def add_tag(self, tag_name: str, hex_color: str = None) -> None: """Helper method for adding a tag to the enriched attribute.""" tag = MISPTag() - tag_properties = {'name': tag_name} + tag_properties = {"name": tag_name} if hex_color: - tag_properties['colour'] = hex_color + tag_properties["colour"] = hex_color tag.from_dict(**tag_properties) self.enriched_attribute.add_tag(tag) def get_output_type(self, related_type: str, indicator: str) -> str: """Helper method for translating a Recorded Future related type to a MISP output type.""" - output_type = 'text' - if related_type == 'RelatedIpAddress': - output_type = 'ip-dst' - elif related_type == 'RelatedInternetDomainName': - output_type = 'domain' - elif related_type == 'RelatedHash': + output_type = "text" + if related_type in ["RelatedIpAddress", "IpAddress"]: + output_type = "ip-dst" + elif related_type in ["RelatedInternetDomainName", "InternetDomainName"]: + output_type = "domain" + elif related_type in ["RelatedHash", "Hash"]: hash_len = len(indicator) if hash_len == 64: - output_type = 'sha256' + output_type = "sha256" elif hash_len == 40: - output_type = 'sha1' + output_type = "sha1" elif hash_len == 32: - output_type = 'md5' - elif related_type == 'RelatedEmailAddress': - output_type = 'email-src' - elif related_type == 'RelatedCyberVulnerability': - signature = indicator.split('-')[0] - if signature == 'CVE': - output_type = 'vulnerability' - elif signature == 'CWE': - output_type = 'weakness' + output_type = "md5" + elif related_type in ["RelatedEmailAddress", "EmailAddress"]: + output_type = "email-src" + elif related_type in ["RelatedCyberVulnerability", "CyberVulnerability"]: + signature = indicator.split("-")[0] + if signature == "CVE": + output_type = "vulnerability" + elif signature == "CWE": + output_type = "weakness" + elif related_type == "MalwareSignature": + output_type = "malware-sample" + elif related_type == "Organization": + output_type = "target-org" + elif related_type == "Username": + output_type = "target-user" return output_type def get_results(self) -> dict: """Build and return the enrichment results.""" - self.enrichment_object.add_attribute('Enriched attribute', **self.enriched_attribute) + self.enrichment_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) for related_type, attribute in self.related_attributes: self.enrichment_object.add_attribute(related_type, **attribute) self.event.add_object(**self.enrichment_object) event = json.loads(self.event.to_json()) - result = {key: event[key] for key in ['Object'] if key in event} - return {'results': result} + result = {key: event[key] for key in ["Object"] if key in event} + return {"results": result} -def get_proxy_settings(config: dict) -> dict: +def get_proxy_settings(config: dict) -> Optional[Dict[str, str]]: """Returns proxy settings in the requests format. - If no proxy settings are set, return None.""" + If no proxy settings are set, return None.""" proxies = None - host = config.get('proxy_host') - port = config.get('proxy_port') - username = config.get('proxy_username') - password = config.get('proxy_password') + host = config.get("proxy_host") + port = config.get("proxy_port") + username = config.get("proxy_username") + password = config.get("proxy_password") if host: if not port: - misperrors['error'] = 'The recordedfuture_proxy_host config is set, ' \ - 'please also set the recordedfuture_proxy_port.' + misperrors["error"] = ( + "The recordedfuture_proxy_host config is set, " + "please also set the recordedfuture_proxy_port." + ) raise KeyError parsed = urlparse(host) - if 'http' in parsed.scheme: - scheme = 'http' + if "http" in parsed.scheme: + scheme = "http" else: scheme = parsed.scheme netloc = parsed.netloc - host = f'{netloc}:{port}' + host = f"{netloc}:{port}" if username: if not password: - misperrors['error'] = 'The recordedfuture_proxy_username config is set, ' \ - 'please also set the recordedfuture_proxy_password.' + misperrors["error"] = ( + "The recordedfuture_proxy_username config is set, " + "please also set the recordedfuture_proxy_password." + ) raise KeyError - auth = f'{username}:{password}' - host = auth + '@' + host + auth = f"{username}:{password}" + host = auth + "@" + host - proxies = { - 'http': f'{scheme}://{host}', - 'https': f'{scheme}://{host}' - } + proxies = {"http": f"{scheme}://{host}", "https": f"{scheme}://{host}"} - LOGGER.info(f'Proxy settings: {proxies}') + LOGGER.info(f"Proxy settings: {proxies}") return proxies @@ -357,23 +492,25 @@ def handler(q=False): return False request = json.loads(q) - config = request.get('config') - if config and config.get('token'): - GLOBAL_REQUEST_HANDLER.rf_token = config.get('token') + config = request.get("config") + if config and config.get("token"): + GLOBAL_REQUEST_HANDLER.rf_token = config.get("token") else: - misperrors['error'] = 'Missing Recorded Future token.' + misperrors["error"] = "Missing Recorded Future token." return misperrors - if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): - return {'error': f'{standard_error_message}, {checking_error}.'} - if request['attribute']['type'] not in mispattributes['input']: - return {'error': 'Unsupported attribute type.'} + if not request.get("attribute") or not check_input_attribute( + request["attribute"], requirements=("type", "value") + ): + return {"error": f"{standard_error_message}, {checking_error}."} + if request["attribute"]["type"] not in mispattributes["input"]: + return {"error": "Unsupported attribute type."} try: GLOBAL_REQUEST_HANDLER.proxies = get_proxy_settings(config) except KeyError: return misperrors - input_attribute = request.get('attribute') + input_attribute = request.get("attribute") rf_enricher = RFEnricher(input_attribute) try: @@ -392,5 +529,5 @@ def introspection(): def version(): """Returns a dict with the version and the associated meta-data including potential configurations required of the module.""" - moduleinfo['config'] = moduleconfig + moduleinfo["config"] = moduleconfig return moduleinfo From 7967542be67a1773b008e99bd123ea91a22dff53 Mon Sep 17 00:00:00 2001 From: Jean-Louis Huynen Date: Tue, 26 Oct 2021 15:11:20 +0200 Subject: [PATCH 333/476] add: [passive-ssh] initial commit --- misp_modules/modules/expansion/__init__.py | 4 +- misp_modules/modules/expansion/passive-ssh.py | 140 ++++++++++++++++++ 2 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 misp_modules/modules/expansion/passive-ssh.py diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 2723736..a817c2a 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -17,7 +17,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'virustotal_public', 'apiosintds', 'urlscan', 'securitytrails', 'apivoid', 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', - 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan'] + 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh'] minimum_required_fields = ('type', 'uuid', 'value') @@ -27,4 +27,4 @@ standard_error_message = 'This module requires an "attribute" field as input' def check_input_attribute(attribute, requirements=minimum_required_fields): - return all(feature in attribute for feature in requirements) + return all(feature in attribute for feature in requirements) \ No newline at end of file diff --git a/misp_modules/modules/expansion/passive-ssh.py b/misp_modules/modules/expansion/passive-ssh.py new file mode 100644 index 0000000..bf70ec9 --- /dev/null +++ b/misp_modules/modules/expansion/passive-ssh.py @@ -0,0 +1,140 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from collections import defaultdict +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} + +mispattributes = {'input': ['ip-src', 'ip-dst', 'ssh-fingerprint'], + 'format': 'misp_standard'} + +moduleinfo = {'version': '1', 'author': 'Jean-Louis Huynen', + 'description': 'An expansion module to enrich, SSH key fingerprints and IP addresses with information collected by passive-ssh', + 'module-type': ['expansion', 'hover']} + +moduleconfig = ["custom_api_url", "api_user", "api_key"] + +passivessh_url = 'https://passivessh.circl.lu/' + +host_query = '/host/ssh' +fingerprint_query = '/fingerprint/all' + + +class PassivesshParser(): + def __init__(self, attribute, passivesshresult): + self.attribute = attribute + self.passivesshresult = passivesshresult + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.references = defaultdict(list) + + def get_result(self): + if self.references: + self.__build_references() + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ( + 'Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_passivessh_information(self): + passivessh_object = MISPObject('passive-ssh') + if 'first_seen' in self.passivesshresult: + passivessh_object.add_attribute( + 'first_seen', **{'type': 'datetime', 'value': self.passivesshresult['first_seen']}) + if 'last_seen' in self.passivesshresult: + passivessh_object.add_attribute( + 'last_seen', **{'type': 'datetime', 'value': self.passivesshresult['last_seen']}) + if 'base64' in self.passivesshresult: + passivessh_object.add_attribute( + 'base64', **{'type': 'text', 'value': self.passivesshresult['base64']}) + if 'keys' in self.passivesshresult: + for key in self.passivesshresult['keys']: + passivessh_object.add_attribute( + 'fingerprint', **{'type': 'ssh-fingerprint', 'value': key['fingerprint']}) + if 'hosts' in self.passivesshresult: + for host in self.passivesshresult['hosts']: + passivessh_object.add_attribute( + 'host', **{'type': 'ip-dst', 'value': host}) + + passivessh_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(passivessh_object) + + def __build_references(self): + for object_uuid, references in self.references.items(): + for misp_object in self.misp_event.objects: + if misp_object.uuid == object_uuid: + for reference in references: + misp_object.add_reference(**reference) + break + + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + + if q is False: + return False + request = json.loads(q) + + api_url = check_url(request['config']['custom_api_url']) if request['config'].get( + 'custom_api_url') else passivessh_url + + if request['config'].get('api_user'): + api_user = request['config'].get('api_user') + else: + misperrors['error'] = 'passive-ssh user required' + return misperrors + if request['config'].get('api_key'): + api_key = request['config'].get('api_key') + else: + misperrors['error'] = 'passive-ssh password required' + return misperrors + + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'ip-src': + type = host_query + pass + elif attribute.get('type') == 'ip-dst': + type = host_query + pass + elif attribute.get('type') == 'ssh-fingerprint': + type = fingerprint_query + pass + else: + misperrors['error'] = 'ip is missing.' + return misperrors + + r = requests.get("{}{}/{}".format(api_url, type, + attribute['value']), auth=(api_user, api_key)) + + if r.status_code == 200: + passivesshresult = r.json() + if not passivesshresult: + misperrors['error'] = 'Empty result' + return misperrors + elif r.status_code == 404: + misperrors['error'] = 'Non existing hash' + return misperrors + else: + misperrors['error'] = 'API not accessible' + return misperrors + + parser = PassivesshParser(attribute, passivesshresult) + parser.parse_passivessh_information() + result = parser.get_result() + + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From eeb321fae789da5bf146cbda6ac419c1247b8e04 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 27 Oct 2021 22:01:46 +0200 Subject: [PATCH 334/476] new: [doc] Passive SSH documentation --- documentation/logos/passivessh.png | Bin 0 -> 58594 bytes documentation/website/expansion/passivessh.json | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 documentation/logos/passivessh.png create mode 100644 documentation/website/expansion/passivessh.json diff --git a/documentation/logos/passivessh.png b/documentation/logos/passivessh.png new file mode 100644 index 0000000000000000000000000000000000000000..42c81906d60af82a6899dc5b3cb4eb7dcc175ff9 GIT binary patch literal 58594 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

!lFlbQ;9W+kwD2P&4zy>EjJDkL>n*0mkC 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 z znT1|^*p3san0`rQXGy-+y+}Jr08mg_^`RC&Ke;JK765VM>jp*JjluF|n<+`RHsyPWZy6qF;xXF@tFad(+@br(gg%I5 zUytHvl$t}Y`i;$&&wGx0zb{^@S4UR;pENL!Ax$T&ru4ywb*ZDW{biL^st`}I=i13Q zncOODIxU`=ZxSeu*z%X%J~j)UDNKLu!0t1=l39L%liyQSOZHf?7d~Et@uuDn}jcn6>; zjHO*6UmtUCF#H6o={LwO-xF}GUOo9s>C~nMcLjFBbJ*SBO@%$HJr&vS+TVB}tIhNb zDoWtU#@{p9+b_M-{)^LORBSx{=1ydHhUR2%Y{?OMWiv;g04@`<6XYHS43F_Cnkj;hnM+)|3%=USIChvFfk3nUM+y3XG&q?GPSxkcd zVqNp6Hg||Jmvr;EM@++!UaM&_t!ayO_=ICkGE}L@tOPyz{5P+rwsyrp5bxl+S8j(m z+lm2!e;QVoqPhjaKeKm1G&3gt&N3$#Zz(a6enQCPtmiX`Q%3^nb`IYf+UCKn3kWS^P3Pu)Yutb>i8o$|;scubY+v_Hkc5FD}`eW0s+l7{}0xrR9&?K%nWw?`JMTT;AU-YdB zI3~rd7S4w%^9tKs^Zdpx<8w6wH33ZgfHtgC$37s;u>ARnBObkd4pmBCW(c<%T~Kj6 zaT-@{cfb&o=Q5X@;DibhNLX>CdZgV+1nH9;bMxJ{l8jLCzW{2?vYoyT4s&o)OS|)B zW?RWYI>QDXRk6XA5`Q<30>^_P;p_5RK%t53%2(l&f}boc*a$l4}{2aJpq zs$WtR6;;<%{)re(#Cq0s0ZE55_a44gF)iJTxFYmxqh|cCQ+ZjCL!f?YwLF|*I{W2V zajgt-=Ruz_8FWs*!WE7deu$k6>fRvNq#fRDzvu2Kt8`KF+9ZLT6%rJXmj!{4v4K4f z6cz3DPr)IMbiGX9HHVN(O7qWdnp!UH({Ux1XhpNF+$ zFKDP2K|7$#JrA$%1;j!w*VejLXabVi0rZ(TO-K}0E7E!!mLb1!d~C1hWiT9sOM0Zu zw5iY_uBbzxkn0n6m{kbzda%XW0RcK&eFA-ng3P(b?D_SlYU6@VjhZ9-cXiq!|Ei*5 zm@!)4LL2g)2xgQXL(^2*$m8q(KHUWI9s2Pd z`u4mOFRxlH1iu`yJ>g$03o0HExGrBn>7=(Q`xFO@iqpm82xeJy zNpU zXt+cB>8cwNFzcQTT$2pZpW|57s1NR)FF(EaxN2U}rsZS((;L_giHRE@)@P9kmMZuz zQ&+#D@4>DC*L`(7ACrps-CC7<2E&g*nDn0_ctY~D11Ts#a&?DFBQq)FONVL6=1DPA z`lb0ZzXNns!|a08FUe#0j?u?lI@EN0VVc(*%Jk=`F0ac$&tHWjMub4U0SF`}CHLH* z6bJBwe(47FY8*ynj648Z7J`Z|ZMi@m%)8QYWU~vaSM={h{V~2CGZ(5-2WKBH3_UnW z^40?)3#%us5N-KNxC2|q{@TAP)dGyA0O1!v(cl-D`PBk3ig#~lY)7G9DK^}Szl|$x z#D)Ew_kpWGR^g2mZZ!EI2VM*)wZUXpT#%zJtl3I}U=qBY*Ph1+5W|7qRwMMX6bN6# z6JuyeOu$I*Wcs_uF<*}d0P>n~1*Ak@2!ukTW62`0+bTrx=AV6+J1w>53IfRDkG*Tc zU$a4=Kea)SAHLL2gZOCIyT~thyzHfScVK}JZTMEG6B{4hJi9Y!YKTt%W}&YB{ycB^ zvL6E?o?_2MS9e-$O&Q^O;L3le+dHz|XIv?)RgKWO)9G!N9{ye|2bWp*-x10WQ(w4o zP-buDQDq`KdD`)QZJy6RAiE{cELK9RN(|9pEKe}`HmI0y_lks@%If#==R4KT&sokE z9~Cv6s^;Atg+{HKPy#m#N=drWfD2$^VYq@)yxYi`Cw2dQu6zxK&Eu+BMKP6^&IMn= z42OMA{S8X)wd6y08=h*}AUlW&d+hMgZ_uHn?;1!0Vk+28D7Ub!G2`({@P2<Q2(iP&_5zP+vRPXe?>5c48>9^s57?_CS*QMYXlSJn@b-Ic&ZCoZ-zn;w~&ZJJJfM z1jhB`B-d+wmW2{LVJbjP(;QF?`0aC`eSDiwButwNa8ms!kP!OXxK`Jg8Vw)TJz zH4M;9j1qpyK@`IswuEJJ*Ql!s6KbPvKm;>?bt$kAc*h@XAi4z76W_?D=lISwslBft z;~F~q;9CW46IR&$kt^<`cbUY*Hu<*sj%{tO^yQ%6N=eCWM)j-DI+-Ge;c%D>k^68# zJk|aNvFbthRbI5Q+JKT9Cs=jWg>NQ{R<{i5Kn7BQDAT<^&jl!oK0GqXLIcL{@)uVA zb2LH4xm7nfGvSz1m)dYlVOxzoiYFx%3@6x6b^se}xma*=M<~{r9{N*Z$s&b?IwVZ<}ZJcJq=kmANDwZMGfo?hONxK?F3NC^Kl?v}3tZpippGs%e7!INTI=#n!dS$uvtqYY_wZcw5}SjvlbZH*mez+xWW#^|Fzw zf`S5>qHEk_Dvps^*~-)|nLBJJTYh@-{U45o_ak$T(wnsAQSDWBv)P)3t#O80b4He> zCpt*~i6CL{va{Sr?PY1%Uc0dyyoZ(alKL6nEqU|Tz20P=z4N)1k7;-{BI2_DD1K*< zUzo9v2ak0w+h0s;**aD!pEnn49Q+zd7&(;g(vjLuBzC^tyEPt(_8Lepx-S;lTKMr; zD{)A?Eko%$jnik=x+K<@m>367>P)oj6qt1-mNptD-)`AdEBlEyCt1eKyV|Fmo~NY{ zJg~OX-#7e{klibt``8BuyZdRk9m%dCoX2qRQTu_r?q*oM=!CBfY?7YseyRkw}>sGKE!`+L>-mwFi-lMCp@JLPWYnA*RbPXNXsL-lLj%oRDIn@P$R;V zFC4UB+nQtjLqN)NO5(Rc!lp-);gp9WWi*3^>*>+qL*B#4@n&IR4qFS?d2CDXS+Kqwib-MqNTM9osh#xwI zTeB#_ye%P8PX79(n!Jo0*TFOjL^)tJz`7z>wje13A}ott-|_OImB=VN+exi4#Z z>Q3KidknKo*VAluYPvr%;FkL(*xUG?`L6@7bno+w;~$D6Bd%dzcm;%Icl0;In-uBr z-z}}(`sv5}+~2zn8NE^obmtf5d+oJ&zYwoL^LDD~_tN&#;0al@+H2gQ{YXb!qE6lF zS5a0LKmLT%Q}}#*s`c%~_vt_VOPf`ZTCQ*kbnsjlt&AiN1)Gf8pshVu+sdgyh-_x% z2~vX&^ygkdaT)Xm9eJ~33Ea6`aa301?TabFOs+PnPNRxZ;%`;u^ijsUJ7(|ZzF%%s z{gfaLibj5G9?GgxNS0WmRx0pn_q)>v69hZd&wot_jk#ESoc(!1?heJkFKj(8WL>T*B9yk(Rw}W`zJMZt%PSX0thPD4!`ftpHj%7%V)w^NF zFTeWc>BWWDzcT(;6ix&qFm%HmjF5KdUEgj|Gm`yE)(mjz3~V=}WZBNJJ)dpOS$-$e zEkqkVqT&&7Bsp*RZ@hSM-8|Rg)TT?b!f%A^3Qp`(Ih2`DxgK)nkic&KBq$*RFXr=sW!!#(ALef4zAIuHZy z=00p!+($i8zWG~@8SCAT5{o+dO5^-*ym=A7h>A0^0eA0t)?Sn{+otD9#kgeI&(Pdc zjA&}7NhEL7@B*?>3PMRmqUV*?B5(g{m_4Dr(hVQIbuGX&!8PdC#2LJ(&Nw(G4QyUK zA}7a4Q~NY-CPGHS{G?7^E_`%`sabG)wKsMCFX_7R)GD*>O{bfqF833uGCD#J9MS8S z&evDBD%FdmuPtUf@$G2-b+}-Wq;>mZlc_lD%g0zSdJbT$9wT&a`z!C~k4W>+SvVc)wod4q!pm(vd$Y^%gsM%?t5k|BT`tWd2A0-@ zNQT!H6DdMAY|#y7PriNOKrId2cHg*t7Xs6*wZ0Gdc@LLlJNVCkE5G4DnRqXb({ikt zs2O>Tv*Xl3U_WVI!2i2G=yD(J31yJJ9P-8_FCoGD26>jz!){Dp-s0&%k(}mX$GFz* zk0YMwwRsxw5qbK*4G~e;x$+fDz-R6JQfQ!ZgjfDPE&29;Spb`9 z6wHO0UJ%O|`W zvObS`(@?Lx5Xv7fIq$g*nZr@M3=j)!$ifuc_>WSZ&hDR+!*VDdD@}GLXSh?2GJNlcCp;YZKL5U3L?cq*W*HG=lFn zP`*3!dWMy4l`$6Y>Iz~4b#HS9;AOzuqjsp=k4Z$HU>F|Mdg_omS8s<=JywXe6QLj4gNJZ~7S{?;-KEzsqoDxlHmrY$NA%Fwts&nn8;iXH zxQ6Pb(lze=={=Wp5Xy-l9zXxu?)z&Y$s{JNj-gyCH?=XI z^+nJmqC1Ck9k+8v`0nTYC+DY6nm?tjvR`t$oV|xBE1xeV+%T`_DAWYbLPkHh6TIqA z%eJ2=M*iS`x6sjfI&~`&#kWYCm$uhBlbE5LduQdQEKoe6u_R4@H>Gn2YXKvwI)hJ^pKHycf%f zw{G8cw${Q6H)EnwRxL+c@{K!{v(3Z+Rdp|Wp+w3p%|CdYBJAby0)C=K#(`?V2)#_K zhNk?iXnl3LdAAdD$FuGcjRbmSm4=(YvcKx#3BRgzmw2lAl{^9`i-KOFWs{Qq(bjgo z!ygg4tIM=n{>vdtSUlk|qA`Swo2(UeAs<&beA`chFZr0hpIrHc9p&Dm?}}C~iz+-{ zS5-b3%EHTDMFpe#p^A7>`FAj~hCD zc*faH6!=c#_3u986PIrcOxb4vrDn#FAI_mpX*wn|Z$M{)fx zZ(cImDo4i3M{})1BkjMP(w6tPZl#sa`HdL08IcLSR=1LQ>+gs5OYJW5+MT?uwq3k` zhs@FZ^LXJ5!g!y=>n5rqTY8;P(?R@9a{;$|zB2M}h3QYiB$$Z3(gv@PX%C zc0w_)>aCaiv-g!9N_nHLIjdz>M{87nxZ=K*b6*w~ULWh(ZeHvC-7YUXY&NAjyo87K z3nTiIO3}h{o!}kAjY`y$S@RtkCG$#4Xq7{2I1w$wEi|}E^apUF!zQZ+KRW!@;R_6d zsXFr@4Qsf@T6h<6RTipU_-9~$@ZQk`pVYYbV?u@9FeE3Z(UcI>x%``TPJ7(>E}tG% zDntUb;QD>N;*wh{20VrB)kfx96te9Pv4@O`4nGVd97ueCe>^FY=!(*2*E>ICr*dp! z_*nSV_h1S2aJ0=+SMX1uAh&SuB+Ye1*MrAVp|5e;up8|x)>RG0L+yjOeh;B|aQh+f zc}$q89rR-zk$q9_e{gP0)X6-}vciftu$}9CO9a3)Ztl9qZuS7`<@ed9jP1E++&BF_ z$IdU64+hmKyB!(F{7ZEUg>%Ln00(D7-Q#S+0p6s#cZ(oq9&)|-FZ`~V01y7@&{2I< zx;AyWwWs7ffZZ8uf!26(f9Ae3WYzUUr2h_D3R2r_xCV9a!CaOh6^{t$zZp9-tnPDn z-1*&}*{_w7(uHWn@(QEZ1pB`}^6ruFiJD%Uv#l1T!#@K?*pdGT@xHFBD`WlapMYm8 z{n7=C#vik2&}DB~n)qjgKP2wc5##3X*{jU2Bv)FvojJ31%jWIb56>*oK2!d~$=2sO zDl?T$z~ZY-KAtX76oZKtjCv`GT77@w-)mKRqgKM#bWhp5Ggz$kkgB*oj2#roVFa+! z4Smn<**bZ6aOTb4y{dzfopSsJmDNN|;5e2cF=W8=_&FQdJuQ|Vrv&Iqo~4fJ_RuMNch?KuexPx{pm z1hn_Jtbl+~>k#RFREPVix&d8?DU6DF^40=PKSUk~%0MKSrwD9}phRLLRB)GCIF!$u zCFyL(m{!ztOdrQb`oNzsas&{!A%JO+=B%Lw^~q!)S-!NwF=Ll8LcU#A=zMHnnE8`K z`(8Etr?@ukSr4iwcY^S9v}rMlRP~8sv~{7-MyA@r&Dd?gz< zW_Z>E)Q6!Yb0f<-Xq3>U5GCJmmC-HB6HcvuI1 zQftP9XY1i*Q-DYgE%D=FTLV1VJtqEw_|HlFP|{X*Lp|dI;1Cd$#>DHfgjyW8&(*Sp z9(w0rPI5fwIbzTJnugg|>L=joQs~gF)1UX|@K}c@yIq$)gB5qkl_vO@_OWUxHen9= zuV-r6%E}xdR=lOBVxAJxE&Cj%JMaZPteVb=`i9jacIoEjHu}PoFP(~U0plAY&+rOP zN^P&Ha9+&XiqrqvB3(Z2*Fz{VITwk05$7zaM=qB%`$VWIhag9y!<)Ct{&%ILbDHz0id$`}7~j*<_ylO~UcA=VRP_k zxe}D-SNxRQcr3SU^QH*xs+k4;ScygGW;hh6Nw%#pf!FD%4t2e%vb=nTbW`Nlb%whQ8v?@xzpF7WWS03v&;SQ<01P+c83U3=eU$yO zJ`;*jaQ(&D7pQ;BL-b=|I^F+}EkIv6knV9+tg^2Cw2;ibC)JWun4&Gha|IRln+AeD zyMdb6&wWEKdsH+y4af_E`;sj-bIbR-J!`hb?oUzuuxG(pZE~p^G)vLG86wUx(VUCr zY67fiePc%JsOW^wJK(5DIBoI9zWdO??()aZw>)#A*7DwPg{a z`f=GtWbS#L;5o;}fve+N#@q9~+g`le&4)ofdpQ=TFF{fZu8^-BC#I!$6Yx1fV9LjRtl$_la0r*x zY*IH*aem^((z_Stl&RW9-xml``Jly*|7<&+cIdK6ed=EQO#cMy*Y2_W87WrgSR~0D zC-L$%yV|#I&L@|m#D(RGmzuObg81LQ&9(($syDu1K6#u~$a{qb@B?GnKJNVu0=m^4 zeqgLyiojbp>WRvN1&;PfBR~g>;i;FFk4Lh-8w4?yn@%f+rq=$;p546~a&NvNb8d*79BU7tU*XT91@o7TR>H8$$dZpt*0kHrRi^&WFw-~bEmcN z#vUav^oKoMk-D$_km{W>gL7Y+NX}W>>60?w{MAG96}RYTHWdoV$Qlq$n)Na49M~-K zV#{wI(%8=bSxVOsVTl^o~6(3%GdY9?o^t;y+2ndd*nHcS6?I8&`YE-F-yvcku7xP`ISX6 zRWiKVZ=OneXg(6nnT1=bb~q8w`Vy4|R3bgarGY*~;1>x~kdYatm~H3&Xz8k493D}i zMFO~C_U4d*Ek)GOAm||ht#jJWR~DjIB<&zQNpSK6A||?-#GM0a|1&e0BG9XBVdO2O zY5l_OyIYA1$KYGHgu;hUK^Dd!6y^A8;?YX;R6Kw5o>GGiZ^oyznc>P_z1pDU80Cp8 zBUQcS`Sxn+mwX3($n%o#|1U=mxbXX6#3=JK%tXg0j!G|zA{UPDWN4t5%#sz6`6AW( zw$pi`l1)$k-GnnaDw`cN_YARNK_W|XV$i52c1>dpD()yTvwB`UCmQ>C>qOVYWPlNL zJG}h+jtf*2#j~m?p4dsauNsw{#n~nnXPaoXx!HE8onEJJ(sge%LWr|xl$qw~r(T6c zk$tsxcAlBqRZWf6lAUNE$)rK2mZMS1rxdK#sTEfkTz!|5` z+dfFoRgmI)oj!VAYp&}wtv6b`S5wBud!E-o2mTuKfPeeH+i zCRmk?*(DpTE*x$@ofj%;KX;tilx!Alc$BO$uKch+gl%wUH=$$5htKCntyZB?t5~^V zR5{(+T+5Kdj>c$W@rK7DzmGPjk-ccmltXd`+yP!c*2!BZEjX*+WMN?zcdXk;ZhGPs zMk*5o$_wI1jn(qv2TfDfg8jiT`)Y0MueFgLuOl}}$}6PC>M-e*R~(;}pyzA%7x3cF zCc65k*YWA-^|1YD=d{O-#n=)UfDGZ*yRX4e7)!sGrfwI<8~dkxDixcsYE&m(|5mQYcERWb=|_HZMtL&=a7!dx!?Bi@FXcL*B{VTM>BU_-HJo zkV`j7c|jb$K$upWo2Kp|>N*B*Xa~%xi~ZbFnuJUcNQhRGY1T)|9G9Sw%P7qr@4C7N z`#Al1>s8pk`&B~uo=g7_5RJj+8(ZuSl ze}YmyN^#39DWCCY42HrSIC6sbckZNWC>f*4Mslo{;CqIYMMWO+T9us7ugm7UZ=NR@n)(6j3x*?Z|4eat=p+iv zo>9KEs~Nj<^rj4kM7)8}j9D)0<|lA}S<1NI1w$epUl5N!#IP?!U`$_TUa}#QFqmu? zee*;o18zTeElP@z;z9a?N^@c;&51!2C3kU8O%LZgCw8gpyPW*=!)CUwOv5}TW>G6; z6s8&}Of_=f(q#HvevZ`la;V-u?H4>92HgP~twR*1NHO!Wyx1#@a(?<~iOA~@QQhL; z_}ecL@C~!(kv~H>(s8dFL%bG*@$vSQxa>I9$TbXyLu4&jMRLvp6sqg13$FUaSJB6q zk;&wda+sxmn7!3KtSE?M>&mpq_q;4OmR(gnINVp?(J|-=aJ-?9;|+ae#Oru+Lv|!F z6lYYiBqxRwjs4TCa{Uls_T1M&kDor*wY9%wn04H@bkrd0yPWK;u}$e7e&=%wk;$j7 z2Z|zmRBPkNgvZ+5}l#8=Xym_K)T*LUX{LwhEs&#;x zBk$2~X<^=~EhJ`*3QLJ&vQvZZ0H-G?v0RR>3#SxjUyhCX5qDmE-k967H*VXBd14Sf^7W~ONG_3+DmZT#`QqoWDtrA5z*QHH~_ zXq4B3JBrPb-R^v+lb3flPsvAA$Ym(xGnXIo1;SLf4N%=C$wHW;)D)x`nU@|#VQN&w zu=roGq0nMrP1QItwKEjBmroU)+TD9BGTP>^C|adu2(H%^b&v9&ynUma+h@q3&I zwQYk8`$K3|a3UfR{n_jg@G=u+ z!YG}R&)zY9jA2#ltjSRNJ{F0ds+NIBJ5y;+3?6@o530IxkGK>9kd>(C{<0LZ%zB)| z0rYAG@+rD8RushZxwQsr+6Fn>IzWrf9a--Z;-l28E{>i@3b$|<9F8W=*adEFkC1*)a%s49HxoPU3SA$a*9o)MlS#pV^HN+W4Z@#ha?NsO< z@Ur8ig@;y14bnxaQ9Qq;kUcd$oa=CoyEXz+i&<`xfrXjT6sAP6>ufj8J?=?XpBbWb zN*-LE%6&_dsq1udq02>^-9!J7FH$-)XcVNy=~$W@Luq!*IB)#DO6!EI9)(=S>S8mi zip{jy+|;%Yj(8Y8Jl-H8QY@MjqhWq}G^>i@$B`6j+XrXdpL@L!MXEj)MtQitm$Ka0 zNIbWyD4vRrfAObE=fMI_Kr9y^5qqw07mCK=!%UGCc zibyYl)HNiNO+E-?U#*QJ^}SQBDX}3?$s<1kS$xYIuQI0+lqjbs%;}3r@ z%-$Lsd#bOTS>$m0aSZv#>4;t`QA~vD)&br)-gVWYz0=`jV}HabFX2qH7kec3)AgXu?q=s1D+@AB6NUqm8BOHCCM9-+!y>O8 z>0n`|iM(XP73&BB$R|jCxxGO?s>&Z_sk{+)`uTh{;$_a+T zxQ2t+27Pq&dT6w|ZfM36B-QYoMCn?Zqt!&|lq2UB@dYFmb4&j)jn<*7qP3|MGBVA2 zGR!&>qt(P1RH&75WP*SxmxOSVWP^ zFRagAIxEGO=YLlDG6-LsjdRUm4j)s5!ZLBq4?e%-=&WR4#kmPwbC|<45MTJg=a(FX zn>Y$@ECfO9nf|Cb%;66d0`CM|#=pPx-`S~ChGla`Ifpq+1d%tQbgHdC`qTVKvSF6o z*YKSCI)^!ohX;gjM71yeAc$5`6dVF!i-2Gi!6JkOYgmpWsPK0D=<)JvSAAnv71G5X zAamNo<}ioZgAeEj9D;x)EDF|$p$Vcx3}Zniv#OOc%fEhh;q-D0Hwd$4lp=Hsb4EFb z*?|MFMhs2Ffq(@eY`tV?%23$x-7l6}5ro@rHu0<(r6AHXd(QG4eh=XQtRp`yh=Mg@ z(yz~^0006(Nklj?`oivq7*-?q&5t#1i8XSnBWh*>mB>Sk^F<{WMz1TTmd zz>0uF3}X=ltO7V92@yeNaR>YzKYh0B_L;788)5d`*O07Il+9V?#}hNlJSsz)_U}Gb zbbUQsbC^A&3>!VC1-I4#Os?lKhuOq1&?AUgMFE>+U}BF5HW^q%5u1p-+a2(C|Mc0i ztCRhn!*yX+gS_W{e&&0E$aAxK&Ob2tfj-8j_&;Wu$2rXQBK%QBA>rTFJEk8`+z zxMkJ+=UzRc72LY-fcVv0@IHotZY0;yj(`Ob8=}}FB3J~l%M>zeNaODQ{-YJMCXGFZ zIlyf|v3dS~tJVmq+sHR8B>(^b07*qoM6N<$f{v)+_y7O^ literal 0 HcmV?d00001 diff --git a/documentation/website/expansion/passivessh.json b/documentation/website/expansion/passivessh.json new file mode 100644 index 0000000..68f7eb7 --- /dev/null +++ b/documentation/website/expansion/passivessh.json @@ -0,0 +1,10 @@ +{ + "description": "An expansion module to query the CIRCL Passive SSH.", + "logo": "passivessh.png", + "input": "IP addresses or SSH fingerprints", + "output": "SSH key materials, complementary IP addresses with similar SSH key materials", + "references": [ + "https://github.com/D4-project/passive-ssh" + ], + "features": "The module queries the Passive SSH service from CIRCL.\n \n The module can be used an hover module but also an expansion model to add related MISP objects.\n" +} From aa21c8619c15758c0608c4b96d223c4c620da07c Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 27 Oct 2021 22:23:50 +0200 Subject: [PATCH 335/476] fix: [mkdocs] updated configuration for version 5 of mkdocs --- mkdocs.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index bafd3d6..c799d20 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,12 +23,11 @@ extra: search: languages: "en" social: - - type: globe - link: https://www.misp-project.org/ - - type: github-alt - link: https://github.com/MISP - - type: twitter - link: https://twitter.com/MISPProject + - icon: fontawesome/brands/twitter + link: https://twitter.com/MISPProject + - icon: fontawesome/brands/github-alt + link: https://github.com/MISP + theme: name: material From 04a6e89813380b446ceb979b57ff99b2b2d15aa9 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 27 Oct 2021 22:24:38 +0200 Subject: [PATCH 336/476] chg: [doc] updated --- docs/index.md | 122 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 53b3e77..1297a3b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,120 @@ +# Home -- [expansion](./expansion) -- [export](./export_mod) -- [import](./import_mod) +[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=master)](https://travis-ci.org/MISP/misp-modules) +[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=master)](https://coveralls.io/github/MISP/misp-modules?branch=master) +[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/master/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%MISP%2Fmisp-modules.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FMISP%2Fmisp-modules?ref=badge_shield) + +MISP modules are autonomous modules that can be used for expansion and other services in [MISP](https://github.com/MISP/MISP). + +The modules are written in Python 3 following a simple API interface. The objective is to ease the extensions of MISP functionalities +without modifying core components. The API is available via a simple REST API which is independent from MISP installation or configuration. + +MISP modules support is included in MISP starting from version `2.4.28`. + +For more information: [Extending MISP with Python modules](https://www.circl.lu/assets/files/misp-training/switch2016/2-misp-modules.pdf) slides from MISP training. + + +## Existing MISP modules + +### Expansion modules + +* [Backscatter.io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/backscatter_io.py) - a hover and expansion module to expand an IP address with mass-scanning observations. +* [BGP Ranking](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/bgpranking.py) - a hover and expansion module to expand an AS number with the ASN description, its history, and position in BGP Ranking. +* [BTC scam check](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_scam_check.py) - An expansion hover module to instantly check if a BTC address has been abused. +* [BTC transactions](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_steroids.py) - An expansion hover module to get a blockchain balance and the transactions from a BTC address in MISP. +* [CIRCL Passive DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivedns.py) - a hover and expansion module to expand hostname and IP addresses with passive DNS information. +* [CIRCL Passive SSL](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivessl.py) - a hover and expansion module to expand IP addresses with the X.509 certificate seen. +* [countrycode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/countrycode.py) - a hover module to tell you what country a URL belongs to. +* [CrowdStrike Falcon](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/crowdstrike_falcon.py) - an expansion module to expand using CrowdStrike Falcon Intel Indicator API. +* [CVE](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve.py) - a hover module to give more information about a vulnerability (CVE). +* [CVE advanced](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve_advanced.py) - An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE). +* [Cuckoo submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cuckoo_submit.py) - A hover module to submit malware sample, url, attachment, domain to Cuckoo Sandbox. +* [DBL Spamhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dbl_spamhaus.py) - a hover module to check Spamhaus DBL for a domain name. +* [DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dns.py) - a simple module to resolve MISP attributes like hostname and domain to expand IP addresses attributes. +* [docx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/docx-enrich.py) - an enrichment module to get text out of Word document into MISP (using free-text parser). +* [DomainTools](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/domaintools.py) - a hover and expansion module to get information from [DomainTools](http://www.domaintools.com/) whois. +* [EUPI](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/eupi.py) - a hover and expansion module to get information about an URL from the [Phishing Initiative project](https://phishing-initiative.eu/?lang=en). +* [EQL](misp_modules/modules/expansion/eql.py) - an expansion module to generate event query language (EQL) from an attribute. [Event Query Language](https://eql.readthedocs.io/en/latest/) +* [Farsight DNSDB Passive DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/farsight_passivedns.py) - a hover and expansion module to expand hostname and IP addresses with passive DNS information. +* [GeoIP](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_country.py) - a hover and expansion module to get GeoIP information from geolite/maxmind. +* [Greynoise](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/greynoise.py) - a hover to get information from greynoise. +* [hashdd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. +* [hibp](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? +* [intel471](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). +* [IPASN](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. +* [iprep](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. +* [Joe Sandbox submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_submit.py) - Submit files and URLs to Joe Sandbox. +* [Joe Sandbox query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) - Query Joe Sandbox with the link of an analysis and get the parsed data. +* [macaddress.io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macaddress_io.py) - a hover module to retrieve vendor details and other information regarding a given MAC address or an OUI from [MAC address Vendor Lookup](https://macaddress.io). See [integration tutorial here](https://macaddress.io/integrations/MISP-module). +* [macvendors](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. +* [ocr-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ocr-enrich.py) - an enrichment module to get OCRized data from images into MISP. +* [ods-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ods-enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). +* [odt-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/odt-enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). +* [onyphe](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe.py) - a modules to process queries on Onyphe. +* [onyphe_full](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe_full.py) - a modules to process full queries on Onyphe. +* [OTX](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/otx.py) - an expansion module for [OTX](https://otx.alienvault.com/). +* [passivetotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/passivetotal.py) - a [passivetotal](https://www.passivetotal.org/) module that queries a number of different PassiveTotal datasets. +* [pdf-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pdf-enrich.py) - an enrichment module to extract text from PDF into MISP (using free-text parser). +* [pptx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pptx-enrich.py) - an enrichment module to get text out of PowerPoint document into MISP (using free-text parser). +* [qrcode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/qrcode.py) - a module decode QR code, barcode and similar codes from an image and enrich with the decoded values. +* [rbl](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/rbl.py) - a module to get RBL (Real-Time Blackhost List) values from an attribute. +* [reversedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/reversedns.py) - Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes. +* [securitytrails](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/securitytrails.py) - an expansion module for [securitytrails](https://securitytrails.com/). +* [shodan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/shodan.py) - a minimal [shodan](https://www.shodan.io/) expansion module. +* [Sigma queries](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_queries.py) - Experimental expansion module querying a sigma rule to convert it into all the available SIEM signatures. +* [Sigma syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_syntax_validator.py) - Sigma syntax validator. +* [sourcecache](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sourcecache.py) - a module to cache a specific link from a MISP instance. +* [STIX2 pattern syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) - a module to check a STIX2 pattern syntax. +* [ThreatCrowd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatcrowd.py) - an expansion module for [ThreatCrowd](https://www.threatcrowd.org/). +* [threatminer](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatminer.py) - an expansion module to expand from [ThreatMiner](https://www.threatminer.org/). +* [urlhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlhaus.py) - Query urlhaus to get additional data about a domain, hash, hostname, ip or url. +* [urlscan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlscan.py) - an expansion module to query [urlscan.io](https://urlscan.io). +* [virustotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) +* [virustotal_public](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal_public.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a public key and a low request rate limit. (More details about the API: [here](https://developers.virustotal.com/reference)) +* [VMray](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vmray_submit.py) - a module to submit a sample to VMray. +* [VulnDB](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulndb.py) - a module to query [VulnDB](https://www.riskbasedsecurity.com/). +* [Vulners](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulners.py) - an expansion module to expand information about CVEs using Vulners API. +* [whois](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/whois.py) - a module to query a local instance of [uwhois](https://github.com/rafiot/uwhoisd). +* [wikidata](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/wiki.py) - a [wikidata](https://www.wikidata.org) expansion module. +* [xforce](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xforceexchange.py) - an IBM X-Force Exchange expansion module. +* [xlsx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xlsx-enrich.py) - an enrichment module to get text out of an Excel document into MISP (using free-text parser). +* [YARA query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_query.py) - a module to create YARA rules from single hash attributes. +* [YARA syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_syntax_validator.py) - YARA syntax validator. + +### Export modules + +* [CEF](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cef_export.py) module to export Common Event Format (CEF). +* [Cisco FireSight Manager ACL rule](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cisco_firesight_manager_ACL_rule_export.py) module to export as rule for the Cisco FireSight manager ACL. +* [GoAML export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/goamlexport.py) module to export in [GoAML format](http://goaml.unodc.org/goaml/en/index.html). +* [Lite Export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/liteexport.py) module to export a lite event. +* [Mass EQL Export](misp_modules/modules/export_mod/mass_eql_export.py) module to export applicable attributes from an event to a mass EQL query. +* [PDF export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/pdfexport.py) module to export an event in PDF. +* [Nexthink query format](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/nexthinkexport.py) module to export in Nexthink query format. +* [osquery](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/osqueryexport.py) module to export in [osquery](https://osquery.io/) query format. +* [ThreatConnect](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threat_connect_export.py) module to export in ThreatConnect CSV format. +* [ThreatStream](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threatStream_misp_export.py) module to export in ThreatStream format. + +### Import modules + +* [CSV import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/csvimport.py) Customizable CSV import module. +* [Cuckoo JSON](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/cuckooimport.py) Cuckoo JSON import. +* [Email Import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/email_import.py) Email import module for MISP to import basic metadata. +* [GoAML import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/goamlimport.py) Module to import [GoAML](http://goaml.unodc.org/goaml/en/index.html) XML format. +* [Joe Sandbox import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/joe_import.py) Parse data from a Joe Sandbox json report. +* [OCR](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/ocr.py) Optical Character Recognition (OCR) module for MISP to import attributes from images, scan or faxes. +* [OpenIOC](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/openiocimport.py) OpenIOC import based on PyMISP library. +* [ThreatAnalyzer](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/threatanalyzer_import.py) - An import module to process ThreatAnalyzer archive.zip/analysis.json sandbox exports. +* [VMRay](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/vmray_import.py) - An import module to process VMRay export. + + +## How to contribute your own module? + +Fork the project, add your module, test it and make a pull-request. Modules can be also private as you can add a module in your own MISP installation. +For further information please see [Contribute](contribute/). + + +## Licenses +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%MISP%2Fmisp-modules.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FMISP%2Fmisp-modules?ref=badge_large) + +For further Information see also the [license file](license/). \ No newline at end of file From 7cb7a9bd52a0920949e544716bb3a7cebfe3e82d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 27 Oct 2021 22:25:41 +0200 Subject: [PATCH 337/476] chg: [documentation] updated --- documentation/README.md | 115 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 10 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 6eefef5..4dea631 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -606,24 +606,19 @@ Module to query a local copy of Maxmind's Geolite database. -Module to access GreyNoise.io API +Module to query IP and CVE information from GreyNoise - **features**: -> - Query an IP from GreyNoise to see if it is internet background noise or a common business service -> - Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days -> - Supports Enterprise (Paid) and Community API for IP lookup -> - CVE Lookup is only supported with an Enterprise API Key +>This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days. - **input**: ->An IP address or CVE ID. +>An IP address or CVE ID - **output**: -> - For IPs: IP Lookup Details -> - FOR CVEs: Scanner Count for last 7 days +>IP Lookup information or CVE scanning profile for past 7 days - **references**: > - https://greynoise.io/ > - https://docs.greyniose.io/ > - https://www.greynoise.io/viz/account/ - **requirements**: -> - A Greynoise API key. -> - Selection of API Key type: `enterprise` (for Paid users) or `community` (for Free users) +>A Greynoise API key. Both Enterprise (Paid) and Community (Free) API keys are supported, however Community API users will only be able to perform IP lookups. ----- @@ -641,6 +636,25 @@ A hover module to check hashes against hashdd.com including NSLR dataset. ----- +#### [hashlookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hashlookup.py) + + + +An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL. +- **features**: +>The module takes file hashes as input such as a MD5 or SHA1. +> It queries the public CIRCL.lu hashlookup service and return all the hits if the hashes are known in an existing dataset. The module can be configured with a custom hashlookup url if required. +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>File hashes (MD5, SHA1) +- **output**: +>Object with the filename associated hashes if the hash is part of a known set. +- **references**: +>https://www.circl.lu/services/hashlookup/ + +----- + #### [hibp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hibp.py) @@ -808,6 +822,8 @@ A module to submit files or URLs to Joe Sandbox for an advanced analysis, and re +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Query Lastline with an analysis link and parse the report into MISP attributes and objects. The analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module. - **features**: @@ -827,6 +843,8 @@ The analysis link can also be retrieved from the output of the [lastline_submit] +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module to submit a file or URL to Lastline. - **features**: >The module requires a Lastline Analysis `api_token` and `key`. @@ -1022,6 +1040,25 @@ Module to get information from AlienVault OTX. ----- +#### [passivessh](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivessh.py) + + + +An expansion module to query the CIRCL Passive SSH. +- **features**: +>The module queries the Passive SSH service from CIRCL. +> +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>IP addresses or SSH fingerprints +- **output**: +>SSH key materials, complementary IP addresses with similar SSH key materials +- **references**: +>https://github.com/D4-project/passive-ssh + +----- + #### [passivetotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivetotal.py) @@ -1573,6 +1610,26 @@ Module to submit a sample to VMRay. ----- +#### [vmware_nsx](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vmware_nsx.py) + + + +Module to enrich a file or URL with VMware NSX Defender. +- **features**: +>This module takes an IoC such as file hash, file attachment, malware-sample or url as input to query VMware NSX Defender. +> +>The IoC is then enriched with data from VMware NSX Defender. +- **input**: +>File hash, attachment or URL to be enriched with VMware NSX Defender. +- **output**: +>Objects and tags generated by VMware NSX Defender. +- **references**: +>https://www.vmware.com +- **requirements**: +>The module requires a VMware NSX Defender Analysis `api_token` and `key`. + +----- + #### [vulndb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulndb.py) @@ -1726,6 +1783,26 @@ An expansion hover module to perform a syntax check on if yara rules are valid o ----- +#### [yeti](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yeti.py) + + + +Module to process a query on Yeti. +- **features**: +>This module add context and links between observables using yeti +- **input**: +>A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute. +- **output**: +>MISP attributes and objects fetched from the Yeti instances. +- **references**: +> - https://github.com/yeti-platform/yeti +> - https://github.com/sebdraven/pyeti +- **requirements**: +> - pyeti +> - API key + +----- + ## Export Modules #### [cef_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cef_export.py) @@ -1958,6 +2035,22 @@ This module is used to create a VirusTotal Graph from a MISP event. ## Import Modules +#### [cof2misp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/cof2misp.py) + +Passive DNS Common Output Format (COF) MISP importer +- **features**: +>Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input. +- **input**: +>Passive DNS output in Common Output Format (COF) +- **output**: +>MISP objects +- **references**: +>https://tools.ietf.org/id/draft-dulaunoy-dnsop-passive-dns-cof-08.html +- **requirements**: +>PyMISP + +----- + #### [csvimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/csvimport.py) Module to import MISP attributes from a csv file. @@ -2050,6 +2143,8 @@ A module to import data from a Joe Sandbox analysis json report. +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module to import and parse reports from Lastline analysis links. - **features**: >The module requires a Lastline Portal `username` and `password`. From 5bad98cf4788b58b3436df27aea83b21b352e66f Mon Sep 17 00:00:00 2001 From: Steve Clement Date: Tue, 9 Nov 2021 14:59:57 +0100 Subject: [PATCH 338/476] chg: [py] Pandas requirements update --- REQUIREMENTS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 010527d..a5a32bf 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -63,7 +63,7 @@ json-log-formatter==0.4.0 jsonschema==3.2.0 lark-parser==0.11.3 lief==0.11.5 -lxml==4.6.3 +lxml==4.6.4 maclookup==1.0.3 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' @@ -76,8 +76,8 @@ oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' oletools==0.56.2 opencv-python==4.5.3.56 -pandas-ods-reader==0.1.2 -pandas==1.3.2 +pandas-ods-reader==0.1.4 +pandas==1.3.4 passivetotal==2.5.4 pcodedmp==1.2.6 pdftotext==2.2.0 @@ -104,7 +104,7 @@ python-magic==0.4.24 python-pptx==0.6.19 python-socketio[client]==5.4.0; python_version >= '3.6' python-utils==2.5.6 -pytz==2019.3 +pytz==2021.3 pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pyzbar==0.1.8 pyzipper==0.3.5; python_version >= '3.5' From e34b019f299094916c195f3d661976b82fb7f6fc Mon Sep 17 00:00:00 2001 From: Steve Clement Date: Tue, 9 Nov 2021 15:37:56 +0100 Subject: [PATCH 339/476] chg: [py] Dependency bump. Works on buuntu 18.04.x --- Pipfile | 6 +++--- REQUIREMENTS | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index a54bdf3..f6759bd 100644 --- a/Pipfile +++ b/Pipfile @@ -33,7 +33,7 @@ blockchain = "*" reportlab = "*" pyintel471 = { editable = true, git = "https://github.com/MISP/PyIntel471.git" } shodan = "*" -Pillow ">=8.2.0" +Pillow = ">=8.2.0" Wand = "*" SPARQLWrapper = "*" domaintools_api = "*" @@ -49,7 +49,7 @@ python-pptx = "*" python-docx = "*" ezodf = "*" pandas = "*" -pandas_ods_reader = "*" +pandas_ods_reader = "==0.1.2" pdftotext = "*" lxml = "*" xlrd = "*" @@ -69,4 +69,4 @@ tau-clients = "*" vt-py = ">=0.7.1" [requires] -python_version = "3" +python_version = "3.6" diff --git a/REQUIREMENTS b/REQUIREMENTS index a5a32bf..f95a924 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -13,6 +13,7 @@ -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe +https://github.com/SteveClement/trustar-python.git aiohttp==3.7.4.post0 antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 @@ -76,8 +77,8 @@ oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' oletools==0.56.2 opencv-python==4.5.3.56 -pandas-ods-reader==0.1.4 -pandas==1.3.4 +pandas-ods-reader==0.1.2 +pandas==1.1.5 passivetotal==2.5.4 pcodedmp==1.2.6 pdftotext==2.2.0 @@ -104,7 +105,7 @@ python-magic==0.4.24 python-pptx==0.6.19 python-socketio[client]==5.4.0; python_version >= '3.6' python-utils==2.5.6 -pytz==2021.3 +pytz==2019.3 pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pyzbar==0.1.8 pyzipper==0.3.5; python_version >= '3.5' @@ -118,7 +119,7 @@ rtfde==0.0.2 ruamel.yaml.clib==0.2.6; python_version < '3.10' and platform_python_implementation == 'CPython' ruamel.yaml==0.17.13; python_version >= '3' shodan==1.25.0 -sigmatools==0.20 +sigmatools==0.19.1 six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' socialscan==1.4.2 socketio-client==0.5.7.4 @@ -130,7 +131,6 @@ tau-clients==0.1.3 tldextract==3.1.0; python_version >= '3.5' tornado==6.1; python_version >= '3.5' tqdm==4.62.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -trustar==0.3.35 typing-extensions==3.10.0.0 tzlocal==3.0; python_version >= '3.6' unicodecsv==0.14.1 From 800135f4e256c3d52ab79044349ab1067aac4ec7 Mon Sep 17 00:00:00 2001 From: Steve Clement Date: Tue, 9 Nov 2021 15:48:34 +0100 Subject: [PATCH 340/476] fix: [py] Dependency fix --- Pipfile | 2 +- REQUIREMENTS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index f6759bd..e8f6929 100644 --- a/Pipfile +++ b/Pipfile @@ -59,7 +59,7 @@ geoip2 = "*" apiosintDS = "*" assemblyline_client = "*" vt-graph-api = "*" -trustar = "*" +trustar = { editable = true, git = "https://github.com/SteveClement/trustar-python.git" } markdownify = "==0.5.3" socialscan = "*" dnsdb2 = "*" diff --git a/REQUIREMENTS b/REQUIREMENTS index f95a924..21e24d9 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -13,7 +13,7 @@ -e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -https://github.com/SteveClement/trustar-python.git +git+https://github.com/SteveClement/trustar-python.git aiohttp==3.7.4.post0 antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 From dc0660acd0df74e874be4cf81c9b5d4381fb594f Mon Sep 17 00:00:00 2001 From: Calvin Krzywiec Date: Mon, 22 Nov 2021 15:46:46 -0500 Subject: [PATCH 341/476] feature: add qintel qsentry expansion module --- misp_modules/lib/__init__.py | 2 +- misp_modules/lib/qintel_helper.py | 263 ++++++++++++++++++ misp_modules/modules/expansion/__init__.py | 3 +- .../modules/expansion/qintel_qsentry.py | 221 +++++++++++++++ 4 files changed, 487 insertions(+), 2 deletions(-) create mode 100644 misp_modules/lib/qintel_helper.py create mode 100644 misp_modules/modules/expansion/qintel_qsentry.py diff --git a/misp_modules/lib/__init__.py b/misp_modules/lib/__init__.py index d92e989..2939e75 100644 --- a/misp_modules/lib/__init__.py +++ b/misp_modules/lib/__init__.py @@ -1,3 +1,3 @@ from .vt_graph_parser import * # noqa -all = ['joe_parser', 'lastline_api', 'cof2misp'] +all = ['joe_parser', 'lastline_api', 'cof2misp', 'qintel_helper'] diff --git a/misp_modules/lib/qintel_helper.py b/misp_modules/lib/qintel_helper.py new file mode 100644 index 0000000..47106f7 --- /dev/null +++ b/misp_modules/lib/qintel_helper.py @@ -0,0 +1,263 @@ +# Copyright (c) 2009-2021 Qintel, LLC +# Licensed under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + +from urllib.request import Request, urlopen +from urllib.parse import urlencode +from urllib.error import HTTPError +from time import sleep +from json import loads +import os +from copy import deepcopy +from datetime import datetime, timedelta +from gzip import GzipFile + +VERSION = '1.0.1' +USER_AGENT = 'integrations-helper' +MAX_RETRY_ATTEMPTS = 5 + +DEFAULT_HEADERS = { + 'User-Agent': f'{USER_AGENT}/{VERSION}' +} + +REMOTE_MAP = { + 'pmi': 'https://api.pmi.qintel.com', + 'qwatch': 'https://api.qwatch.qintel.com', + 'qauth': 'https://api.qauth.qintel.com', + 'qsentry_feed': 'https://qsentry.qintel.com', + 'qsentry': 'https://api.qsentry.qintel.com' +} + +ENDPOINT_MAP = { + 'pmi': { + 'ping': '/users/me', + 'cve': 'cves' + }, + 'qsentry_feed': { + 'anon': '/files/anonymization', + 'mal_hosting': '/files/malicious_hosting' + }, + 'qsentry': {}, + 'qwatch': { + 'ping': '/users/me', + 'exposures': 'exposures' + }, + 'qauth': {} +} + + +def _get_request_wait_time(attempts): + """ Use Fibonacci numbers for determining the time to wait when rate limits + have been encountered. + """ + + n = attempts + 3 + a, b = 1, 0 + for _ in range(n): + a, b = a + b, a + + return a + + +def _search(**kwargs): + remote = kwargs.get('remote') + max_retries = int(kwargs.get('max_retries', MAX_RETRY_ATTEMPTS)) + params = kwargs.get('params', {}) + headers = _set_headers(**kwargs) + + logger = kwargs.get('logger') + + params = urlencode(params) + url = remote + "?" + params + req = Request(url, headers=headers) + + request_attempts = 1 + while request_attempts < max_retries: + try: + return urlopen(req) + + except HTTPError as e: + response = e + + except Exception as e: + raise Exception('API connection error') from e + + if response.code not in [429, 504]: + raise Exception(f'API connection error: {response}') + + if request_attempts < max_retries: + wait_time = _get_request_wait_time(request_attempts) + + if response.code == 429: + msg = 'rate limit reached on attempt {request_attempts}, ' \ + 'waiting {wait_time} seconds' + + if logger: + logger(msg) + + else: + msg = f'connection timed out, retrying in {wait_time} seconds' + if logger: + logger(msg) + + sleep(wait_time) + + else: + raise Exception('Max API retries exceeded') + + request_attempts += 1 + + +def _set_headers(**kwargs): + headers = deepcopy(DEFAULT_HEADERS) + + if kwargs.get('user_agent'): + headers['User-Agent'] = \ + f"{kwargs['user_agent']}/{USER_AGENT}/{VERSION}" + + # TODO: deprecate + if kwargs.get('client_id') or kwargs.get('client_secret'): + try: + headers['Cf-Access-Client-Id'] = kwargs['client_id'] + headers['Cf-Access-Client-Secret'] = kwargs['client_secret'] + except KeyError: + raise Exception('missing client_id or client_secret') + + if kwargs.get('token'): + headers['x-api-key'] = kwargs['token'] + + return headers + + +def _set_remote(product, query_type, **kwargs): + remote = kwargs.get('remote') + endpoint = kwargs.get('endpoint', ENDPOINT_MAP[product].get(query_type)) + + if not remote: + remote = REMOTE_MAP[product] + + if not endpoint: + raise Exception('invalid search type') + + remote = remote.rstrip('/') + endpoint = endpoint.lstrip('/') + + return f'{remote}/{endpoint}' + + +def _process_qsentry(resp): + if resp.getheader('Content-Encoding', '') == 'gzip': + with GzipFile(fileobj=resp) as file: + for line in file.readlines(): + yield loads(line) + + +def search_pmi(search_term, query_type, **kwargs): + """ + Search PMI + + :param str search_term: Search term + :param str query_type: Query type [cve|ping] + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + kwargs['remote'] = _set_remote('pmi', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('PMI_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'identifier': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qwatch(search_term, search_type, query_type, **kwargs): + """ + Search QWatch for exposed credentials + + :param str search_term: Search term + :param str search_type: Search term type [domain|email] + :param str query_type: Query type [exposures] + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + kwargs['remote'] = _set_remote('qwatch', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QWATCH_TOKEN')) + + params = kwargs.get('params', {}) + if search_type: + params.update({search_type: search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qauth(search_term, **kwargs): + """ + Search QAuth + + :param str search_term: Search term + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + if not kwargs.get('endpoint'): + kwargs['endpoint'] = '/' + + kwargs['remote'] = _set_remote('qauth', None, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QAUTH_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'q': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qsentry(search_term, **kwargs): + """ + Search QSentry + + :param str search_term: Search term + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + if not kwargs.get('endpoint'): + kwargs['endpoint'] = '/' + + kwargs['remote'] = _set_remote('qsentry', None, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QSENTRY_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'q': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def qsentry_feed(query_type='anon', feed_date=datetime.today(), **kwargs): + """ + Fetch the most recent QSentry Feed + + :param str query_type: Feed type [anon|mal_hosting] + :param dict kwargs: extra client args [remote|token|params] + :param datetime feed_date: feed date to fetch + :return: API JSON response object + :rtype: Iterator[dict] + """ + + remote = _set_remote('qsentry_feed', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QSENTRY_TOKEN')) + + feed_date = (feed_date - timedelta(days=1)).strftime('%Y%m%d') + kwargs['remote'] = f'{remote}/{feed_date}' + + resp = _search(**kwargs) + for r in _process_qsentry(resp): + yield r diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index a817c2a..1666ffe 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -17,7 +17,8 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'virustotal_public', 'apiosintds', 'urlscan', 'securitytrails', 'apivoid', 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', - 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh'] + 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', + 'qintel_qsentry'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/qintel_qsentry.py b/misp_modules/modules/expansion/qintel_qsentry.py new file mode 100644 index 0000000..6733b93 --- /dev/null +++ b/misp_modules/modules/expansion/qintel_qsentry.py @@ -0,0 +1,221 @@ +import logging +import json + +from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject +from . import check_input_attribute, checking_error, standard_error_message + +from qintel_helper import search_qsentry + +logger = logging.getLogger('qintel_qsentry') +logger.setLevel(logging.DEBUG) + +moduleinfo = { + 'version': '1.0', + 'author': 'Qintel, LLC', + 'description': 'Query Qintel QSentry for ip intelligence', + 'module-type': ['hover', 'expansion'] +} + +moduleconfig = ['token', 'remote'] + +misperrors = {'error': 'Error'} + +mispattributes = { + 'input': ['ip-src', 'ip-dst'], + 'output': ['ip-src', 'ip-dst', 'AS', 'freetext'], + 'format': 'misp_standard' +} + +TAG_COLOR = { + 'benign': '#27ae60', + 'suspicious': '#e6a902', + 'malicious': '#c0392b' +} + +CLIENT_HEADERS = { + 'User-Agent': f"MISP/{moduleinfo['version']}", +} + + +def _return_error(message): + misperrors['error'] = message + return misperrors + + +def _make_tags(enriched_attr, result): + + for tag in result['tags']: + color = TAG_COLOR['suspicious'] + if tag == 'criminal': + color = TAG_COLOR['malicious'] + + t = MISPTag() + t.from_dict(**{ + 'name': f'qintel:tag="{tag}"', + 'colour': color + }) + enriched_attr.add_tag(**t) + + return enriched_attr + + +def _make_enriched_attr(event, result, orig_attr): + + enriched_object = MISPObject('Qintel Threat Enrichment') + enriched_object.add_reference(orig_attr.uuid, 'related-to') + + enriched_attr = MISPAttribute() + enriched_attr.from_dict(**{ + 'value': orig_attr.value, + 'type': orig_attr.type, + 'distribution': 0, + 'object_relation': 'enriched-attr', + 'to_ids': orig_attr.to_ids + }) + + enriched_attr = _make_tags(enriched_attr, result) + enriched_object.add_attribute(**enriched_attr) + + comment_attr = MISPAttribute() + comment_attr.from_dict(**{ + 'value': '\n'.join(result.get('descriptions', [])), + 'type': 'text', + 'object_relation': 'descriptions', + 'distribution': 0 + }) + enriched_object.add_attribute(**comment_attr) + + last_seen = MISPAttribute() + last_seen.from_dict(**{ + 'value': result.get('last_seen'), + 'type': 'datetime', + 'object_relation': 'last-seen', + 'distribution': 0 + }) + enriched_object.add_attribute(**last_seen) + + event.add_attribute(**orig_attr) + event.add_object(**enriched_object) + + return event + + +def _make_asn_attr(event, result, orig_attr): + + asn_object = MISPObject('asn') + asn_object.add_reference(orig_attr.uuid, 'related-to') + + asn_attr = MISPAttribute() + asn_attr.from_dict(**{ + 'type': 'AS', + 'value': result.get('asn'), + 'object_relation': 'asn', + 'distribution': 0 + }) + asn_object.add_attribute(**asn_attr) + + org_attr = MISPAttribute() + org_attr.from_dict(**{ + 'type': 'text', + 'value': result.get('asn_name', 'unknown').title(), + 'object_relation': 'description', + 'distribution': 0 + }) + asn_object.add_attribute(**org_attr) + + event.add_object(**asn_object) + + return event + + +def _format_hover(event, result): + + enriched_object = event.get_objects_by_name('Qintel Threat Enrichment')[0] + + tags = ', '.join(result.get('tags')) + enriched_object.add_attribute('Tags', type='text', value=tags) + + return event + + +def _format_result(attribute, result): + + event = MISPEvent() + + orig_attr = MISPAttribute() + orig_attr.from_dict(**attribute) + + event = _make_enriched_attr(event, result, orig_attr) + event = _make_asn_attr(event, result, orig_attr) + + return event + + +def _check_config(config): + if not config: + return False + + if not isinstance(config, dict): + return False + + if config.get('token', '') == '': + return False + + return True + + +def _check_request(request): + if not request.get('attribute'): + return f'{standard_error_message}, {checking_error}' + + check_reqs = ('type', 'value') + if not check_input_attribute(request['attribute'], + requirements=check_reqs): + return f'{standard_error_message}, {checking_error}' + + if request['attribute']['type'] not in mispattributes['input']: + return 'Unsupported attribute type' + + +def handler(q=False): + if not q: + return False + + request = json.loads(q) + config = request.get('config') + + if not _check_config(config): + return _return_error('Missing Qintel token') + + check_request_error = _check_request(request) + if check_request_error: + return _return_error(check_request_error) + + search_args = { + 'token': config['token'], + 'remote': config.get('remote') + } + + try: + result = search_qsentry(request['attribute']['value'], **search_args) + except Exception as e: + return _return_error(str(e)) + + event = _format_result(request['attribute'], result) + if not request.get('event_id'): + event = _format_hover(event, result) + + event = json.loads(event.to_json()) + + ret_result = {key: event[key] for key in ('Attribute', 'Object') if key + in event} + return {'results': ret_result} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 897164c5edaa653108a4b67e187318365464d4e4 Mon Sep 17 00:00:00 2001 From: Calvin Krzywiec Date: Mon, 22 Nov 2021 15:52:58 -0500 Subject: [PATCH 342/476] feature: add qintel qsentry module documentation --- documentation/logos/qintel.png | Bin 0 -> 47612 bytes .../website/expansion/qintel_qsentry.json | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 documentation/logos/qintel.png create mode 100644 documentation/website/expansion/qintel_qsentry.json diff --git a/documentation/logos/qintel.png b/documentation/logos/qintel.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3af768d7234d51238fd8d8d5df80b058017703 GIT binary patch literal 47612 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 Hmze(mT4uy9 literal 0 HcmV?d00001 diff --git a/documentation/website/expansion/qintel_qsentry.json b/documentation/website/expansion/qintel_qsentry.json new file mode 100644 index 0000000..4994a62 --- /dev/null +++ b/documentation/website/expansion/qintel_qsentry.json @@ -0,0 +1,13 @@ +{ + "description": "A hover and expansion module which queries Qintel QSentry for ip reputation data", + "logo": "qintel.png", + "requirements": [ + "A Qintel API token" + ], + "input": "ip address attribute", + "ouput": "Objects containing the enriched IP, threat tags, last seen attributes and associated Autonomous System information", + "features": "This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the Qintel QSentry API to retrieve ip reputation data", + "references": [ + "https://www.qintel.com/products/qsentry/" + ] +} \ No newline at end of file From eaff5700de16a2a24c4a8f6f4a7e06f903223eba Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 24 Nov 2021 11:05:00 +0100 Subject: [PATCH 343/476] chg: [doc] updated --- documentation/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index 4dea631..8936fbf 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1142,6 +1142,24 @@ Module to extract freetext from a .pptx document. ----- +#### [qintel_qsentry](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qintel_qsentry.py) + + + +A hover and expansion module which queries Qintel QSentry for ip reputation data +- **features**: +>This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the Qintel QSentry API to retrieve ip reputation data +- **input**: +>ip address attribute +- **ouput**: +>Objects containing the enriched IP, threat tags, last seen attributes and associated Autonomous System information +- **references**: +>https://www.qintel.com/products/qsentry/ +- **requirements**: +>A Qintel API token + +----- + #### [qrcode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qrcode.py) Module to decode QR codes. From ffe3f0680abb6c03091c70a88b91b4ce2f5b7b34 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Dec 2021 13:49:14 +0100 Subject: [PATCH 344/476] chg: [requirements] lxml updated --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 21e24d9..eaa495a 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -64,7 +64,7 @@ json-log-formatter==0.4.0 jsonschema==3.2.0 lark-parser==0.11.3 lief==0.11.5 -lxml==4.6.4 +lxml==4.7.1 maclookup==1.0.3 markdownify==0.5.3 maxminddb==2.0.3; python_version >= '3.6' From 578187a9f9d173ac9a86e1b161225f02f1705f90 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Dec 2021 13:50:11 +0100 Subject: [PATCH 345/476] chg: [requirements] pillow updated to the latest version --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index eaa495a..a71ffea 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -82,7 +82,7 @@ pandas==1.1.5 passivetotal==2.5.4 pcodedmp==1.2.6 pdftotext==2.2.0 -pillow==8.3.1 +pillow==8.3.2 progressbar2==3.53.1 psutil==5.8.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' From f7b35ee7eb60d5bf2145fe8cefc51150ff5027a8 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Dec 2021 13:50:50 +0100 Subject: [PATCH 346/476] chg: [REQUIREMENTS] aiohttp --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index a71ffea..d35bc49 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -14,7 +14,7 @@ -e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe git+https://github.com/SteveClement/trustar-python.git -aiohttp==3.7.4.post0 +aiohttp==3.7.4 antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 argparse==1.4.0 From 2dbaba7053bc787ec39ba03b31bd67aa9bf1c362 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Dec 2021 13:56:20 +0100 Subject: [PATCH 347/476] chg: [REQUIREMENTS] chardet issue - let installer decide --- REQUIREMENTS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index d35bc49..187722e 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -28,7 +28,9 @@ bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 certifi==2021.5.30 cffi==1.14.6 -chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' + +#chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +chardet charset-normalizer==2.0.4; python_version >= '3' clamd==1.0.2 click-plugins==1.1.1 From eb5190049cacca80d130a1634e530d928e30230d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Dec 2021 14:07:40 +0100 Subject: [PATCH 348/476] chg: [Pipefile.lock] removed --- Pipfile.lock | 1865 -------------------------------------------------- 1 file changed, 1865 deletions(-) delete mode 100644 Pipfile.lock diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index fce2898..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,1865 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "53f7c8111e3655205f3816245250a528453b48cf0ea99e2e6b7ae83902949d0c" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "aiohttp": { - "hashes": [ - "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe", - "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe", - "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5", - "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8", - "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd", - "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb", - "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c", - "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87", - "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0", - "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290", - "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5", - "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287", - "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde", - "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf", - "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8", - "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16", - "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf", - "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809", - "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213", - "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f", - "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013", - "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b", - "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9", - "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5", - "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb", - "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df", - "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4", - "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439", - "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f", - "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22", - "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f", - "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5", - "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970", - "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009", - "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc", - "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a", - "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" - ], - "index": "pypi", - "version": "==3.7.4.post0" - }, - "antlr4-python3-runtime": { - "hashes": [ - "sha256:15793f5d0512a372b4e7d2284058ad32ce7dd27126b105fb0b2245130445db33" - ], - "markers": "python_version >= '3'", - "version": "==4.8" - }, - "apiosintds": { - "hashes": [ - "sha256:d8ab4dcf75a9989572cd6808773b56fdf535b6080d6041d98e911e6c5eb31f3c" - ], - "index": "pypi", - "version": "==1.8.3" - }, - "argparse": { - "hashes": [ - "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", - "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314" - ], - "version": "==1.4.0" - }, - "assemblyline-client": { - "hashes": [ - "sha256:fd434694ecdfb58f86118ccbbdecf37bc753935c7ae43ef7a74bc5a22fa48d21" - ], - "index": "pypi", - "version": "==4.1.0" - }, - "async-timeout": { - "hashes": [ - "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", - "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==3.0.1" - }, - "attrs": { - "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" - }, - "backports.zoneinfo": { - "hashes": [ - "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf", - "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328", - "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546", - "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6", - "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570", - "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9", - "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7", - "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987", - "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722", - "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582", - "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc", - "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b", - "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1", - "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08", - "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac", - "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2" - ], - "markers": "python_version < '3.9'", - "version": "==0.2.1" - }, - "backscatter": { - "hashes": [ - "sha256:7a0d1aa3661635de81e2a09b15d53e35cbe399a111cc58a70925f80e6874abd3", - "sha256:afb0efcf5d2551dac953ec4c38fb710b274b8e811775650e02c1ef42cafb14c8" - ], - "index": "pypi", - "version": "==0.2.4" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35", - "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25", - "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666" - ], - "index": "pypi", - "version": "==4.9.3" - }, - "bidict": { - "hashes": [ - "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", - "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" - ], - "markers": "python_version >= '3.6'", - "version": "==0.21.2" - }, - "blockchain": { - "hashes": [ - "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" - ], - "index": "pypi", - "version": "==1.4.4" - }, - "certifi": { - "hashes": [ - "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", - "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" - ], - "version": "==2021.5.30" - }, - "cffi": { - "hashes": [ - "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d", - "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771", - "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872", - "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c", - "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc", - "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762", - "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202", - "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5", - "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548", - "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a", - "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f", - "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20", - "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218", - "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c", - "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e", - "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56", - "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224", - "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a", - "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2", - "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a", - "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819", - "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346", - "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b", - "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e", - "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534", - "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb", - "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0", - "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156", - "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd", - "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87", - "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc", - "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195", - "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33", - "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f", - "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d", - "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd", - "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728", - "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7", - "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca", - "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99", - "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf", - "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e", - "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c", - "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5", - "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69" - ], - "version": "==1.14.6" - }, - "chardet": { - "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", - "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" - ], - "markers": "python_version >= '3'", - "version": "==2.0.4" - }, - "clamd": { - "hashes": [ - "sha256:5c32546b7d1eb00fd6be00a889d79e00fbf980ed082826ccfa369bce3dcff5e7", - "sha256:d82a2fd814684a35a1b31feadafb2e69c8ebde9403613f6bdaa5d877c0f29560" - ], - "index": "pypi", - "version": "==1.0.2" - }, - "click": { - "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" - ], - "markers": "python_version >= '3.6'", - "version": "==8.0.1" - }, - "click-plugins": { - "hashes": [ - "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", - "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" - ], - "version": "==1.1.1" - }, - "colorama": { - "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" - }, - "colorclass": { - "hashes": [ - "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" - ], - "version": "==2.2.0" - }, - "compressed-rtf": { - "hashes": [ - "sha256:c1c827f1d124d24608981a56e8b8691eb1f2a69a78ccad6440e7d92fde1781dd" - ], - "version": "==1.0.6" - }, - "configparser": { - "hashes": [ - "sha256:85d5de102cfe6d14a5172676f09d19c465ce63d6019cf0a4ef13385fc535e828", - "sha256:af59f2cdd7efbdd5d111c1976ecd0b82db9066653362f0962d7bf1d3ab89a1fa" - ], - "markers": "python_version >= '3.6'", - "version": "==5.0.2" - }, - "cryptography": { - "hashes": [ - "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d", - "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959", - "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6", - "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873", - "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2", - "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713", - "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", - "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", - "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", - "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586", - "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3", - "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", - "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", - "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" - ], - "markers": "python_version >= '3.6'", - "version": "==3.4.7" - }, - "decorator": { - "hashes": [ - "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323", - "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5" - ], - "markers": "python_version >= '3.5'", - "version": "==5.0.9" - }, - "deprecated": { - "hashes": [ - "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771", - "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.12" - }, - "dnsdb2": { - "hashes": [ - "sha256:e7ed25c8ca1e456c77deaf67f440ae0c2ff94c714dab4d67df14ccc82f501faf" - ], - "index": "pypi", - "version": "==1.1.3" - }, - "dnspython": { - "hashes": [ - "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216", - "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "domaintools-api": { - "hashes": [ - "sha256:10fd899b2fe063a23edbcf15daf516fe14fb4a67ef1bf72af630a183161cb003", - "sha256:fde92d0f1fb0cfc324548eca85c3bab7774ffa93581fd92ced954ce11d5891e1" - ], - "index": "pypi", - "version": "==0.5.4" - }, - "easygui": { - "hashes": [ - "sha256:073f728ca88a77b74f404446fb8ec3004945427677c5618bd00f70c1b999fef2", - "sha256:8d38764803c27bbccab2771e6c021cb20647049b36617f765fac79f01af07a27" - ], - "version": "==0.98.2" - }, - "ebcdic": { - "hashes": [ - "sha256:33b4cb729bc2d0bf46cc1847b0e5946897cb8d3f53520c5b9aa5fa98d7e735f1" - ], - "version": "==1.1.1" - }, - "enum-compat": { - "hashes": [ - "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e", - "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157" - ], - "version": "==0.0.3" - }, - "extract-msg": { - "hashes": [ - "sha256:6ad2702bef86e6c1b8505e2993c7f3d37a1f3d140903138ee2df4a299dd2a29c", - "sha256:7ebdbd7863a3699080a69f71ec0cd30ed9bfee70bad9acc6a8e6abe9523c78c0" - ], - "version": "==0.28.7" - }, - "ez-setup": { - "hashes": [ - "sha256:303c5b17d552d1e3fb0505d80549f8579f557e13d8dc90e5ecef3c07d7f58642" - ], - "version": "==0.9" - }, - "ezodf": { - "hashes": [ - "sha256:000da534f689c6d55297a08f9e2ed7eada9810d194d31d164388162fb391122d" - ], - "index": "pypi", - "version": "==0.3.2" - }, - "filelock": { - "hashes": [ - "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", - "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" - ], - "version": "==3.0.12" - }, - "future": { - "hashes": [ - "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.18.2" - }, - "futures": { - "hashes": [ - "sha256:3a44f286998ae64f0cc083682fcfec16c406134a81a589a5de445d7bb7c2751b", - "sha256:51ecb45f0add83c806c68e4b06106f90db260585b25ef2abfcda0bd95c0132fd", - "sha256:c4884a65654a7c45435063e14ae85280eb1f111d94e542396717ba9828c4337f" - ], - "version": "==3.1.1" - }, - "geoip2": { - "hashes": [ - "sha256:906a1dbf15a179a1af3522970e8420ab15bb3e0afc526942cc179e12146d9c1d", - "sha256:b97b44031fdc463e84eb1316b4f19edd978cb1d78703465fcb1e36dc5a822ba6" - ], - "index": "pypi", - "version": "==4.2.0" - }, - "httplib2": { - "hashes": [ - "sha256:0b12617eeca7433d4c396a100eaecfa4b08ee99aa881e6df6e257a7aad5d533d", - "sha256:2ad195faf9faf079723f6714926e9a9061f694d07724b846658ce08d40f522b4" - ], - "version": "==0.19.1" - }, - "idna": { - "hashes": [ - "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", - "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" - ], - "markers": "python_version >= '3'", - "version": "==3.2" - }, - "idna-ssl": { - "hashes": [ - "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" - ], - "markers": "python_version < '3.7'", - "version": "==1.1.0" - }, - "imapclient": { - "hashes": [ - "sha256:3eeb97b9aa8faab0caa5024d74bfde59408fbd542781246f6960873c7bf0dd01", - "sha256:60ba79758cc9f13ec910d7a3df9acaaf2bb6c458720d9a02ec33a41352fd1b99" - ], - "version": "==2.1.0" - }, - "isodate": { - "hashes": [ - "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", - "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" - ], - "version": "==0.6.0" - }, - "itsdangerous": { - "hashes": [ - "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c", - "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.1" - }, - "jbxapi": { - "hashes": [ - "sha256:5a1016282bf8a79032346dbe2abb9f597b7e7b811e0964f5bccce9da80eab1b0", - "sha256:99d748c9f48f410d858313d6e53663668231384f895d8ed574a02eada1244bc9" - ], - "index": "pypi", - "version": "==3.17.2" - }, - "json-log-formatter": { - "hashes": [ - "sha256:3644f30233f22746fd181d1340cc8096520a4f464d18877270b8664554e61f81" - ], - "version": "==0.4.0" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "lark-parser": { - "hashes": [ - "sha256:e29ca814a98bb0f81674617d878e5f611cb993c19ea47f22c80da3569425f9bd" - ], - "version": "==0.11.3" - }, - "lief": { - "hashes": [ - "sha256:17314177c0124ccd450554bbcb203b8cd2660c94e36bdc05a6eba04bb0af3954", - "sha256:1cca100e77382f4137a3b1283769efa0e68a965fa4f3e21e64e3f67b6e22fdc8", - "sha256:208294f208354f57ded772efc4c3b2ea61fae35325a048d38c21571cb35e4bfc", - "sha256:3f510836d19cee407015ee565ea566e444471f0ecb3028a5c5e2219a7583f3c4", - "sha256:44bd7804a39837ff46cd543154f6e4a28e2d4fafa312752ca6deea1c849995ce", - "sha256:5122e4e70fecc32e7fdf2e9cd9b580ddd63fb4509eae373be78b3c11d67175b8", - "sha256:544b0f8a587bc5f6fd39cf47d9785af2714f982682efcd1dd3291604e7cb6351", - "sha256:5a0da170943aaf7019b27b9a7199b860298426c0455f88add392f472605c39ee", - "sha256:5f5fb42461b5d5d5b2ccf7fe17e8f26bd632afcbaedf29a9d30819eeea5dab29", - "sha256:621ad19f77884a008d61e05b92aed8309a8460e93916f4722439beaa529ca37d", - "sha256:710112ebc642bf5287a7b25c54c8a4e1079cbb403d4e844a364e1c3cbed52486", - "sha256:8b219ce4a41b0734fe9a7fbfde7d23a92bc005c8684882662808fc438568c1b5", - "sha256:8fd1ecdb3001e8e19df7278b77df5d6394ad6071354e177d11ad08b0a727d390", - "sha256:932ba495388fb52b4ba056a0b00abe0bda3567ad3ebc6d726be1e87b8be08b3f", - "sha256:9c6cc9da3e3a56ad29fc4e77e7109e960bd0cae3e3ba5307e3ae5c65d85fbdc4", - "sha256:a1f7792f1d811a898d3d676c32731d6b055573a2c3e67988ab1b32917db3de96", - "sha256:a4bb649a2f5404b8e2e4b8beb3772466430e7382fc5f7f014f3f778137133987", - "sha256:b275a542b5ef173ec9602d2f511a895c4228db63bbbc58699859da4afe8bfd58", - "sha256:bfc0246af63361e22a952f8babd542477d64288d993c5a053a72f9e3f59da795", - "sha256:c672dcd78dbbe2c0746721cdb1593b237a8b983d039e73713b055449e4a58207", - "sha256:c773eaee900f398cc98a9c8501d9ab7465af9729979841bb78f4aaa8b821fd9a", - "sha256:e6d9621c1db852ca4de37efe98151838edf0a976fe03cace471b3a761861f95e", - "sha256:e743345290649f54efcf2c1ea530f3520a7b22583fb8b0772df48b1901ecb1ea", - "sha256:eb8c2ae617ff54c4ea73dbd055544681b3cfeafbdbf0fe4535fac494515ab65b", - "sha256:f4e8a878615a46ef4ae016261a59152b8c019a35adb865e26a37c8ef25200d7e", - "sha256:fd41077526e30bfcafa3d03bff8466a4a9ae4bbe21cadd6a09168a62ce18710c" - ], - "version": "==0.11.5" - }, - "lxml": { - "hashes": [ - "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d", - "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3", - "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2", - "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae", - "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f", - "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927", - "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3", - "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7", - "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59", - "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f", - "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade", - "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96", - "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468", - "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b", - "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4", - "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354", - "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83", - "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04", - "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16", - "sha256:64812391546a18896adaa86c77c59a4998f33c24788cadc35789e55b727a37f4", - "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791", - "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a", - "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51", - "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1", - "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a", - "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f", - "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee", - "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec", - "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969", - "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28", - "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a", - "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa", - "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106", - "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d", - "sha256:c1a40c06fd5ba37ad39caa0b3144eb3772e813b5fb5b084198a985431c2f1e8d", - "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617", - "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4", - "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92", - "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0", - "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4", - "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24", - "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2", - "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e", - "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0", - "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654", - "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2", - "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23", - "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586" - ], - "index": "pypi", - "version": "==4.6.3" - }, - "maclookup": { - "hashes": [ - "sha256:33bf8eaebe3b1e4ab4ae9277dd93c78024e0ebf6b3c42f76c37695bc26ce287a", - "sha256:795e792cd3e03c9bdad77e52904d43ff71d3ac03b360443f99d4bae08a6bffef" - ], - "index": "pypi", - "version": "==1.0.3" - }, - "markdownify": { - "hashes": [ - "sha256:30be8340724e706c9e811c27fe8c1542cf74a15b46827924fff5c54b40dd9b0d", - "sha256:a69588194fd76634f0139d6801b820fd652dc5eeba9530e90d323dfdc0155252" - ], - "index": "pypi", - "version": "==0.5.3" - }, - "maxminddb": { - "hashes": [ - "sha256:47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.3" - }, - "misp-modules": { - "editable": true, - "path": "." - }, - "more-itertools": { - "hashes": [ - "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d", - "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a" - ], - "markers": "python_version >= '3.5'", - "version": "==8.8.0" - }, - "msoffcrypto-tool": { - "hashes": [ - "sha256:234f85ef59945fa1ebb618ca029f31f0cb43a637344dbda5c1bb8578b2d96a68", - "sha256:7f04b621365e3753f8cef8ba40536acc23d0d201c0ad2dcb1b3d82c83056b7ff" - ], - "markers": "python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin')", - "version": "==4.12.0" - }, - "multidict": { - "hashes": [ - "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", - "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93", - "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632", - "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656", - "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79", - "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7", - "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d", - "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5", - "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224", - "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26", - "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea", - "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348", - "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6", - "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76", - "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1", - "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f", - "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952", - "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a", - "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37", - "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9", - "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359", - "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8", - "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da", - "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3", - "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d", - "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf", - "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841", - "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d", - "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93", - "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f", - "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647", - "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635", - "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456", - "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda", - "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5", - "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", - "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" - ], - "markers": "python_version >= '3.6'", - "version": "==5.1.0" - }, - "np": { - "hashes": [ - "sha256:781265283f3823663ad8fb48741aae62abcf4c78bc19f908f8aa7c1d3eb132f8" - ], - "index": "pypi", - "version": "==1.0.2" - }, - "numpy": { - "hashes": [ - "sha256:09858463db6dd9f78b2a1a05c93f3b33d4f65975771e90d2cf7aadb7c2f66edf", - "sha256:209666ce9d4a817e8a4597cd475b71b4878a85fa4b8db41d79fdb4fdee01dde2", - "sha256:298156f4d3d46815eaf0fcf0a03f9625fc7631692bd1ad851517ab93c3168fc6", - "sha256:30fc68307c0155d2a75ad19844224be0f2c6f06572d958db4e2053f816b859ad", - "sha256:423216d8afc5923b15df86037c6053bf030d15cc9e3224206ef868c2d63dd6dc", - "sha256:426a00b68b0d21f2deb2ace3c6d677e611ad5a612d2c76494e24a562a930c254", - "sha256:466e682264b14982012887e90346d33435c984b7fead7b85e634903795c8fdb0", - "sha256:51a7b9db0a2941434cd930dacaafe0fc9da8f3d6157f9d12f761bbde93f46218", - "sha256:52a664323273c08f3b473548bf87c8145b7513afd63e4ebba8496ecd3853df13", - "sha256:550564024dc5ceee9421a86fc0fb378aa9d222d4d0f858f6669eff7410c89bef", - "sha256:5de64950137f3a50b76ce93556db392e8f1f954c2d8207f78a92d1f79aa9f737", - "sha256:640c1ccfd56724f2955c237b6ccce2e5b8607c3bc1cc51d3933b8c48d1da3723", - "sha256:7fdc7689daf3b845934d67cb221ba8d250fdca20ac0334fea32f7091b93f00d3", - "sha256:805459ad8baaf815883d0d6f86e45b3b0b67d823a8f3fa39b1ed9c45eaf5edf1", - "sha256:92a0ab128b07799dd5b9077a9af075a63467d03ebac6f8a93e6440abfea4120d", - "sha256:9f2dc79c093f6c5113718d3d90c283f11463d77daa4e83aeeac088ec6a0bda52", - "sha256:a5109345f5ce7ddb3840f5970de71c34a0ff7fceb133c9441283bb8250f532a3", - "sha256:a55e4d81c4260386f71d22294795c87609164e22b28ba0d435850fbdf82fc0c5", - "sha256:a9da45b748caad72ea4a4ed57e9cd382089f33c5ec330a804eb420a496fa760f", - "sha256:b160b9a99ecc6559d9e6d461b95c8eec21461b332f80267ad2c10394b9503496", - "sha256:b342064e647d099ca765f19672696ad50c953cac95b566af1492fd142283580f", - "sha256:b5e8590b9245803c849e09bae070a8e1ff444f45e3f0bed558dd722119eea724", - "sha256:bf75d5825ef47aa51d669b03ce635ecb84d69311e05eccea083f31c7570c9931", - "sha256:c01b59b33c7c3ba90744f2c695be571a3bd40ab2ba7f3d169ffa6db3cfba614f", - "sha256:d96a6a7d74af56feb11e9a443150216578ea07b7450f7c05df40eec90af7f4a7", - "sha256:dd0e3651d210068d13e18503d75aaa45656eef51ef0b261f891788589db2cc38", - "sha256:e167b9805de54367dcb2043519382be541117503ce99e3291cc9b41ca0a83557", - "sha256:e42029e184008a5fd3d819323345e25e2337b0ac7f5c135b7623308530209d57", - "sha256:f545c082eeb09ae678dd451a1b1dbf17babd8a0d7adea02897a76e639afca310", - "sha256:fde50062d67d805bc96f1a9ecc0d37bfc2a8f02b937d2c50824d186aa91f2419" - ], - "markers": "python_version < '3.11' and python_version >= '3.7'", - "version": "==1.21.2" - }, - "oauth2": { - "hashes": [ - "sha256:15b5c42301f46dd63113f1214b0d81a8b16254f65a86d3c32a1b52297f3266e6", - "sha256:c006a85e7c60107c7cc6da1b184b5c719f6dd7202098196dfa6e55df669b59bf" - ], - "index": "pypi", - "version": "==1.9.0.post1" - }, - "odtreader": { - "editable": true, - "git": "https://github.com/cartertemm/ODTReader.git/", - "ref": "49d6938693f6faa3ff09998f86dba551ae3a996b" - }, - "olefile": { - "hashes": [ - "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.46" - }, - "oletools": { - "hashes": [ - "sha256:e2a6d3e3c860822d8539d47cfd89bb681a9663ae4d1ea9ec99e88b14d85b6c4e", - "sha256:eb5310d15e79201f4d33d8107209dd8795a7ea0178030ecbc45c4cc915a166e2" - ], - "version": "==0.56.2" - }, - "opencv-python": { - "hashes": [ - "sha256:05c5139d620e8d02f7ce0921796d55736fa19fa15e2ec00a388db2eb1ae1e9a1", - "sha256:085232718f28bddd265da480874c37db5c7354cb08f23f4a68a8639b16276a89", - "sha256:18a4a14015eee30d9cd514db8cdefbf594b1d5c234762d27abe512d62a333bc3", - "sha256:205a73adb29c37e42475645519e612e843a985475da993d10b4d5daa6afec36a", - "sha256:3c001d3feec7f3140f1fb78dfc52ca28122db8240826882d175a208a89d2731b", - "sha256:437f30e300725e1d1b3744dbfbc66a523a4744792b58f3dbe1e9140c8f4dfba5", - "sha256:5366fcd6eae4243add3c8c92142045850f1db8e464bcf0b75313e1596b2e3671", - "sha256:54c64e86a087841869901fd34462bb6bec01cd4652800fdf5d92fe7b0596c82f", - "sha256:6763729fcfee2a08e069aa1982c9a8c1abf55b9cdf2fb9640eda1d85bdece19a", - "sha256:68813b720b88e4951e84399b9a8a7b532d45a07a96ea8f539636242f862e32e0", - "sha256:7f41b97d84ac66bdf13cb4d9f4dad3e159525ba1e3f421e670c787ce536eb70a", - "sha256:831b92fe63ce18dd628f71104da7e60596658b75e2fa16b83aefa3eb10c115e2", - "sha256:881f3d85269500e0c7d72b140a6ebb5c14a089f8140fb9da7ce01f12a245858e", - "sha256:8852be06c0749fef0d9c58f532bbcb0570968c59e41cf56b90f5c92593c6e108", - "sha256:8b5bc61be7fc8565140b746288b370a4bfdb4edb9d680b66bb914e7690485db1", - "sha256:8d3282138f3a8646941089aae142684910ebe40776266448eab5f4bb609fc63f", - "sha256:9a78558b5ae848386edbb843c761e5fed5a8480be9af16274a5a78838529edeb", - "sha256:b42bbba9f5421865377c7960bd4f3dd881003b322a6bf46ed2302b89224d102b", - "sha256:c360cb76ad1ddbd5d2d3e730b42f2ff6e4be08ea6f4a6eefacca175d27467e8f", - "sha256:cdc3363c2911d7cfc6c9f55308c51c2841a7aecbf0bf5e791499d220ce89d880", - "sha256:e1f54736272830a1e895cedf7a4ee67737e31e966d380c82a81ef22515d043a3", - "sha256:e42c644a70d5c54f53a4b114dbd88b4eb83f42a9ca998f07bd5682f3f404efcc", - "sha256:f1bda4d144f5204e077ca4571453ebb2015e5748d5e0043386c92c2bbf7f52eb", - "sha256:f3ac2355217114a683f3f72a9c40a5890914a59c4a2df62e4083c66ff65c9cf9" - ], - "index": "pypi", - "version": "==4.5.3.56" - }, - "pandas": { - "hashes": [ - "sha256:0cd5776be891331a3e6b425b5abeab9596abea18435c5982191356f9b24ae731", - "sha256:1099e2a0cd3a01ec62cca183fc1555833a2d43764950ef8cb5948c8abfc51014", - "sha256:132def05e73d292c949b02e7ef873debb77acc44a8b119d215921046f0c3a91d", - "sha256:1738154049062156429a5cf2fd79a69c9f3fa4f231346a7ec6fd156cd1a9a621", - "sha256:34ced9ce5d5b17b556486da7256961b55b471d64a8990b56e67a84ebeb259416", - "sha256:53b17e4debba26b7446b1e4795c19f94f0c715e288e08145e44bdd2865e819b3", - "sha256:59a78d7066d1c921a77e3306aa0ebf6e55396c097d5dfcc4df8defe3dcecb735", - "sha256:66a95361b81b4ba04b699ecd2416b0591f40cd1e24c60a8bfe0d19009cfa575a", - "sha256:69e1b2f5811f46827722fd641fdaeedb26002bd1e504eacc7a8ec36bdc25393e", - "sha256:7996d311413379136baf0f3cf2a10e331697657c87ced3f17ac7c77f77fe34a3", - "sha256:89f40e5d21814192802421df809f948247d39ffe171e45fe2ab4abf7bd4279d8", - "sha256:9cce01f6d655b4add966fcd36c32c5d1fe84628e200626b3f5e2f40db2d16a0f", - "sha256:a56246de744baf646d1f3e050c4653d632bc9cd2e0605f41051fea59980e880a", - "sha256:ba7ceb8abc6dbdb1e34612d1173d61e4941f1a1eb7e6f703b2633134ae6a6c89", - "sha256:c9e8e0ce5284ebebe110efd652c164ed6eab77f5de4c3533abc756302ee77765", - "sha256:cbcb84d63867af3411fa063af3de64902665bb5b3d40b25b2059e40603594e87", - "sha256:f07a9745ca075ae73a5ce116f5e58f691c0dc9de0bff163527858459df5c176f", - "sha256:fa54dc1d3e5d004a09ab0b1751473698011ddf03e14f1f59b84ad9a6ac630975", - "sha256:fcb71b1935249de80e3a808227189eee381d4d74a31760ced2df21eedc92a8e3" - ], - "index": "pypi", - "version": "==1.3.2" - }, - "pandas-ods-reader": { - "hashes": [ - "sha256:bea2dd630416cd73cbf6e3e8a6d5b291ae7780f3fa2989e5583df12620c3963f" - ], - "index": "pypi", - "version": "==0.1.2" - }, - "passivetotal": { - "hashes": [ - "sha256:246b5a331e39f862dc195c650ede1f6968cea923cd2512cfd51d5e0d6746b912", - "sha256:7896269acfcddb5ee649a06878b1e237ae771ab2063ebdaca3bf46f60e333a3c" - ], - "index": "pypi", - "version": "==2.5.4" - }, - "pcodedmp": { - "hashes": [ - "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955", - "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278" - ], - "version": "==1.2.6" - }, - "pdftotext": { - "hashes": [ - "sha256:efbbfb14cf37ed7ab2c71936bae44707dfed6bb3be7ea5214e9c44c8c258c7af" - ], - "index": "pypi", - "version": "==2.2.0" - }, - "pillow": { - "hashes": [ - "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc", - "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63", - "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d", - "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e", - "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd", - "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4", - "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77", - "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723", - "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba", - "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792", - "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae", - "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e", - "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367", - "sha256:479ab11cbd69612acefa8286481f65c5dece2002ffaa4f9db62682379ca3bb77", - "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856", - "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4", - "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de", - "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8", - "sha256:75e09042a3b39e0ea61ce37e941221313d51a9c26b8e54e12b3ececccb71718a", - "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636", - "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab", - "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79", - "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d", - "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229", - "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf", - "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500", - "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04", - "sha256:c0e0550a404c69aab1e04ae89cca3e2a042b56ab043f7f729d984bf73ed2a093", - "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844", - "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8", - "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82", - "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf", - "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83", - "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0", - "sha256:f156d6ecfc747ee111c167f8faf5f4953761b5e66e91a4e6767e548d0f80129c", - "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8", - "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37", - "sha256:fd7eef578f5b2200d066db1b50c4aa66410786201669fb76d5238b007918fb24", - "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14" - ], - "index": "pypi", - "version": "==8.3.1" - }, - "progressbar2": { - "hashes": [ - "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", - "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" - ], - "version": "==3.53.1" - }, - "psutil": { - "hashes": [ - "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64", - "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131", - "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c", - "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6", - "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023", - "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df", - "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394", - "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4", - "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b", - "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2", - "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d", - "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65", - "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d", - "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef", - "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7", - "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60", - "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6", - "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8", - "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b", - "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d", - "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac", - "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935", - "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d", - "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28", - "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876", - "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0", - "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", - "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.8.0" - }, - "pybgpranking": { - "editable": true, - "git": "https://github.com/D4-project/BGP-Ranking.git/", - "ref": "68de39f6c5196f796055c1ac34504054d688aa59", - "subdirectory": "client" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.20" - }, - "pycryptodome": { - "hashes": [ - "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", - "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", - "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", - "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", - "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", - "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", - "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", - "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", - "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", - "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", - "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", - "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", - "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", - "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", - "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", - "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", - "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", - "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", - "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", - "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", - "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", - "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", - "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", - "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", - "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", - "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", - "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", - "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", - "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", - "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.10.1" - }, - "pycryptodomex": { - "hashes": [ - "sha256:00a584ee52bf5e27d540129ca9bf7c4a7e7447f24ff4a220faa1304ad0c09bcd", - "sha256:04265a7a84ae002001249bd1de2823bcf46832bd4b58f6965567cb8a07cf4f00", - "sha256:0bd35af6a18b724c689e56f2dbbdd8e409288be71952d271ba3d9614b31d188c", - "sha256:20c45a30f3389148f94edb77f3b216c677a277942f62a2b81a1cc0b6b2dde7fc", - "sha256:2959304d1ce31ab303d9fb5db2b294814278b35154d9b30bf7facc52d6088d0a", - "sha256:36dab7f506948056ceba2d57c1ade74e898401960de697cefc02f3519bd26c1b", - "sha256:37ec1b407ec032c7a0c1fdd2da12813f560bad38ae61ad9c7ce3c0573b3e5e30", - "sha256:3b8eb85b3cc7f083d87978c264d10ff9de3b4bfc46f1c6fdc2792e7d7ebc87bb", - "sha256:3dfce70c4e425607ae87b8eae67c9c7dbba59a33b62d70f79417aef0bc5c735b", - "sha256:418f51c61eab52d9920f4ef468d22c89dab1be5ac796f71cf3802f6a6e667df0", - "sha256:4195604f75cdc1db9bccdb9e44d783add3c817319c30aaff011670c9ed167690", - "sha256:4344ab16faf6c2d9df2b6772995623698fb2d5f114dace4ab2ff335550cf71d5", - "sha256:541cd3e3e252fb19a7b48f420b798b53483302b7fe4d9954c947605d0a263d62", - "sha256:564063e3782474c92cbb333effd06e6eb718471783c6e67f28c63f0fc3ac7b23", - "sha256:72f44b5be46faef2a1bf2a85902511b31f4dd7b01ce0c3978e92edb2cc812a82", - "sha256:8a98e02cbf8f624add45deff444539bf26345b479fc04fa0937b23cd84078d91", - "sha256:940db96449d7b2ebb2c7bf190be1514f3d67914bd37e54e8d30a182bd375a1a9", - "sha256:961333e7ee896651f02d4692242aa36b787b8e8e0baa2256717b2b9d55ae0a3c", - "sha256:9f713ffb4e27b5575bd917c70bbc3f7b348241a351015dbbc514c01b7061ff7e", - "sha256:a6584ae58001d17bb4dc0faa8a426919c2c028ef4d90ceb4191802ca6edb8204", - "sha256:c2b680987f418858e89dbb4f09c8c919ece62811780a27051ace72b2f69fb1be", - "sha256:d8fae5ba3d34c868ae43614e0bd6fb61114b2687ac3255798791ce075d95aece", - "sha256:dbd2c361db939a4252589baa94da4404d45e3fc70da1a31e541644cdf354336e", - "sha256:e090a8609e2095aa86978559b140cf8968af99ee54b8791b29ff804838f29f10", - "sha256:e4a1245e7b846e88ba63e7543483bda61b9acbaee61eadbead5a1ce479d94740", - "sha256:ec9901d19cadb80d9235ee41cc58983f18660314a0eb3fc7b11b0522ac3b6c4a", - "sha256:f2abeb4c4ce7584912f4d637b2c57f23720d35dd2892bfeb1b2c84b6fb7a8c88", - "sha256:f3bb267df679f70a9f40f17d62d22fe12e8b75e490f41807e7560de4d3e6bf9f", - "sha256:f933ecf4cb736c7af60a6a533db2bf569717f2318b265f92907acff1db43bc34", - "sha256:fc9c55dc1ed57db76595f2d19a479fc1c3a1be2c9da8de798a93d286c5f65f38" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.10.1" - }, - "pydeep": { - "hashes": [ - "sha256:22866eb422d1d5907f8076ee792da65caecb172425d27576274e2a8eacf6afc1" - ], - "version": "==0.4" - }, - "pydnstrails": { - "editable": true, - "git": "https://github.com/sebdraven/pydnstrails", - "ref": "48c1f740025c51289f43a24863d1845ff12fd21a" - }, - "pyeupi": { - "hashes": [ - "sha256:2309c61ac2ef0eafabd6e9f32a0078069ffbba0e113ebc6b51cffc1869094472", - "sha256:a0798a4a52601b0840339449a1bbf2aa2bc180d8f82a979022954e05fcb5bfba" - ], - "index": "pypi", - "version": "==1.1" - }, - "pygeoip": { - "hashes": [ - "sha256:1938b9dac7b00d77f94d040b9465ea52c938f3fcdcd318b5537994f3c16aef96", - "sha256:f22c4e00ddf1213e0fae36dc60b46ee7c25a6339941ec1a975539014c1f9a96d" - ], - "index": "pypi", - "version": "==0.3.2" - }, - "pyintel471": { - "editable": true, - "git": "https://github.com/MISP/PyIntel471.git", - "ref": "917272fafa8e12102329faca52173e90c5256968" - }, - "pyipasnhistory": { - "editable": true, - "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "a2853c39265cecdd0c0d16850bd34621c0551b87", - "subdirectory": "client" - }, - "pymisp": { - "extras": [ - "email", - "fileobjects", - "openioc", - "pdfexport" - ], - "hashes": [ - "sha256:5971eba9a4d3b7f5ee47035417c7692fc0ec45d581afcaa63e3f7e2d6a400923", - "sha256:641e3db1af1010cff3a652df6eb51ac4f4e540b1801b811d5e009c59114bf26a" - ], - "index": "pypi", - "version": "==2.4.148" - }, - "pyonyphe": { - "editable": true, - "git": "https://github.com/sebdraven/pyonyphe", - "ref": "1ce15581beebb13e841193a08a2eb6f967855fcb" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pypdns": { - "hashes": [ - "sha256:1cef645d6534a86670070762dcb9af62ce1456b018fc818302cb8a2a4bf5a8ec", - "sha256:b54ded94416e8770f1e26f91988798018cfab0e637908aab6086b0d2fc54f57d" - ], - "index": "pypi", - "version": "==1.5.2" - }, - "pypssl": { - "hashes": [ - "sha256:249ea2152827c10e746fe94c2957c0a525f8ed7ca9db2cd972690a3a136d7bb7", - "sha256:88cedaa4191b50154951fce98396521ad6c1d7e3eb914343e7a12ec0df1882a8" - ], - "index": "pypi", - "version": "==2.2" - }, - "pyrsistent": { - "hashes": [ - "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2", - "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7", - "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea", - "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426", - "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710", - "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1", - "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396", - "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2", - "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680", - "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35", - "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427", - "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b", - "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b", - "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f", - "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef", - "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c", - "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4", - "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d", - "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78", - "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b", - "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72" - ], - "markers": "python_version >= '3.6'", - "version": "==0.18.0" - }, - "pytesseract": { - "hashes": [ - "sha256:6148a01e4375760862e8f56ea718e22b5d13b281454df46ea8dac9807793fc5a" - ], - "index": "pypi", - "version": "==0.3.8" - }, - "python-baseconv": { - "hashes": [ - "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" - ], - "version": "==1.2.2" - }, - "python-dateutil": { - "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" - }, - "python-docx": { - "hashes": [ - "sha256:1105d233a0956dd8dd1e710d20b159e2d72ac3c301041b95f4d4ceb3e0ebebc4" - ], - "index": "pypi", - "version": "==0.8.11" - }, - "python-engineio": { - "hashes": [ - "sha256:d510329b6d8ed5662547862f58bc73659ae62defa66b66d745ba021de112fa62", - "sha256:f3ef9a2c048d08990f294c5f8991f6f162c3b12ecbd368baa0d90441de907d1c" - ], - "markers": "python_version >= '3.6'", - "version": "==4.2.1" - }, - "python-magic": { - "hashes": [ - "sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626", - "sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf" - ], - "version": "==0.4.24" - }, - "python-pptx": { - "hashes": [ - "sha256:cbac6cdf28bde418acab332b62f961225f69993579f4662faf9f7a878150d2b5" - ], - "index": "pypi", - "version": "==0.6.19" - }, - "python-socketio": { - "extras": [ - "client" - ], - "hashes": [ - "sha256:7ed57f6c024abdfeb9b25c74c0c00ffc18da47d903e8d72deecb87584370d1fc", - "sha256:ca807c9e1f168e96dea412d64dd834fb47c470d27fd83da0504aa4b248ba2544" - ], - "markers": "python_version >= '3.6'", - "version": "==5.4.0" - }, - "python-utils": { - "hashes": [ - "sha256:18fbc1a1df9a9061e3059a48ebe5c8a66b654d688b0e3ecca8b339a7f168f208", - "sha256:352d5b1febeebf9b3cdb9f3c87a3b26ef22d3c9e274a8ec1e7048ecd2fac4349" - ], - "version": "==2.5.6" - }, - "pytz": { - "hashes": [ - "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", - "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" - ], - "version": "==2019.3" - }, - "pyyaml": { - "hashes": [ - "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf", - "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696", - "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393", - "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77", - "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922", - "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5", - "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8", - "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10", - "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc", - "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018", - "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e", - "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253", - "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347", - "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183", - "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541", - "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb", - "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185", - "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc", - "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db", - "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa", - "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46", - "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122", - "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b", - "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63", - "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df", - "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc", - "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247", - "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", - "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==5.4.1" - }, - "pyzbar": { - "hashes": [ - "sha256:0e204b904e093e5e75aa85e0203bb0e02888105732a509b51f31cff400f34265", - "sha256:496249b546be70ec98c0ff0ad9151e73daaffff129266df86150a15dcd8dac4c", - "sha256:7d6c01d2c0a352fa994aa91b5540d1caeaeaac466656eb41468ca5df33be9f2e" - ], - "index": "pypi", - "version": "==0.1.8" - }, - "pyzipper": { - "hashes": [ - "sha256:6040069654dad040cf8708d4db78ce5829238e2091ad8006a47d97d6ffe275d6", - "sha256:e696e9d306427400e23e13a766c7614b64d9fc3316bdc71bbcc8f0070a14f150" - ], - "markers": "python_version >= '3.5'", - "version": "==0.3.5" - }, - "rdflib": { - "hashes": [ - "sha256:7ce4d757eb26f4dd43205ec340d8c097f29e5adfe45d6ea20238c731dc679879", - "sha256:bb24f0058070d5843503e15b37c597bc3858d328d11acd9476efad3aa62f555d" - ], - "markers": "python_version >= '3.7'", - "version": "==6.0.0" - }, - "redis": { - "hashes": [ - "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", - "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.5.3" - }, - "reportlab": { - "hashes": [ - "sha256:00e9ffb955972a8f6a3a0d61a12231fcaf5e23ee238c98421d65fecc29bd88a1", - "sha256:115177b3fc51209b5f50371735311c9a6cd9d260ffedbdce5fbc965645b7567c", - "sha256:17130f034dae50aaf22fce2292e0077a0c2093ba4363211bcafb54418fb8dc09", - "sha256:200bdfc327d5b06cb400ae86c972b579efe03a1fd8a2e8cb7a5d9aaa744e5adb", - "sha256:496b28ef414d9a7734e07221c4386bb00f416a3aa276b9f349ed9a328c73ec23", - "sha256:4bc378039f70141176f3d511d84bc1a172820d4d2edee4f9fcff52cde753dc08", - "sha256:4f357b4c39b0fa0071de47e8be7af44e07f375d2e59e395daccb7fd13b275668", - "sha256:57b39303e6dbe3de91e60a14269543ac058ac98a0ea6cf900f5403d9c226022f", - "sha256:6472478e597ef4a8f5c621d811d08b7ef09fc5af5bc85c2cf4a4505a7164f8b8", - "sha256:68f9324000cfc5570b5a59a92306691b5d655078a399f20bc72c2581fe903261", - "sha256:69870e2bbf39b60ebe9a31b31324e249bf314bdc2798e46efc58c67db74b56cb", - "sha256:6adb17ba89829d5e77fd81baac396f1af99241d7dfc121a065217334131662e7", - "sha256:7c360aee2bdaa05c24cadddc2f10924961dc7cad125d8876b4d307c879b3b4e8", - "sha256:7c4c8e87ef29714ccc7fa9764efe30d849cd38f8a9a1742ab7aedf8b5e23494d", - "sha256:8a07672e86bf288ea3e55959d2e06d6c01320318662241f9b7a71c583e15e5b5", - "sha256:9f583295f7dd523bf6e5619720677279dc7b9db22671573888f0591fc46b90b2", - "sha256:b668433f32ac955a94633e58ed7800c06c00f9c46d3b99e2189b3d88dc3184c8", - "sha256:b7a92564198c5a5ff4efdb83ace215c73343afb80d9379183bc736fea76edd6d", - "sha256:bd52e1715c70a96a116a61c8477e586b3a46047c85581195bc74162b19b46286", - "sha256:c7ddc9a6234267bbb52059b017ca22f59ffd7d41d545524cb85f68086a2cbb43", - "sha256:c8586d72932b8e3bd50a5230d6f1cfbb85c2605bad34253c6d6fe757211b2bf7", - "sha256:ce3d8e782e3776f19d3accc706aab85ff06caedb70a52016532bebacf5537567", - "sha256:f3fd26f63c4a9033115707a8718154538a1cebfd6ec992f214e6423524450e3e" - ], - "index": "pypi", - "version": "==3.6.1" - }, - "requests": { - "extras": [ - "security" - ], - "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" - ], - "index": "pypi", - "version": "==2.26.0" - }, - "requests-cache": { - "hashes": [ - "sha256:1102daa13a804abe23fad62d694e7dee58d6063a35d94bf6e8c9821e22e5a78b", - "sha256:dd9120a4ab7b8128cba9b6b120d8b5560d566a3cd0f828cced3d3fd60a42ec40" - ], - "markers": "python_version >= '3.6'", - "version": "==0.6.4" - }, - "requests-file": { - "hashes": [ - "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e", - "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953" - ], - "version": "==1.5.1" - }, - "rtfde": { - "hashes": [ - "sha256:18386e4f060cee12a2a8035b0acf0cc99689f5dff1bf347bab7e92351860a21d", - "sha256:b86b5d734950fe8745a5b89133f50554252dbd67c6d1b9265e23ee140e7ea8a2" - ], - "version": "==0.0.2" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:02f0ed93e98ea32498d25a2952635bbd9fabd553599b8ad67724b4ac88dd8f6c", - "sha256:aa1a5b8041bab0d0e8c514949fa8e11b02653061dcbc68365c820b263f8c6ec7" - ], - "markers": "python_version >= '3'", - "version": "==0.17.13" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd", - "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0", - "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277", - "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104", - "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd", - "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78", - "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99", - "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527", - "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84", - "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7", - "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468", - "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b", - "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94", - "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233", - "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb", - "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5", - "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe", - "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751", - "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502", - "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed", - "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c" - ], - "markers": "python_version < '3.10' and platform_python_implementation == 'CPython'", - "version": "==0.2.6" - }, - "shodan": { - "hashes": [ - "sha256:7e2bddbc1b60bf620042d0010f4b762a80b43111dbea9c041d72d4325e260c23" - ], - "index": "pypi", - "version": "==1.25.0" - }, - "sigmatools": { - "hashes": [ - "sha256:55a528916c28f3d20ee6f034364053e281773959b7ad2b19335cbe1424f76839", - "sha256:f64302990e7329327dd916b0bd45760bdbd50edeb498679de9f5fa1bb8bf44e1" - ], - "index": "pypi", - "version": "==0.20" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "socialscan": { - "hashes": [ - "sha256:47f042bb2ab1afb77c2cf2f31e6ab43afa91ff87849a79307cf753dfc7b84f20", - "sha256:d03eb63177c516b1b8eb1fbca3d25753bb6d68b56e7325a96414b8b319c5daad" - ], - "index": "pypi", - "version": "==1.4.2" - }, - "socketio-client": { - "hashes": [ - "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" - ], - "version": "==0.5.7.4" - }, - "soupsieve": { - "hashes": [ - "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc", - "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b" - ], - "markers": "python_version >= '3'", - "version": "==2.2.1" - }, - "sparqlwrapper": { - "hashes": [ - "sha256:17ec44b08b8ae2888c801066249f74fe328eec25d90203ce7eadaf82e64484c7", - "sha256:357ee8a27bc910ea13d77836dbddd0b914991495b8cc1bf70676578155e962a8", - "sha256:8cf6c21126ed76edc85c5c232fd6f77b9f61f8ad1db90a7147cdde2104aff145", - "sha256:c7f9c9d8ebb13428771bc3b6dee54197422507dcc3dea34e30d5dcfc53478dec", - "sha256:d6a66b5b8cda141660e07aeb00472db077a98d22cb588c973209c7336850fb3c" - ], - "index": "pypi", - "version": "==1.8.5" - }, - "stix2-patterns": { - "hashes": [ - "sha256:174fe5302d2c3223205033af987754132a9ea45a9f8e08aefafbe0549c889ea4", - "sha256:bc46cc4eba44b76a17eab7a3ff67f35203543cdb918ab24c1ebd58403fa27992" - ], - "index": "pypi", - "version": "==1.3.2" - }, - "tabulate": { - "hashes": [ - "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", - "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" - ], - "version": "==0.8.9" - }, - "tau-clients": { - "hashes": [ - "sha256:4a8e2a3ee27dcc48b6468343d898cd0d72d6b8c10d7f9e563053cca8c023513b", - "sha256:f57b433663f3fd7741c1975c3e0ad4f7b7977c35ee5e359650784371d4a996a0" - ], - "index": "pypi", - "version": "==0.1.3" - }, - "tldextract": { - "hashes": [ - "sha256:cfae9bc8bda37c3e8c7c8639711ad20e95dc85b207a256b60b0b23d7ff5540ea", - "sha256:e57f22b6d00a28c21673d2048112f1bdcb6a14d4711568305f6bb96cf5bb53a1" - ], - "markers": "python_version >= '3.5'", - "version": "==3.1.0" - }, - "tornado": { - "hashes": [ - "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", - "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", - "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", - "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", - "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", - "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", - "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", - "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", - "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", - "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", - "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", - "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", - "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", - "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", - "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", - "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", - "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", - "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", - "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", - "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", - "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", - "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", - "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", - "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", - "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", - "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", - "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", - "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", - "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", - "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", - "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", - "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", - "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", - "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", - "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", - "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", - "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", - "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", - "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", - "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", - "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" - ], - "markers": "python_version >= '3.5'", - "version": "==6.1" - }, - "tqdm": { - "hashes": [ - "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588", - "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.62.2" - }, - "trustar": { - "hashes": [ - "sha256:e2988cb892103b58a8a22aae232518cb3c7d3899fa90408bc7958d3ab959af09" - ], - "index": "pypi", - "version": "==0.3.35" - }, - "typing-extensions": { - "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" - ], - "version": "==3.10.0.0" - }, - "tzlocal": { - "hashes": [ - "sha256:c736f2540713deb5938d789ca7c3fc25391e9a20803f05b60ec64987cf086559", - "sha256:f4e6e36db50499e0d92f79b67361041f048e2609d166e93456b50746dc4aef12" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0" - }, - "unicodecsv": { - "hashes": [ - "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" - ], - "version": "==0.14.1" - }, - "url-normalize": { - "hashes": [ - "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2", - "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.4.3" - }, - "urlarchiver": { - "hashes": [ - "sha256:652e0890dab58bf62a759656671dcfb9a40eb4a77aac8a8d93154f00360238b5" - ], - "index": "pypi", - "version": "==0.2" - }, - "urllib3": { - "hashes": [ - "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", - "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.6" - }, - "validators": { - "hashes": [ - "sha256:f0ac832212e3ee2e9b10e156f19b106888cf1429c291fbc5297aae87685014ae" - ], - "version": "==0.14.0" - }, - "vt-graph-api": { - "hashes": [ - "sha256:3b13ce6e460aadd9917e883a8fc205f491ba09107963c9ebd3f5df4a8b3e67b7", - "sha256:d766285b06b854da04dd26cdb0ad3613fa17a935c00825b3dc04ea2b307381a6" - ], - "index": "pypi", - "version": "==1.1.2" - }, - "vt-py": { - "hashes": [ - "sha256:e1adfcb54b4ff3e86456b8a551827702650e25469e9d99bf030b71d564358b1d" - ], - "index": "pypi", - "version": "==0.7.2" - }, - "vulners": { - "hashes": [ - "sha256:94a26ee69989d4a863408d4d5765ef4e3279d8f3ccc1f34bfb9c76c862cea138", - "sha256:ba5ffa05a9995995b307beb6faecbe627207269982b0e6d9081212269f8a2903", - "sha256:de508bc6dd8031eb6f8b00f74f3d6197eb8cb86fe0353957284c17bc17b65f1a" - ], - "index": "pypi", - "version": "==1.5.12" - }, - "wand": { - "hashes": [ - "sha256:5ba497e90741a05ebce4603b04ee843150c566482a753554da54dc57d8503bba", - "sha256:ebc01bccc25dba68414ab55b482341f9ad2b197d7f49d5e724f339bbf63fb6db" - ], - "index": "pypi", - "version": "==0.6.7" - }, - "websocket-client": { - "hashes": [ - "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec", - "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d" - ], - "version": "==1.2.1" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" - }, - "xlrd": { - "hashes": [ - "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", - "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" - ], - "index": "pypi", - "version": "==2.0.1" - }, - "xlsxwriter": { - "hashes": [ - "sha256:2f2af944d2b4b5f21cd3ac8e01b2417ec74c60e2ca11cae90b4f32ee172c99d6", - "sha256:3f39bf581c55f3ad1438bc170d7f4c4649cee8b6b7a80d21f79508118eeea52a" - ], - "markers": "python_version >= '3.4'", - "version": "==3.0.1" - }, - "yara-python": { - "hashes": [ - "sha256:03e5c5e333c8572e7994b0b11964d515d61a393f23c5e272f8d0e4229f368c58", - "sha256:0423e08bd618752a028ac0405ff8e0103f3a8fd607dde7618a64a4c010c3757b", - "sha256:0a0dd632dcdb347d1a9a8b1f6a83b3a77d5e63f691357ea4021fb1cf1d7ff0a4", - "sha256:728b99627a8072a877eaaa4dafb4eff39d1b14ff4fd70d39f18899ce81e29625", - "sha256:7cb0d5724eccfa52e1bcd352a56cb4dc422aa51f5f6d0945d4f830783927513b", - "sha256:8c76531e89806c0309586dd4863a972d12f1d5d63261c6d4b9331a99859fd1d8", - "sha256:9472676583e212bc4e17c2236634e02273d53c872b350f0571b48e06183de233", - "sha256:9735b680a7d95c1d3f255c351bb067edc62cdb3c0999f7064278cb2c85245405", - "sha256:997f104590167220a9af5564c042ec4d6534261e7b8a5b49655d8dffecc6b8a2", - "sha256:a48e071d02a3699363e628ac899b5b7237803bcb4b512c92ebcb4fb9b1488497", - "sha256:b67c0d75a6519ca357b4b85ede9768c96a81fff20fbc169bd805ff009ddee561" - ], - "index": "pypi", - "version": "==3.8.1" - }, - "yarl": { - "hashes": [ - "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", - "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", - "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", - "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", - "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", - "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", - "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", - "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", - "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", - "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", - "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", - "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", - "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", - "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", - "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", - "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", - "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", - "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", - "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", - "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", - "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", - "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", - "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", - "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", - "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", - "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", - "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", - "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", - "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", - "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", - "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", - "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", - "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", - "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", - "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", - "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", - "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" - ], - "markers": "python_version >= '3.6'", - "version": "==1.6.3" - } - }, - "develop": { - "attrs": { - "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" - }, - "certifi": { - "hashes": [ - "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", - "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" - ], - "version": "==2021.5.30" - }, - "charset-normalizer": { - "hashes": [ - "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", - "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" - ], - "markers": "python_version >= '3'", - "version": "==2.0.4" - }, - "codecov": { - "hashes": [ - "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47", - "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635", - "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1" - ], - "index": "pypi", - "version": "==2.1.12" - }, - "coverage": { - "hashes": [ - "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c", - "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6", - "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45", - "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a", - "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03", - "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529", - "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a", - "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a", - "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2", - "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6", - "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759", - "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53", - "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a", - "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4", - "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff", - "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502", - "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793", - "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb", - "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905", - "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821", - "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b", - "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81", - "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0", - "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b", - "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3", - "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184", - "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701", - "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a", - "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82", - "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638", - "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5", - "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083", - "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6", - "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90", - "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465", - "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a", - "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3", - "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e", - "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066", - "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf", - "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b", - "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae", - "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669", - "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873", - "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b", - "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6", - "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb", - "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160", - "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c", - "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079", - "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d", - "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.5" - }, - "flake8": { - "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" - ], - "index": "pypi", - "version": "==3.9.2" - }, - "idna": { - "hashes": [ - "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", - "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" - ], - "markers": "python_version >= '3'", - "version": "==3.2" - }, - "iniconfig": { - "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" - ], - "version": "==1.1.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "nose": { - "hashes": [ - "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", - "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a", - "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98" - ], - "index": "pypi", - "version": "==1.3.7" - }, - "packaging": { - "hashes": [ - "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7", - "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14" - ], - "markers": "python_version >= '3.6'", - "version": "==21.0" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" - }, - "py": { - "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.10.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.7.0" - }, - "pyflakes": { - "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.3.1" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", - "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" - ], - "index": "pypi", - "version": "==6.2.4" - }, - "requests": { - "extras": [ - "security" - ], - "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" - ], - "index": "pypi", - "version": "==2.26.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, - "urllib3": { - "hashes": [ - "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", - "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.6" - } - } -} From 2d98885231e647a3572e2c98de1d401fbb2d2b4b Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 18 Dec 2021 09:22:32 +0100 Subject: [PATCH 349/476] chg: [hashlookup] support for sha256 and bug fix for non-exising MD5 --- misp_modules/modules/expansion/hashlookup.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index a88de8a..60c43d7 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -5,8 +5,8 @@ from collections import defaultdict from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['md5', 'sha1'], 'format': 'misp_standard'} -moduleinfo = {'version': '1', 'author': 'Alexandre Dulaunoy', +mispattributes = {'input': ['md5', 'sha1', 'sha256'], 'format': 'misp_standard'} +moduleinfo = {'version': '2', 'author': 'Alexandre Dulaunoy', 'description': 'An expansion module to enrich a file hash with hashlookup.circl.lu services (NSRL and other sources)', 'module-type': ['expansion', 'hover']} moduleconfig = ["custom_API"] @@ -35,8 +35,12 @@ class HashlookupParser(): hashlookup_object.add_attribute('source', **{'type': 'text', 'value': self.hashlookupresult['source']}) if 'KnownMalicious' in self.hashlookupresult: hashlookup_object.add_attribute('KnownMalicious', **{'type': 'text', 'value': self.hashlookupresult['KnownMalicious']}) - hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) + if 'MD5' in self.hashlookupresult: + hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) + # SHA-1 is the default value in hashlookup it must always be present hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) + if 'SHA-256' in self.hashlookupresult: + hashlookup_object.add_attribute('SHA-256', **{'type': 'sha256', 'value': self.hashlookup['SHA-256']}) if 'SSDEEP' in self.hashlookupresult: hashlookup_object.add_attribute('SSDEEP', **{'type': 'ssdeep', 'value': self.hashlookupresult['SSDEEP']}) if 'TLSH' in self.hashlookupresult: @@ -71,8 +75,10 @@ def handler(q=False): pass elif attribute.get('type') == 'sha1': pass + elif attribute.get('type') == 'sha256': + pass else: - misperrors['error'] = 'md5 or sha1 is missing.' + misperrors['error'] = 'md5 or sha1 or sha256 is missing.' return misperrors api_url = check_url(request['config']['custom_API']) if request['config'].get('custom_API') else hashlookup_url r = requests.get("{}/lookup/{}/{}".format(api_url, attribute.get('type'), attribute['value'])) From 268bb312c932f6c5bac3f8b8fb06dbdd7dc98814 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 18 Dec 2021 17:11:06 +0100 Subject: [PATCH 350/476] fix: [hashlookup] typo fixed --- misp_modules/modules/expansion/hashlookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py index 60c43d7..eeca95f 100644 --- a/misp_modules/modules/expansion/hashlookup.py +++ b/misp_modules/modules/expansion/hashlookup.py @@ -40,7 +40,7 @@ class HashlookupParser(): # SHA-1 is the default value in hashlookup it must always be present hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) if 'SHA-256' in self.hashlookupresult: - hashlookup_object.add_attribute('SHA-256', **{'type': 'sha256', 'value': self.hashlookup['SHA-256']}) + hashlookup_object.add_attribute('SHA-256', **{'type': 'sha256', 'value': self.hashlookupresult['SHA-256']}) if 'SSDEEP' in self.hashlookupresult: hashlookup_object.add_attribute('SSDEEP', **{'type': 'ssdeep', 'value': self.hashlookupresult['SSDEEP']}) if 'TLSH' in self.hashlookupresult: From 767de02107cc87d1b8edc487ee61fb1c57a591a1 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 22 Dec 2021 11:37:33 +0100 Subject: [PATCH 351/476] chg: [gitchangelogrc] added --- .gitchangelog.rc | 289 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 .gitchangelog.rc diff --git a/.gitchangelog.rc b/.gitchangelog.rc new file mode 100644 index 0000000..19d9b85 --- /dev/null +++ b/.gitchangelog.rc @@ -0,0 +1,289 @@ +# -*- coding: utf-8; mode: python -*- +## +## Format +## +## ACTION: [AUDIENCE:] COMMIT_MSG [!TAG ...] +## +## Description +## +## ACTION is one of 'chg', 'fix', 'new' +## +## Is WHAT the change is about. +## +## 'chg' is for refactor, small improvement, cosmetic changes... +## 'fix' is for bug fixes +## 'new' is for new features, big improvement +## +## AUDIENCE is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc'|'docs' +## +## Is WHO is concerned by the change. +## +## 'dev' is for developpers (API changes, refactors...) +## 'usr' is for final users (UI changes) +## 'pkg' is for packagers (packaging changes) +## 'test' is for testers (test only related changes) +## 'doc' is for doc guys (doc only changes) +## +## COMMIT_MSG is ... well ... the commit message itself. +## +## TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic' +## +## They are preceded with a '!' or a '@' (prefer the former, as the +## latter is wrongly interpreted in github.) Commonly used tags are: +## +## 'refactor' is obviously for refactoring code only +## 'minor' is for a very meaningless change (a typo, adding a comment) +## 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...) +## 'wip' is for partial functionality but complete subfunctionality. +## +## Example: +## +## new: usr: support of bazaar implemented +## chg: re-indentend some lines !cosmetic +## new: dev: updated code to be compatible with last version of killer lib. +## fix: pkg: updated year of licence coverage. +## new: test: added a bunch of test around user usability of feature X. +## fix: typo in spelling my name in comment. !minor +## +## Please note that multi-line commit message are supported, and only the +## first line will be considered as the "summary" of the commit message. So +## tags, and other rules only applies to the summary. The body of the commit +## message will be displayed in the changelog without reformatting. + + +## +## ``ignore_regexps`` is a line of regexps +## +## Any commit having its full commit message matching any regexp listed here +## will be ignored and won't be reported in the changelog. +## +ignore_regexps = [ + r'@minor', r'!minor', + r'@cosmetic', r'!cosmetic', + r'@refactor', r'!refactor', + r'@wip', r'!wip', + r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[p|P]kg:', + r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[d|D]ev:', + r'^(.{3,3}\s*:)?\s*[fF]irst commit.?\s*$', + ] + + +## ``section_regexps`` is a list of 2-tuples associating a string label and a +## list of regexp +## +## Commit messages will be classified in sections thanks to this. Section +## titles are the label, and a commit is classified under this section if any +## of the regexps associated is matching. +## +## Please note that ``section_regexps`` will only classify commits and won't +## make any changes to the contents. So you'll probably want to go check +## ``subject_process`` (or ``body_process``) to do some changes to the subject, +## whenever you are tweaking this variable. +## +section_regexps = [ + ('New', [ + r'^[nN]ew\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + ('Changes', [ + r'^[cC]hg\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + ('Fix', [ + r'^[fF]ix\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + + ('Other', None ## Match all lines + ), + +] + + +## ``body_process`` is a callable +## +## This callable will be given the original body and result will +## be used in the changelog. +## +## Available constructs are: +## +## - any python callable that take one txt argument and return txt argument. +## +## - ReSub(pattern, replacement): will apply regexp substitution. +## +## - Indent(chars=" "): will indent the text with the prefix +## Please remember that template engines gets also to modify the text and +## will usually indent themselves the text if needed. +## +## - Wrap(regexp=r"\n\n"): re-wrap text in separate paragraph to fill 80-Columns +## +## - noop: do nothing +## +## - ucfirst: ensure the first letter is uppercase. +## (usually used in the ``subject_process`` pipeline) +## +## - final_dot: ensure text finishes with a dot +## (usually used in the ``subject_process`` pipeline) +## +## - strip: remove any spaces before or after the content of the string +## +## - SetIfEmpty(msg="No commit message."): will set the text to +## whatever given ``msg`` if the current text is empty. +## +## Additionally, you can `pipe` the provided filters, for instance: +#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') | Indent(chars=" ") +#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') +#body_process = noop +body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip + + +## ``subject_process`` is a callable +## +## This callable will be given the original subject and result will +## be used in the changelog. +## +## Available constructs are those listed in ``body_process`` doc. +subject_process = (strip | + ReSub(r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$', r'\4') | + SetIfEmpty("No commit message.") | ucfirst | final_dot) + + +## ``tag_filter_regexp`` is a regexp +## +## Tags that will be used for the changelog must match this regexp. +## +tag_filter_regexp = r'^v[0-9]+\.[0-9]+\.[0-9]+$' + + + +## ``unreleased_version_label`` is a string or a callable that outputs a string +## +## This label will be used as the changelog Title of the last set of changes +## between last valid tag and HEAD if any. +unreleased_version_label = "%%version%% (unreleased)" + + +## ``output_engine`` is a callable +## +## This will change the output format of the generated changelog file +## +## Available choices are: +## +## - rest_py +## +## Legacy pure python engine, outputs ReSTructured text. +## This is the default. +## +## - mustache() +## +## Template name could be any of the available templates in +## ``templates/mustache/*.tpl``. +## Requires python package ``pystache``. +## Examples: +## - mustache("markdown") +## - mustache("restructuredtext") +## +## - makotemplate() +## +## Template name could be any of the available templates in +## ``templates/mako/*.tpl``. +## Requires python package ``mako``. +## Examples: +## - makotemplate("restructuredtext") +## +#output_engine = rest_py +#output_engine = mustache("restructuredtext") +output_engine = mustache("markdown") +#output_engine = makotemplate("restructuredtext") + + +## ``include_merge`` is a boolean +## +## This option tells git-log whether to include merge commits in the log. +## The default is to include them. +include_merge = True + + +## ``log_encoding`` is a string identifier +## +## This option tells gitchangelog what encoding is outputed by ``git log``. +## The default is to be clever about it: it checks ``git config`` for +## ``i18n.logOutputEncoding``, and if not found will default to git's own +## default: ``utf-8``. +#log_encoding = 'utf-8' + + +## ``publish`` is a callable +## +## Sets what ``gitchangelog`` should do with the output generated by +## the output engine. ``publish`` is a callable taking one argument +## that is an interator on lines from the output engine. +## +## Some helper callable are provided: +## +## Available choices are: +## +## - stdout +## +## Outputs directly to standard output +## (This is the default) +## +## - FileInsertAtFirstRegexMatch(file, pattern, idx=lamda m: m.start()) +## +## Creates a callable that will parse given file for the given +## regex pattern and will insert the output in the file. +## ``idx`` is a callable that receive the matching object and +## must return a integer index point where to insert the +## the output in the file. Default is to return the position of +## the start of the matched string. +## +## - FileRegexSubst(file, pattern, replace, flags) +## +## Apply a replace inplace in the given file. Your regex pattern must +## take care of everything and might be more complex. Check the README +## for a complete copy-pastable example. +## +# publish = FileInsertIntoFirstRegexMatch( +# "CHANGELOG.rst", +# r'/(?P[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n/', +# idx=lambda m: m.start(1) +# ) +#publish = stdout + + +## ``revs`` is a list of callable or a list of string +## +## callable will be called to resolve as strings and allow dynamical +## computation of these. The result will be used as revisions for +## gitchangelog (as if directly stated on the command line). This allows +## to filter exaclty which commits will be read by gitchangelog. +## +## To get a full documentation on the format of these strings, please +## refer to the ``git rev-list`` arguments. There are many examples. +## +## Using callables is especially useful, for instance, if you +## are using gitchangelog to generate incrementally your changelog. +## +## Some helpers are provided, you can use them:: +## +## - FileFirstRegexMatch(file, pattern): will return a callable that will +## return the first string match for the given pattern in the given file. +## If you use named sub-patterns in your regex pattern, it'll output only +## the string matching the regex pattern named "rev". +## +## - Caret(rev): will return the rev prefixed by a "^", which is a +## way to remove the given revision and all its ancestor. +## +## Please note that if you provide a rev-list on the command line, it'll +## replace this value (which will then be ignored). +## +## If empty, then ``gitchangelog`` will act as it had to generate a full +## changelog. +## +## The default is to use all commits to make the changelog. +#revs = ["^1.0.3", ] +#revs = [ +# Caret( +# FileFirstRegexMatch( +# "CHANGELOG.rst", +# r"(?P[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n")), +# "HEAD" +#] +revs = [] From ef55d7cc3d96ac5b3b9249491edf4b6d768e1c77 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 14:40:19 +0100 Subject: [PATCH 352/476] new: [CI] Use GitHub Actions for test --- .github/workflows/python-package.yml | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/python-package.yml diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 0000000..a444958 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,50 @@ +name: Python package + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.7", "3.8", "3.9"] + + steps: + - run: | + sudo apt-get install libfuzzy-dev libpoppler-cpp-dev libzbar0 tesseract-ocr + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Cache Python dependencies + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('REQUIREMENTS') }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest + # pyfaul must be installed manually (?) + pip install -r REQUIREMENTS pyfaup + pip install . + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + # Run server in background + misp-modules -l 127.0.0.1 -s & + sleep 5 + # Run tests + pytest tests From e50ab6379f289660d50c51f9427455aab9cbf87a Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 14:59:13 +0100 Subject: [PATCH 353/476] fix: [test] Typo --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 838c39b..e33825a 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -253,7 +253,7 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_values(response), 'This IP is commonly spoofed in Internet-scan activity') except Exception: self.assertIn( - self.get_errors(reponse), + self.get_errors(response), ( "Unauthorized. Please check your API key.", "Too many requests. You've hit the rate-limit." From 1f75b8f8658e30faabaca00283d31a0741d7994d Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 15:33:23 +0100 Subject: [PATCH 354/476] fix: [internal] Better exception logging --- misp_modules/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/__init__.py b/misp_modules/__init__.py index 21e3db3..b068d8a 100644 --- a/misp_modules/__init__.py +++ b/misp_modules/__init__.py @@ -41,14 +41,14 @@ try: from .modules import * # noqa HAS_PACKAGE_MODULES = True except Exception as e: - print(e) + logging.exception(e) HAS_PACKAGE_MODULES = False try: from .helpers import * # noqa HAS_PACKAGE_HELPERS = True except Exception as e: - print(e) + logging.exception(e) HAS_PACKAGE_HELPERS = False log = logging.getLogger('misp-modules') From c5801d1776e9f51d66c8580d6271c88042089406 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 16:03:06 +0100 Subject: [PATCH 355/476] fix: [test] Better error handling --- tests/test_expansions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index e33825a..97d758c 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -65,6 +65,8 @@ class TestExpansions(unittest.TestCase): if not isinstance(data, dict): print(json.dumps(data, indent=2)) return data + if 'results' not in data: + return data for result in data['results']: values = result['values'] if values: From 3fe7072bfbe9410acd419345de179725fb120def Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 16:10:29 +0100 Subject: [PATCH 356/476] fix: [ods_enrich] Better exception logging --- misp_modules/modules/expansion/ods_enrich.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/ods_enrich.py b/misp_modules/modules/expansion/ods_enrich.py index b247c44..8b66688 100644 --- a/misp_modules/modules/expansion/ods_enrich.py +++ b/misp_modules/modules/expansion/ods_enrich.py @@ -4,6 +4,7 @@ import np import ezodf import pandas_ods_reader import io +import logging misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment'], @@ -37,11 +38,10 @@ def handler(q=False): for i in range(0, num_sheets): ods = pandas_ods_reader.read_ods(ods_file, i, headers=False) ods_content = ods_content + "\n" + ods.to_string(max_rows=None) - print(ods_content) return {'results': [{'types': ['freetext'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}, {'types': ['text'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}]} except Exception as e: - print(e) + logging.exception(e) err = "Couldn't analyze file as .ods. Error was: " + str(e) misperrors['error'] = err return misperrors From 2842b27c5074fa9a133cc0daf2e936e5e9c5a7c3 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 16:17:37 +0100 Subject: [PATCH 357/476] fix: [test] Skip test_ipasn and test_otx tests --- tests/test_expansions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 97d758c..7af78b7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -265,6 +265,7 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Missing Greynoise API key.') + @unittest.skip("Service doesn't work") def test_ipasn(self): query = {"module": "ipasn", "attribute": {"type": "ip-src", @@ -345,6 +346,7 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Onyphe authentication is missing') + @unittest.skip("Unreliable results") def test_otx(self): query_types = ('domain', 'ip-src', 'md5') query_values = ('circl.lu', '8.8.8.8', '616eff3e9a7575ae73821b4668d2801c') From 907ac1e93565ae9bd7320482bcedd37fa90a7319 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 16:31:10 +0100 Subject: [PATCH 358/476] fix: [ods_enrich] Try to fix reading bytesio --- misp_modules/modules/expansion/ods_enrich.py | 2 +- tests/test_expansions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/ods_enrich.py b/misp_modules/modules/expansion/ods_enrich.py index 8b66688..69aca77 100644 --- a/misp_modules/modules/expansion/ods_enrich.py +++ b/misp_modules/modules/expansion/ods_enrich.py @@ -36,7 +36,7 @@ def handler(q=False): num_sheets = len(doc.sheets) try: for i in range(0, num_sheets): - ods = pandas_ods_reader.read_ods(ods_file, i, headers=False) + ods = pandas_ods_reader.algo.read_data(pandas_ods_reader.parsers.ods, ods_file, i, headers=False) ods_content = ods_content + "\n" + ods.to_string(max_rows=None) return {'results': [{'types': ['freetext'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}, {'types': ['text'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}]} diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 7af78b7..841a39a 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -304,7 +304,7 @@ class TestExpansions(unittest.TestCase): encoded = b64encode(f.read()).decode() query = {"module": "ods_enrich", "attachment": filename, "data": encoded} response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), '\n column_0\n0 ods test') + self.assertEqual(self.get_values(response), '\n column.0\n0 ods test') def test_odt(self): filename = 'test.odt' From 84ded524f96011eba6ea952f4e1312b4fed0ad8a Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 24 Dec 2021 16:54:12 +0100 Subject: [PATCH 359/476] chg: [pip] Force pandas to 1.3.5 --- Pipfile | 2 +- REQUIREMENTS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index e8f6929..85226be 100644 --- a/Pipfile +++ b/Pipfile @@ -48,7 +48,7 @@ ODTReader = { editable = true, git = "https://github.com/cartertemm/ODTReader.gi python-pptx = "*" python-docx = "*" ezodf = "*" -pandas = "*" +pandas = "==1.3.5" pandas_ods_reader = "==0.1.2" pdftotext = "*" lxml = "*" diff --git a/REQUIREMENTS b/REQUIREMENTS index 187722e..46b2a48 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -80,7 +80,7 @@ olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, oletools==0.56.2 opencv-python==4.5.3.56 pandas-ods-reader==0.1.2 -pandas==1.1.5 +pandas==1.3.5 passivetotal==2.5.4 pcodedmp==1.2.6 pdftotext==2.2.0 From e86201a9fc7775e31e4afcdb1df3a0165fbc184a Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 25 Dec 2021 09:09:08 +0100 Subject: [PATCH 360/476] Update README Add status badge for GH workflow --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 66caa42..6b96be2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # MISP modules -[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=main)](https://travis-ci.org/MISP/misp-modules) -[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=main)](https://coveralls.io/github/MISP/misp-modules?branch=main) +[![Python package](https://github.com/MISP/misp-modules/actions/workflows/python-package.yml/badge.svg)](https://github.com/MISP/misp-modules/actions/workflows/python-package.yml)[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=main)](https://coveralls.io/github/MISP/misp-modules?branch=main) [![codecov](https://codecov.io/gh/MISP/misp-modules/branch/main/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) MISP modules are autonomous modules that can be used to extend [MISP](https://github.com/MISP/MISP) for new services such as expansion, import and export. From c42723d42df0bb295fa8d7d426702ffa96374a89 Mon Sep 17 00:00:00 2001 From: Koen Van Impe Date: Sun, 26 Dec 2021 23:34:00 +0100 Subject: [PATCH 361/476] Module to push malware samples to a MWDB instance - Upload of attachment or malware sample to MWDB - Tags of events and/or attributes are added to MWDB. - Comment of the MISP attribute is added to MWDB. - A link back to the MISP event is added to MWDB via the MWDB attribute. - A link to the MWDB attribute is added as an enriched attribute to the MISP event. --- documentation/website/expansion/mwdb.json | 11 ++ misp_modules/modules/expansion/__init__.py | 4 +- misp_modules/modules/expansion/mwdb.py | 140 +++++++++++++++++++++ 3 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 documentation/website/expansion/mwdb.json create mode 100644 misp_modules/modules/expansion/mwdb.py diff --git a/documentation/website/expansion/mwdb.json b/documentation/website/expansion/mwdb.json new file mode 100644 index 0000000..456a160 --- /dev/null +++ b/documentation/website/expansion/mwdb.json @@ -0,0 +1,11 @@ +{ + "description": "Module to push malware samples to a MWDB instance", + "requirements": [ + "* mwdblib installed (pip install mwdblib) ; * (optional) keys.py file to add tags of events/attributes to MWDB * (optional) MWDB attribute created for the link back to MISP (defined in mwdb_misp_attribute)" + ], + "input": "Attachment or malware sample", + "output": "Link attribute that points to the sample at the MWDB instane", + "references": [ + ], + "features": "An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB). Does: * Upload of attachment or malware sample to MWDB * Tags of events and/or attributes are added to MWDB. * Comment of the MISP attribute is added to MWDB. * A link back to the MISP event is added to MWDB via the MWDB attribute. * A link to the MWDB attribute is added as an enrichted attribute to the MISP event." +} \ No newline at end of file diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1666ffe..7591d7d 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry'] + 'qintel_qsentry', 'mwdb'] minimum_required_fields = ('type', 'uuid', 'value') @@ -28,4 +28,4 @@ standard_error_message = 'This module requires an "attribute" field as input' def check_input_attribute(attribute, requirements=minimum_required_fields): - return all(feature in attribute for feature in requirements) \ No newline at end of file + return all(feature in attribute for feature in requirements) diff --git a/misp_modules/modules/expansion/mwdb.py b/misp_modules/modules/expansion/mwdb.py new file mode 100644 index 0000000..aa3c727 --- /dev/null +++ b/misp_modules/modules/expansion/mwdb.py @@ -0,0 +1,140 @@ +import json +import sys +import base64 +#from distutils.util import strtobool + +import io +import zipfile + +from pymisp import PyMISP, MISPEvent, MISPAttribute +from mwdblib import MWDB + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['attachment', 'malware-sample'], 'output': ['link']} +moduleinfo = {'version': '1', 'author': 'Koen Van Impe', + 'description': 'Module to push malware samples to a MWDB instance', + 'module-type': ['expansion']} + +moduleconfig = ['mwdb_apikey', 'mwdb_url', 'mwdb_misp_attribute', 'mwdb_public', 'include_tags_event', 'include_tags_attribute'] + +pymisp_keys_file = "/var/www/MISP/PyMISP/" +mwdb_public_default = True + +""" +An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. +This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB) + +Does: +- Upload of attachment or malware sample to MWDB +- Tags of events and/or attributes are added to MWDB. +- Comment of the MISP attribute is added to MWDB. +- A link back to the MISP event is added to MWDB via the MWDB attribute. +- A link to the MWDB attribute is added as an enriched attribute to the MISP event. + +Requires +- mwdblib installed (pip install mwdblib) +- (optional) keys.py file to add tags of events/attributes to MWDB +- (optional) MWDB "attribute" created for the link back to MISP (defined in mwdb_misp_attribute) +""" + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + try: + data = request.get("data") + if 'malware-sample' in request: + # malicious samples are encrypted with zip (password infected) and then base64 encoded + sample_filename = request.get("malware-sample").split("|", 1)[0] + data = base64.b64decode(data) + fl = io.BytesIO(data) + zf = zipfile.ZipFile(fl) + sample_hashname = zf.namelist()[0] + data = zf.read(sample_hashname, b"infected") + zf.close() + elif 'attachment' in request: + # All attachments get base64 encoded + sample_filename = request.get("attachment") + data = base64.b64decode(data) + + else: + misperrors['error'] = "No malware sample or attachment supplied" + return misperrors + except Exception: + misperrors['error'] = "Unable to process submited sample data" + return misperrors + + if (request["config"].get("mwdb_apikey") is None) or (request["config"].get("mwdb_url") is None): + misperrors["error"] = "Missing MWDB API key or server URL" + return misperrors + + mwdb_misp_attribute = request["config"].get("mwdb_misp_attribute") + mwdb_public = request["config"].get("mwdb_public", mwdb_public_default) + + include_tags_event = request["config"].get("include_tags_event") + include_tags_attribute = request["config"].get("include_tags_attribute") + misp_event_id = request.get("event_id") + misp_attribute_uuid = request.get("attribute_uuid") + misp_attribute_comment = "" + mwdb_tags = [] + misp_info = "" + + try: + if include_tags_event: + sys.path.append(pymisp_keys_file) + from keys import misp_url, misp_key, misp_verifycert + misp = PyMISP(misp_url, misp_key, misp_verifycert, False) + misp_event = misp.get_event(misp_event_id) + if "Event" in misp_event: + misp_info = misp_event["Event"]["info"] + if "Tag" in misp_event["Event"]: + tags = misp_event["Event"]["Tag"] + for tag in tags: + if "misp-galaxy" not in tag["name"]: + mwdb_tags.append(tag["name"]) + if include_tags_attribute: + sys.path.append(pymisp_keys_file) + from keys import misp_url, misp_key, misp_verifycert + misp = PyMISP(misp_url, misp_key, misp_verifycert, False) + misp_attribute = misp.get_attribute(misp_attribute_uuid) + if "Attribute" in misp_attribute: + if "Tag" in misp_attribute["Attribute"]: + tags = misp_attribute["Attribute"]["Tag"] + for tag in tags: + if "misp-galaxy" not in tag["name"]: + mwdb_tags.append(tag["name"]) + misp_attribute_comment = misp_attribute["Attribute"]["comment"] + except Exception: + misperrors['error'] = "Unable to read PyMISP (keys.py) configuration file" + return misperrors + + try: + mwdb = MWDB(api_key=request["config"].get("mwdb_apikey"), api_url=request["config"].get("mwdb_url")) + if mwdb_misp_attribute and len(mwdb_misp_attribute) > 0: + metakeys = {mwdb_misp_attribute: misp_event_id} + else: + metakeys = False + file_object = mwdb.upload_file(sample_filename, data, metakeys=metakeys, public=mwdb_public) + for tag in mwdb_tags: + file_object.add_tag(tag) + if len(misp_attribute_comment) < 1: + misp_attribute_comment = "MISP attribute {}".format(misp_attribute_uuid) + file_object.add_comment(misp_attribute_comment) + mwdb_link = request["config"].get("mwdb_url").replace("/api", "/file/") + "{}".format(file_object.md5) + except Exception: + misperrors['error'] = "Unable to send sample to MWDB instance" + return misperrors + + r = {'results': [{'types': 'link', 'values': mwdb_link, 'comment': 'Link to MWDB sample'}]} + return r + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From b9fb2f3ca7ceb0945523e7fcc87270af60c986c0 Mon Sep 17 00:00:00 2001 From: Koen Van Impe Date: Sun, 26 Dec 2021 23:59:16 +0100 Subject: [PATCH 362/476] Update mwdb.py --- misp_modules/modules/expansion/mwdb.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/mwdb.py b/misp_modules/modules/expansion/mwdb.py index aa3c727..66f5fe4 100644 --- a/misp_modules/modules/expansion/mwdb.py +++ b/misp_modules/modules/expansion/mwdb.py @@ -6,7 +6,7 @@ import base64 import io import zipfile -from pymisp import PyMISP, MISPEvent, MISPAttribute +from pymisp import PyMISP from mwdblib import MWDB misperrors = {'error': 'Error'} @@ -122,6 +122,8 @@ def handler(q=False): if len(misp_attribute_comment) < 1: misp_attribute_comment = "MISP attribute {}".format(misp_attribute_uuid) file_object.add_comment(misp_attribute_comment) + if len(misp_event) > 0: + file_object.add_comment("Fetched from event {} - {}".format(misp_event_id, misp_info)) mwdb_link = request["config"].get("mwdb_url").replace("/api", "/file/") + "{}".format(file_object.md5) except Exception: misperrors['error'] = "Unable to send sample to MWDB instance" From adc61963df95422930643a3eaf73607070fd98e5 Mon Sep 17 00:00:00 2001 From: Koen Van Impe Date: Mon, 27 Dec 2021 15:23:13 +0100 Subject: [PATCH 363/476] Update REQUIREMENTS --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 46b2a48..a2486b4 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -151,3 +151,4 @@ xlsxwriter==3.0.1; python_version >= '3.4' yara-python==3.8.1 yarl==1.6.3; python_version >= '3.6' ndjson==0.3.1 +mwdblib==3.4.1 From 6c4e7881101cc9f429896c24fc592651edd92c29 Mon Sep 17 00:00:00 2001 From: Derek LaHousse Date: Thu, 30 Dec 2021 09:25:44 -0500 Subject: [PATCH 364/476] It seems alright to leave the field empty, just have to check that it is empty --- misp_modules/modules/import_mod/csvimport.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/csvimport.py b/misp_modules/modules/import_mod/csvimport.py index 34eed8c..6bd79b7 100644 --- a/misp_modules/modules/import_mod/csvimport.py +++ b/misp_modules/modules/import_mod/csvimport.py @@ -224,7 +224,8 @@ class CsvParser(): @staticmethod def __deal_with_tags(attribute): - attribute['Tag'] = [{'name': tag.strip()} for tag in attribute['Tag'].split(',')] + if 'Tag' in attribute.keys(): + attribute['Tag'] = [{'name': tag.strip()} for tag in attribute['Tag'].split(',')] def __get_score(self): score = 1 if 'to_ids' in self.header else 0 From a08ec71b96f55dee5dde7733e456044ac23b9fd1 Mon Sep 17 00:00:00 2001 From: Silvian I Date: Thu, 6 Jan 2022 11:35:01 +0100 Subject: [PATCH 365/476] Upgrade censys_enrich module to new api version --- REQUIREMENTS | 2 +- .../modules/expansion/censys_enrich.py | 119 +++++++++++------- tests/expansion_configs.json | 6 + tests/test_expansions.py | 15 +++ 4 files changed, 93 insertions(+), 49 deletions(-) create mode 100644 tests/expansion_configs.json diff --git a/REQUIREMENTS b/REQUIREMENTS index a2486b4..ccc737f 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -27,8 +27,8 @@ beautifulsoup4==4.9.3 bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 certifi==2021.5.30 +censys==2.0.9 cffi==1.14.6 - #chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' chardet charset-normalizer==2.0.4; python_version >= '3' diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index d5823ff..033824c 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -1,15 +1,26 @@ # encoding: utf-8 import json +import configparser import base64 import codecs +import censys.common.config from dateutil.parser import isoparse from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject + try: - import censys.base - import censys.ipv4 - import censys.websites - import censys.certificates + #needed in order to overwrite the censys module intent of creating config files in the home folder of the proccess owner + #-- + def get_config_over() -> configparser.ConfigParser: + config = configparser.ConfigParser() + config[censys.common.config.DEFAULT] = censys.common.config.default_config + return config + censys.common.config.get_config = get_config_over + #-- + + from censys.search import CensysHosts + from censys.search import CensysCertificates + from censys.common.base import * except ImportError: print("Censys module not installed. Try 'pip install censys'") @@ -20,8 +31,11 @@ mispattributes = {'input': ['ip-src', 'ip-dst', 'domain', 'hostname', 'hostname| moduleinfo = {'version': '0.1', 'author': 'Loïc Fortemps', 'description': 'Censys.io expansion module', 'module-type': ['expansion', 'hover']} +api_id = None +api_secret = None def handler(q=False): + global api_id, api_secret if q is False: return False request = json.loads(q) @@ -65,27 +79,31 @@ def handler(q=False): types.append(attribute.type) values.append(attribute.value) + found = False for t in types: - # ip, ip-src or ip-dst - if t[:2] == "ip": - conn.append(censys.ipv4.CensysIPv4(api_id=api_id, api_secret=api_secret)) - elif t == 'domain' or t == "hostname": - conn.append(censys.websites.CensysWebsites(api_id=api_id, api_secret=api_secret)) - elif 'x509-fingerprint' in t: - conn.append(censys.certificates.CensysCertificates(api_id=api_id, api_secret=api_secret)) - - found = True - for c in conn: - val = values.pop(0) try: - r = c.view(val) - results.append(parse_response(r, attribute)) - found = True - except censys.base.CensysNotFoundException: - found = False - except Exception: - misperrors['error'] = "Connection issue" - return misperrors + val = values.pop(0) + # ip, ip-src or ip-dst + if t[:2] == "ip": + r = CensysHosts(api_id, api_secret).view(val) + results.append(parse_response(r, attribute)) + found = True + elif t == 'domain' or t == "hostname": + #get ips + endpoint = CensysHosts(api_id, api_secret) + for r_list in endpoint.search(query=val, per_page=15, pages=1): + for r in r_list: + results.append(parse_response(r, attribute)) + found = True + elif 'x509-fingerprint' in t: + # TODO switch to api_v2 once available + # sill use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + r = CensysCertificates(api_id, api_secret).view(val) + results.append(parse_response(r, attribute)) + found = True + except CensysException as e: + misperrors['error'] = print("ERROR: param {} / resposne: {}".format(value, e)) + return misperrors if not found: misperrors['error'] = "Nothing could be found on Censys" @@ -98,38 +116,43 @@ def parse_response(censys_output, attribute): misp_event = MISPEvent() misp_event.add_attribute(**attribute) # Generic fields (for IP/Websites) - if "autonomous_system" in censys_output: - cen_as = censys_output['autonomous_system'] + if censys_output.get('autonomous_system'): + cen_as = censys_output.get('autonomous_system') asn_object = MISPObject('asn') - asn_object.add_attribute('asn', value=cen_as["asn"]) - asn_object.add_attribute('description', value=cen_as['name']) - asn_object.add_attribute('subnet-announced', value=cen_as['routed_prefix']) - asn_object.add_attribute('country', value=cen_as['country_code']) + asn_object.add_attribute('asn', value=cen_as.get("asn")) + asn_object.add_attribute('description', value=cen_as.get('name')) + asn_object.add_attribute('subnet-announced', value=cen_as.get('routed_prefix')) + asn_object.add_attribute('country', value=cen_as.get('country_code')) asn_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**asn_object) - if "ip" in censys_output and "ports" in censys_output: + if censys_output.get('ip') and len(censys_output.get('services')): #"ports" in censys_output ip_object = MISPObject('ip-port') - ip_object.add_attribute('ip', value=censys_output['ip']) - for p in censys_output['ports']: - ip_object.add_attribute('dst-port', value=p) + ip_object.add_attribute('ip', value=censys_output.get('ip')) + for serv in censys_output.get('services'): + if serv.get('port'): + ip_object.add_attribute('dst-port', value=serv.get('port')) ip_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**ip_object) # We explore all ports to find https or ssh services - for k in censys_output.keys(): - if not isinstance(censys_output[k], dict): + for serv in censys_output.get('services', []): + if not isinstance(serv, dict): continue - if 'https' in censys_output[k]: + if serv.get('service_name').lower() == 'http' and serv.get('certificate', None): try: - cert = censys_output[k]['https']['tls']['certificate'] - cert_obj = get_certificate_object(cert, attribute) - misp_event.add_object(**cert_obj) + cert = serv.get('certificate', None) + if cert: + # TODO switch to api_v2 once available + # use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + cert_details = CensysCertificates(api_id, api_secret).view(cert) + cert_obj = get_certificate_object(cert_details, attribute) + misp_event.add_object(**cert_obj) except KeyError: print("Error !") - if 'ssh' in censys_output[k]: + if serv.get('ssh') and serv.get('service_name').lower() == 'ssh': try: - cert = censys_output[k]['ssh']['v2']['server_host_key'] + cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') # TODO enable once the type is merged # misp_event.add_attribute(type='hasshserver-sha256', value=cert['fingerprint_sha256']) except KeyError: @@ -144,15 +167,15 @@ def parse_response(censys_output, attribute): if "location" in censys_output: loc_obj = MISPObject('geolocation') loc = censys_output['location'] - loc_obj.add_attribute('latitude', value=loc['latitude']) - loc_obj.add_attribute('longitude', value=loc['longitude']) + loc_obj.add_attribute('latitude', value=loc.get('coordinates', {}).get('latitude', None)) + loc_obj.add_attribute('longitude', value=loc.get('coordinates', {}).get('longitude', None)) if 'city' in loc: - loc_obj.add_attribute('city', value=loc['city']) - loc_obj.add_attribute('country', value=loc['country']) + loc_obj.add_attribute('city', value=loc.get('city')) + loc_obj.add_attribute('country', value=loc.get('country')) if 'postal_code' in loc: - loc_obj.add_attribute('zipcode', value=loc['postal_code']) + loc_obj.add_attribute('zipcode', value=loc.get('postal_code')) if 'province' in loc: - loc_obj.add_attribute('region', value=loc['province']) + loc_obj.add_attribute('region', value=loc.get('province')) loc_obj.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**loc_obj) @@ -253,4 +276,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo + return moduleinfo \ No newline at end of file diff --git a/tests/expansion_configs.json b/tests/expansion_configs.json new file mode 100644 index 0000000..57b0f9e --- /dev/null +++ b/tests/expansion_configs.json @@ -0,0 +1,6 @@ +{ + "censys_enrich": { + "api_id" : "", + "api_secret": "" + } +} \ No newline at end of file diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 841a39a..696e000 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -215,6 +215,21 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), '\nThis is an basic test docx file. ') + def test_censys(self): + module_name = "censys_enrich" + query = { + "attribute": {"type" : "ip-dst", "value": "8.8.8.8", "uuid": ""}, + "module": module_name, + "config": {} + } + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + self.assertEqual(self.get_object(response), 'asn') + else: + response = self.misp_modules_post(query) + self.assertTrue(self.get_errors(response).startswith('Please provide config options')) + def test_farsight_passivedns(self): module_name = 'farsight_passivedns' if module_name in self.configs: From 4af4642d8a0d212b4dd4b7d9a3c5c30cd6d6f105 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 7 Jan 2022 12:10:21 +0100 Subject: [PATCH 366/476] new: [REQUIREMENTS] for the documentation generation --- DOC-REQUIREMENTS | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 DOC-REQUIREMENTS diff --git a/DOC-REQUIREMENTS b/DOC-REQUIREMENTS new file mode 100644 index 0000000..8373cb7 --- /dev/null +++ b/DOC-REQUIREMENTS @@ -0,0 +1,3 @@ +mkdocs +pymdown-extensions +mkdocs-material From ae4221723a031157dd10ce71f2ab2a7e5350d47d Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 7 Jan 2022 12:10:56 +0100 Subject: [PATCH 367/476] chg: [doc] updated --- documentation/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index 8936fbf..c9fd62e 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -916,6 +916,20 @@ Query the MALWAREbazaar API to get additional information about the input hash a ----- +#### [mwdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mwdb.py) + +Module to push malware samples to a MWDB instance +- **features**: +>An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB). Does: * Upload of attachment or malware sample to MWDB * Tags of events and/or attributes are added to MWDB. * Comment of the MISP attribute is added to MWDB. * A link back to the MISP event is added to MWDB via the MWDB attribute. * A link to the MWDB attribute is added as an enrichted attribute to the MISP event. +- **input**: +>Attachment or malware sample +- **output**: +>Link attribute that points to the sample at the MWDB instane +- **requirements**: +>* mwdblib installed (pip install mwdblib) ; * (optional) keys.py file to add tags of events/attributes to MWDB * (optional) MWDB attribute created for the link back to MISP (defined in mwdb_misp_attribute) + +----- + #### [ocr_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ocr_enrich.py) Module to process some optical character recognition on pictures. From b9d9df4dd07b6be72fa320b08d7026d7e3e24fa2 Mon Sep 17 00:00:00 2001 From: Silvian I Date: Thu, 6 Jan 2022 11:35:01 +0100 Subject: [PATCH 368/476] Upgrade censys_enrich module to new api version --- REQUIREMENTS | 2 +- .../modules/expansion/censys_enrich.py | 151 ++++++++++-------- tests/expansion_configs.json | 6 + tests/test_expansions.py | 19 +++ 4 files changed, 112 insertions(+), 66 deletions(-) create mode 100644 tests/expansion_configs.json diff --git a/REQUIREMENTS b/REQUIREMENTS index a2486b4..ccc737f 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -27,8 +27,8 @@ beautifulsoup4==4.9.3 bidict==0.21.2; python_version >= '3.6' blockchain==1.4.4 certifi==2021.5.30 +censys==2.0.9 cffi==1.14.6 - #chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' chardet charset-normalizer==2.0.4; python_version >= '3' diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index d5823ff..6f630a3 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -1,15 +1,26 @@ # encoding: utf-8 import json +import configparser import base64 import codecs +import censys.common.config from dateutil.parser import isoparse from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject + try: - import censys.base - import censys.ipv4 - import censys.websites - import censys.certificates + #needed in order to overwrite the censys module intent of creating config files in the home folder of the proccess owner + #-- + def get_config_over() -> configparser.ConfigParser: + config = configparser.ConfigParser() + config[censys.common.config.DEFAULT] = censys.common.config.default_config + return config + censys.common.config.get_config = get_config_over + #-- + + from censys.search import CensysHosts + from censys.search import CensysCertificates + from censys.common.base import * except ImportError: print("Censys module not installed. Try 'pip install censys'") @@ -20,8 +31,11 @@ mispattributes = {'input': ['ip-src', 'ip-dst', 'domain', 'hostname', 'hostname| moduleinfo = {'version': '0.1', 'author': 'Loïc Fortemps', 'description': 'Censys.io expansion module', 'module-type': ['expansion', 'hover']} +api_id = None +api_secret = None def handler(q=False): + global api_id, api_secret if q is False: return False request = json.loads(q) @@ -65,26 +79,29 @@ def handler(q=False): types.append(attribute.type) values.append(attribute.value) + found = False for t in types: - # ip, ip-src or ip-dst - if t[:2] == "ip": - conn.append(censys.ipv4.CensysIPv4(api_id=api_id, api_secret=api_secret)) - elif t == 'domain' or t == "hostname": - conn.append(censys.websites.CensysWebsites(api_id=api_id, api_secret=api_secret)) - elif 'x509-fingerprint' in t: - conn.append(censys.certificates.CensysCertificates(api_id=api_id, api_secret=api_secret)) - - found = True - for c in conn: - val = values.pop(0) try: - r = c.view(val) - results.append(parse_response(r, attribute)) - found = True - except censys.base.CensysNotFoundException: - found = False - except Exception: - misperrors['error'] = "Connection issue" + value = values.pop(0) + # ip, ip-src or ip-dst + if t[:2] == "ip": + r = CensysHosts(api_id, api_secret).view(value) + results.append(parse_response(r, attribute)) + found = True + elif t == 'domain' or t == "hostname": + # get ips + endpoint = CensysHosts(api_id, api_secret) + for r_list in endpoint.search(query=value, per_page=5, pages=1): + for r in r_list: + results.append(parse_response(r, attribute)) + found = True + elif 'x509-fingerprint-sha256' in t: + # use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + r = CensysCertificates(api_id, api_secret).view(value) + results.append(parse_response(r, attribute)) + found = True + except CensysException as e: + misperrors['error'] = print("ERROR: param {} / response: {}".format(value, e)) return misperrors if not found: @@ -98,38 +115,43 @@ def parse_response(censys_output, attribute): misp_event = MISPEvent() misp_event.add_attribute(**attribute) # Generic fields (for IP/Websites) - if "autonomous_system" in censys_output: - cen_as = censys_output['autonomous_system'] + if censys_output.get('autonomous_system'): + cen_as = censys_output.get('autonomous_system') asn_object = MISPObject('asn') - asn_object.add_attribute('asn', value=cen_as["asn"]) - asn_object.add_attribute('description', value=cen_as['name']) - asn_object.add_attribute('subnet-announced', value=cen_as['routed_prefix']) - asn_object.add_attribute('country', value=cen_as['country_code']) + asn_object.add_attribute('asn', value=cen_as.get("asn")) + asn_object.add_attribute('description', value=cen_as.get('name')) + asn_object.add_attribute('subnet-announced', value=cen_as.get('routed_prefix')) + asn_object.add_attribute('country', value=cen_as.get('country_code')) asn_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**asn_object) - if "ip" in censys_output and "ports" in censys_output: + if censys_output.get('ip') and len(censys_output.get('services')): #"ports" in censys_output ip_object = MISPObject('ip-port') - ip_object.add_attribute('ip', value=censys_output['ip']) - for p in censys_output['ports']: - ip_object.add_attribute('dst-port', value=p) + ip_object.add_attribute('ip', value=censys_output.get('ip')) + for serv in censys_output.get('services'): + if serv.get('port'): + ip_object.add_attribute('dst-port', value=serv.get('port')) ip_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**ip_object) # We explore all ports to find https or ssh services - for k in censys_output.keys(): - if not isinstance(censys_output[k], dict): + for serv in censys_output.get('services', []): + if not isinstance(serv, dict): continue - if 'https' in censys_output[k]: + if serv.get('service_name').lower() == 'http' and serv.get('certificate', None): try: - cert = censys_output[k]['https']['tls']['certificate'] - cert_obj = get_certificate_object(cert, attribute) - misp_event.add_object(**cert_obj) + cert = serv.get('certificate', None) + if cert: + # TODO switch to api_v2 once available + # use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + cert_details = CensysCertificates(api_id, api_secret).view(cert) + cert_obj = get_certificate_object(cert_details, attribute) + misp_event.add_object(**cert_obj) except KeyError: print("Error !") - if 'ssh' in censys_output[k]: + if serv.get('ssh') and serv.get('service_name').lower() == 'ssh': try: - cert = censys_output[k]['ssh']['v2']['server_host_key'] + cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') # TODO enable once the type is merged # misp_event.add_attribute(type='hasshserver-sha256', value=cert['fingerprint_sha256']) except KeyError: @@ -144,20 +166,20 @@ def parse_response(censys_output, attribute): if "location" in censys_output: loc_obj = MISPObject('geolocation') loc = censys_output['location'] - loc_obj.add_attribute('latitude', value=loc['latitude']) - loc_obj.add_attribute('longitude', value=loc['longitude']) + loc_obj.add_attribute('latitude', value=loc.get('coordinates', {}).get('latitude', None)) + loc_obj.add_attribute('longitude', value=loc.get('coordinates', {}).get('longitude', None)) if 'city' in loc: - loc_obj.add_attribute('city', value=loc['city']) - loc_obj.add_attribute('country', value=loc['country']) + loc_obj.add_attribute('city', value=loc.get('city')) + loc_obj.add_attribute('country', value=loc.get('country')) if 'postal_code' in loc: - loc_obj.add_attribute('zipcode', value=loc['postal_code']) + loc_obj.add_attribute('zipcode', value=loc.get('postal_code')) if 'province' in loc: - loc_obj.add_attribute('region', value=loc['province']) + loc_obj.add_attribute('region', value=loc.get('province')) loc_obj.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**loc_obj) event = json.loads(misp_event.to_json()) - return {'Object': event['Object'], 'Attribute': event['Attribute']} + return {'Object': event.get('Object', []), 'Attribute': event.get('Attribute', [])} # In case of multiple enrichment (ip and domain), we need to filter out similar objects @@ -166,24 +188,23 @@ def remove_duplicates(results): # Only one enrichment was performed so no duplicate if len(results) == 1: return results[0] - elif len(results) == 2: - final_result = results[0] - obj_l2 = results[1]['Object'] - for o2 in obj_l2: - if o2['name'] == "asn": - key = "asn" - elif o2['name'] == "ip-port": - key = "ip" - elif o2['name'] == "x509": - key = "x509-fingerprint-sha256" - elif o2['name'] == "geolocation": - key = "latitude" - if not check_if_present(o2, key, final_result['Object']): - final_result['Object'].append(o2) - - return final_result else: - return [] + final_result = results[0] + for i,result in enumerate(results[1:]): + obj_l = results[i+1].get('Object', []) + for o2 in obj_l: + if o2['name'] == "asn": + key = "asn" + elif o2['name'] == "ip-port": + key = "ip" + elif o2['name'] == "x509": + key = "x509-fingerprint-sha256" + elif o2['name'] == "geolocation": + key = "latitude" + if not check_if_present(o2, key, final_result.get('Object', [])): + final_result['Object'].append(o2) + + return final_result def check_if_present(object, attribute_name, list_objects): @@ -253,4 +274,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo + return moduleinfo \ No newline at end of file diff --git a/tests/expansion_configs.json b/tests/expansion_configs.json new file mode 100644 index 0000000..57b0f9e --- /dev/null +++ b/tests/expansion_configs.json @@ -0,0 +1,6 @@ +{ + "censys_enrich": { + "api_id" : "", + "api_secret": "" + } +} \ No newline at end of file diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 841a39a..d015bcb 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -215,6 +215,25 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), '\nThis is an basic test docx file. ') + def test_censys(self): + module_name = "censys_enrich" + query = { + "attribute": {"type" : "ip-dst", "value": "8.8.8.8", "uuid": ""}, + "module": module_name, + "config": {} + } + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + + if self.configs[module_name].get('api_id') == '': + self.assertTrue(self.get_errors(response).startswith('ERROR: param ')) + else: + self.assertGreaterEqual(len(response.json().get('results', {}).get('Attribute')), 1) + else: + response = self.misp_modules_post(query) + self.assertTrue(self.get_errors(response).startswith('Please provide config options')) + def test_farsight_passivedns(self): module_name = 'farsight_passivedns' if module_name in self.configs: From ef543a3fa827ce5ac3896a1f5e00b31b65b305db Mon Sep 17 00:00:00 2001 From: Silvian I Date: Fri, 7 Jan 2022 19:04:34 +0100 Subject: [PATCH 369/476] Upgrade censys_enrich module to new api version - fix test error --- misp_modules/modules/expansion/censys_enrich.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index 6f630a3..52c3945 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -60,7 +60,6 @@ def handler(q=False): attribute = MISPAttribute() attribute.from_dict(**request['attribute']) # Lists to accomodate multi-types attribute - conn = list() types = list() values = list() results = list() @@ -101,8 +100,8 @@ def handler(q=False): results.append(parse_response(r, attribute)) found = True except CensysException as e: - misperrors['error'] = print("ERROR: param {} / response: {}".format(value, e)) - return misperrors + misperrors['error'] = "ERROR: param {} / response: {}".format(value, e) + return misperrors if not found: misperrors['error'] = "Nothing could be found on Censys" @@ -151,7 +150,7 @@ def parse_response(censys_output, attribute): print("Error !") if serv.get('ssh') and serv.get('service_name').lower() == 'ssh': try: - cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') + # cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') # TODO enable once the type is merged # misp_event.add_attribute(type='hasshserver-sha256', value=cert['fingerprint_sha256']) except KeyError: From 950a76a3ad5967f1f94f28238e329fa132e9b28c Mon Sep 17 00:00:00 2001 From: Silvian I Date: Fri, 7 Jan 2022 19:04:34 +0100 Subject: [PATCH 370/476] Upgrade censys_enrich module to new api version - fix test error --- misp_modules/modules/expansion/censys_enrich.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index 52c3945..f423712 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -100,8 +100,8 @@ def handler(q=False): results.append(parse_response(r, attribute)) found = True except CensysException as e: - misperrors['error'] = "ERROR: param {} / response: {}".format(value, e) - return misperrors + misperrors['error'] = "ERROR: param {} / response: {}".format(value, e) + return misperrors if not found: misperrors['error'] = "Nothing could be found on Censys" @@ -150,7 +150,7 @@ def parse_response(censys_output, attribute): print("Error !") if serv.get('ssh') and serv.get('service_name').lower() == 'ssh': try: - # cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') + cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') # TODO enable once the type is merged # misp_event.add_attribute(type='hasshserver-sha256', value=cert['fingerprint_sha256']) except KeyError: From 13cb1f472d40e50735e972bb0e70da3ff29b8940 Mon Sep 17 00:00:00 2001 From: Silvian I Date: Tue, 11 Jan 2022 13:59:59 +0100 Subject: [PATCH 371/476] [crowdstrike_falcon] Upgrade crowdstrike_falcon enrich module to new api version & add attribute creation on enrichment functionality --- REQUIREMENTS | 1 + .../modules/expansion/crowdstrike_falcon.py | 156 ++++++++++-------- tests/expansion_configs.json | 4 + tests/test_expansions.py | 19 +++ 4 files changed, 108 insertions(+), 72 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index ccc737f..c0b5326 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -39,6 +39,7 @@ colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3. colorclass==2.2.0 compressed-rtf==1.0.6 configparser==5.0.2; python_version >= '3.6' +crowdstrike-falconpy==0.9.0 cryptography==3.4.7; python_version >= '3.6' decorator==5.0.9; python_version >= '3.5' deprecated==1.2.12; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' diff --git a/misp_modules/modules/expansion/crowdstrike_falcon.py b/misp_modules/modules/expansion/crowdstrike_falcon.py index 1342e88..f556d8a 100755 --- a/misp_modules/modules/expansion/crowdstrike_falcon.py +++ b/misp_modules/modules/expansion/crowdstrike_falcon.py @@ -1,42 +1,45 @@ import json import requests +from . import check_input_attribute, standard_error_message +from falconpy import Intel +from pymisp import MISPAttribute, MISPEvent, MISPObject -moduleinfo = {'version': '0.1', +moduleinfo = {'version': '0.2', 'author': 'Christophe Vandeplas', 'description': 'Module to query CrowdStrike Falcon.', - 'module-type': ['expansion']} + 'module-type': ['expansion', 'hover']} moduleconfig = ['api_id', 'apikey'] misperrors = {'error': 'Error'} -misp_types_in = ['domain', 'email-attachment', 'email-dst', 'email-reply-to', 'email-src', 'email-subject', +misp_type_in = ['domain', 'email-attachment', 'email-dst', 'email-reply-to', 'email-src', 'email-subject', 'filename', 'hostname', 'ip', 'ip-src', 'ip-dst', 'md5', 'mutex', 'regkey', 'sha1', 'sha256', 'uri', 'url', 'user-agent', 'whois-registrant-email', 'x509-fingerprint-md5'] -mapping_out = { # mapping between the MISP attributes types and the compatible CrowdStrike indicator types. - 'domain': {'types': 'hostname', 'to_ids': True}, - 'email_address': {'types': 'email-src', 'to_ids': True}, - 'email_subject': {'types': 'email-subject', 'to_ids': True}, - 'file_name': {'types': 'filename', 'to_ids': True}, - 'hash_md5': {'types': 'md5', 'to_ids': True}, - 'hash_sha1': {'types': 'sha1', 'to_ids': True}, - 'hash_sha256': {'types': 'sha256', 'to_ids': True}, - 'ip_address': {'types': 'ip-dst', 'to_ids': True}, - 'ip_address_block': {'types': 'ip-dst', 'to_ids': True}, - 'mutex_name': {'types': 'mutex', 'to_ids': True}, - 'registry': {'types': 'regkey', 'to_ids': True}, - 'url': {'types': 'url', 'to_ids': True}, - 'user_agent': {'types': 'user-agent', 'to_ids': True}, - 'x509_serial': {'types': 'x509-fingerprint-md5', 'to_ids': True}, +mapping_out = { # mapping between the MISP attributes type and the compatible CrowdStrike indicator types. + 'domain': {'type': 'hostname', 'to_ids': True}, + 'email_address': {'type': 'email-src', 'to_ids': True}, + 'email_subject': {'type': 'email-subject', 'to_ids': True}, + 'file_name': {'type': 'filename', 'to_ids': True}, + 'hash_md5': {'type': 'md5', 'to_ids': True}, + 'hash_sha1': {'type': 'sha1', 'to_ids': True}, + 'hash_sha256': {'type': 'sha256', 'to_ids': True}, + 'ip_address': {'type': 'ip-dst', 'to_ids': True}, + 'ip_address_block': {'type': 'ip-dst', 'to_ids': True}, + 'mutex_name': {'type': 'mutex', 'to_ids': True}, + 'registry': {'type': 'regkey', 'to_ids': True}, + 'url': {'type': 'url', 'to_ids': True}, + 'user_agent': {'type': 'user-agent', 'to_ids': True}, + 'x509_serial': {'type': 'x509-fingerprint-md5', 'to_ids': True}, - 'actors': {'types': 'threat-actor'}, - 'malware_families': {'types': 'text', 'categories': 'Attribution'} + 'actors': {'type': 'threat-actor', 'category': 'Attribution'}, + 'malware_families': {'type': 'text', 'category': 'Attribution'} } -misp_types_out = [item['types'] for item in mapping_out.values()] -mispattributes = {'input': misp_types_in, 'output': misp_types_out} - +misp_type_out = [item['type'] for item in mapping_out.values()] +mispattributes = {'input': misp_type_in, 'format': 'misp_standard'} def handler(q=False): if q is False: return False request = json.loads(q) + #validate CrowdStrike params if (request.get('config')): if (request['config'].get('apikey') is None): misperrors['error'] = 'CrowdStrike apikey is missing' @@ -44,41 +47,64 @@ def handler(q=False): if (request['config'].get('api_id') is None): misperrors['error'] = 'CrowdStrike api_id is missing' return misperrors + + #validate attribute + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request.get('attribute') + if not any(input_type == attribute.get('type') for input_type in misp_type_in): + return {'error': 'Unsupported attribute type.'} + client = CSIntelAPI(request['config']['api_id'], request['config']['apikey']) + attribute = MISPAttribute() + attribute.from_dict(**request.get('attribute') ) r = {"results": []} - valid_type = False - for k in misp_types_in: - if request.get(k): - # map the MISP typ to the CrowdStrike type - for item in lookup_indicator(client, request[k]): - r['results'].append(item) - valid_type = True + + try: + for k in misp_type_in: + if attribute.type == k: + # map the MISP type to the CrowdStrike type + r['results'].append(lookup_indicator(client, attribute)) + valid_type = True + except Exception as e: + return {'error': f"{e}"} if not valid_type: misperrors['error'] = "Unsupported attributes type" return misperrors - return r + return {'results': r.get('results').pop()} -def lookup_indicator(client, item): - result = client.search_indicator(item) - for item in result: - for relation in item['relations']: - if mapping_out.get(relation['type']): - r = mapping_out[relation['type']].copy() - r['values'] = relation['indicator'] - yield(r) - for actor in item['actors']: - r = mapping_out['actors'].copy() - r['values'] = actor - yield(r) - for malware_family in item['malware_families']: - r = mapping_out['malware_families'].copy() - r['values'] = malware_family - yield(r) +def lookup_indicator(client, ref_attribute): + result = client.search_indicator(ref_attribute.value) + misp_event = MISPEvent() + misp_event.add_attribute(**ref_attribute) + for item in result.get('resources', []): + for relation in item.get('relations'): + if mapping_out.get(relation.get('type')): + r = mapping_out[relation.get('type')].copy() + r['value'] = relation.get('indicator') + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + for actor in item.get('actors'): + r = mapping_out.get('actors').copy() + r['value'] = actor + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + if item.get('malware_families'): + r = mapping_out.get('malware_families').copy() + r['value'] = f"malware_families: {' | '.join(item.get('malware_families'))}" + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + + event = json.loads(misp_event.to_json()) + return {'Object': event.get('Object', []), 'Attribute': event.get('Attribute', [])} def introspection(): return mispattributes @@ -90,39 +116,25 @@ def version(): class CSIntelAPI(): - def __init__(self, custid=None, custkey=None, perpage=100, page=1, baseurl="https://intelapi.crowdstrike.com/indicator/v2/search/"): + def __init__(self, custid=None, custkey=None): # customer id and key should be passed when obj is created - self.custid = custid - self.custkey = custkey + self.falcon = Intel(client_id=custid, client_secret=custkey) - self.baseurl = baseurl - self.perpage = perpage - self.page = page - - def request(self, query): - headers = {'X-CSIX-CUSTID': self.custid, - 'X-CSIX-CUSTKEY': self.custkey, - 'Content-Type': 'application/json'} - - full_query = self.baseurl + query - - r = requests.get(full_query, headers=headers) + def search_indicator(self, query): + r = self.falcon.query_indicator_entities(q=query) # 400 - bad request - if r.status_code == 400: + if r.get('status_code') == 400: raise Exception('HTTP Error 400 - Bad request.') # 404 - oh shit - if r.status_code == 404: + if r.get('status_code') == 404: raise Exception('HTTP Error 404 - awww snap.') # catch all? - if r.status_code != 200: - raise Exception('HTTP Error: ' + str(r.status_code)) + if r.get('status_code') != 200: + raise Exception('HTTP Error: ' + str(r.get('status_code'))) - if r.text: - return r + if len(r.get('body').get('errors')): + raise Exception('API Error: ' + ' | '.join(r.get('body').get('errors'))) - def search_indicator(self, item): - query = 'indicator?match=' + item - r = self.request(query) - return json.loads(r.text) + return r.get('body', {}) \ No newline at end of file diff --git a/tests/expansion_configs.json b/tests/expansion_configs.json index 57b0f9e..8056ec8 100644 --- a/tests/expansion_configs.json +++ b/tests/expansion_configs.json @@ -2,5 +2,9 @@ "censys_enrich": { "api_id" : "", "api_secret": "" + }, + "crowdstrike_falcon": { + "api_id" : "", + "apikey": "" } } \ No newline at end of file diff --git a/tests/test_expansions.py b/tests/test_expansions.py index d015bcb..b8764f7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -511,6 +511,25 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertTrue(self.get_values(response), result) + def test_crowdstrike(self): + module_name = "crowdstrike_falcon" + query = { + "attribute": {"type": "sha256", "value": "", "uuid": ""}, + "module": module_name, + "config": {} + } + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + + if self.configs[module_name].get('api_id') == '': + self.assertTrue(self.get_errors(response).startswith('HTTP Error:')) + else: + self.assertGreaterEqual(len(response.json().get('results', {}).get('Attribute')), 1) + else: + response = self.misp_modules_post(query) + self.assertTrue(self.get_errors(response).startswith('CrowdStrike apikey is missing')) + def test_threatminer(self): if LiveCI: return True From 23ff0348ed073967c33e67b76150fb3293db7509 Mon Sep 17 00:00:00 2001 From: Silvian I Date: Tue, 11 Jan 2022 15:25:39 +0100 Subject: [PATCH 372/476] [crowdstrike_falcon] fix imports warning --- misp_modules/modules/expansion/crowdstrike_falcon.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/crowdstrike_falcon.py b/misp_modules/modules/expansion/crowdstrike_falcon.py index f556d8a..c26d59f 100755 --- a/misp_modules/modules/expansion/crowdstrike_falcon.py +++ b/misp_modules/modules/expansion/crowdstrike_falcon.py @@ -1,8 +1,7 @@ import json -import requests from . import check_input_attribute, standard_error_message from falconpy import Intel -from pymisp import MISPAttribute, MISPEvent, MISPObject +from pymisp import MISPAttribute, MISPEvent moduleinfo = {'version': '0.2', 'author': 'Christophe Vandeplas', From 923fd05eb3e8d917ad9fe0a96b9e0fe33983451b Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Fri, 10 Dec 2021 19:26:32 -0500 Subject: [PATCH 373/476] Contribute a TAXII 2.1 import style misp-module. --- .gitmodules | 4 + misp_modules/lib/misp-objects | 1 + misp_modules/lib/stix2misp.py | 2070 +++++++++++++++++++ misp_modules/lib/stix2misp_mapping.py | 460 +++++ misp_modules/lib/synonymsToTagNames.json | 1 + misp_modules/modules/import_mod/__init__.py | 1 + misp_modules/modules/import_mod/taxii21.py | 354 ++++ 7 files changed, 2891 insertions(+) create mode 100644 .gitmodules create mode 160000 misp_modules/lib/misp-objects create mode 100644 misp_modules/lib/stix2misp.py create mode 100644 misp_modules/lib/stix2misp_mapping.py create mode 100644 misp_modules/lib/synonymsToTagNames.json create mode 100644 misp_modules/modules/import_mod/taxii21.py diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e9f78ac --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "misp_modules/lib/misp-objects"] + path = misp_modules/lib/misp-objects + url = https://github.com/MISP/misp-objects.git + branch = main diff --git a/misp_modules/lib/misp-objects b/misp_modules/lib/misp-objects new file mode 160000 index 0000000..9dc7e35 --- /dev/null +++ b/misp_modules/lib/misp-objects @@ -0,0 +1 @@ +Subproject commit 9dc7e3578f2165e32a3b7cdd09e9e552f2d98d36 diff --git a/misp_modules/lib/stix2misp.py b/misp_modules/lib/stix2misp.py new file mode 100644 index 0000000..ed875b5 --- /dev/null +++ b/misp_modules/lib/stix2misp.py @@ -0,0 +1,2070 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2017-2018 CIRCL Computer Incident Response Center Luxembourg (smile gie) +# Copyright (C) 2017-2018 Christian Studer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import sys +import json +import os +import time +import io +import pymisp +import stix2 +import misp_modules.lib.stix2misp_mapping as stix2misp_mapping +from collections import defaultdict +from copy import deepcopy +from pathlib import Path +_misp_objects_path = Path(__file__).parent / 'misp-objects' / 'objects' +_misp_types = pymisp.AbstractMISP().describe_types.get('types') +from pymisp import MISPEvent, MISPObject, MISPAttribute + + +class StixParser(): + _galaxy_types = ('intrusion-set', 'malware', 'threat-actor', 'tool') + _stix2misp_mapping = {'marking-definition': '_load_marking', + 'relationship': '_load_relationship', + 'report': '_load_report', + 'indicator': '_parse_indicator', + 'observed-data': '_parse_observable', + 'identity': '_load_identity'} + _stix2misp_mapping.update({galaxy_type: '_load_galaxy' for galaxy_type in _galaxy_types}) + _special_mapping = {'attack-pattern': 'parse_attack_pattern', + 'course-of-action': 'parse_course_of_action', + 'vulnerability': 'parse_vulnerability'} + _timeline_mapping = {'indicator': ('valid_from', 'valid_until'), + 'observed-data': ('first_observed', 'last_observed')} + + def __init__(self): + super().__init__() + self.misp_event = MISPEvent() + self.relationship = defaultdict(list) + self.tags = set() + self.galaxy = {} + self.marking_definition = {} + + def handler(self, event, filename, args): + self.filename = filename + self.stix_version = f"STIX {event['spec_version'] if event.get('spec_version') else '2.1'}" + try: + event_distribution = args[0] + if not isinstance(event_distribution, int): + event_distribution = int(event_distribution) if event_distribution.isdigit() else 0 + except IndexError: + event_distribution = 0 + try: + attribute_distribution = args[1] + if attribute_distribution == 'event': + attribute_distribution = 5 + if not isinstance(attribute_distribution, int): + attribute_distribution = int(attribute_distribution) if attribute_distribution.isdigit() else 5 + except IndexError: + attribute_distribution = 5 + synonyms_to_tag_names = args[2] if len(args) > 2 else '/var/www/MISP/app/files/scripts/synonymsToTagNames.json' + with open(synonyms_to_tag_names, 'rt', encoding='utf-8') as f: + self._synonyms_to_tag_names = json.loads(f.read()) + self.parse_event(event) + + def _load_galaxy(self, galaxy): + self.galaxy[galaxy['id'].split('--')[1]] = {'tag_names': self.parse_galaxy(galaxy), 'used': False} + + def _load_identity(self, identity): + try: + self.identity[identity['id'].split('--')[1]] = identity['name'] + except AttributeError: + self.identity = {identity['id'].split('--')[1]: identity['name']} + + def _load_marking(self, marking): + tag = self.parse_marking(marking) + self.marking_definition[marking['id'].split('--')[1]] = {'object': tag, 'used': False} + + def _load_relationship(self, relationship): + target_uuid = relationship.target_ref.split('--')[1] + reference = (target_uuid, relationship.relationship_type) + source_uuid = relationship.source_ref.split('--')[1] + self.relationship[source_uuid].append(reference) + + def _load_report(self, report): + try: + self.report[report['id'].split('--')[1]] = report + except AttributeError: + self.report = {report['id'].split('--')[1]: report} + + def save_file(self): + event = self.misp_event.to_json() + with open(f'{self.filename}.stix2', 'wt', encoding='utf-8') as f: + f.write(event) + + ################################################################################ + ## PARSING FUNCTIONS USED BY BOTH SUBCLASSES. ## + ################################################################################ + + def handle_markings(self): + if hasattr(self, 'marking_refs'): + for attribute in self.misp_event.attributes: + if attribute.uuid in self.marking_refs: + for marking_uuid in self.marking_refs[attribute.uuid]: + attribute.add_tag(self.marking_definition[marking_uuid]['object']) + self.marking_definition[marking_uuid]['used'] = True + if self.marking_definition: + for marking_definition in self.marking_definition.values(): + if not marking_definition['used']: + self.tags.add(marking_definition['object']) + if self.tags: + for tag in self.tags: + self.misp_event.add_tag(tag) + + @staticmethod + def _parse_email_body(body, references): + attributes = [] + for body_multipart in body: + reference = references.pop(body_multipart['body_raw_ref']) + feature = body_multipart['content_disposition'].split(';')[0] + if feature in stix2misp_mapping.email_references_mapping: + attribute = deepcopy(stix2misp_mapping.email_references_mapping[feature]) + else: + print(f'Unknown content disposition in the following email body: {body_multipart}', file=sys.stderr) + continue + if isinstance(reference, stix2.v20.observables.Artifact): + attribute.update({ + 'value': body_multipart['content_disposition'].split('=')[-1].strip("'"), + 'data': reference.payload_bin, + 'to_ids': False + }) + else: + attribute.update({ + 'value': reference.name, + 'to_ids': False + }) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_email_references(email_message, references): + attributes = [] + if hasattr(email_message, 'from_ref'): + reference = references.pop(email_message.from_ref) + attribute = { + 'value': reference.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.email_references_mapping['from_ref']) + attributes.append(attribute) + for feature in ('to_refs', 'cc_refs'): + if hasattr(email_message, feature): + for ref_id in getattr(email_message, feature): + reference = references.pop(ref_id) + attribute = { + 'value': reference.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.email_references_mapping[feature]) + attributes.append(attribute) + return attributes + + def parse_galaxies(self): + for galaxy in self.galaxy.values(): + if not galaxy['used']: + for tag_name in galaxy['tag_names']: + self.tags.add(tag_name) + + @staticmethod + def _parse_network_connection_reference(feature_type, feature, value): + if feature == 'type': + return {type: value.format(feature_type) for type, value in stix2misp_mapping.network_traffic_references_mapping[value].items()} + return {feature: value} + + @staticmethod + def _parse_network_traffic_protocol(protocol): + return {'type': 'text', 'value': protocol, 'to_ids': False, + 'object_relation': f'layer{stix2misp_mapping.connection_protocols[protocol]}-protocol'} + + @staticmethod + def _parse_observable_reference(reference, mapping, feature=None): + attribute = { + 'value': reference.value, + 'to_ids': False + } + if feature is not None: + attribute.update({key: value.format(feature) for key, value in getattr(stix2misp_mapping, mapping)[reference._type].items()}) + return attribute + attribute.update({key: value for key, value in getattr(stix2misp_mapping, mapping)[reference._type].items()}) + return attribute + + def parse_pe(self, extension): + pe_object = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + self.fill_misp_object(pe_object, extension, 'pe_mapping') + for section in extension['sections']: + section_object = MISPObject('pe-section', misp_objects_path_custom=_misp_objects_path) + self.fill_misp_object(section_object, section, 'pe_section_mapping') + if hasattr(section, 'hashes'): + self.fill_misp_object(section_object, section.hashes, 'pe_section_mapping') + self.misp_event.add_object(section_object) + pe_object.add_reference(section_object.uuid, 'includes') + self.misp_event.add_object(pe_object) + return pe_object.uuid + + def parse_relationships(self): + attribute_uuids = tuple(attribute.uuid for attribute in self.misp_event.attributes) + object_uuids = tuple(object.uuid for object in self.misp_event.objects) + for source, references in self.relationship.items(): + if source in object_uuids: + source_object = self.misp_event.get_object_by_uuid(source) + for reference in references: + target, reference = reference + if target in attribute_uuids or target in object_uuids: + source_object.add_reference(target, reference) + elif source in attribute_uuids: + for attribute in self.misp_event.attributes: + if attribute.uuid == source: + for reference in references: + target, reference = reference + if target in self.galaxy: + for tag_name in self.galaxy[target]['tag_names']: + attribute.add_tag(tag_name) + self.galaxy[target]['used'] = True + break + + def parse_report(self, event_uuid=None): + event_infos = set() + self.misp_event.uuid = event_uuid if event_uuid and len(self.report) > 1 else tuple(self.report.keys())[0] + for report in self.report.values(): + if hasattr(report, 'name') and report.name: + event_infos.add(report.name) + if hasattr(report, 'labels') and report.labels: + for label in report.labels: + self.tags.add(label) + if hasattr(report, 'object_marking_refs') and report.object_marking_refs: + for marking_ref in report.object_marking_refs: + marking_ref = marking_ref.split('--')[1] + try: + self.tags.add(self.marking_definition[marking_ref]['object']) + self.marking_definition[marking_ref]['used'] = True + except KeyError: + continue + if hasattr(report, 'external_references'): + for reference in report.external_references: + self.misp_event.add_attribute(**{'type': 'link', 'value': reference['url']}) + if len(event_infos) == 1: + self.misp_event.info = event_infos.pop() + else: + self.misp_event.info = f'Imported with MISP import script for {self.stix_version}' + + @staticmethod + def _parse_user_account_groups(groups): + attributes = [{'type': 'text', 'object_relation': 'group', 'to_ids': False, + 'disable_correlation': True, 'value': group} for group in groups] + return attributes + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + @staticmethod + def _choose_with_priority(container, first_choice, second_choice): + return first_choice if first_choice in container else second_choice + + def filter_main_object(self, observable, main_type, test_function='_standard_test_filter'): + references = {} + main_objects = [] + for key, value in observable.items(): + if getattr(self, test_function)(value, main_type): + main_objects.append(value) + else: + references[key] = value + if len(main_objects) > 1: + print(f'More than one {main_type} objects in this observable: {observable}', file=sys.stderr) + return main_objects[0] if main_objects else None, references + + @staticmethod + def getTimestampfromDate(date): + try: + return int(date.timestamp()) + except AttributeError: + return int(time.mktime(time.strptime(date.split('+')[0], "%Y-%m-%dT%H:%M:%S.%fZ"))) + + @staticmethod + def _handle_data(data): + return io.BytesIO(data.encode()) + + @staticmethod + def parse_marking(marking): + marking_type = marking.definition_type + tag = getattr(marking.definition, marking_type) + return "{}:{}".format(marking_type, tag) + + def parse_timeline(self, stix_object): + misp_object = {'timestamp': self.getTimestampfromDate(stix_object.modified)} + try: + first, last = self._timeline_mapping[stix_object._type] + first_seen = getattr(stix_object, first) + if stix_object.created != first_seen and stix_object.modified != first_seen: + misp_object['first_seen'] = first_seen + if hasattr(stix_object, last): + misp_object['last_seen'] = getattr(stix_object, last) + elif hasattr(stix_object, last): + misp_object.update({'first_seen': first_seen, 'last_seen': getattr(stix_object, last)}) + except KeyError: + pass + return misp_object + + @staticmethod + def _process_test_filter(value, main_type): + _is_main_process = any(feature in value for feature in ('parent_ref', 'child_refs')) + return isinstance(value, getattr(stix2.v20.observables, main_type)) and _is_main_process + + @staticmethod + def _standard_test_filter(value, main_type): + return isinstance(value, getattr(stix2.v20.observables, main_type)) + + def update_marking_refs(self, attribute_uuid, marking_refs): + try: + self.marking_refs[attribute_uuid] = tuple(marking.split('--')[1] for marking in marking_refs) + except AttributeError: + self.marking_refs = {attribute_uuid: tuple(marking.split('--')[1] for marking in marking_refs)} + + +class StixFromMISPParser(StixParser): + def __init__(self): + super().__init__() + self._stix2misp_mapping.update({'custom_object': '_parse_custom'}) + self._stix2misp_mapping.update({special_type: '_parse_undefined' for special_type in ('attack-pattern', 'course-of-action', 'vulnerability')}) + self._custom_objects = tuple(filename.name.replace('_', '-') for filename in _misp_objects_path.glob('*') if '_' in filename.name) + + def parse_event(self, stix_event): + for stix_object in stix_event.objects: + object_type = stix_object['type'] + if object_type.startswith('x-misp-object'): + object_type = 'custom_object' + if object_type in self._stix2misp_mapping: + getattr(self, self._stix2misp_mapping[object_type])(stix_object) + else: + print(f'not found: {object_type}', file=sys.stderr) + if self.relationship: + self.parse_relationships() + if self.galaxy: + self.parse_galaxies() + if hasattr(self, 'report'): + self.parse_report() + self.handle_markings() + + def _parse_custom(self, custom): + if 'from_object' in custom['labels']: + self.parse_custom_object(custom) + else: + self.parse_custom_attribute(custom) + + def _parse_indicator(self, indicator): + if 'from_object' in indicator['labels']: + self.parse_indicator_object(indicator) + else: + self.parse_indicator_attribute(indicator) + + def _parse_observable(self, observable): + if 'from_object' in observable['labels']: + self.parse_observable_object(observable) + else: + self.parse_observable_attribute(observable) + + def _parse_undefined(self, stix_object): + if any(label.startswith('misp-galaxy:') for label in stix_object.get('labels', [])): + self._load_galaxy(stix_object) + else: + getattr(self, self._special_mapping[stix_object._type])(stix_object) + + ################################################################################ + ## PARSING FUNCTIONS. ## + ################################################################################ + + def fill_misp_object(self, misp_object, stix_object, mapping, + to_call='_fill_observable_object_attribute'): + for feature, value in stix_object.items(): + if feature not in getattr(stix2misp_mapping, mapping): + if feature.startswith('x_misp_'): + attribute = self.parse_custom_property(feature) + if isinstance(value, list): + self._fill_misp_object_from_list(misp_object, attribute, value) + continue + else: + continue + else: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[feature]) + attribute.update(getattr(self, to_call)(feature, value)) + misp_object.add_attribute(**attribute) + + @staticmethod + def _fill_misp_object_from_list(misp_object, mapping, values): + for value in values: + attribute = {'value': value} + attribute.update(mapping) + misp_object.add_attribute(**attribute) + + def parse_attack_pattern(self, attack_pattern): + misp_object, _ = self.create_misp_object(attack_pattern) + if hasattr(attack_pattern, 'external_references'): + for reference in attack_pattern.external_references: + value = reference['external_id'].split('-')[1] if reference['source_name'] == 'capec' else reference['url'] + misp_object.add_attribute(**{ + 'type': 'text', 'object_relation': 'id', + 'value': value + }) + self.fill_misp_object(misp_object, attack_pattern, 'attack_pattern_mapping', + '_fill_observable_object_attribute') + self.misp_event.add_object(**misp_object) + + def parse_course_of_action(self, course_of_action): + misp_object, _ = self.create_misp_object(course_of_action) + self.fill_misp_object(misp_object, course_of_action, 'course_of_action_mapping', + '_fill_observable_object_attribute') + self.misp_event.add_object(**misp_object) + + def parse_custom_attribute(self, custom): + attribute_type = custom['type'].split('x-misp-object-')[1] + if attribute_type not in _misp_types: + replacement = ' ' if attribute_type == 'named-pipe' else '|' + attribute_type = attribute_type.replace('-', replacement) + attribute = {'type': attribute_type, + 'timestamp': self.getTimestampfromDate(custom['modified']), + 'to_ids': bool(custom['labels'][1].split('=')[1]), + 'value': custom['x_misp_value'], + 'category': self.get_misp_category(custom['labels']), + 'uuid': custom['id'].split('--')[1]} + if custom.get('object_marking_refs'): + self.update_marking_refs(attribute['uuid'], custom['object_marking_refs']) + self.misp_event.add_attribute(**attribute) + + def parse_custom_object(self, custom): + name = custom['type'].split('x-misp-object-')[1] + if name in self._custom_objects: + name = name.replace('-', '_') + misp_object = MISPObject(name, misp_objects_path_custom=_misp_objects_path) + misp_object.timestamp = self.getTimestampfromDate(custom['modified']) + misp_object.uuid = custom['id'].split('--')[1] + try: + misp_object.category = custom['category'] + except KeyError: + misp_object.category = self.get_misp_category(custom['labels']) + for key, value in custom['x_misp_values'].items(): + attribute_type, object_relation = key.replace('_DOT_', '.').split('_') + if isinstance(value, list): + for single_value in value: + misp_object.add_attribute(**{'type': attribute_type, 'value': single_value, + 'object_relation': object_relation}) + else: + misp_object.add_attribute(**{'type': attribute_type, 'value': value, + 'object_relation': object_relation}) + self.misp_event.add_object(**misp_object) + + def parse_galaxy(self, galaxy): + if hasattr(galaxy, 'labels'): + return [label for label in galaxy.labels if label.startswith('misp-galaxy:')] + try: + return self._synonyms_to_tag_names[name] + except KeyError: + print(f'Unknown {galaxy._type} name: {galaxy.name}', file=sys.stderr) + return [f'misp-galaxy:{galaxy._type}="{galaxy.name}"'] + + def parse_indicator_attribute(self, indicator): + attribute = self.create_attribute_dict(indicator) + attribute['to_ids'] = True + pattern = indicator.pattern.replace('\\\\', '\\') + if attribute['type'] in ('malware-sample', 'attachment'): + value, data = self.parse_attribute_pattern_with_data(pattern) + attribute.update({feature: value for feature, value in zip(('value', 'data'), (value, io.BytesIO(data.encode())))}) + else: + attribute['value'] = self.parse_attribute_pattern(pattern) + self.misp_event.add_attribute(**attribute) + + def parse_indicator_object(self, indicator): + misp_object, object_type = self.create_misp_object(indicator) + pattern = self._handle_pattern(indicator.pattern).replace('\\\\', '\\').split(' AND ') + try: + attributes = getattr(self, stix2misp_mapping.objects_mapping[object_type]['pattern'])(pattern) + except KeyError: + print(f"Unable to map {object_type} object:\n{indicator}", file=sys.stderr) + return + if isinstance(attributes, tuple): + attributes, target_uuid = attributes + misp_object.add_reference(target_uuid, 'includes') + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(misp_object) + + def parse_observable_attribute(self, observable): + attribute = self.create_attribute_dict(observable) + attribute['to_ids'] = False + objects = observable.objects + value = self.parse_single_attribute_observable(objects, attribute['type']) + if isinstance(value, tuple): + value, data = value + attribute['data'] = data + attribute['value'] = value + self.misp_event.add_attribute(**attribute) + + def parse_observable_object(self, observable): + misp_object, object_type = self.create_misp_object(observable) + observable_object = observable.objects + try: + attributes = getattr(self, stix2misp_mapping.objects_mapping[object_type]['observable'])(observable_object) + except KeyError: + print(f"Unable to map {object_type} object:\n{observable}", file=sys.stderr) + return + if isinstance(attributes, tuple): + attributes, target_uuid = attributes + misp_object.add_reference(target_uuid, 'includes') + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(misp_object) + + def parse_vulnerability(self, vulnerability): + attributes = self.fill_observable_attributes(vulnerability, 'vulnerability_mapping') + if hasattr(vulnerability, 'external_references'): + for reference in vulnerability.external_references: + if reference['source_name'] == 'url': + attributes.append({'type': 'link', 'object_relation': 'references', 'value': reference['url']}) + if len(attributes) > 1: + vulnerability_object, _ = self.create_misp_object(vulnerability) + for attribute in attributes: + vulnerability_object.add_attribute(**attribute) + self.misp_event.add_object(**vulnerability_object) + else: + attribute = self.create_attribute_dict(vulnerability) + attribute['value'] = attributes[0]['value'] + self.misp_event.add_attribute(**attribute) + + ################################################################################ + ## OBSERVABLE PARSING FUNCTIONS ## + ################################################################################ + + @staticmethod + def _define_hash_type(hash_type): + if 'sha' in hash_type: + return f'SHA-{hash_type.split("sha")[1]}' + return hash_type.upper() if hash_type == 'md5' else hash_type + + @staticmethod + def _fetch_file_observable(observable_objects): + for key, observable in observable_objects.items(): + if observable['type'] == 'file': + return key + return '0' + + @staticmethod + def _fill_observable_attribute(attribute_type, object_relation, value): + return {'type': attribute_type, + 'object_relation': object_relation, + 'value': value, + 'to_ids': False} + + def fill_observable_attributes(self, observable, object_mapping): + attributes = [] + for key, value in observable.items(): + if key in getattr(stix2misp_mapping, object_mapping): + attribute = deepcopy(getattr(stix2misp_mapping, object_mapping)[key]) + elif key.startswith('x_misp_'): + attribute = self.parse_custom_property(key) + if isinstance(value, list): + for single_value in value: + single_attribute = {'value': single_value, 'to_ids': False} + single_attribute.update(attribute) + attributes.append(single_attribute) + continue + else: + continue + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def _handle_multiple_file_fields(self, file): + attributes = [] + for feature, attribute_type in zip(('filename', 'path', 'fullpath'), ('filename', 'text', 'text')): + key = f'x_misp_multiple_{feature}' + if key in file: + attributes.append(self._fill_observable_attribute(attribute_type, feature, file.pop(key))) + elif f'{key}s' in file: + attributes.extend(self._fill_observable_attribute(attribute_type, feature, value) for value in file.pop(key)) + attributes.extend(self.fill_observable_attributes(file, 'file_mapping')) + return attributes + + def parse_asn_observable(self, observable): + attributes = [] + mapping = 'asn_mapping' + for observable_object in observable.values(): + if isinstance(observable_object, stix2.v20.observables.AutonomousSystem): + attributes.extend(self.fill_observable_attributes(observable_object, mapping)) + else: + attributes.append(self._parse_observable_reference(observable_object, mapping)) + return attributes + + def _parse_attachment(self, observable): + if len(observable) > 1: + return self._parse_name(observable, index='1'), self._parse_payload(observable) + return self._parse_name(observable) + + def parse_credential_observable(self, observable): + return self.fill_observable_attributes(observable['0'], 'credential_mapping') + + def _parse_domain_ip_attribute(self, observable): + return f'{self._parse_value(observable)}|{self._parse_value(observable, index="1")}' + + @staticmethod + def parse_domain_ip_observable(observable): + attributes = [] + for observable_object in observable.values(): + attribute = deepcopy(stix2misp_mapping.domain_ip_mapping[observable_object._type]) + attribute.update({'value': observable_object.value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_email_message(observable, attribute_type): + return observable['0'].get(attribute_type.split('-')[1]) + + def parse_email_observable(self, observable): + email, references = self.filter_main_object(observable, 'EmailMessage') + attributes = self.fill_observable_attributes(email, 'email_mapping') + if hasattr(email, 'additional_header_fields'): + attributes.extend(self.fill_observable_attributes(email.additional_header_fields, 'email_mapping')) + attributes.extend(self._parse_email_references(email, references)) + if hasattr(email, 'body_multipart') and email.body_multipart: + attributes.extend(self._parse_email_body(email.body_multipart, references)) + return attributes + + @staticmethod + def _parse_email_reply_to(observable): + return observable['0'].additional_header_fields.get('Reply-To') + + def parse_file_observable(self, observable): + file, references = self.filter_main_object(observable, 'File') + references = {key: {'object': value, 'used': False} for key, value in references.items()} + file = {key: value for key, value in file.items()} + multiple_fields = any(f'x_misp_multiple_{feature}' in file for feature in ('filename', 'path', 'fullpath')) + attributes = self._handle_multiple_file_fields(file) if multiple_fields else self.fill_observable_attributes(file, 'file_mapping') + if 'hashes' in file: + attributes.extend(self.fill_observable_attributes(file['hashes'], 'file_mapping')) + if 'content_ref' in file: + reference = references[file['content_ref']] + value = f'{reference["object"].name}|{reference["object"].hashes["MD5"]}' + attributes.append({'type': 'malware-sample', 'object_relation': 'malware-sample', 'value': value, + 'to_ids': False, 'data': reference['object'].payload_bin}) + reference['used'] = True + if 'parent_directory_ref' in file: + reference = references[file['parent_directory_ref']] + attributes.append({'type': 'text', 'object_relation': 'path', + 'value': reference['object'].path, 'to_ids': False}) + reference['used'] = True + for reference in references.values(): + if not reference['used']: + attributes.append({ + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': reference['object'].name, + 'data': reference['object'].payload_bin, + 'to_ids': False + }) + return attributes + + def _parse_filename_hash(self, observable, attribute_type, index='0'): + hash_type = attribute_type.split('|')[1] + filename = self._parse_name(observable, index=index) + hash_value = self._parse_hash(observable, hash_type, index=index) + return f'{filename}|{hash_value}' + + def _parse_hash(self, observable, attribute_type, index='0'): + hash_type = self._define_hash_type(attribute_type) + return observable[index]['hashes'].get(hash_type) + + def parse_ip_port_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = [] + for feature in ('src', 'dst'): + port = f'{feature}_port' + if hasattr(network_traffic, port): + attribute = deepcopy(stix2misp_mapping.ip_port_mapping[port]) + attribute.update({'value': getattr(network_traffic, port), 'to_ids': False}) + attributes.append(attribute) + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + attributes.append(self._parse_observable_reference(references.pop(getattr(network_traffic, ref)), 'ip_port_references_mapping', feature)) + for reference in references.values(): + attribute = deepcopy(stix2misp_mapping.ip_port_references_mapping[reference._type]) + attribute.update({'value': reference.value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def _parse_malware_sample(self, observable): + if len(observable) > 1: + value = self._parse_filename_hash(observable, 'filename|md5', '1') + return value, self._parse_payload(observable) + return self._parse_filename_hash(observable, 'filename|md5') + + @staticmethod + def _parse_name(observable, index='0'): + return observable[index].get('name') + + def _parse_network_attribute(self, observable): + port = self._parse_port(observable, index='1') + return f'{self._parse_value(observable)}|{port}' + + def parse_network_connection_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = self._parse_network_traffic(network_traffic, references) + if hasattr(network_traffic, 'protocols'): + attributes.extend(self._parse_network_traffic_protocol(protocol) for protocol in network_traffic.protocols if protocol in stix2misp_mapping.connection_protocols) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def parse_network_socket_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = self._parse_network_traffic(network_traffic, references) + if hasattr(network_traffic, 'protocols'): + attributes.append({'type': 'text', 'object_relation': 'protocol', 'to_ids': False, + 'value': network_traffic.protocols[0].strip("'")}) + if hasattr(network_traffic, 'extensions') and network_traffic.extensions: + attributes.extend(self._parse_socket_extension(network_traffic.extensions['socket-ext'])) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def _parse_network_traffic(self, network_traffic, references): + attributes = [] + mapping = 'network_traffic_references_mapping' + for feature in ('src', 'dst'): + port = f'{feature}_port' + if hasattr(network_traffic, port): + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[port]) + attribute.update({'value': getattr(network_traffic, port), 'to_ids': False}) + attributes.append(attribute) + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + attributes.append(self._parse_observable_reference(references.pop(getattr(network_traffic, ref)), mapping, feature)) + if hasattr(network_traffic, f'{ref}s'): + for ref in getattr(network_traffic, f'{ref}s'): + attributes.append(self._parse_observable_reference(references.pop(ref), mapping, feature)) + return attributes + + @staticmethod + def _parse_number(observable): + return observable['0'].get('number') + + @staticmethod + def _parse_payload(observable): + return observable['0'].payload_bin + + def parse_pe_observable(self, observable): + key = self._fetch_file_observable(observable) + extension = observable[key]['extensions']['windows-pebinary-ext'] + pe_uuid = self.parse_pe(extension) + return self.parse_file_observable(observable), pe_uuid + + @staticmethod + def _parse_port(observable, index='0'): + port_observable = observable[index] + return port_observable['src_port'] if 'src_port' in port_observable else port_observable['dst_port'] + + def parse_process_observable(self, observable): + process, references = self.filter_main_object(observable, 'Process', test_function='_process_test_filter') + attributes = self.fill_observable_attributes(process, 'process_mapping') + if hasattr(process, 'parent_ref'): + attributes.extend(self.fill_observable_attributes(references[process.parent_ref], 'parent_process_reference_mapping')) + if hasattr(process, 'child_refs'): + for reference in process.child_refs: + attributes.extend(self.fill_observable_attributes(references[reference], 'child_process_reference_mapping')) + if hasattr(process, 'binary_ref'): + reference = references[process.binary_ref] + attribute = deepcopy(stix2misp_mapping.process_image_mapping) + attribute.update({'value': reference.name, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_regkey_attribute(observable): + return observable['0'].get('key') + + def parse_regkey_observable(self, observable): + attributes = [] + for key, value in observable['0'].items(): + if key in stix2misp_mapping.regkey_mapping: + attribute = deepcopy(stix2misp_mapping.regkey_mapping[key]) + attribute.update({'value': value.replace('\\\\', '\\'), 'to_ids': False}) + attributes.append(attribute) + if 'values' in observable['0']: + attributes.extend(self.fill_observable_attributes(observable['0']['values'][0], 'regkey_mapping')) + return attributes + + def _parse_regkey_value(self, observable): + regkey = self._parse_regkey_attribute(observable) + return f'{regkey}|{observable["0"]["values"][0].get("data")}' + + def parse_single_attribute_observable(self, observable, attribute_type): + if attribute_type in stix2misp_mapping.attributes_type_mapping: + return getattr(self, stix2misp_mapping.attributes_type_mapping[attribute_type])(observable, attribute_type) + return getattr(self, stix2misp_mapping.attributes_mapping[attribute_type])(observable) + + def _parse_socket_extension(self, extension): + attributes = [] + extension = {key: value for key, value in extension.items()} + if 'x_misp_text_address_family' in extension: + extension.pop('address_family') + for element, value in extension.items(): + if element in stix2misp_mapping.network_socket_extension_mapping: + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[element]) + if element in ('is_listening', 'is_blocking'): + if value is False: + continue + value = element.split('_')[1] + elif element.startswith('x_misp_'): + attribute = self.parse_custom_property(element) + else: + continue + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def parse_url_observable(observable): + attributes = [] + for object in observable.values(): + feature = 'dst_port' if isinstance(object, stix2.v20.observables.NetworkTraffic) else 'value' + attribute = deepcopy(stix2misp_mapping.url_mapping[object._type]) + attribute.update({'value': getattr(object, feature), 'to_ids': False}) + attributes.append(attribute) + return attributes + + def parse_user_account_observable(self, observable): + observable = observable['0'] + attributes = self.fill_observable_attributes(observable, 'user_account_mapping') + if 'extensions' in observable and 'unix-account-ext' in observable['extensions']: + extension = observable['extensions']['unix-account-ext'] + if 'groups' in extension: + attributes.extend(self._parse_user_account_groups(extension['groups'])) + attributes.extend(self.fill_observable_attributes(extension, 'user_account_mapping')) + return attributes + + @staticmethod + def _parse_value(observable, index='0'): + return observable[index].get('value') + + def _parse_x509_attribute(self, observable, attribute_type): + hash_type = attribute_type.split('-')[-1] + return self._parse_hash(observable, hash_type) + + def parse_x509_observable(self, observable): + attributes = self.fill_observable_attributes(observable['0'], 'x509_mapping') + if hasattr(observable['0'], 'hashes') and observable['0'].hashes: + attributes.extend(self.fill_observable_attributes(observable['0'].hashes, 'x509_mapping')) + return attributes + + ################################################################################ + ## PATTERN PARSING FUNCTIONS. ## + ################################################################################ + + def fill_pattern_attributes(self, pattern, object_mapping): + attributes = [] + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type not in getattr(stix2misp_mapping, object_mapping): + if 'x_misp_' in pattern_type: + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(getattr(stix2misp_mapping, object_mapping)[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + return attributes + + def parse_asn_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'asn_mapping') + + def parse_credential_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'credential_mapping') + + def parse_domain_ip_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'domain_ip_mapping') + + def parse_email_pattern(self, pattern): + attributes = [] + attachments = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if 'body_multipart' in pattern_type: + pattern_type = pattern_type.split('.') + feature = 'data' if pattern_type[-1] == 'payload_bin' else 'value' + attachments[pattern_type[0][-2]][feature] = pattern_value.strip("'") + continue + if pattern_type not in stix2misp_mapping.email_mapping: + if 'x_misp_' in pattern_type: + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(stix2misp_mapping.email_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + for attachment in attachments.values(): + if 'data' in attachment: + attribute = {'type': 'attachment', 'object_relation': 'screenshot', 'data': attachment['data']} + else: + attribute = {'type': 'email-attachment', 'object_relation': 'attachment'} + attribute['value'] = attachment['value'] + attributes.append(attribute) + return attributes + + def parse_file_pattern(self, pattern): + attributes = [] + attachment = {} + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type in stix2misp_mapping.attachment_types: + attachment[pattern_type] = pattern_value.strip("'") + if pattern_type not in stix2misp_mapping.file_mapping: + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + if 'file:content_ref.payload_bin' in attachment: + filename = self._choose_with_priority(attachment, 'file:content_ref.name', 'file:name') + md5 = self._choose_with_priority(attachment, "file:content_ref.hashes.'MD5'", "file:hashes.'MD5'") + attributes.append({ + 'type': 'malware-sample', + 'object_relation': 'malware-sample', + 'value': f'{attachment[filename]}|{attachment[md5]}', + 'data': attachment['file:content_ref.payload_bin'] + }) + if 'artifact:payload_bin' in attachment: + attributes.append({ + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment['artifact:x_misp_text_name'] if 'artifact:x_misp_text_name' in attachment else attachment['file:name'], + 'data': attachment['artifact:payload_bin'] + }) + return attributes + + def parse_ip_port_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'ip_port_mapping') + + def parse_network_connection_pattern(self, pattern): + attributes = [] + references = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type not in stix2misp_mapping.network_traffic_mapping: + pattern_value = pattern_value.strip("'") + if pattern_type.startswith('network-traffic:protocols['): + attributes.append({ + 'type': 'text', 'value': pattern_value, + 'object_relation': f'layer{stix2misp_mapping.connection_protocols[pattern_value]}-protocol' + }) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + continue + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + attributes.extend(attribute for attribute in references.values()) + return attributes + + def parse_network_socket_pattern(self, pattern): + attributes = [] + references = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + pattern_value = pattern_value.strip("'") + if pattern_type not in stix2misp_mapping.network_traffic_mapping: + if pattern_type in stix2misp_mapping.network_socket_extension_mapping: + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[pattern_type]) + if pattern_type.startswith("network-traffic:extensions.'socket-ext'.is_"): + if pattern_value != 'True': + continue + pattern_value = pattern_type.split('_')[1] + else: + if pattern_type.startswith('network-traffic:protocols['): + attributes.append({'type': 'text', 'object_relation': 'protocol', 'value': pattern_value}) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + continue + else: + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + attributes.extend(attribute for attribute in references.values()) + return attributes + + def parse_pe_pattern(self, pattern): + attributes = [] + sections = defaultdict(dict) + pe = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if ':extensions.' in pattern_type: + if '.sections[' in pattern_type: + pattern_type = pattern_type.split('.') + relation = pattern_type[-1].strip("'") + if relation in stix2misp_mapping.pe_section_mapping: + sections[pattern_type[2][-2]][relation] = pattern_value.strip("'") + else: + pattern_type = pattern_type.split('.')[-1] + if pattern_type not in stix2misp_mapping.pe_mapping: + if pattern_type.startswith('x_misp_'): + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + pe.add_attribute(**attribute) + continue + attribute = deepcopy(stix2misp_mapping.pe_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + pe.add_attribute(**attribute) + else: + if pattern_type not in stix2misp_mapping.file_mapping: + if pattern_type.startswith('x_misp_'): + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + for section in sections.values(): + pe_section = MISPObject('pe-section', misp_objects_path_custom=_misp_objects_path) + for feature, value in section.items(): + attribute = deepcopy(stix2misp_mapping.pe_section_mapping[feature]) + attribute['value'] = value + pe_section.add_attribute(**attribute) + self.misp_event.add_object(pe_section) + pe.add_reference(pe_section.uuid, 'includes') + self.misp_event.add_object(pe) + return attributes, pe.uuid + + def parse_process_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'process_mapping') + + def parse_regkey_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'regkey_mapping') + + def parse_url_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'url_mapping') + + @staticmethod + def parse_user_account_pattern(pattern): + attributes = [] + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + pattern_type = pattern_type.split('.')[-1].split('[')[0] if "extensions.'unix-account-ext'" in pattern_type else pattern_type.split(':')[-1] + if pattern_type not in stix2misp_mapping.user_account_mapping: + if pattern_type.startswith('group'): + attributes.append({'type': 'text', 'object_relation': 'group', 'value': pattern_value.strip("'")}) + continue + attribute = deepcopy(stix2misp_mapping.user_account_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + return attributes + + def parse_x509_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'x509_mapping') + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + def create_attribute_dict(self, stix_object): + labels = stix_object['labels'] + attribute_uuid = stix_object.id.split('--')[1] + attribute = {'uuid': attribute_uuid, + 'type': self.get_misp_type(labels), + 'category': self.get_misp_category(labels)} + tags = [{'name': label} for label in labels[3:]] + if tags: + attribute['Tag'] = tags + attribute.update(self.parse_timeline(stix_object)) + if hasattr(stix_object, 'object_marking_refs'): + self.update_marking_refs(attribute_uuid, stix_object.object_marking_refs) + return attribute + + def create_misp_object(self, stix_object): + labels = stix_object['labels'] + object_type = self.get_misp_type(labels) + misp_object = MISPObject('file' if object_type == 'WindowsPEBinaryFile' else object_type, + misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = stix_object.id.split('--')[1] + misp_object.update(self.parse_timeline(stix_object)) + return misp_object, object_type + + @staticmethod + def _fill_object_attribute(feature, value): + return {'value': str(value) if feature in ('entropy', 'size') else value} + + @staticmethod + def _fill_observable_object_attribute(feature, value): + return {'value': str(value) if feature in ('entropy', 'size') else value, + 'to_ids': False} + + @staticmethod + def get_misp_category(labels): + return labels[1].split('=')[1].strip('"') + + @staticmethod + def get_misp_type(labels): + return labels[0].split('=')[1].strip('"') + + @staticmethod + def parse_attribute_pattern(pattern): + if ' AND ' in pattern: + pattern_parts = pattern.strip('[]').split(' AND ') + if len(pattern_parts) == 3: + _, value1 = pattern_parts[2].split(' = ') + _, value2 = pattern_parts[0].split(' = ') + return '{}|{}'.format(value1.strip("'"), value2.strip("'")) + else: + _, value1 = pattern_parts[0].split(' = ') + _, value2 = pattern_parts[1].split(' = ') + if value1 in ("'ipv4-addr'", "'ipv6-addr'"): + return value2.strip("'") + return '{}|{}'.format(value1.strip("'"), value2.strip("'")) + else: + return pattern.split(' = ')[1].strip("]'") + + def parse_attribute_pattern_with_data(self, pattern): + if 'file:content_ref.payload_bin' not in pattern: + return self.parse_attribute_pattern(pattern) + pattern_parts = pattern.strip('[]').split(' AND ') + if len(pattern_parts) == 3: + filename = pattern_parts[0].split(' = ')[1] + md5 = pattern_parts[1].split(' = ')[1] + return "{}|{}".format(filename.strip("'"), md5.strip("'")), pattern_parts[2].split(' = ')[1].strip("'") + return pattern_parts[0].split(' = ')[1].strip("'"), pattern_parts[1].split(' = ')[1].strip("'") + + @staticmethod + def parse_custom_property(custom_property): + properties = custom_property.split('_') + return {'type': properties[2], 'object_relation': '-'.join(properties[3:])} + + +class ExternalStixParser(StixParser): + def __init__(self): + super().__init__() + self._stix2misp_mapping.update({'attack-pattern': 'parse_attack_pattern', + 'course-of-action': 'parse_course_of_action', + 'vulnerability': 'parse_vulnerability'}) + + ################################################################################ + ## PARSING FUNCTIONS. ## + ################################################################################ + + def parse_event(self, stix_event): + for stix_object in stix_event.objects: + object_type = stix_object['type'] + if object_type in self._stix2misp_mapping: + getattr(self, self._stix2misp_mapping[object_type])(stix_object) + else: + print(f'not found: {object_type}', file=sys.stderr) + if self.relationship: + self.parse_relationships() + if self.galaxy: + self.parse_galaxies() + event_uuid = stix_event.id.split('--')[1] + if hasattr(self, 'report'): + self.parse_report(event_uuid=event_uuid) + else: + self.misp_event.uuid = event_uuid + self.misp_event.info = 'Imported with the STIX to MISP import script.' + self.handle_markings() + + def parse_galaxy(self, galaxy): + galaxy_names = self._check_existing_galaxy_name(galaxy.name) + if galaxy_names is not None: + return galaxy_names + return [f'misp-galaxy:{galaxy._type}="{galaxy.name}"'] + + def _parse_indicator(self, indicator): + pattern = indicator.pattern + if any(relation in pattern for relation in stix2misp_mapping.pattern_forbidden_relations) or all(relation in pattern for relation in (' OR ', ' AND ')): + self.add_stix2_pattern_object(indicator) + separator = ' OR ' if ' OR ' in pattern else ' AND ' + self.parse_usual_indicator(indicator, separator) + + def _parse_observable(self, observable): + types = self._parse_observable_types(observable.objects) + try: + getattr(self, stix2misp_mapping.observable_mapping[types])(observable) + except KeyError: + print(f'Type(s) not supported at the moment: {types}\n', file=sys.stderr) + + def _parse_undefined(self, stix_object): + try: + self.objects_to_parse[stix_object['id'].split('--')[1]] = stix_object + except AttributeError: + self.objects_to_parse = {stix_object['id'].split('--')[1]: stix_object} + + def add_stix2_pattern_object(self, indicator): + misp_object = MISPObject('stix2-pattern', misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = indicator.id.split('--')[1] + misp_object.update(self.parse_timeline(indicator)) + version = f'STIX {indicator.pattern_version}' if hasattr(indicator, 'pattern_version') else 'STIX 2.0' + misp_object.add_attribute(**{'type': 'text', 'object_relation': 'version', 'value': version}) + misp_object.add_attribute(**{'type': 'stix2-pattern', 'object_relation': 'stix2-pattern', + 'value': indicator.pattern}) + self.misp_event.add_object(**misp_object) + + @staticmethod + def fill_misp_object(misp_object, stix_object, mapping): + for key, feature in getattr(stix2misp_mapping, mapping).items(): + if hasattr(stix_object, key): + attribute = deepcopy(feature) + attribute['value'] = getattr(stix_object, key) + misp_object.add_attribute(**attribute) + + @staticmethod + def fill_misp_object_from_dict(misp_object, stix_object, mapping): + for key, feature in getattr(stix2misp_mapping, mapping).items(): + if key in stix_object: + attribute = deepcopy(feature) + attribute['value'] = stix_object[key] + misp_object.add_attribute(**attribute) + + def parse_attack_pattern(self, attack_pattern): + galaxy_names = self._check_existing_galaxy_name(attack_pattern.name) + if galaxy_names is not None: + self.galaxy[attack_pattern['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + misp_object = self.create_misp_object(attack_pattern) + if hasattr(attack_pattern, 'external_references'): + for reference in attack_pattern.external_references: + source_name = reference['source_name'] + value = reference['external_id'].split('-')[1] if source_name == 'capec' else reference['url'] + attribute = deepcopy(stix2misp_mapping.attack_pattern_references_mapping[source_name]) if source_name in stix2misp_mapping.attack_pattern_references_mapping else stix2misp_mapping.references_attribute_mapping + attribute['value'] = value + misp_object.add_attribute(**attribute) + self.fill_misp_object(misp_object, attack_pattern, 'attack_pattern_mapping') + self.misp_event.add_object(**misp_object) + + def parse_course_of_action(self, course_of_action): + galaxy_names = self._check_existing_galaxy_name(course_of_action.name) + if galaxy_names is not None: + self.galaxy[course_of_action['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + misp_object = self.create_misp_object(course_of_action) + self.fill_misp_object(misp_object, course_of_action, 'course_of_action_mapping') + self.misp_event.add_object(**misp_object) + + def parse_usual_indicator(self, indicator, separator): + pattern = tuple(part.strip() for part in self._handle_pattern(indicator.pattern).split(separator)) + types = self._parse_pattern_types(pattern) + try: + getattr(self, stix2misp_mapping.pattern_mapping[types])(indicator, separator) + except KeyError: + print(f'Type(s) not supported at the moment: {types}\n', file=sys.stderr) + self.add_stix2_pattern_object(indicator) + + def parse_vulnerability(self, vulnerability): + galaxy_names = self._check_existing_galaxy_name(vulnerability.name) + if galaxy_names is not None: + self.galaxy[vulnerability['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + attributes = self._get_attributes_from_observable(vulnerability, 'vulnerability_mapping') + if hasattr(vulnerability, 'external_references'): + for reference in vulnerability.external_references: + if reference['source_name'] == 'url': + attribute = deepcopy(stix2misp_mapping.references_attribute_mapping) + attribute['value'] = reference['url'] + attributes.append(attribute) + if len(attributes) == 1 and attributes[0]['object_relation'] == 'id': + attributes[0]['type'] = 'vulnerability' + self.handle_import_case(vulnerability, attributes, 'vulnerability') + + ################################################################################ + ## OBSERVABLE PARSING FUNCTIONS ## + ################################################################################ + + @staticmethod + def _fetch_reference_type(references, object_type): + for key, reference in references.items(): + if isinstance(reference, getattr(stix2.v20.observables, object_type)): + return key + return None + + @staticmethod + def _fetch_user_account_type_observable(observable_objects): + for observable_object in observable_objects.values(): + if hasattr(observable_object, 'extensions') or any(key not in ('user_id', 'credential', 'type') for key in observable_object): + return 'user-account', 'user_account_mapping' + return 'credential', 'credential_mapping' + + @staticmethod + def _get_attributes_from_observable(stix_object, mapping): + attributes = [] + for key, value in stix_object.items(): + if key in getattr(stix2misp_mapping, mapping) and value: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[key]) + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def get_network_traffic_attributes(self, network_traffic, references): + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') + mapping = 'network_traffic_references_mapping' + attributes.extend(self.parse_network_traffic_references(network_traffic, references, mapping)) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping, 'dst')) + return attributes + + @staticmethod + def _handle_attachment_type(stix_object, is_reference, filename): + _has_md5 = hasattr(stix_object, 'hashes') and 'MD5' in stix_object.hashes + if is_reference and _has_md5: + return 'malware-sample', f'{filename}|{stix_object.hashes["MD5"]}' + return 'attachment', filename + + def handle_pe_observable(self, attributes, extension, observable): + pe_uuid = self.parse_pe(extension) + file = self.create_misp_object(observable, 'file') + file.add_reference(pe_uuid, 'includes') + for attribute in attributes: + file.add_attribute(**attribute) + self.misp_event.add_object(file) + + @staticmethod + def _is_reference(network_traffic, reference): + for feature in ('src', 'dst'): + for reference_type in (f'{feature}_{ref}' for ref in ('ref', 'refs')): + if reference in network_traffic.get(reference_type, []): + return True + return False + + @staticmethod + def _network_traffic_has_extension(network_traffic): + if not hasattr(network_traffic, 'extensions'): + return None + if 'socket-ext' in network_traffic.extensions: + return 'parse_socket_extension_observable' + return None + + def parse_asn_observable(self, observable): + autonomous_system, references = self.filter_main_object(observable.objects, 'AutonomousSystem') + mapping = 'asn_mapping' + attributes = self._get_attributes_from_observable(autonomous_system, mapping) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping)) + self.handle_import_case(observable, attributes, 'asn') + + def parse_domain_ip_observable(self, observable): + domain, references = self.filter_main_object(observable.objects, 'DomainName') + mapping = 'domain_ip_mapping' + attributes = [self._parse_observable_reference(domain, mapping)] + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping)) + self.handle_import_case(observable, attributes, 'domain-ip') + + def parse_domain_ip_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + if self._required_protocols(network_traffic.protocols): + attributes = self.parse_network_connection_object(network_traffic, references) + return self.handle_import_case(observable, attributes, 'network-connection') + attributes, object_name = self.parse_network_traffic_objects(network_traffic, references) + self.handle_import_case(observable, attributes, object_name) + + def parse_domain_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + attributes = self.parse_network_connection_object(network_traffic, references) + self.handle_import_case(observable, attributes, 'network-connection') + + def parse_email_address_observable(self, observable): + self.add_attributes_from_observable(observable, 'email-src', 'value') + + def parse_email_observable(self, observable): + email_message, references = self.filter_main_object(observable.objects, 'EmailMessage') + attributes = self._get_attributes_from_observable(email_message, 'email_mapping') + if hasattr(email_message, 'additional_header_fields'): + attributes.extend(self._get_attributes_from_observable(email_message.additional_header_fields, 'email_mapping')) + attributes.extend(self._parse_email_references(email_message, references)) + if hasattr(email_message, 'body_multipart') and email_message.body_multipart: + attributes.extend(self._parse_email_body(email_message.body_multipart, references)) + if references: + print(f'Unable to parse the following observable objects: {references}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'email') + + def parse_file_observable(self, observable): + file_object, references = self.filter_main_object(observable.objects, 'File') + attributes = self._get_attributes_from_observable(file_object, 'file_mapping') + if 'hashes' in file_object: + attributes.extend(self._get_attributes_from_observable(file_object.hashes, 'file_mapping')) + if references: + filename = file_object.name if hasattr(file_object, 'name') else 'unknown_filename' + for key, reference in references.items(): + if isinstance(reference, stix2.v20.observables.Artifact): + _is_content_ref = 'content_ref' in file_object and file_object.content_ref == key + attribute_type, value = self._handle_attachment_type(reference, _is_content_ref, filename) + attribute = { + 'type': attribute_type, + 'object_relation': attribute_type, + 'value': value, + 'to_ids': False + } + if hasattr(reference, 'payload_bin'): + attribute['data'] = reference.payload_bin + attributes.append(attribute) + elif isinstance(reference, stix2.v20.observables.Directory): + attribute = { + 'type': 'text', + 'object_relation': 'path', + 'value': reference.path, + 'to_ids': False + } + attributes.append(attribute) + if hasattr(file_object, 'extensions'): + # Support of more extension types probably in the future + if 'windows-pebinary-ext' in file_object.extensions: + # Here we do not go to the standard route of "handle_import_case" + # because we want to make sure a file object is created + return self.handle_pe_observable(attributes, file_object.extensions['windows-pebinary-ext'], observable) + extension_types = (extension_type for extension_type in file_object.extensions.keys()) + print(f'File extension type(s) not supported at the moment: {", ".join(extension_types)}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'file', _force_object=('file-encoding', 'path')) + + def parse_ip_address_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attribute = { + 'value': observable_object.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.ip_attribute_mapping) + attributes.append(attribute) + self.handle_import_case(observable, attributes, 'ip-port') + + def parse_ip_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + attributes = self.parse_ip_port_object(network_traffic, references) + self.handle_import_case(observable, attributes, 'ip-port') + + def parse_ip_port_object(self, network_traffic, references): + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') + attributes.extend(self.parse_network_traffic_references(network_traffic, references, 'ip_port_references_mapping')) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def parse_mac_address_observable(self, observable): + self.add_attributes_from_observable(observable, 'mac-address', 'value') + + def parse_network_connection_object(self, network_traffic, references): + attributes = self.get_network_traffic_attributes(network_traffic, references) + attributes.extend(self.parse_protocols(network_traffic.protocols, 'observable object')) + return attributes + + def parse_network_traffic_objects(self, network_traffic, references): + _has_domain = self._fetch_reference_type(references.values(), 'DomainName') + if _has_domain and self._is_reference(network_traffic, _has_domain): + return self.parse_network_connection_object(network_traffic, references), 'network-connection' + return self.parse_ip_port_object(network_traffic, references), 'ip-port' + + def parse_network_traffic_references(self, network_traffic, references, mapping): + attributes = [] + for feature in ('src', 'dst'): + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + reference = getattr(network_traffic, ref) + attributes.append(self._parse_observable_reference(references.pop(reference), mapping, feature)) + if hasattr(network_traffic, f'{ref}s'): + for reference in getattr(network_traffic, f'{ref}s'): + attributes.append(self._parse_observable_reference(references.pop(reference), mapping, feature)) + return attributes + + def parse_mutex_observable(self, observable): + self.add_attributes_from_observable(observable, 'mutex', 'name') + + def parse_process_observable(self, observable): + process, references = self.filter_main_object(observable.objects, 'Process', test_function='_process_test_filter') + attributes = self._get_attributes_from_observable(process, 'process_mapping') + if hasattr(process, 'parent_ref'): + attributes.extend(self._get_attributes_from_observable(references.pop(process.parent_ref), 'parent_process_reference_mapping')) + if hasattr(process, 'child_refs'): + for reference in process.child_refs: + attributes.extend(self._get_attributes_from_observable(references.pop(reference), 'child_process_reference_mapping')) + if hasattr(process, 'binary_ref'): + reference = references.pop(process.binary_ref) + attribute = { + 'value': reference.name, + 'to_ids': False + } + attribute.update(stix2misp_mapping.process_image_mapping) + attributes.append(attribute) + if references: + print(f'Unable to parse the following observable objects: {references}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'process', _force_object=True) + + def parse_protocols(self, protocols, object_type): + attributes = [] + protocols = (protocol.upper() for protocol in protocols) + for protocol in protocols: + try: + attributes.append(self._parse_network_traffic_protocol(protocol)) + except KeyError: + print(f'Unknown protocol in network-traffic {object_type}: {protocol}', file=sys.stderr) + return attributes + + def parse_regkey_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, 'regkey_mapping')) + if 'values' in observable_object: + for registry_value in observable_object['values']: + attributes.extend(self._get_attributes_from_observable(registry_value, 'regkey_mapping')) + self.handle_import_case(observable, attributes, 'registry-key') + + def parse_socket_extension_observable(self, network_traffic, references): + attributes = self.get_network_traffic_attributes(network_traffic, references) + for key, value in network_traffic.extensions['socket-ext'].items(): + if key not in stix2misp_mapping.network_socket_extension_mapping: + print(f'Unknown socket extension field in observable object: {key}', file=sys.stderr) + continue + if key.startswith('is_') and not value: + continue + attribute = { + 'value': key.split('_')[1] if key.startswith('is_') else value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.network_socket_extension_mapping[key]) + attributes.append(attribute) + return attributes, 'network-socket' + + def parse_url_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') if network_traffic else [] + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'url_mapping')) + self.handle_import_case(observable, attributes, 'url') + + def parse_user_account_extension(self, extension): + attributes = self._parse_user_account_groups(extension['groups']) if 'groups' in extension else [] + attributes.extend(self._get_attributes_from_observable(extension, 'user_account_mapping')) + return attributes + + def parse_user_account_observable(self, observable): + attributes = [] + object_name, mapping = self._fetch_user_account_type_observable(observable.objects) + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, mapping)) + if hasattr(observable_object, 'extensions') and observable_object.extensions.get('unix-account-ext'): + attributes.extend(self.parse_user_account_extension(observable_object.extensions['unix-account-ext'])) + self.handle_import_case(observable, attributes, object_name) + + def parse_x509_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, 'x509_mapping')) + if hasattr(observable_object, 'hashes'): + attributes.extend(self._get_attributes_from_observable(observable_object.hashes, 'x509_mapping')) + self.handle_import_case(observable, attributes, 'x509') + + ################################################################################ + ## PATTERN PARSING FUNCTIONS. ## + ################################################################################ + + @staticmethod + def _fetch_user_account_type_pattern(pattern): + for stix_object in pattern: + if 'extensions' in stix_object or all(key not in stix_object for key in ('user_id', 'credential', 'type')): + return 'user-account', 'user_account_mapping' + return 'credential', 'credential_mapping' + + def get_attachment(self, attachment, filename): + attribute = { + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment.pop(filename) + } + data_feature = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute['data'] = attachment.pop(data_feature) + return attribute + + def get_attributes_from_pattern(self, pattern, mapping, separator): + attributes = [] + for pattern_part in pattern.strip('[]').split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + try: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[pattern_type]) + except KeyError: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute['value'] = pattern_value + attributes.append(attribute) + return attributes + + def get_malware_sample(self, attachment, filename): + md5_feature = self._choose_with_priority(attachment, "file:content_ref.hashes.'MD5'", "file:hashes.'MD5'") + attribute = { + 'type': 'malware-sample', + 'object_relation': 'malware-sample', + 'value': f'{attachment.pop(filename)}|{attachment.pop(md5_feature)}' + } + data_feature = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute['data'] = attachment.pop(data_feature) + return attribute + + def _handle_file_attachments(self, attachment): + attributes = [] + if any('content_ref' in feature for feature in attachment.keys()): + attribute_type = 'attachment' + value = attachment['file:name'] if 'file:name' in attachment else 'unknown_filename' + if "file:content_ref.hashes.'MD5'" in attachment: + attribute_type = 'malware-sample' + md5 = attachment.pop("file:content_ref.hashes.'MD5'") + value = f'{value}|{md5}' + data = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute = { + 'type': attribute_type, + 'object_relation': attribute_type, + 'value': value, + 'data': attachment.pop(data) + } + attributes.append(attribute) + if 'artifact:payload_bin' in attachment: + attribute = { + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment['file:name'], + 'data': attachment.pop('artifact:payload_bin') + } + attributes.append(attribute) + return attributes + + def parse_as_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'asn_mapping', separator) + self.handle_import_case(indicator, attributes, 'asn') + + def parse_domain_ip_port_pattern(self, indicator, separator): + attributes = [] + references = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type not in stix2misp_mapping.domain_ip_mapping: + if any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + else: + print(f'Pattern type not currently mapped: {pattern_type}', file=sys.stderr) + continue + attribute = deepcopy(stix2misp_mapping.domain_ip_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if references: + attributes.extend(references.values()) + object_name = 'ip-port' if 'network-traffic' in indicator.pattern else 'domain-ip' + self.handle_import_case(indicator, attributes, object_name) + + def parse_email_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'email-src', separator) + + def parse_email_message_pattern(self, indicator, separator): + attributes = [] + attachments = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type not in stix2misp_mapping.email_mapping: + if pattern_type.startswith('email-message:body_multipart'): + features = pattern_type.split('.') + if len(features) == 3 and features[1] == 'body_raw_ref': + index = features[0].split('[')[1].strip(']') if '[' in features[0] else '0' + key = 'data' if features[2] == 'payload_bin' else 'value' + attachments[index][key] = pattern_value + continue + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute = deepcopy(stix2misp_mapping.email_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if attachments: + for attachment in attachments.values(): + attribute = { + 'type': 'attachment', + 'object_relation': 'screenshot' + } if 'data' in attachment else { + 'type': 'email-attachment', + 'object_relation': 'attachment' + } + attribute.update(attachment) + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'email') + + def parse_file_pattern(self, indicator, separator): + attributes = [] + attachment = {} + extensions = defaultdict(lambda: defaultdict(dict)) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type in stix2misp_mapping.attachment_types: + attachment[pattern_type] = pattern_value.strip("'") + continue + if pattern_type not in stix2misp_mapping.file_mapping: + if 'extensions' in pattern_type: + features = pattern_type.split('.')[1:] + extension_type = features.pop(0).strip("'") + if 'section' in features[0] and features[0] != 'number_of_sections': + index = features[0].split('[')[1].strip(']') if '[' in features[0] else '0' + extensions[extension_type][f'section_{index}'][features[-1].strip("'")] = pattern_value + else: + extensions[extension_type]['.'.join(features)] = pattern_value + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if any(key.endswith('payload_bin') for key in attachment.keys()): + attributes.extend(self._handle_file_attachments(attachment)) + if attachment: + for pattern_type, value in attachment.items(): + if pattern_type in stix2misp_mapping.file_mapping: + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = value + attributes.append(attribute) + if extensions: + file_object = self.create_misp_object(indicator, 'file') + self.parse_file_extension(file_object, attributes, extensions) + else: + self.handle_import_case(indicator, attributes, 'file', _force_object=('file-encoding', 'path')) + + def parse_file_extension(self, file_object, attributes, extensions): + for attribute in attributes: + file_object.add_attribute(**attribute) + if 'windows-pebinary-ext' in extensions: + pe_extension = extensions['windows-pebinary-ext'] + pe_object = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + sections = self._get_sections(pe_extension) + self.fill_misp_object_from_dict(pe_object, pe_extension, 'pe_mapping') + if sections: + for section in sections: + section_object = MISPObject('pe-section') + self.fill_misp_object_from_dict(section_object, section, 'pe_section_mapping') + self.misp_event.add_object(section_object) + pe_object.add_reference(section_object.uuid, 'includes') + self.misp_event.add_object(pe_object) + file_object.add_reference(pe_object.uuid, 'includes') + self.misp_event.add_object(file_object) + + def parse_ip_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'ip-dst', separator) + + def parse_mac_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'mac-address', separator) + + def parse_mutex_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'mutex', separator) + + def parse_network_connection_pattern(self, indicator, attributes, references): + attributes.extend(self._parse_network_pattern_references(references, 'network_traffic_references_mapping')) + self.handle_import_case(indicator, attributes, 'network-connection') + + @staticmethod + def _parse_network_pattern_references(references, mapping): + attributes = [] + for feature, reference in references.items(): + feature = feature.split('_')[0] + attribute = {key: value.format(feature) for key, value in getattr(stix2misp_mapping, mapping)[reference['type']].items()} + attribute['value'] = reference['value'] + attributes.append(attribute) + return attributes + + def parse_network_socket_pattern(self, indicator, attributes, references, extension): + attributes.extend(self._parse_network_pattern_references(references, 'network_traffic_references_mapping')) + for key, value in extension.items(): + if key not in stix2misp_mapping.network_socket_extension_mapping: + print(f'Unknown socket extension field in pattern: {key}', file=sys.stderr) + continue + if key.startswith('is_') and not json.loads(value.lower()): + continue + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[key]) + attribute['value'] = key.split('_')[1] if key.startswith('is_') else value + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'network-socket') + + def parse_network_traffic_pattern(self, indicator, separator): + attributes = [] + protocols = [] + references = defaultdict(dict) + extensions = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type in stix2misp_mapping.network_traffic_mapping: + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + if pattern_type.startswith('network-traffic:protocols['): + protocols.append(pattern_value) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update({feature: pattern_value}) + elif pattern_type.startswith('network-traffic:extensions.'): + _, extension_type, feature = pattern_type.split('.') + extensions[extension_type.strip("'")][feature] = pattern_value + else: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + if extensions: + if 'socket-ext' in extensions: + return self.parse_network_socket_pattern(indicator, attributes, references, extensions['socket-ext']) + print(f'Unknown network extension(s) in pattern: {", ".join(extensions.keys())}', file=sys.stderr) + if protocols and self._required_protocols(protocols): + attributes.extend(self.parse_protocols(protocols, 'pattern')) + return self.parse_network_connection_pattern(indicator, attributes, references) + attributes.extend(self._parse_network_pattern_references(references, 'ip_port_references_mapping')) + self.handle_import_case(indicator, attributes, 'ip-port') + + def parse_process_pattern(self, indicator, separator): + attributes = [] + parent = {} + child = defaultdict(set) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if 'parent_' in pattern_type: + child[pattern_type.split('.')[-1]].add(pattern_value) + elif 'child_' in pattern_type: + parent[pattern_type.split('.')[-1]] = pattern_value + else: + try: + attribute = deepcopy(stix2misp_mapping.process_mapping[pattern_type]) + except KeyError: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute['value'] = pattern_value + attributes.append(attribute) + if parent: + for key, value in parent.items(): + if key not in stix2misp_mapping.parent_process_reference_mapping: + print(f'Parent process key from pattern not supported at the moment: {key}', file=sys.stderr) + continue + attribute = {'value': value} + attribute.update(stix2misp_mapping.parent_process_reference_mapping[key]) + attributes.append(attribute) + if child: + for key, values in child.items(): + if key not in stix2misp_mapping.child_process_reference_mapping: + print(f'Child process key from pattern not supported at the moment: {key}', file=sys.stderr) + continue + for value in values: + attribute = {'value': value} + attribute.update(stix2misp_mapping.child_process_reference_mapping[key]) + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'process', _force_object=True) + + def parse_regkey_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'regkey_mapping', separator) + self.handle_import_case(indicator, attributes, 'registry-key') + + def parse_url_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'url_mapping', separator) + self.handle_import_case(indicator, attributes, 'url') + + def parse_user_account_pattern(self, indicator, separator): + attributes = [] + pattern = self._handle_pattern(indicator.pattern).split(separator) + object_name, mapping = self._fetch_user_account_type_pattern(pattern) + for pattern_part in pattern: + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + pattern_type = pattern_type.split(':')[1] + if pattern_type.startswith('extensions.'): + pattern_type = pattern_type.split('.')[-1] + if '[' in pattern_type: + pattern_type = pattern_type.split('[')[0] + if pattern_type in ('group', 'groups'): + attributes.append({'type': 'text', 'object_relation': 'group', 'value': pattern_value}) + continue + if pattern_type in getattr(stix2misp_mapping, mapping): + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + self.handle_import_case(indicator, attributes, object_name) + + def parse_x509_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'x509_mapping', separator) + self.handle_import_case(indicator, attributes, 'x509') + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + def add_attributes_from_indicator(self, indicator, attribute_type, separator): + patterns = self._handle_pattern(indicator.pattern).split(separator) + if len(patterns) == 1: + _, value = self.get_type_and_value_from_pattern(patterns[0]) + attribute = MISPAttribute() + attribute.from_dict(**{ + 'uuid': indicator.id.split('--')[1], + 'type': attribute_type, + 'value': value, + 'to_ids': True + }) + attribute.update(self.parse_timeline(indicator)) + self.misp_event.add_attribute(**attribute) + else: + tmp_attribute = self.parse_timeline(indicator) + for pattern in patterns: + _, value = self.get_type_and_value_from_pattern(pattern) + attribute = MISPAttribute() + attribute.from_dict(**{ + 'type': attribute_type, + 'value': value, + 'to_ids': True + }) + attribute.update(tmp_attribute) + self.misp_event.add_attribute(**attribute) + + def add_attributes_from_observable(self, observable, attribute_type, feature): + if len(observable.objects) == 1: + attribute = MISPAttribute() + attribute.from_dict(**{ + 'uuid': observable.id.split('--')[1], + 'type': attribute_type, + 'value': getattr(observable.objects['0'], feature), + 'to_ids': False + }) + attribute.update(self.parse_timeline(observable)) + self.misp_event.add_attribute(**attribute) + else: + tmp_attribute = self.parse_timeline(observable) + for observable_object in observable.objects.values(): + attribute = MISPAttribute() + attribute.from_dict(**{ + 'type': attribute_type, + 'value': getattr(observable_object, feature), + 'to_ids': False + }) + attribute.update(tmp_attribute) + self.misp_event.add_attribute(**attribute) + + def _check_existing_galaxy_name(self, galaxy_name): + if galaxy_name in self._synonyms_to_tag_names: + return self._synonyms_to_tag_names[galaxy_name] + for name, tag_names in self._synonyms_to_tag_names.items(): + if galaxy_name in name: + return tag_names + return None + + def create_misp_object(self, stix_object, name=None): + misp_object = MISPObject(name if name is not None else stix_object.type, + misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = stix_object.id.split('--')[1] + misp_object.update(self.parse_timeline(stix_object)) + return misp_object + + @staticmethod + def _get_sections(pe_extension): + sections = [feature for feature in pe_extension.keys() if feature.startswith('section_')] + return (pe_extension.pop(feature) for feature in sections) + + @staticmethod + def get_type_and_value_from_pattern(pattern): + pattern = pattern.strip('[]') + try: + pattern_type, pattern_value = pattern.split(' = \'') + except ValueError: + pattern_type, pattern_value = pattern.split('=') + return pattern_type.strip(), pattern_value.strip("'") + + def handle_import_case(self, stix_object, attributes, name, _force_object=False): + try: + if len(attributes) > 1 or (_force_object and self._handle_object_forcing(_force_object, attributes[0])): + misp_object = self.create_misp_object(stix_object, name) + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(**misp_object) + else: + attribute = {field: attributes[0][field] for field in stix2misp_mapping.single_attribute_fields if attributes[0].get(field) is not None} + attribute['uuid'] = stix_object.id.split('--')[1] + attribute.update(self.parse_timeline(stix_object)) + if isinstance(stix_object, stix2.v20.Indicator): + attribute['to_ids'] = True + if hasattr(stix_object, 'object_marking_refs'): + self.update_marking_refs(attribute['uuid'], stix_object.object_marking_refs) + self.misp_event.add_attribute(**attribute) + except IndexError: + object_type = 'indicator' if isinstance(stix_object, stix2.Indicator) else 'observable objects' + print(f'No attribute or object could be imported from the following {object_type}: {stix_object}', file=sys.stderr) + + @staticmethod + def _handle_object_forcing(_force_object, attribute): + if isinstance(_force_object, (list, tuple)): + return attribute['object_relation'] in _force_object + return _force_object + + @staticmethod + def _handle_pattern(pattern): + return pattern.strip().strip('[]') + + @staticmethod + def _parse_observable_types(observable_objects): + types = {observable_object._type for observable_object in observable_objects.values()} + return tuple(sorted(types)) + + @staticmethod + def _parse_pattern_types(pattern): + types = {part.split('=')[0].split(':')[0].strip('[') for part in pattern} + return tuple(sorted(types)) + + @staticmethod + def _required_protocols(protocols): + protocols = tuple(protocol.upper() for protocol in protocols) + if any(protocol not in ('TCP', 'IP') for protocol in protocols): + return True + return False + + +def from_misp(stix_objects): + for stix_object in stix_objects: + if stix_object['type'] == "report" and 'misp:tool="misp2stix2"' in stix_object.get('labels', []): + return True + return False + + +def main(args): + filename = Path(os.path.dirname(args[0]), args[1]) + with open(filename, 'rt', encoding='utf-8') as f: + event = stix2.parse(f.read(), allow_custom=True, interoperability=True) + stix_parser = StixFromMISPParser() if from_misp(event.objects) else ExternalStixParser() + stix_parser.handler(event, filename, args[2:]) + stix_parser.save_file() + print(1) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/misp_modules/lib/stix2misp_mapping.py b/misp_modules/lib/stix2misp_mapping.py new file mode 100644 index 0000000..706d990 --- /dev/null +++ b/misp_modules/lib/stix2misp_mapping.py @@ -0,0 +1,460 @@ +################################################################################ +# ATTRIBUTES AND OBJECTS MAPPING # +################################################################################ + +attributes_mapping = { + 'filename': '_parse_name', + 'ip-src': '_parse_value', + 'ip-dst': '_parse_value', + 'hostname': '_parse_value', + 'domain': '_parse_value', + 'domain|ip': '_parse_domain_ip_attribute', + 'email-src': '_parse_value', + 'email-dst': '_parse_value', + 'email-attachment': '_parse_name', + 'url': '_parse_value', + 'regkey': '_parse_regkey_attribute', + 'regkey|value': '_parse_regkey_value', + 'malware-sample': '_parse_malware_sample', + 'mutex': '_parse_name', + 'uri': '_parse_value', + 'port': '_parse_port', + 'ip-dst|port': '_parse_network_attribute', + 'ip-src|port': '_parse_network_attribute', + 'hostname|port': '_parse_network_attribute', + 'email-reply-to': '_parse_email_reply_to', + 'attachment': '_parse_attachment', + 'mac-address': '_parse_value', + 'AS': '_parse_number' +} + +attributes_type_mapping = { + 'md5': '_parse_hash', + 'sha1': '_parse_hash', + 'sha256': '_parse_hash', + 'filename|md5': '_parse_filename_hash', + 'filename|sha1': '_parse_filename_hash', + 'filename|sha256': '_parse_filename_hash', + 'email-subject': '_parse_email_message', + 'email-body': '_parse_email_message', + 'authentihash': '_parse_hash', + 'ssdeep': '_parse_hash', + 'imphash': '_parse_hash', + 'pehash': '_parse_hash', + 'impfuzzy': '_parse_hash', + 'sha224': '_parse_hash', + 'sha384': '_parse_hash', + 'sha512': '_parse_hash', + 'sha512/224': '_parse_hash', + 'sha512/256': '_parse_hash', + 'tlsh': '_parse_hash', + 'cdhash': '_parse_hash', + 'filename|authentihash': '_parse_filename_hash', + 'filename|ssdeep': '_parse_filename_hash', + 'filename|imphash': '_parse_filename_hash', + 'filename|impfuzzy': '_parse_filename_hash', + 'filename|pehash': '_parse_filename_hash', + 'filename|sha224': '_parse_filename_hash', + 'filename|sha384': '_parse_filename_hash', + 'filename|sha512': '_parse_filename_hash', + 'filename|sha512/224': '_parse_filename_hash', + 'filename|sha512/256': '_parse_filename_hash', + 'filename|tlsh': '_parse_filename_hash', + 'x509-fingerprint-md5': '_parse_x509_attribute', + 'x509-fingerprint-sha1': '_parse_x509_attribute', + 'x509-fingerprint-sha256': '_parse_x509_attribute' +} + +objects_mapping = { + 'asn': { + 'observable': 'parse_asn_observable', + 'pattern': 'parse_asn_pattern'}, + 'credential': { + 'observable': 'parse_credential_observable', + 'pattern': 'parse_credential_pattern'}, + 'domain-ip': { + 'observable': 'parse_domain_ip_observable', + 'pattern': 'parse_domain_ip_pattern'}, + 'email': { + 'observable': 'parse_email_observable', + 'pattern': 'parse_email_pattern'}, + 'file': { + 'observable': 'parse_file_observable', + 'pattern': 'parse_file_pattern'}, + 'ip-port': { + 'observable': 'parse_ip_port_observable', + 'pattern': 'parse_ip_port_pattern'}, + 'network-connection': { + 'observable': 'parse_network_connection_observable', + 'pattern': 'parse_network_connection_pattern'}, + 'network-socket': { + 'observable': 'parse_network_socket_observable', + 'pattern': 'parse_network_socket_pattern'}, + 'process': { + 'observable': 'parse_process_observable', + 'pattern': 'parse_process_pattern'}, + 'registry-key': { + 'observable': 'parse_regkey_observable', + 'pattern': 'parse_regkey_pattern'}, + 'url': { + 'observable': 'parse_url_observable', + 'pattern': 'parse_url_pattern'}, + 'user-account': { + 'observable': 'parse_user_account_observable', + 'pattern': 'parse_user_account_pattern'}, + 'WindowsPEBinaryFile': { + 'observable': 'parse_pe_observable', + 'pattern': 'parse_pe_pattern'}, + 'x509': { + 'observable': 'parse_x509_observable', + 'pattern': 'parse_x509_pattern'} +} + +observable_mapping = { + ('artifact', 'file'): 'parse_file_observable', + ('artifact', 'directory', 'file'): 'parse_file_observable', + ('artifact', 'email-addr', 'email-message', 'file'): 'parse_email_observable', + ('autonomous-system',): 'parse_asn_observable', + ('autonomous-system', 'ipv4-addr'): 'parse_asn_observable', + ('autonomous-system', 'ipv6-addr'): 'parse_asn_observable', + ('autonomous-system', 'ipv4-addr', 'ipv6-addr'): 'parse_asn_observable', + ('directory', 'file'): 'parse_file_observable', + ('domain-name',): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv6-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr', 'ipv6-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'ipv6-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'ipv4-addr', 'ipv6-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'network-traffic'): 'parse_domain_network_traffic_observable', + ('domain-name', 'network-traffic', 'url'): 'parse_url_observable', + ('email-addr',): 'parse_email_address_observable', + ('email-addr', 'email-message'): 'parse_email_observable', + ('email-addr', 'email-message', 'file'): 'parse_email_observable', + ('email-message',): 'parse_email_observable', + ('file',): 'parse_file_observable', + ('file', 'process'): 'parse_process_observable', + ('ipv4-addr',): 'parse_ip_address_observable', + ('ipv6-addr',): 'parse_ip_address_observable', + ('ipv4-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('ipv6-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('ipv4-addr', 'ipv6-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('mac-addr',): 'parse_mac_address_observable', + ('mutex',): 'parse_mutex_observable', + ('process',): 'parse_process_observable', + ('x509-certificate',): 'parse_x509_observable', + ('url',): 'parse_url_observable', + ('user-account',): 'parse_user_account_observable', + ('windows-registry-key',): 'parse_regkey_observable' +} + +pattern_mapping = { + ('artifact', 'file'): 'parse_file_pattern', + ('artifact', 'directory', 'file'): 'parse_file_pattern', + ('autonomous-system', ): 'parse_as_pattern', + ('autonomous-system', 'ipv4-addr'): 'parse_as_pattern', + ('autonomous-system', 'ipv6-addr'): 'parse_as_pattern', + ('autonomous-system', 'ipv4-addr', 'ipv6-addr'): 'parse_as_pattern', + ('directory',): 'parse_file_pattern', + ('directory', 'file'): 'parse_file_pattern', + ('domain-name',): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv6-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr', 'ipv6-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'ipv6-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'ipv4-addr', 'ipv6-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'network-traffic'): 'parse_domain_ip_port_pattern', + ('domain-name', 'network-traffic', 'url'): 'parse_url_pattern', + ('email-addr',): 'parse_email_address_pattern', + ('email-message',): 'parse_email_message_pattern', + ('file',): 'parse_file_pattern', + ('ipv4-addr',): 'parse_ip_address_pattern', + ('ipv6-addr',): 'parse_ip_address_pattern', + ('ipv4-addr', 'ipv6-addr'): 'parse_ip_address_pattern', + ('mac-addr',): 'parse_mac_address_pattern', + ('mutex',): 'parse_mutex_pattern', + ('network-traffic',): 'parse_network_traffic_pattern', + ('process',): 'parse_process_pattern', + ('url',): 'parse_url_pattern', + ('user-account',): 'parse_user_account_pattern', + ('windows-registry-key',): 'parse_regkey_pattern', + ('x509-certificate',): 'parse_x509_pattern' +} + +pattern_forbidden_relations = (' LIKE ', ' FOLLOWEDBY ', ' MATCHES ', ' ISSUBSET ', ' ISSUPERSET ', ' REPEATS ') +single_attribute_fields = ('type', 'value', 'to_ids') + + +################################################################################ +# OBSERVABLE OBJECTS AND PATTERNS MAPPING. # +################################################################################ + +address_family_attribute_mapping = {'type': 'text','object_relation': 'address-family'} +as_number_attribute_mapping = {'type': 'AS', 'object_relation': 'asn'} +description_attribute_mapping = {'type': 'text', 'object_relation': 'description'} +asn_subnet_attribute_mapping = {'type': 'ip-src', 'object_relation': 'subnet-announced'} +cc_attribute_mapping = {'type': 'email-dst', 'object_relation': 'cc'} +credential_attribute_mapping = {'type': 'text', 'object_relation': 'password'} +data_attribute_mapping = {'type': 'text', 'object_relation': 'data'} +data_type_attribute_mapping = {'type': 'text', 'object_relation': 'data-type'} +domain_attribute_mapping = {'type': 'domain', 'object_relation': 'domain'} +domain_family_attribute_mapping = {'type': 'text', 'object_relation': 'domain-family'} +dst_port_attribute_mapping = {'type': 'port', 'object_relation': 'dst-port'} +email_attachment_attribute_mapping = {'type': 'email-attachment', 'object_relation': 'attachment'} +email_date_attribute_mapping = {'type': 'datetime', 'object_relation': 'send-date'} +email_subject_attribute_mapping = {'type': 'email-subject', 'object_relation': 'subject'} +encoding_attribute_mapping = {'type': 'text', 'object_relation': 'file-encoding'} +end_datetime_attribute_mapping = {'type': 'datetime', 'object_relation': 'last-seen'} +entropy_mapping = {'type': 'float', 'object_relation': 'entropy'} +filename_attribute_mapping = {'type': 'filename', 'object_relation': 'filename'} +from_attribute_mapping = {'type': 'email-src', 'object_relation': 'from'} +imphash_mapping = {'type': 'imphash', 'object_relation': 'imphash'} +id_attribute_mapping = {'type': 'text', 'object_relation': 'id'} +ip_attribute_mapping = {'type': 'ip-dst', 'object_relation': 'ip'} +issuer_attribute_mapping = {'type': 'text', 'object_relation': 'issuer'} +key_attribute_mapping = {'type': 'regkey', 'object_relation': 'key'} +malware_sample_attribute_mapping = {'type': 'malware-sample', 'object_relation': 'malware-sample'} +mime_type_attribute_mapping = {'type': 'mime-type', 'object_relation': 'mimetype'} +modified_attribute_mapping = {'type': 'datetime', 'object_relation': 'last-modified'} +name_attribute_mapping = {'type': 'text', 'object_relation': 'name'} +network_traffic_ip = {'type': 'ip-{}', 'object_relation': 'ip-{}'} +number_sections_mapping = {'type': 'counter', 'object_relation': 'number-sections'} +password_mapping = {'type': 'text', 'object_relation': 'password'} +path_attribute_mapping = {'type': 'text', 'object_relation': 'path'} +pe_type_mapping = {'type': 'text', 'object_relation': 'type'} +pid_attribute_mapping = {'type': 'text', 'object_relation': 'pid'} +process_command_line_mapping = {'type': 'text', 'object_relation': 'command-line'} +process_creation_time_mapping = {'type': 'datetime', 'object_relation': 'creation-time'} +process_image_mapping = {'type': 'filename', 'object_relation': 'image'} +process_name_mapping = {'type': 'text', 'object_relation': 'name'} +regkey_name_attribute_mapping = {'type': 'text', 'object_relation': 'name'} +references_attribute_mapping = {'type': 'link', 'object_relation': 'references'} +reply_to_attribute_mapping = {'type': 'email-reply-to', 'object_relation': 'reply-to'} +screenshot_attribute_mapping = {'type': 'attachment', 'object_relation': 'screenshot'} +section_name_mapping = {'type': 'text', 'object_relation': 'name'} +serial_number_attribute_mapping = {'type': 'text', 'object_relation': 'serial-number'} +size_attribute_mapping = {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'} +src_port_attribute_mapping = {'type': 'port', 'object_relation': 'src-port'} +start_datetime_attribute_mapping = {'type': 'datetime', 'object_relation': 'first-seen'} +state_attribute_mapping = {'type': 'text', 'object_relation': 'state'} +summary_attribute_mapping = {'type': 'text', 'object_relation': 'summary'} +to_attribute_mapping = {'type': 'email-dst', 'object_relation': 'to'} +url_attribute_mapping = {'type': 'url', 'object_relation': 'url'} +url_port_attribute_mapping = {'type': 'port', 'object_relation': 'port'} +user_id_mapping = {'type': 'text', 'object_relation': 'username'} +x_mailer_attribute_mapping = {'type': 'email-x-mailer', 'object_relation': 'x-mailer'} +x509_md5_attribute_mapping = {'type': 'x509-fingerprint-md5', 'object_relation': 'x509-fingerprint-md5'} +x509_sha1_attribute_mapping = {'type': 'x509-fingerprint-sha1', 'object_relation': 'x509-fingerprint-sha1'} +x509_sha256_attribute_mapping = {'type': 'x509-fingerprint-sha256', 'object_relation': 'x509-fingerprint-sha256'} +x509_spka_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-algorithm'} # x509 subject public key algorithm +x509_spke_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-exponent'} # x509 subject public key exponent +x509_spkm_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-modulus'} # x509 subject public key modulus +x509_subject_attribute_mapping = {'type': 'text', 'object_relation': 'subject'} +x509_version_attribute_mapping = {'type': 'text', 'object_relation': 'version'} +x509_vna_attribute_mapping = {'type': 'datetime', 'object_relation': 'validity-not-after'} # x509 validity not after +x509_vnb_attribute_mapping = {'type': 'datetime', 'object_relation': 'validity-not-before'} # x509 validity not before + +asn_mapping = {'number': as_number_attribute_mapping, + 'autonomous-system:number': as_number_attribute_mapping, + 'name': description_attribute_mapping, + 'autonomous-system:name': description_attribute_mapping, + 'ipv4-addr': asn_subnet_attribute_mapping, + 'ipv6-addr': asn_subnet_attribute_mapping, + 'ipv4-addr:value': asn_subnet_attribute_mapping, + 'ipv6-addr:value': asn_subnet_attribute_mapping} + +attack_pattern_mapping = {'name': name_attribute_mapping, + 'description': summary_attribute_mapping} + +attack_pattern_references_mapping = {'mitre-attack': references_attribute_mapping, + 'capec': id_attribute_mapping} + +course_of_action_mapping = {'description': description_attribute_mapping, + 'name': name_attribute_mapping} + +credential_mapping = {'credential': credential_attribute_mapping, + 'user-account:credential': credential_attribute_mapping, + 'user_id': user_id_mapping, + 'user-account:user_id': user_id_mapping} + +domain_ip_mapping = {'domain-name': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'ipv4-addr': ip_attribute_mapping, + 'ipv6-addr': ip_attribute_mapping, + 'ipv4-addr:value': ip_attribute_mapping, + 'ipv6-addr:value': ip_attribute_mapping, + 'domain-name:resolves_to_refs[*].value': ip_attribute_mapping, + 'network-traffic:dst_port': dst_port_attribute_mapping, + 'network-traffic:src_port': src_port_attribute_mapping} + +email_mapping = {'date': email_date_attribute_mapping, + 'email-message:date': email_date_attribute_mapping, + 'email-message:to_refs[*].value': to_attribute_mapping, + 'email-message:cc_refs[*].value': cc_attribute_mapping, + 'subject': email_subject_attribute_mapping, + 'email-message:subject': email_subject_attribute_mapping, + 'X-Mailer': x_mailer_attribute_mapping, + 'email-message:additional_header_fields.x_mailer': x_mailer_attribute_mapping, + 'Reply-To': reply_to_attribute_mapping, + 'email-message:additional_header_fields.reply_to': reply_to_attribute_mapping, + 'email-message:from_ref.value': from_attribute_mapping, + 'email-addr:value': to_attribute_mapping} + +email_references_mapping = {'attachment': email_attachment_attribute_mapping, + 'cc_refs': cc_attribute_mapping, + 'from_ref': from_attribute_mapping, + 'screenshot': screenshot_attribute_mapping, + 'to_refs': to_attribute_mapping} + +file_mapping = {'artifact:mime_type': mime_type_attribute_mapping, + 'file:content_ref.mime_type': mime_type_attribute_mapping, + 'mime_type': mime_type_attribute_mapping, + 'file:mime_type': mime_type_attribute_mapping, + 'name': filename_attribute_mapping, + 'file:name': filename_attribute_mapping, + 'name_enc': encoding_attribute_mapping, + 'file:name_enc': encoding_attribute_mapping, + 'file:parent_directory_ref.path': path_attribute_mapping, + 'directory:path': path_attribute_mapping, + 'size': size_attribute_mapping, + 'file:size': size_attribute_mapping} + +network_traffic_mapping = {'dst_port':dst_port_attribute_mapping, + 'src_port': src_port_attribute_mapping, + 'network-traffic:dst_port': dst_port_attribute_mapping, + 'network-traffic:src_port': src_port_attribute_mapping} + +ip_port_mapping = {'value': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'network-traffic:dst_ref.value': {'type': 'ip-dst', 'object_relation': 'ip-dst'}, + 'network-traffic:src_ref.value': {'type': 'ip-src', 'object_relation': 'ip-src'}} +ip_port_mapping.update(network_traffic_mapping) + +ip_port_references_mapping = {'domain-name': domain_attribute_mapping, + 'ipv4-addr': network_traffic_ip, + 'ipv6-addr': network_traffic_ip} + +network_socket_extension_mapping = {'address_family': address_family_attribute_mapping, + "network-traffic:extensions.'socket-ext'.address_family": address_family_attribute_mapping, + 'protocol_family': domain_family_attribute_mapping, + "network-traffic:extensions.'socket-ext'.protocol_family": domain_family_attribute_mapping, + 'is_blocking': state_attribute_mapping, + "network-traffic:extensions.'socket-ext'.is_blocking": state_attribute_mapping, + 'is_listening': state_attribute_mapping, + "network-traffic:extensions.'socket-ext'.is_listening": state_attribute_mapping} + +network_traffic_references_mapping = {'domain-name': {'type': 'hostname', 'object_relation': 'hostname-{}'}, + 'ipv4-addr': network_traffic_ip, + 'ipv6-addr': network_traffic_ip} + +pe_mapping = {'pe_type': pe_type_mapping, 'number_of_sections': number_sections_mapping, 'imphash': imphash_mapping} + +pe_section_mapping = {'name': section_name_mapping, 'size': size_attribute_mapping, 'entropy': entropy_mapping} + +hash_types = ('MD5', 'SHA-1', 'SHA-256', 'SHA-224', 'SHA-384', 'SHA-512', 'ssdeep', 'tlsh') +for hash_type in hash_types: + misp_hash_type = hash_type.replace('-', '').lower() + attribute = {'type': misp_hash_type, 'object_relation': misp_hash_type} + file_mapping[hash_type] = attribute + file_mapping.update({f"file:hashes.'{feature}'": attribute for feature in (hash_type, misp_hash_type)}) + file_mapping.update({f"file:hashes.{feature}": attribute for feature in (hash_type, misp_hash_type)}) + pe_section_mapping[hash_type] = attribute + pe_section_mapping[misp_hash_type] = attribute + +process_mapping = {'name': process_name_mapping, + 'process:name': process_name_mapping, + 'pid': pid_attribute_mapping, + 'process:pid': pid_attribute_mapping, + 'created': process_creation_time_mapping, + 'process:created': process_creation_time_mapping, + 'command_line': process_command_line_mapping, + 'process:command_line': process_command_line_mapping, + 'process:parent_ref.pid': {'type': 'text', 'object_relation': 'parent-pid'}, + 'process:child_refs[*].pid': {'type': 'text', 'object_relation': 'child-pid'}, + 'process:binary_ref.name': process_image_mapping} + +child_process_reference_mapping = {'pid': {'type': 'text', 'object_relation': 'child-pid'}} + +parent_process_reference_mapping = {'command_line': {'type': 'text', 'object_relation': 'parent-command-line'}, + 'pid': {'type': 'text', 'object_relation': 'parent-pid'}, + 'process-name': {'type': 'text', 'object_relation': 'parent-process-name'}} + +regkey_mapping = {'data': data_attribute_mapping, + 'windows-registry-key:values.data': data_attribute_mapping, + 'data_type': data_type_attribute_mapping, + 'windows-registry-key:values.data_type': data_type_attribute_mapping, + 'modified': modified_attribute_mapping, + 'windows-registry-key:modified': modified_attribute_mapping, + 'name': regkey_name_attribute_mapping, + 'windows-registry-key:values.name': regkey_name_attribute_mapping, + 'key': key_attribute_mapping, + 'windows-registry-key:key': key_attribute_mapping, + 'windows-registry-key:value': {'type': 'text', 'object_relation': 'hive'} + } + +url_mapping = {'url': url_attribute_mapping, + 'url:value': url_attribute_mapping, + 'domain-name': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'network-traffic': url_port_attribute_mapping, + 'network-traffic:dst_port': url_port_attribute_mapping, + 'ipv4-addr:value': ip_attribute_mapping, + 'ipv6-addr:value': ip_attribute_mapping + } + +user_account_mapping = {'account_created': {'type': 'datetime', 'object_relation': 'created'}, + 'account_expires': {'type': 'datetime', 'object_relation': 'expires'}, + 'account_first_login': {'type': 'datetime', 'object_relation': 'first_login'}, + 'account_last_login': {'type': 'datetime', 'object_relation': 'last_login'}, + 'account_login': user_id_mapping, + 'account_type': {'type': 'text', 'object_relation': 'account-type'}, + 'can_escalate_privs': {'type': 'boolean', 'object_relation': 'can_escalate_privs'}, + 'credential': credential_attribute_mapping, + 'credential_last_changed': {'type': 'datetime', 'object_relation': 'password_last_changed'}, + 'display_name': {'type': 'text', 'object_relation': 'display-name'}, + 'gid': {'type': 'text', 'object_relation': 'group-id'}, + 'home_dir': {'type': 'text', 'object_relation': 'home_dir'}, + 'is_disabled': {'type': 'boolean', 'object_relation': 'disabled'}, + 'is_privileged': {'type': 'boolean', 'object_relation': 'privileged'}, + 'is_service_account': {'type': 'boolean', 'object_relation': 'is_service_account'}, + 'shell': {'type': 'text', 'object_relation': 'shell'}, + 'user_id': {'type': 'text', 'object_relation': 'user-id'}} + +vulnerability_mapping = {'name': id_attribute_mapping, + 'description': summary_attribute_mapping} + +x509_mapping = {'issuer': issuer_attribute_mapping, + 'x509-certificate:issuer': issuer_attribute_mapping, + 'serial_number': serial_number_attribute_mapping, + 'x509-certificate:serial_number': serial_number_attribute_mapping, + 'subject': x509_subject_attribute_mapping, + 'x509-certificate:subject': x509_subject_attribute_mapping, + 'subject_public_key_algorithm': x509_spka_attribute_mapping, + 'x509-certificate:subject_public_key_algorithm': x509_spka_attribute_mapping, + 'subject_public_key_exponent': x509_spke_attribute_mapping, + 'x509-certificate:subject_public_key_exponent': x509_spke_attribute_mapping, + 'subject_public_key_modulus': x509_spkm_attribute_mapping, + 'x509-certificate:subject_public_key_modulus': x509_spkm_attribute_mapping, + 'validity_not_before': x509_vnb_attribute_mapping, + 'x509-certificate:validity_not_before': x509_vnb_attribute_mapping, + 'validity_not_after': x509_vna_attribute_mapping, + 'x509-certificate:validity_not_after': x509_vna_attribute_mapping, + 'version': x509_version_attribute_mapping, + 'x509-certificate:version': x509_version_attribute_mapping, + 'SHA-1': x509_sha1_attribute_mapping, + "x509-certificate:hashes.'sha1'": x509_sha1_attribute_mapping, + 'SHA-256': x509_sha256_attribute_mapping, + "x509-certificate:hashes.'sha256'": x509_sha256_attribute_mapping, + 'MD5': x509_md5_attribute_mapping, + "x509-certificate:hashes.'md5'": x509_md5_attribute_mapping, + } + +attachment_types = ('file:content_ref.name', 'file:content_ref.payload_bin', + 'artifact:x_misp_text_name', 'artifact:payload_bin', + "file:hashes.'MD5'", "file:content_ref.hashes.'MD5'", + 'file:name') + +connection_protocols = {"IP": "3", "ICMP": "3", "ARP": "3", + "TCP": "4", "UDP": "4", + "HTTP": "7", "HTTPS": "7", "FTP": "7"} diff --git a/misp_modules/lib/synonymsToTagNames.json b/misp_modules/lib/synonymsToTagNames.json new file mode 100644 index 0000000..c3013f3 --- /dev/null +++ b/misp_modules/lib/synonymsToTagNames.json @@ -0,0 +1 @@ +{"Accstealer":["misp-galaxy:android=\"Accstealer\""],"Ackposts":["misp-galaxy:android=\"Ackposts\""],"Acnetdoor":["misp-galaxy:android=\"Acnetdoor\""],"Acnetsteal":["misp-galaxy:android=\"Acnetsteal\""],"Actech":["misp-galaxy:android=\"Actech\""],"AdChina":["misp-galaxy:android=\"AdChina\""],"AdInfo":["misp-galaxy:android=\"AdInfo\""],"AdMarvel":["misp-galaxy:android=\"AdMarvel\""],"AdMob":["misp-galaxy:android=\"AdMob\""],"AdSms":["misp-galaxy:android=\"AdSms\""],"Adfonic":["misp-galaxy:android=\"Adfonic\""],"Adknowledge":["misp-galaxy:android=\"Adknowledge\""],"Adrd":["misp-galaxy:android=\"Adrd\""],"Aduru":["misp-galaxy:android=\"Aduru\""],"Adwhirl":["misp-galaxy:android=\"Adwhirl\""],"Adwind":["misp-galaxy:android=\"Adwind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"AlienSpy":["misp-galaxy:android=\"Adwind\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Frutas":["misp-galaxy:android=\"Adwind\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Unrecom":["misp-galaxy:android=\"Adwind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Sockrat":["misp-galaxy:android=\"Adwind\"","misp-galaxy:android=\"Sockrat\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"Jsocket":["misp-galaxy:android=\"Adwind\"","misp-galaxy:rat=\"Adwind RAT\""],"jRat":["misp-galaxy:android=\"Adwind\"","misp-galaxy:tool=\"Adwind\""],"Backdoor:Java\/Adwind":["misp-galaxy:android=\"Adwind\"","misp-galaxy:tool=\"Adwind\""],"Adwlauncher":["misp-galaxy:android=\"Adwlauncher\""],"Adwo":["misp-galaxy:android=\"Adwo\""],"Airad":["misp-galaxy:android=\"Airad\""],"Airpush":["misp-galaxy:android=\"Airpush\""],"StopSMS":["misp-galaxy:android=\"Airpush\""],"Alienspy":["misp-galaxy:android=\"Alienspy\""],"AmazonAds":["misp-galaxy:android=\"AmazonAds\""],"Andr\/Dropr-FH":["misp-galaxy:android=\"Andr\/Dropr-FH\""],"GhostCtrl":["misp-galaxy:android=\"Andr\/Dropr-FH\"","misp-galaxy:malpedia=\"GhostCtrl\""],"AndroidOS_HidenAd":["misp-galaxy:android=\"AndroidOS_HidenAd\""],"AndroidOS_HiddenAd":["misp-galaxy:android=\"AndroidOS_HidenAd\""],"Answerbot":["misp-galaxy:android=\"Answerbot\""],"Antammi":["misp-galaxy:android=\"Antammi\""],"Apkmore":["misp-galaxy:android=\"Apkmore\""],"Aplog":["misp-galaxy:android=\"Aplog\""],"AppLovin":["misp-galaxy:android=\"AppLovin\""],"Appenda":["misp-galaxy:android=\"Appenda\""],"Apperhand":["misp-galaxy:android=\"Apperhand\""],"Appleservice":["misp-galaxy:android=\"Appleservice\""],"Arspam":["misp-galaxy:android=\"Arspam\""],"Aurecord":["misp-galaxy:android=\"Aurecord\""],"Backapp":["misp-galaxy:android=\"Backapp\""],"Backdexer":["misp-galaxy:android=\"Backdexer\""],"Backflash":["misp-galaxy:android=\"Backflash\""],"Backscript":["misp-galaxy:android=\"Backscript\""],"Badaccents":["misp-galaxy:android=\"Badaccents\""],"Badpush":["misp-galaxy:android=\"Badpush\""],"Ballonpop":["misp-galaxy:android=\"Ballonpop\""],"BambaPurple":["misp-galaxy:android=\"BambaPurple\""],"BankBot":["misp-galaxy:android=\"BankBot\"","misp-galaxy:malpedia=\"Anubis\"","misp-galaxy:malpedia=\"BankBot\""],"Bankosy":["misp-galaxy:android=\"Bankosy\"","misp-galaxy:android=\"GM Bot\"","misp-galaxy:tool=\"Slempo\""],"Bankun":["misp-galaxy:android=\"Bankun\""],"Basebridge":["misp-galaxy:android=\"Basebridge\""],"Basedao":["misp-galaxy:android=\"Basedao\""],"Batterydoctor":["misp-galaxy:android=\"Batterydoctor\""],"BeNews":["misp-galaxy:android=\"BeNews\""],"Beaglespy":["misp-galaxy:android=\"Beaglespy\""],"BeanBot":["misp-galaxy:android=\"BeanBot\""],"Becuro":["misp-galaxy:android=\"Becuro\""],"Beita":["misp-galaxy:android=\"Beita\""],"Bgserv":["misp-galaxy:android=\"Bgserv\""],"Biigespy":["misp-galaxy:android=\"Biigespy\""],"Bmaster":["misp-galaxy:android=\"Bmaster\""],"Bossefiv":["misp-galaxy:android=\"Bossefiv\""],"Boxpush":["misp-galaxy:android=\"Boxpush\""],"BreadSMS":["misp-galaxy:android=\"BreadSMS\""],"Burstly":["misp-galaxy:android=\"Burstly\""],"BusyGasper":["misp-galaxy:android=\"BusyGasper\"","misp-galaxy:malpedia=\"BusyGasper\""],"Buzzcity":["misp-galaxy:android=\"Buzzcity\""],"ByPush":["misp-galaxy:android=\"ByPush\""],"Cajino":["misp-galaxy:android=\"Cajino\""],"Casee":["misp-galaxy:android=\"Casee\""],"Catchtoken":["misp-galaxy:android=\"Catchtoken\""],"Cauly":["misp-galaxy:android=\"Cauly\""],"Cellshark":["misp-galaxy:android=\"Cellshark\""],"Centero":["misp-galaxy:android=\"Centero\""],"Cepsohord":["misp-galaxy:android=\"Cepsohord\""],"Chamois":["misp-galaxy:android=\"Chamois\"","misp-galaxy:malpedia=\"Chamois\""],"Chuli":["misp-galaxy:android=\"Chuli\""],"Citmo":["misp-galaxy:android=\"Citmo\""],"Claco":["misp-galaxy:android=\"Claco\""],"Clevernet":["misp-galaxy:android=\"Clevernet\""],"Cnappbox":["misp-galaxy:android=\"Cnappbox\""],"Cobblerone":["misp-galaxy:android=\"Cobblerone\""],"Coolpaperleak":["misp-galaxy:android=\"Coolpaperleak\""],"Coolreaper":["misp-galaxy:android=\"Coolreaper\""],"CopyCat":["misp-galaxy:android=\"CopyCat\""],"Cosha":["misp-galaxy:android=\"Cosha\""],"Counterclank":["misp-galaxy:android=\"Counterclank\""],"Crazymedia":["misp-galaxy:android=\"Crazymedia\""],"Crisis":["misp-galaxy:android=\"Crisis\"","misp-galaxy:malpedia=\"RCS\""],"Crusewind":["misp-galaxy:android=\"Crusewind\""],"Dandro":["misp-galaxy:android=\"Dandro\""],"Daoyoudao":["misp-galaxy:android=\"Daoyoudao\""],"Deathring":["misp-galaxy:android=\"Deathring\""],"Deeveemap":["misp-galaxy:android=\"Deeveemap\""],"Dendoroid":["misp-galaxy:android=\"Dendoroid\""],"Dengaru":["misp-galaxy:android=\"Dengaru\""],"Diandong":["misp-galaxy:android=\"Diandong\""],"Dianjin":["misp-galaxy:android=\"Dianjin\""],"Dogowar":["misp-galaxy:android=\"Dogowar\""],"Domob":["misp-galaxy:android=\"Domob\""],"DoubleLocker":["misp-galaxy:android=\"DoubleLocker\"","misp-galaxy:malpedia=\"DoubleLocker\""],"Dougalek":["misp-galaxy:android=\"Dougalek\""],"Dowgin":["misp-galaxy:android=\"Dowgin\""],"Droidsheep":["misp-galaxy:android=\"Droidsheep\""],"Dropdialer":["misp-galaxy:android=\"Dropdialer\""],"Dupvert":["misp-galaxy:android=\"Dupvert\""],"Dynamicit":["misp-galaxy:android=\"Dynamicit\""],"Ecardgrabber":["misp-galaxy:android=\"Ecardgrabber\""],"Ecobatry":["misp-galaxy:android=\"Ecobatry\""],"Enesoluty":["misp-galaxy:android=\"Enesoluty\""],"Everbadge":["misp-galaxy:android=\"Everbadge\""],"Ewalls":["misp-galaxy:android=\"Ewalls\""],"Expensive Wall":["misp-galaxy:android=\"Expensive Wall\""],"ExpensiveWall":["misp-galaxy:android=\"ExpensiveWall\""],"Exprespam":["misp-galaxy:android=\"Exprespam\""],"FakeLookout":["misp-galaxy:android=\"FakeLookout\""],"FakeMart":["misp-galaxy:android=\"FakeMart\""],"Fakealbums":["misp-galaxy:android=\"Fakealbums\""],"Fakeangry":["misp-galaxy:android=\"Fakeangry\""],"Fakeapp":["misp-galaxy:android=\"Fakeapp\""],"Fakebanco":["misp-galaxy:android=\"Fakebanco\""],"Fakebank":["misp-galaxy:android=\"Fakebank\""],"Fakebank.B":["misp-galaxy:android=\"Fakebank.B\""],"Fakebok":["misp-galaxy:android=\"Fakebok\""],"Fakedaum":["misp-galaxy:android=\"Fakedaum\""],"Fakedefender":["misp-galaxy:android=\"Fakedefender\""],"Fakedefender.B":["misp-galaxy:android=\"Fakedefender.B\""],"Fakedown":["misp-galaxy:android=\"Fakedown\""],"Fakeflash":["misp-galaxy:android=\"Fakeflash\""],"Fakegame":["misp-galaxy:android=\"Fakegame\""],"Fakeguard":["misp-galaxy:android=\"Fakeguard\""],"Fakejob":["misp-galaxy:android=\"Fakejob\""],"Fakekakao":["misp-galaxy:android=\"Fakekakao\""],"Fakelemon":["misp-galaxy:android=\"Fakelemon\""],"Fakelicense":["misp-galaxy:android=\"Fakelicense\""],"Fakelogin":["misp-galaxy:android=\"Fakelogin\""],"Fakem Rat":["misp-galaxy:android=\"Fakem Rat\""],"Fakemini":["misp-galaxy:android=\"Fakemini\""],"Fakemrat":["misp-galaxy:android=\"Fakemrat\""],"Fakeneflic":["misp-galaxy:android=\"Fakeneflic\""],"Fakenotify":["misp-galaxy:android=\"Fakenotify\""],"Fakepatch":["misp-galaxy:android=\"Fakepatch\""],"Fakeplay":["misp-galaxy:android=\"Fakeplay\""],"Fakescarav":["misp-galaxy:android=\"Fakescarav\""],"Fakesecsuit":["misp-galaxy:android=\"Fakesecsuit\""],"Fakesucon":["misp-galaxy:android=\"Fakesucon\""],"Faketaobao":["misp-galaxy:android=\"Faketaobao\""],"Faketaobao.B":["misp-galaxy:android=\"Faketaobao.B\""],"Faketoken":["misp-galaxy:android=\"Faketoken\""],"Fakeupdate":["misp-galaxy:android=\"Fakeupdate\""],"Fakevoice":["misp-galaxy:android=\"Fakevoice\""],"Farmbaby":["misp-galaxy:android=\"Farmbaby\""],"Fauxtocopy":["misp-galaxy:android=\"Fauxtocopy\""],"Feiwo":["misp-galaxy:android=\"Feiwo\""],"FindAndCall":["misp-galaxy:android=\"FindAndCall\""],"Finfish":["misp-galaxy:android=\"Finfish\""],"Fireleaker":["misp-galaxy:android=\"Fireleaker\""],"Fitikser":["misp-galaxy:android=\"Fitikser\""],"Flexispy":["misp-galaxy:android=\"Flexispy\""],"Fokonge":["misp-galaxy:android=\"Fokonge\""],"FoncySMS":["misp-galaxy:android=\"FoncySMS\""],"Frogonal":["misp-galaxy:android=\"Frogonal\""],"Ftad":["misp-galaxy:android=\"Ftad\""],"Funtasy":["misp-galaxy:android=\"Funtasy\""],"GM Bot":["misp-galaxy:android=\"GM Bot\""],"Acecard":["misp-galaxy:android=\"GM Bot\"","misp-galaxy:tool=\"Slempo\""],"SlemBunk":["misp-galaxy:android=\"GM Bot\"","misp-galaxy:malpedia=\"Slempo\"","misp-galaxy:tool=\"Slempo\""],"Gaiaphish":["misp-galaxy:android=\"Gaiaphish\""],"GallMe":["misp-galaxy:android=\"GallMe\""],"Gamex":["misp-galaxy:android=\"Gamex\""],"Gappusin":["misp-galaxy:android=\"Gappusin\""],"Gazon":["misp-galaxy:android=\"Gazon\""],"Geinimi":["misp-galaxy:android=\"Geinimi\""],"Generisk":["misp-galaxy:android=\"Generisk\""],"Genheur":["misp-galaxy:android=\"Genheur\""],"Genpush":["misp-galaxy:android=\"Genpush\""],"GeoFake":["misp-galaxy:android=\"GeoFake\""],"Geplook":["misp-galaxy:android=\"Geplook\""],"Getadpush":["misp-galaxy:android=\"Getadpush\""],"Ggtracker":["misp-galaxy:android=\"Ggtracker\""],"Ghost Push":["misp-galaxy:android=\"Ghost Push\"","misp-galaxy:mitre-malware=\"Gooligan - S0290\""],"Ghostpush":["misp-galaxy:android=\"Ghostpush\""],"Gmaster":["misp-galaxy:android=\"Gmaster\""],"Godwon":["misp-galaxy:android=\"Godwon\""],"Golddream":["misp-galaxy:android=\"Golddream\""],"Goldeneagle":["misp-galaxy:android=\"Goldeneagle\""],"Golocker":["misp-galaxy:android=\"Golocker\""],"Gomal":["misp-galaxy:android=\"Gomal\""],"Gonesixty":["misp-galaxy:android=\"Gonesixty\""],"Gonfu":["misp-galaxy:android=\"Gonfu\""],"Gonfu.B":["misp-galaxy:android=\"Gonfu.B\""],"Gonfu.C":["misp-galaxy:android=\"Gonfu.C\""],"Gonfu.D":["misp-galaxy:android=\"Gonfu.D\""],"Gooboot":["misp-galaxy:android=\"Gooboot\""],"Goodadpush":["misp-galaxy:android=\"Goodadpush\""],"Greystripe":["misp-galaxy:android=\"Greystripe\""],"Gugespy":["misp-galaxy:android=\"Gugespy\""],"Gugespy.B":["misp-galaxy:android=\"Gugespy.B\""],"Gupno":["misp-galaxy:android=\"Gupno\""],"Habey":["misp-galaxy:android=\"Habey\""],"Handyclient":["misp-galaxy:android=\"Handyclient\""],"Hehe":["misp-galaxy:android=\"Hehe\""],"HenBox":["misp-galaxy:android=\"HenBox\"","misp-galaxy:threat-actor=\"HenBox\""],"Hesperbot":["misp-galaxy:android=\"Hesperbot\""],"Hippo":["misp-galaxy:android=\"Hippo\""],"Hippo.B":["misp-galaxy:android=\"Hippo.B\""],"HummingBad":["misp-galaxy:android=\"HummingBad\"","misp-galaxy:mitre-malware=\"HummingBad - S0322\"","misp-galaxy:mitre-mobile-attack-malware=\"HummingBad - MOB-S0038\"","misp-galaxy:threat-actor=\"HummingBad\""],"IadPush":["misp-galaxy:android=\"IadPush\""],"IcicleGum":["misp-galaxy:android=\"IcicleGum\"","misp-galaxy:android=\"Igexin\""],"Iconosis":["misp-galaxy:android=\"Iconosis\""],"Iconosys":["misp-galaxy:android=\"Iconosys\""],"Igexin":["misp-galaxy:android=\"Igexin\""],"ImAdPush":["misp-galaxy:android=\"ImAdPush\""],"InMobi":["misp-galaxy:android=\"InMobi\""],"JamSkunk":["misp-galaxy:android=\"JamSkunk\""],"Jifake":["misp-galaxy:android=\"Jifake\""],"Jollyserv":["misp-galaxy:android=\"Jollyserv\""],"Jsmshider":["misp-galaxy:android=\"Jsmshider\""],"Ju6":["misp-galaxy:android=\"Ju6\""],"Judy":["misp-galaxy:android=\"Judy\"","misp-galaxy:mitre-malware=\"Judy - S0325\""],"Jumptap":["misp-galaxy:android=\"Jumptap\""],"Jzmob":["misp-galaxy:android=\"Jzmob\""],"Kabstamper":["misp-galaxy:android=\"Kabstamper\""],"Kemoge":["misp-galaxy:android=\"Kemoge\"","misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Kidlogger":["misp-galaxy:android=\"Kidlogger\""],"Kielog":["misp-galaxy:android=\"Kielog\""],"Kituri":["misp-galaxy:android=\"Kituri\""],"KoreFrog":["misp-galaxy:android=\"KoreFrog\""],"Kranxpay":["misp-galaxy:android=\"Kranxpay\""],"Krysanec":["misp-galaxy:android=\"Krysanec\""],"Kuaidian360":["misp-galaxy:android=\"Kuaidian360\""],"Kuguo":["misp-galaxy:android=\"Kuguo\""],"Lastacloud":["misp-galaxy:android=\"Lastacloud\""],"Laucassspy":["misp-galaxy:android=\"Laucassspy\""],"Lifemonspy":["misp-galaxy:android=\"Lifemonspy\""],"Lightdd":["misp-galaxy:android=\"Lightdd\""],"Loaderpush":["misp-galaxy:android=\"Loaderpush\""],"Loapi":["misp-galaxy:android=\"Loapi\""],"Locaspy":["misp-galaxy:android=\"Locaspy\""],"Lockdroid.E":["misp-galaxy:android=\"Lockdroid.E\""],"Lockdroid.F":["misp-galaxy:android=\"Lockdroid.F\""],"Lockdroid.G":["misp-galaxy:android=\"Lockdroid.G\""],"Lockdroid.H":["misp-galaxy:android=\"Lockdroid.H\""],"Lockscreen":["misp-galaxy:android=\"Lockscreen\""],"LogiaAd":["misp-galaxy:android=\"LogiaAd\""],"Loicdos":["misp-galaxy:android=\"Loicdos\""],"LokiBot":["misp-galaxy:android=\"LokiBot\"","misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\"","misp-galaxy:malpedia=\"LokiBot\""],"Loozfon":["misp-galaxy:android=\"Loozfon\""],"Lotoor":["misp-galaxy:android=\"Lotoor\""],"Lovespy":["misp-galaxy:android=\"Lovespy\""],"Lovetrap":["misp-galaxy:android=\"Lovetrap\""],"Luckycat":["misp-galaxy:android=\"Luckycat\""],"Machinleak":["misp-galaxy:android=\"Machinleak\""],"Maistealer":["misp-galaxy:android=\"Maistealer\""],"Malapp":["misp-galaxy:android=\"Malapp\""],"Malebook":["misp-galaxy:android=\"Malebook\""],"Malhome":["misp-galaxy:android=\"Malhome\""],"Malminer":["misp-galaxy:android=\"Malminer\""],"Mania":["misp-galaxy:android=\"Mania\""],"Maxit":["misp-galaxy:android=\"Maxit\""],"MdotM":["misp-galaxy:android=\"MdotM\""],"Medialets":["misp-galaxy:android=\"Medialets\""],"Meshidden":["misp-galaxy:android=\"Meshidden\""],"Mesploit":["misp-galaxy:android=\"Mesploit\""],"Mesprank":["misp-galaxy:android=\"Mesprank\""],"Meswatcherbox":["misp-galaxy:android=\"Meswatcherbox\""],"Miji":["misp-galaxy:android=\"Miji\""],"Milipnot":["misp-galaxy:android=\"Milipnot\""],"MillennialMedia":["misp-galaxy:android=\"MillennialMedia\""],"Mitcad":["misp-galaxy:android=\"Mitcad\""],"MoPub":["misp-galaxy:android=\"MoPub\""],"MobClix":["misp-galaxy:android=\"MobClix\""],"MobFox":["misp-galaxy:android=\"MobFox\""],"MobWin":["misp-galaxy:android=\"MobWin\""],"Mobidisplay":["misp-galaxy:android=\"Mobidisplay\""],"Mobigapp":["misp-galaxy:android=\"Mobigapp\""],"MobileBackup":["misp-galaxy:android=\"MobileBackup\""],"Mobilespy":["misp-galaxy:android=\"Mobilespy\""],"Mobiletx":["misp-galaxy:android=\"Mobiletx\""],"Mobinaspy":["misp-galaxy:android=\"Mobinaspy\""],"Mobus":["misp-galaxy:android=\"Mobus\""],"Mocore":["misp-galaxy:android=\"Mocore\""],"Moghava":["misp-galaxy:android=\"Moghava\""],"Momark":["misp-galaxy:android=\"Momark\""],"Monitorello":["misp-galaxy:android=\"Monitorello\""],"Moolah":["misp-galaxy:android=\"Moolah\""],"Moplus":["misp-galaxy:android=\"Moplus\""],"Morepaks":["misp-galaxy:android=\"Morepaks\""],"MysteryBot":["misp-galaxy:android=\"MysteryBot\"","misp-galaxy:malpedia=\"MysteryBot\""],"Nandrobox":["misp-galaxy:android=\"Nandrobox\""],"Netisend":["misp-galaxy:android=\"Netisend\""],"Nickispy":["misp-galaxy:android=\"Nickispy\""],"Notcompatible":["misp-galaxy:android=\"Notcompatible\""],"Nuhaz":["misp-galaxy:android=\"Nuhaz\""],"Nyearleaker":["misp-galaxy:android=\"Nyearleaker\""],"Obad":["misp-galaxy:android=\"Obad\""],"Oneclickfraud":["misp-galaxy:android=\"Oneclickfraud\""],"Opfake":["misp-galaxy:android=\"Opfake\""],"Opfake.B":["misp-galaxy:android=\"Opfake.B\""],"Ozotshielder":["misp-galaxy:android=\"Ozotshielder\""],"Pafloat":["misp-galaxy:android=\"Pafloat\""],"PandaAds":["misp-galaxy:android=\"PandaAds\""],"Pandbot":["misp-galaxy:android=\"Pandbot\""],"Pdaspy":["misp-galaxy:android=\"Pdaspy\""],"Penetho":["misp-galaxy:android=\"Penetho\""],"Perkel":["misp-galaxy:android=\"Perkel\""],"Phimdropper":["misp-galaxy:android=\"Phimdropper\""],"Phospy":["misp-galaxy:android=\"Phospy\""],"Piddialer":["misp-galaxy:android=\"Piddialer\""],"Pikspam":["misp-galaxy:android=\"Pikspam\""],"Pincer":["misp-galaxy:android=\"Pincer\""],"Pirator":["misp-galaxy:android=\"Pirator\""],"Pjapps":["misp-galaxy:android=\"Pjapps\""],"Pjapps.B":["misp-galaxy:android=\"Pjapps.B\""],"Pletora":["misp-galaxy:android=\"Pletora\""],"Podec":["misp-galaxy:android=\"Podec\"","misp-galaxy:malpedia=\"Podec\""],"Poisoncake":["misp-galaxy:android=\"Poisoncake\""],"Pontiflex":["misp-galaxy:android=\"Pontiflex\""],"Positmob":["misp-galaxy:android=\"Positmob\""],"Premiumtext":["misp-galaxy:android=\"Premiumtext\""],"Pris":["misp-galaxy:android=\"Pris\""],"Qdplugin":["misp-galaxy:android=\"Qdplugin\""],"Qicsomos":["misp-galaxy:android=\"Qicsomos\""],"Qitmo":["misp-galaxy:android=\"Qitmo\""],"Rabbhome":["misp-galaxy:android=\"Rabbhome\""],"Razdel":["misp-galaxy:android=\"Razdel\""],"RedAlert2":["misp-galaxy:android=\"RedAlert2\"","misp-galaxy:malpedia=\"RedAlert2\""],"RedDrop":["misp-galaxy:android=\"RedDrop\"","misp-galaxy:mitre-malware=\"RedDrop - S0326\""],"Repane":["misp-galaxy:android=\"Repane\""],"Reputation.1":["misp-galaxy:android=\"Reputation.1\""],"Reputation.2":["misp-galaxy:android=\"Reputation.2\""],"Reputation.3":["misp-galaxy:android=\"Reputation.3\""],"RevMob":["misp-galaxy:android=\"RevMob\""],"Roidsec":["misp-galaxy:android=\"Roidsec\""],"Rootcager":["misp-galaxy:android=\"Rootcager\""],"Rootnik":["misp-galaxy:android=\"Rootnik\"","misp-galaxy:malpedia=\"Rootnik\""],"Rufraud":["misp-galaxy:android=\"Rufraud\""],"Rusms":["misp-galaxy:android=\"Rusms\""],"SLocker":["misp-galaxy:android=\"SLocker\""],"SMSLocker":["misp-galaxy:android=\"SLocker\""],"SMSReplicator":["misp-galaxy:android=\"SMSReplicator\""],"Samsapo":["misp-galaxy:android=\"Samsapo\""],"Sandorat":["misp-galaxy:android=\"Sandorat\""],"Sberick":["misp-galaxy:android=\"Sberick\""],"Scartibro":["misp-galaxy:android=\"Scartibro\""],"Scipiex":["misp-galaxy:android=\"Scipiex\""],"Selfmite":["misp-galaxy:android=\"Selfmite\""],"Selfmite.B":["misp-galaxy:android=\"Selfmite.B\""],"SellARing":["misp-galaxy:android=\"SellARing\""],"SendDroid":["misp-galaxy:android=\"SendDroid\""],"Simhosy":["misp-galaxy:android=\"Simhosy\""],"Simplocker":["misp-galaxy:android=\"Simplocker\""],"Simplocker.B":["misp-galaxy:android=\"Simplocker.B\""],"Skullkey":["misp-galaxy:android=\"Skullkey\""],"Skygofree":["misp-galaxy:android=\"Skygofree\"","misp-galaxy:malpedia=\"Skygofree\"","misp-galaxy:mitre-malware=\"Skygofree - S0327\""],"Smaato":["misp-galaxy:android=\"Smaato\""],"Smbcheck":["misp-galaxy:android=\"Smbcheck\""],"Smsblocker":["misp-galaxy:android=\"Smsblocker\""],"Smsbomber":["misp-galaxy:android=\"Smsbomber\""],"Smslink":["misp-galaxy:android=\"Smslink\""],"Smspacem":["misp-galaxy:android=\"Smspacem\""],"Smssniffer":["misp-galaxy:android=\"Smssniffer\""],"Smsstealer":["misp-galaxy:android=\"Smsstealer\""],"Smstibook":["misp-galaxy:android=\"Smstibook\""],"Smszombie":["misp-galaxy:android=\"Smszombie\""],"Snadapps":["misp-galaxy:android=\"Snadapps\""],"Sockbot":["misp-galaxy:android=\"Sockbot\""],"Sofacy":["misp-galaxy:android=\"Sofacy\"","misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\"","misp-galaxy:tool=\"CORESHELL\"","misp-galaxy:tool=\"GAMEFISH\"","misp-galaxy:tool=\"SOURFACE\""],"Sosceo":["misp-galaxy:android=\"Sosceo\""],"Spitmo":["misp-galaxy:android=\"Spitmo\""],"Spitmo.B":["misp-galaxy:android=\"Spitmo.B\""],"Spyagent":["misp-galaxy:android=\"Spyagent\""],"Spybubble":["misp-galaxy:android=\"Spybubble\""],"Spydafon":["misp-galaxy:android=\"Spydafon\""],"Spymple":["misp-galaxy:android=\"Spymple\""],"Spyoo":["misp-galaxy:android=\"Spyoo\""],"Spytekcell":["misp-galaxy:android=\"Spytekcell\""],"Spytrack":["misp-galaxy:android=\"Spytrack\""],"Spywaller":["misp-galaxy:android=\"Spywaller\""],"Stealthgenie":["misp-galaxy:android=\"Stealthgenie\""],"Steek":["misp-galaxy:android=\"Steek\""],"Stels":["misp-galaxy:android=\"Stels\""],"Stiniter":["misp-galaxy:android=\"Stiniter\""],"Sumzand":["misp-galaxy:android=\"Sumzand\""],"Svpeng":["misp-galaxy:android=\"Svpeng\"","misp-galaxy:malpedia=\"Svpeng\"","misp-galaxy:tool=\"Svpeng\""],"Invisble Man":["misp-galaxy:android=\"Svpeng\""],"Switcher":["misp-galaxy:android=\"Switcher\"","misp-galaxy:malpedia=\"Switcher\""],"Sysecsms":["misp-galaxy:android=\"Sysecsms\""],"Tanci":["misp-galaxy:android=\"Tanci\""],"Tapjoy":["misp-galaxy:android=\"Tapjoy\""],"Tapsnake":["misp-galaxy:android=\"Tapsnake\""],"Tascudap":["misp-galaxy:android=\"Tascudap\""],"Teelog":["misp-galaxy:android=\"Teelog\""],"Temai":["misp-galaxy:android=\"Temai\""],"Tetus":["misp-galaxy:android=\"Tetus\""],"Tgpush":["misp-galaxy:android=\"Tgpush\""],"Tigerbot":["misp-galaxy:android=\"Tigerbot\""],"Tizi":["misp-galaxy:android=\"Tizi\""],"Tonclank":["misp-galaxy:android=\"Tonclank\""],"Triout":["misp-galaxy:android=\"Triout\"","misp-galaxy:malpedia=\"Triout\""],"Trogle":["misp-galaxy:android=\"Trogle\""],"Twikabot":["misp-galaxy:android=\"Twikabot\""],"Uapush":["misp-galaxy:android=\"Uapush\""],"Umeng":["misp-galaxy:android=\"Umeng\""],"Updtbot":["misp-galaxy:android=\"Updtbot\""],"Upush":["misp-galaxy:android=\"Upush\""],"Uracto":["misp-galaxy:android=\"Uracto\""],"Uranico":["misp-galaxy:android=\"Uranico\""],"Usbcleaver":["misp-galaxy:android=\"Usbcleaver\""],"Utchi":["misp-galaxy:android=\"Utchi\""],"Uten":["misp-galaxy:android=\"Uten\""],"Uupay":["misp-galaxy:android=\"Uupay\""],"Uxipp":["misp-galaxy:android=\"Uxipp\""],"VDopia":["misp-galaxy:android=\"VDopia\""],"VServ":["misp-galaxy:android=\"VServ\""],"Vdloader":["misp-galaxy:android=\"Vdloader\""],"Vibleaker":["misp-galaxy:android=\"Vibleaker\""],"Viking Horde":["misp-galaxy:android=\"Viking Horde\""],"Virusshield":["misp-galaxy:android=\"Virusshield\""],"Walkinwat":["misp-galaxy:android=\"Walkinwat\""],"WannaLocker":["misp-galaxy:android=\"WannaLocker\""],"Waps":["misp-galaxy:android=\"Waps\""],"Waren":["misp-galaxy:android=\"Waren\""],"Windseeker":["misp-galaxy:android=\"Windseeker\""],"Wirex":["misp-galaxy:android=\"Wirex\""],"Wiyun":["misp-galaxy:android=\"Wiyun\""],"Wooboo":["misp-galaxy:android=\"Wooboo\""],"Wqmobile":["misp-galaxy:android=\"Wqmobile\""],"YahooAds":["misp-galaxy:android=\"YahooAds\""],"Yatoot":["misp-galaxy:android=\"Yatoot\""],"Yinhan":["misp-galaxy:android=\"Yinhan\""],"Youmi":["misp-galaxy:android=\"Youmi\""],"YuMe":["misp-galaxy:android=\"YuMe\""],"Zeahache":["misp-galaxy:android=\"Zeahache\""],"ZertSecurity":["misp-galaxy:android=\"ZertSecurity\""],"ZestAdz":["misp-galaxy:android=\"ZestAdz\""],"Zeusmitmo":["misp-galaxy:android=\"Zeusmitmo\""],"iBanking":["misp-galaxy:android=\"iBanking\""],"Rising Sun":["misp-galaxy:backdoor=\"Rising Sun\"","misp-galaxy:malpedia=\"Rising Sun\""],"Rosenbridge":["misp-galaxy:backdoor=\"Rosenbridge\""],"SLUB":["misp-galaxy:backdoor=\"SLUB\"","misp-galaxy:malpedia=\"SLUB\""],"ServHelper":["misp-galaxy:backdoor=\"ServHelper\"","misp-galaxy:malpedia=\"ServHelper\""],"WellMess":["misp-galaxy:backdoor=\"WellMess\"","misp-galaxy:malpedia=\"WellMess\""],"Atmos":["misp-galaxy:banker=\"Atmos\""],"Backswap":["misp-galaxy:banker=\"Backswap\""],"Banjori":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"MultiBanker 2":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"BankPatch":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"BackPatcher":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"Bebloh":["misp-galaxy:banker=\"Bebloh\"","misp-galaxy:malpedia=\"UrlZone\""],"URLZone":["misp-galaxy:banker=\"Bebloh\""],"Shiotob":["misp-galaxy:banker=\"Bebloh\"","misp-galaxy:malpedia=\"UrlZone\""],"CamuBot":["misp-galaxy:banker=\"CamuBot\"","misp-galaxy:malpedia=\"CamuBot\""],"Chthonic":["misp-galaxy:banker=\"Chthonic\"","misp-galaxy:malpedia=\"Chthonic\""],"Chtonic":["misp-galaxy:banker=\"Chthonic\""],"Citadel":["misp-galaxy:banker=\"Citadel\"","misp-galaxy:malpedia=\"Citadel\""],"Corebot":["misp-galaxy:banker=\"Corebot\"","misp-galaxy:malpedia=\"Corebot\""],"DanaBot":["misp-galaxy:banker=\"DanaBot\"","misp-galaxy:malpedia=\"DanaBot\""],"Dok":["misp-galaxy:banker=\"Dok\"","misp-galaxy:malpedia=\"Dok\"","misp-galaxy:mitre-malware=\"Dok - S0281\""],"Dreambot":["misp-galaxy:banker=\"Dreambot\""],"Dridex":["misp-galaxy:banker=\"Dridex\"","misp-galaxy:malpedia=\"Dridex\"","misp-galaxy:tool=\"Dridex\""],"Feodo Version D":["misp-galaxy:banker=\"Dridex\""],"Dyre":["misp-galaxy:banker=\"Dyre\"","misp-galaxy:malpedia=\"Dyre\"","misp-galaxy:mitre-enterprise-attack-malware=\"Dyre - S0024\"","misp-galaxy:mitre-malware=\"Dyre - S0024\""],"Dyreza":["misp-galaxy:banker=\"Dyre\"","misp-galaxy:malpedia=\"Dyre\""],"Feodo":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Feodo\""],"Bugat":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Bugat\"","misp-galaxy:malpedia=\"Feodo\""],"Cridex":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Feodo\"","misp-galaxy:tool=\"Dridex\""],"Fobber":["misp-galaxy:banker=\"Fobber\"","misp-galaxy:malpedia=\"Fobber\""],"Geodo":["misp-galaxy:banker=\"Geodo\"","misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\"","misp-galaxy:mitre-malware=\"Emotet - S0367\"","misp-galaxy:tool=\"Emotet\""],"Feodo Version C":["misp-galaxy:banker=\"Geodo\""],"Emotet":["misp-galaxy:banker=\"Geodo\"","misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\"","misp-galaxy:mitre-malware=\"Emotet - S0367\"","misp-galaxy:tool=\"Emotet\""],"GozNym":["misp-galaxy:banker=\"GozNym\"","misp-galaxy:threat-actor=\"GozNym\""],"Gozi ISFB":["misp-galaxy:banker=\"Gozi ISFB\"","misp-galaxy:malpedia=\"ISFB\""],"Gozi":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Ursnif":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\"","misp-galaxy:malpedia=\"Snifula\"","misp-galaxy:tool=\"Snifula\""],"CRM":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Snifula":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\"","misp-galaxy:malpedia=\"Snifula\"","misp-galaxy:tool=\"Snifula\""],"Papras":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Goziv2":["misp-galaxy:banker=\"Goziv2\""],"Prinimalka":["misp-galaxy:banker=\"Goziv2\""],"GratefulPOS":["misp-galaxy:banker=\"GratefulPOS\"","misp-galaxy:tool=\"GratefulPOS\""],"IAP":["misp-galaxy:banker=\"IAP\"","misp-galaxy:malpedia=\"ISFB\""],"Ice IX":["misp-galaxy:banker=\"Ice IX\"","misp-galaxy:malpedia=\"Ice IX\""],"IcedID":["misp-galaxy:banker=\"IcedID\"","misp-galaxy:malpedia=\"IcedID\""],"Karius":["misp-galaxy:banker=\"Karius\"","misp-galaxy:malpedia=\"Karius\""],"Kronos":["misp-galaxy:banker=\"Kronos\"","misp-galaxy:malpedia=\"Kronos\""],"Licat":["misp-galaxy:banker=\"Licat\""],"Murofet":["misp-galaxy:banker=\"Licat\"","misp-galaxy:malpedia=\"Murofet\""],"Matrix Banker":["misp-galaxy:banker=\"Matrix Banker\"","misp-galaxy:malpedia=\"Matrix Banker\""],"Panda Banker":["misp-galaxy:banker=\"Panda Banker\""],"Zeus Panda":["misp-galaxy:banker=\"Panda Banker\"","misp-galaxy:mitre-malware=\"Zeus Panda - S0330\""],"Qadars":["misp-galaxy:banker=\"Qadars\"","misp-galaxy:malpedia=\"Qadars\""],"Qakbot":["misp-galaxy:banker=\"Qakbot\"","misp-galaxy:tool=\"Akbot\""],"Qbot ":["misp-galaxy:banker=\"Qakbot\""],"Pinkslipbot":["misp-galaxy:banker=\"Qakbot\"","misp-galaxy:malpedia=\"QakBot\""],"Ramnit":["misp-galaxy:banker=\"Ramnit\"","misp-galaxy:botnet=\"Ramnit\"","misp-galaxy:malpedia=\"Ramnit\""],"Nimnul":["misp-galaxy:banker=\"Ramnit\"","misp-galaxy:malpedia=\"Ramnit\""],"Ranbyus":["misp-galaxy:banker=\"Ranbyus\"","misp-galaxy:malpedia=\"Ranbyus\""],"ReactorBot":["misp-galaxy:banker=\"ReactorBot\"","misp-galaxy:malpedia=\"ReactorBot\""],"Retefe":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Dok\"","misp-galaxy:mitre-malware=\"Dok - S0281\""],"Tsukuba":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Retefe (Windows)\""],"Werdlod":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Retefe (Windows)\""],"Sisron":["misp-galaxy:banker=\"Sisron\""],"Skynet":["misp-galaxy:banker=\"Skynet\""],"Smominru":["misp-galaxy:banker=\"Smominru\"","misp-galaxy:malpedia=\"Smominru\""],"Ismo":["misp-galaxy:banker=\"Smominru\"","misp-galaxy:malpedia=\"Smominru\""],"lsmo":["misp-galaxy:banker=\"Smominru\""],"SpyEye":["misp-galaxy:banker=\"SpyEye\""],"Tinba":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"Zusy":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"TinyBanker":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"illi":["misp-galaxy:banker=\"Tinba\""],"TinyNuke":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"NukeBot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"Nuclear Bot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"MicroBankingTrojan":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"Xbot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\"","misp-galaxy:malpedia=\"Xbot\"","misp-galaxy:mitre-mobile-attack-tool=\"Xbot - MOB-S0014\"","misp-galaxy:mitre-tool=\"Xbot - S0298\""],"Trickbot":["misp-galaxy:banker=\"Trickbot\""],"Trickster":["misp-galaxy:banker=\"Trickbot\"","misp-galaxy:malpedia=\"TrickBot\""],"Trickloader":["misp-galaxy:banker=\"Trickbot\""],"Vawtrak":["misp-galaxy:banker=\"Vawtrak\"","misp-galaxy:malpedia=\"Vawtrak\"","misp-galaxy:tool=\"Vawtrak\""],"Neverquest":["misp-galaxy:banker=\"Vawtrak\""],"Zeus Gameover":["misp-galaxy:banker=\"Zeus Gameover\""],"Zeus KINS":["misp-galaxy:banker=\"Zeus KINS\""],"Kasper Internet Non-Security":["misp-galaxy:banker=\"Zeus KINS\"","misp-galaxy:malpedia=\"KINS\""],"Maple":["misp-galaxy:banker=\"Zeus KINS\"","misp-galaxy:malpedia=\"KINS\""],"Zeus Sphinx":["misp-galaxy:banker=\"Zeus Sphinx\"","misp-galaxy:malpedia=\"Zeus Sphinx\""],"Zeus VM":["misp-galaxy:banker=\"Zeus VM\""],"VM Zeus":["misp-galaxy:banker=\"Zeus VM\"","misp-galaxy:malpedia=\"VM Zeus\""],"Zeus":["misp-galaxy:banker=\"Zeus\"","misp-galaxy:botnet=\"Zeus\"","misp-galaxy:malpedia=\"Zeus\"","misp-galaxy:tool=\"Zeus\""],"Zbot":["misp-galaxy:banker=\"Zeus\"","misp-galaxy:botnet=\"Zeus\"","misp-galaxy:malpedia=\"Zeus\"","misp-galaxy:tool=\"Zeus\""],"Zitmo":["misp-galaxy:banker=\"Zitmo\""],"Zloader Zeus":["misp-galaxy:banker=\"Zloader Zeus\""],"Zeus Terdot":["misp-galaxy:banker=\"Zloader Zeus\""],"downAndExec":["misp-galaxy:banker=\"downAndExec\""],"ADB.miner":["misp-galaxy:botnet=\"ADB.miner\""],"AESDDoS":["misp-galaxy:botnet=\"AESDDoS\""],"Akbot":["misp-galaxy:botnet=\"Akbot\"","misp-galaxy:tool=\"Akbot\""],"Asprox":["misp-galaxy:botnet=\"Asprox\"","misp-galaxy:malpedia=\"Asprox\""],"Badsrc":["misp-galaxy:botnet=\"Asprox\""],"Aseljo":["misp-galaxy:botnet=\"Asprox\"","misp-galaxy:malpedia=\"Asprox\""],"Danmec":["misp-galaxy:botnet=\"Asprox\""],"Hydraflux":["misp-galaxy:botnet=\"Asprox\""],"Bagle":["misp-galaxy:botnet=\"Bagle\"","misp-galaxy:malpedia=\"Bagle\""],"Beagle":["misp-galaxy:botnet=\"Bagle\""],"Mitglieder":["misp-galaxy:botnet=\"Bagle\""],"Lodeight":["misp-galaxy:botnet=\"Bagle\""],"Bamital":["misp-galaxy:botnet=\"Bamital\""],"Mdrop-CSK":["misp-galaxy:botnet=\"Bamital\""],"Agent-OCF":["misp-galaxy:botnet=\"Bamital\""],"Beebone":["misp-galaxy:botnet=\"Beebone\""],"BetaBot":["misp-galaxy:botnet=\"BetaBot\"","misp-galaxy:malpedia=\"BetaBot\""],"Brain Food":["misp-galaxy:botnet=\"Brain Food\""],"BredoLab":["misp-galaxy:botnet=\"BredoLab\""],"Oficla":["misp-galaxy:botnet=\"BredoLab\"","misp-galaxy:malpedia=\"Sasfis\"","misp-galaxy:tool=\"Oficla\""],"Chalubo":["misp-galaxy:botnet=\"Chalubo\""],"Chameleon":["misp-galaxy:botnet=\"Chameleon\""],"Conficker":["misp-galaxy:botnet=\"Conficker\"","misp-galaxy:malpedia=\"Conficker\""],"DownUp":["misp-galaxy:botnet=\"Conficker\""],"DownAndUp":["misp-galaxy:botnet=\"Conficker\""],"DownAdUp":["misp-galaxy:botnet=\"Conficker\""],"Kido":["misp-galaxy:botnet=\"Conficker\"","misp-galaxy:malpedia=\"Conficker\""],"Cutwail":["misp-galaxy:botnet=\"Cutwail\"","misp-galaxy:malpedia=\"Cutwail\""],"Pandex":["misp-galaxy:botnet=\"Cutwail\""],"Mutant":["misp-galaxy:botnet=\"Cutwail\""],"Donbot":["misp-galaxy:botnet=\"Donbot\""],"Buzus":["misp-galaxy:botnet=\"Donbot\"","misp-galaxy:malpedia=\"Buzus\""],"Bachsoy":["misp-galaxy:botnet=\"Donbot\""],"Festi":["misp-galaxy:botnet=\"Festi\""],"Spamnost":["misp-galaxy:botnet=\"Festi\""],"Gafgyt":["misp-galaxy:botnet=\"Gafgyt\"","misp-galaxy:malpedia=\"Bashlite\"","misp-galaxy:tool=\"Gafgyt\""],"Bashlite":["misp-galaxy:botnet=\"Gafgyt\"","misp-galaxy:malpedia=\"Bashlite\""],"Gheg":["misp-galaxy:botnet=\"Gheg\"","misp-galaxy:malpedia=\"Tofsee\""],"Tofsee":["misp-galaxy:botnet=\"Gheg\"","misp-galaxy:malpedia=\"Tofsee\""],"Mondera":["misp-galaxy:botnet=\"Gheg\""],"Grum":["misp-galaxy:botnet=\"Grum\""],"Tedroo":["misp-galaxy:botnet=\"Grum\""],"Reddyb":["misp-galaxy:botnet=\"Grum\""],"Gumblar":["misp-galaxy:botnet=\"Gumblar\""],"Hajime":["misp-galaxy:botnet=\"Hajime\"","misp-galaxy:malpedia=\"Hajime\""],"Hide and Seek":["misp-galaxy:botnet=\"Hide and Seek\"","misp-galaxy:malpedia=\"Hide and Seek\""],"HNS":["misp-galaxy:botnet=\"Hide and Seek\"","misp-galaxy:malpedia=\"Hide and Seek\""],"Hide 'N Seek":["misp-galaxy:botnet=\"Hide and Seek\""],"Kelihos":["misp-galaxy:botnet=\"Kelihos\"","misp-galaxy:malpedia=\"Kelihos\""],"Hlux":["misp-galaxy:botnet=\"Kelihos\""],"Kraken":["misp-galaxy:botnet=\"Kraken\"","misp-galaxy:botnet=\"Marina Botnet\"","misp-galaxy:malpedia=\"Kraken\""],"Kracken":["misp-galaxy:botnet=\"Kraken\""],"Lethic":["misp-galaxy:botnet=\"Lethic\"","misp-galaxy:malpedia=\"Lethic\""],"LowSec":["misp-galaxy:botnet=\"LowSec\""],"LowSecurity":["misp-galaxy:botnet=\"LowSec\""],"FreeMoney":["misp-galaxy:botnet=\"LowSec\""],"Ring0.Tools":["misp-galaxy:botnet=\"LowSec\""],"Maazben":["misp-galaxy:botnet=\"Maazben\""],"Madmax":["misp-galaxy:botnet=\"Madmax\""],"Mad Max":["misp-galaxy:botnet=\"Madmax\"","misp-galaxy:tool=\"Mad Max\""],"Marina Botnet":["misp-galaxy:botnet=\"Marina Botnet\""],"Damon Briant":["misp-galaxy:botnet=\"Marina Botnet\""],"BOB.dc":["misp-galaxy:botnet=\"Marina Botnet\""],"Cotmonger":["misp-galaxy:botnet=\"Marina Botnet\""],"Hacktool.Spammer":["misp-galaxy:botnet=\"Marina Botnet\""],"Mariposa":["misp-galaxy:botnet=\"Mariposa\""],"Mega-D":["misp-galaxy:botnet=\"Mega-D\""],"Ozdok":["misp-galaxy:botnet=\"Mega-D\""],"Mettle":["misp-galaxy:botnet=\"Mettle\""],"Mirai":["misp-galaxy:botnet=\"Mirai\"","misp-galaxy:tool=\"Mirai\""],"Muhstik":["misp-galaxy:botnet=\"Muhstik\"","misp-galaxy:malpedia=\"Tsunami (ELF)\""],"Nucrypt":["misp-galaxy:botnet=\"Nucrypt\""],"Onewordsub":["misp-galaxy:botnet=\"Onewordsub\""],"Owari":["misp-galaxy:botnet=\"Owari\"","misp-galaxy:malpedia=\"Owari\""],"Persirai":["misp-galaxy:botnet=\"Persirai\"","misp-galaxy:malpedia=\"Persirai\""],"Pontoeb":["misp-galaxy:botnet=\"Pontoeb\""],"N0ise":["misp-galaxy:botnet=\"Pontoeb\""],"Pushdo":["misp-galaxy:botnet=\"Pushdo\"","misp-galaxy:malpedia=\"Pushdo\""],"Rustock":["misp-galaxy:botnet=\"Rustock\"","misp-galaxy:malpedia=\"Rustock\""],"RKRustok":["misp-galaxy:botnet=\"Rustock\""],"Costrat":["misp-galaxy:botnet=\"Rustock\""],"Sality":["misp-galaxy:botnet=\"Sality\"","misp-galaxy:botnet=\"Sality\"","misp-galaxy:malpedia=\"Sality\""],"Sector":["misp-galaxy:botnet=\"Sality\""],"Kuku":["misp-galaxy:botnet=\"Sality\""],"SalLoad":["misp-galaxy:botnet=\"Sality\""],"Kookoo":["misp-galaxy:botnet=\"Sality\""],"SaliCode":["misp-galaxy:botnet=\"Sality\""],"Kukacka":["misp-galaxy:botnet=\"Sality\""],"Satori":["misp-galaxy:botnet=\"Satori\"","misp-galaxy:malpedia=\"Satori\"","misp-galaxy:tool=\"Satori\""],"Okiru":["misp-galaxy:botnet=\"Satori\"","misp-galaxy:tool=\"Satori\""],"Simda":["misp-galaxy:botnet=\"Simda\"","misp-galaxy:malpedia=\"Simda\""],"Sora":["misp-galaxy:botnet=\"Sora\""],"Mirai Sora":["misp-galaxy:botnet=\"Sora\""],"Spamthru":["misp-galaxy:botnet=\"Spamthru\""],"Spam-DComServ":["misp-galaxy:botnet=\"Spamthru\""],"Covesmer":["misp-galaxy:botnet=\"Spamthru\""],"Xmiler":["misp-galaxy:botnet=\"Spamthru\""],"Srizbi":["misp-galaxy:botnet=\"Srizbi\""],"Cbeplay":["misp-galaxy:botnet=\"Srizbi\""],"Exchanger":["misp-galaxy:botnet=\"Srizbi\""],"Storm":["misp-galaxy:botnet=\"Storm\""],"Nuwar":["misp-galaxy:botnet=\"Storm\""],"Peacomm":["misp-galaxy:botnet=\"Storm\""],"Zhelatin":["misp-galaxy:botnet=\"Storm\""],"Dorf":["misp-galaxy:botnet=\"Storm\""],"Ecard":["misp-galaxy:botnet=\"Storm\""],"TDL4":["misp-galaxy:botnet=\"TDL4\""],"TDSS":["misp-galaxy:botnet=\"TDL4\"","misp-galaxy:malpedia=\"Alureon\""],"Alureon":["misp-galaxy:botnet=\"TDL4\"","misp-galaxy:malpedia=\"Alureon\""],"Torii":["misp-galaxy:botnet=\"Torii\"","misp-galaxy:malpedia=\"Torii\""],"Torpig":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Sinowal":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Anserin":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Trik Spam Botnet":["misp-galaxy:botnet=\"Trik Spam Botnet\""],"Trik Trojan":["misp-galaxy:botnet=\"Trik Spam Botnet\""],"Virut":["misp-galaxy:botnet=\"Virut\"","misp-galaxy:malpedia=\"Virut\""],"Vulcanbot":["misp-galaxy:botnet=\"Vulcanbot\""],"Waledac":["misp-galaxy:botnet=\"Waledac\""],"Waled":["misp-galaxy:botnet=\"Waledac\""],"Waledpak":["misp-galaxy:botnet=\"Waledac\""],"Wopla":["misp-galaxy:botnet=\"Wopla\""],"Xarvester":["misp-galaxy:botnet=\"Xarvester\""],"Rlsloup":["misp-galaxy:botnet=\"Xarvester\""],"Pixoliz":["misp-galaxy:botnet=\"Xarvester\""],"XorDDoS":["misp-galaxy:botnet=\"XorDDoS\""],"Zer0n3t":["misp-galaxy:botnet=\"Zer0n3t\"","misp-galaxy:botnet=\"Zer0n3t\""],"Fib3rl0g1c":["misp-galaxy:botnet=\"Zer0n3t\""],"Zer0Log1x":["misp-galaxy:botnet=\"Zer0n3t\""],"ZeuS":["misp-galaxy:botnet=\"Zeus\""],"PRG":["misp-galaxy:botnet=\"Zeus\""],"Wsnpoem":["misp-galaxy:botnet=\"Zeus\""],"Gorhax":["misp-galaxy:botnet=\"Zeus\""],"Kneber":["misp-galaxy:botnet=\"Zeus\""],"BadUSB":["misp-galaxy:branded-vulnerability=\"BadUSB\""],"Badlock":["misp-galaxy:branded-vulnerability=\"Badlock\""],"Blacknurse":["misp-galaxy:branded-vulnerability=\"Blacknurse\""],"BlueKeep":["misp-galaxy:branded-vulnerability=\"BlueKeep\""],"Dirty COW":["misp-galaxy:branded-vulnerability=\"Dirty COW\""],"Ghost":["misp-galaxy:branded-vulnerability=\"Ghost\"","misp-galaxy:rat=\"Ghost\""],"Heartbleed":["misp-galaxy:branded-vulnerability=\"Heartbleed\""],"ImageTragick":["misp-galaxy:branded-vulnerability=\"ImageTragick\""],"Meltdown":["misp-galaxy:branded-vulnerability=\"Meltdown\""],"POODLE":["misp-galaxy:branded-vulnerability=\"POODLE\""],"SPOILER":["misp-galaxy:branded-vulnerability=\"SPOILER\""],"Shellshock":["misp-galaxy:branded-vulnerability=\"Shellshock\""],"Spectre":["misp-galaxy:branded-vulnerability=\"Spectre\""],"Stagefright":["misp-galaxy:branded-vulnerability=\"Stagefright\""],"Constituency":["misp-galaxy:cert-eu-govsector=\"Constituency\""],"EU-Centric":["misp-galaxy:cert-eu-govsector=\"EU-Centric\""],"EU-nearby":["misp-galaxy:cert-eu-govsector=\"EU-nearby\""],"Outside World":["misp-galaxy:cert-eu-govsector=\"Outside World\""],"Unknown":["misp-galaxy:cert-eu-govsector=\"Unknown\"","misp-galaxy:exploit-kit=\"Unknown\"","misp-galaxy:sector=\"Unknown\""],"World-class":["misp-galaxy:cert-eu-govsector=\"World-class\""],"AAD - Dump users and groups with Azure AD":["misp-galaxy:cloud-security=\"AAD - Dump users and groups with Azure AD\""],"AAD - Password Spray: CredKing":["misp-galaxy:cloud-security=\"AAD - Password Spray: CredKing\""],"AAD - Password Spray: MailSniper":["misp-galaxy:cloud-security=\"AAD - Password Spray: MailSniper\""],"End Point - Create Hidden Mailbox Rule":["misp-galaxy:cloud-security=\"End Point - Create Hidden Mailbox Rule\""],"End Point - Persistence throught Outlook Home Page: SensePost Ruler":["misp-galaxy:cloud-security=\"End Point - Persistence throught Outlook Home Page: SensePost Ruler\""],"End Point - Persistence throught custom Outlook form":["misp-galaxy:cloud-security=\"End Point - Persistence throught custom Outlook form\""],"End Point - Search host for Azure Credentials: SharpCloud":["misp-galaxy:cloud-security=\"End Point - Search host for Azure Credentials: SharpCloud\""],"O365 - 2FA MITM Phishing: evilginx2":["misp-galaxy:cloud-security=\"O365 - 2FA MITM Phishing: evilginx2\""],"O365 - Account Takeover: Add-MailboxPermission":["misp-galaxy:cloud-security=\"O365 - Account Takeover: Add-MailboxPermission\""],"O365 - Add Global admin account":["misp-galaxy:cloud-security=\"O365 - Add Global admin account\""],"O365 - Add Mail forwarding rule":["misp-galaxy:cloud-security=\"O365 - Add Mail forwarding rule\""],"O365 - Bruteforce of Autodiscover: SensePost Ruler":["misp-galaxy:cloud-security=\"O365 - Bruteforce of Autodiscover: SensePost Ruler\""],"O365 - Delegate Tenant Admin":["misp-galaxy:cloud-security=\"O365 - Delegate Tenant Admin\""],"O365 - Download documents and email":["misp-galaxy:cloud-security=\"O365 - Download documents and email\""],"O365 - Exchange Tasks for C2: MWR":["misp-galaxy:cloud-security=\"O365 - Exchange Tasks for C2: MWR\""],"O365 - Exfiltration email using EWS APIs with PowerShell":["misp-galaxy:cloud-security=\"O365 - Exfiltration email using EWS APIs with PowerShell\""],"O365 - Find Open Mailboxes: MailSniper":["misp-galaxy:cloud-security=\"O365 - Find Open Mailboxes: MailSniper\""],"O365 - Get Global Address List: MailSniper":["misp-galaxy:cloud-security=\"O365 - Get Global Address List: MailSniper\""],"O365 - MailSniper: Search Mailbox for content":["misp-galaxy:cloud-security=\"O365 - MailSniper: Search Mailbox for content\""],"O365 - MailSniper: Search Mailbox for credentials":["misp-galaxy:cloud-security=\"O365 - MailSniper: Search Mailbox for credentials\""],"O365 - Phishing for credentials":["misp-galaxy:cloud-security=\"O365 - Phishing for credentials\""],"O365 - Phishing using OAuth app":["misp-galaxy:cloud-security=\"O365 - Phishing using OAuth app\""],"O365 - Pivot to On-Prem host: SensePost Ruler":["misp-galaxy:cloud-security=\"O365 - Pivot to On-Prem host: SensePost Ruler\""],"O365 - Search for Content with eDiscovery":["misp-galaxy:cloud-security=\"O365 - Search for Content with eDiscovery\""],"O365 - Send Internal Email":["misp-galaxy:cloud-security=\"O365 - Send Internal Email\""],"O365 - User account enumeration with ActiveSync":["misp-galaxy:cloud-security=\"O365 - User account enumeration with ActiveSync\""],"On-Prem Exchange - Bruteforce of Autodiscover: SensePost Ruler":["misp-galaxy:cloud-security=\"On-Prem Exchange - Bruteforce of Autodiscover: SensePost Ruler\""],"On-Prem Exchange - Delegation":["misp-galaxy:cloud-security=\"On-Prem Exchange - Delegation\""],"On-Prem Exchange - Enumerate domain accounts: FindPeople":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: FindPeople\""],"On-Prem Exchange - Enumerate domain accounts: OWA & Exchange":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: OWA & Exchange\""],"On-Prem Exchange - Enumerate domain accounts: using Skype4B":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: using Skype4B\""],"On-Prem Exchange - OWA version discovery":["misp-galaxy:cloud-security=\"On-Prem Exchange - OWA version discovery\""],"On-Prem Exchange - Password Spray using Invoke-PasswordSprayOWA, EWS":["misp-galaxy:cloud-security=\"On-Prem Exchange - Password Spray using Invoke-PasswordSprayOWA, EWS\""],"On-Prem Exchange - Portal Recon":["misp-galaxy:cloud-security=\"On-Prem Exchange - Portal Recon\""],"On-Prem Exchange - Search Mailboxes with eDiscovery searches (EXO, Teams, SPO, OD4B, Skype4B)":["misp-galaxy:cloud-security=\"On-Prem Exchange - Search Mailboxes with eDiscovery searches (EXO, Teams, SPO, OD4B, Skype4B)\""],"Angler":["misp-galaxy:exploit-kit=\"Angler\""],"XXX":["misp-galaxy:exploit-kit=\"Angler\""],"AEK":["misp-galaxy:exploit-kit=\"Angler\""],"Axpergle":["misp-galaxy:exploit-kit=\"Angler\""],"Archie":["misp-galaxy:exploit-kit=\"Archie\""],"Astrum":["misp-galaxy:exploit-kit=\"Astrum\""],"Stegano EK":["misp-galaxy:exploit-kit=\"Astrum\""],"Bingo":["misp-galaxy:exploit-kit=\"Bingo\""],"Bizarro Sundown":["misp-galaxy:exploit-kit=\"Bizarro Sundown\""],"Sundown-b":["misp-galaxy:exploit-kit=\"Bizarro Sundown\""],"BlackHole":["misp-galaxy:exploit-kit=\"BlackHole\"","misp-galaxy:rat=\"BlackHole\""],"BHEK":["misp-galaxy:exploit-kit=\"BlackHole\""],"Bleeding Life":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"BL":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"BL2":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"Cool":["misp-galaxy:exploit-kit=\"Cool\""],"CEK":["misp-galaxy:exploit-kit=\"Cool\""],"Styxy Cool":["misp-galaxy:exploit-kit=\"Cool\""],"DNSChanger":["misp-galaxy:exploit-kit=\"DNSChanger\""],"RouterEK":["misp-galaxy:exploit-kit=\"DNSChanger\""],"DealersChoice":["misp-galaxy:exploit-kit=\"DealersChoice\"","misp-galaxy:mitre-malware=\"DealersChoice - S0243\""],"Sednit RTF EK":["misp-galaxy:exploit-kit=\"DealersChoice\""],"Disdain":["misp-galaxy:exploit-kit=\"Disdain\""],"Empire":["misp-galaxy:exploit-kit=\"Empire\"","misp-galaxy:mitre-tool=\"Empire - S0363\"","misp-galaxy:tool=\"Empire\""],"RIG-E":["misp-galaxy:exploit-kit=\"Empire\""],"Fallout":["misp-galaxy:exploit-kit=\"Fallout\"","misp-galaxy:exploit-kit=\"Fallout\""],"Fiesta":["misp-galaxy:exploit-kit=\"Fiesta\""],"NeoSploit":["misp-galaxy:exploit-kit=\"Fiesta\""],"Fiexp":["misp-galaxy:exploit-kit=\"Fiesta\""],"FlashPack":["misp-galaxy:exploit-kit=\"FlashPack\""],"FlashEK":["misp-galaxy:exploit-kit=\"FlashPack\""],"SafePack":["misp-galaxy:exploit-kit=\"FlashPack\""],"CritXPack":["misp-galaxy:exploit-kit=\"FlashPack\""],"Vintage Pack":["misp-galaxy:exploit-kit=\"FlashPack\""],"Glazunov":["misp-galaxy:exploit-kit=\"Glazunov\""],"GrandSoft":["misp-galaxy:exploit-kit=\"GrandSoft\""],"StampEK":["misp-galaxy:exploit-kit=\"GrandSoft\""],"SofosFO":["misp-galaxy:exploit-kit=\"GrandSoft\""],"GreenFlash Sundown":["misp-galaxy:exploit-kit=\"GreenFlash Sundown\""],"Sundown-GF":["misp-galaxy:exploit-kit=\"GreenFlash Sundown\""],"HanJuan":["misp-galaxy:exploit-kit=\"HanJuan\""],"Himan":["misp-galaxy:exploit-kit=\"Himan\""],"High Load":["misp-galaxy:exploit-kit=\"Himan\""],"Hunter":["misp-galaxy:exploit-kit=\"Hunter\"","misp-galaxy:tool=\"Tinba\""],"3ROS Exploit Kit":["misp-galaxy:exploit-kit=\"Hunter\""],"Impact":["misp-galaxy:exploit-kit=\"Impact\""],"Infinity":["misp-galaxy:exploit-kit=\"Infinity\""],"Redkit v2.0":["misp-galaxy:exploit-kit=\"Infinity\""],"Goon":["misp-galaxy:exploit-kit=\"Infinity\""],"Kaixin":["misp-galaxy:exploit-kit=\"Kaixin\""],"CK vip":["misp-galaxy:exploit-kit=\"Kaixin\""],"Lightsout":["misp-galaxy:exploit-kit=\"Lightsout\""],"MWI":["misp-galaxy:exploit-kit=\"MWI\""],"Magnitude":["misp-galaxy:exploit-kit=\"Magnitude\""],"Popads EK":["misp-galaxy:exploit-kit=\"Magnitude\""],"TopExp":["misp-galaxy:exploit-kit=\"Magnitude\""],"Nebula":["misp-galaxy:exploit-kit=\"Nebula\""],"Neutrino":["misp-galaxy:exploit-kit=\"Neutrino\"","misp-galaxy:malpedia=\"Neutrino\""],"Job314":["misp-galaxy:exploit-kit=\"Neutrino\""],"Neutrino Rebooted":["misp-galaxy:exploit-kit=\"Neutrino\""],"Neutrino-v":["misp-galaxy:exploit-kit=\"Neutrino\""],"Niteris":["misp-galaxy:exploit-kit=\"Niteris\""],"CottonCastle":["misp-galaxy:exploit-kit=\"Niteris\""],"Novidade":["misp-galaxy:exploit-kit=\"Novidade\""],"DNSGhost":["misp-galaxy:exploit-kit=\"Novidade\""],"Nuclear":["misp-galaxy:exploit-kit=\"Nuclear\""],"NEK":["misp-galaxy:exploit-kit=\"Nuclear\""],"Nuclear Pack":["misp-galaxy:exploit-kit=\"Nuclear\""],"Spartan":["misp-galaxy:exploit-kit=\"Nuclear\""],"Neclu":["misp-galaxy:exploit-kit=\"Nuclear\""],"Phoenix":["misp-galaxy:exploit-kit=\"Phoenix\""],"PEK":["misp-galaxy:exploit-kit=\"Phoenix\""],"Private Exploit Pack":["misp-galaxy:exploit-kit=\"Private Exploit Pack\""],"PEP":["misp-galaxy:exploit-kit=\"Private Exploit Pack\""],"RIG":["misp-galaxy:exploit-kit=\"RIG\""],"RIG 3":["misp-galaxy:exploit-kit=\"RIG\""],"RIG-v":["misp-galaxy:exploit-kit=\"RIG\""],"RIG 4":["misp-galaxy:exploit-kit=\"RIG\""],"Meadgive":["misp-galaxy:exploit-kit=\"RIG\""],"Redkit":["misp-galaxy:exploit-kit=\"Redkit\""],"SPL":["misp-galaxy:exploit-kit=\"SPL\""],"SPL_Data":["misp-galaxy:exploit-kit=\"SPL\""],"SPLNet":["misp-galaxy:exploit-kit=\"SPL\""],"SPL2":["misp-galaxy:exploit-kit=\"SPL\""],"Sakura":["misp-galaxy:exploit-kit=\"Sakura\""],"Sednit EK":["misp-galaxy:exploit-kit=\"Sednit EK\""],"SedKit":["misp-galaxy:exploit-kit=\"Sednit EK\""],"Spelevo":["misp-galaxy:exploit-kit=\"Spelevo\""],"SpelevoEK":["misp-galaxy:exploit-kit=\"SpelevoEK\""],"Styx":["misp-galaxy:exploit-kit=\"Styx\""],"Sundown":["misp-galaxy:exploit-kit=\"Sundown\""],"Beps":["misp-galaxy:exploit-kit=\"Sundown\""],"Xer":["misp-galaxy:exploit-kit=\"Sundown\""],"Beta":["misp-galaxy:exploit-kit=\"Sundown\""],"Sundown-P":["misp-galaxy:exploit-kit=\"Sundown-P\""],"Sundown-Pirate":["misp-galaxy:exploit-kit=\"Sundown-P\""],"CaptainBlack":["misp-galaxy:exploit-kit=\"Sundown-P\""],"Sweet-Orange":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"SWO":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"Anogre":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"Taurus Builder":["misp-galaxy:exploit-kit=\"Taurus Builder\""],"Terror EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"Blaze EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"Neptune EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"ThreadKit":["misp-galaxy:exploit-kit=\"ThreadKit\""],"Underminer":["misp-galaxy:exploit-kit=\"Underminer\""],"Underminer EK":["misp-galaxy:exploit-kit=\"Underminer\""],"VenomKit":["misp-galaxy:exploit-kit=\"VenomKit\""],"Venom":["misp-galaxy:exploit-kit=\"VenomKit\""],"WhiteHole":["misp-galaxy:exploit-kit=\"WhiteHole\""],"ATM Black Box Attack":["misp-galaxy:financial-fraud=\"ATM Black Box Attack\""],"ATM Explosive Attack":["misp-galaxy:financial-fraud=\"ATM Explosive Attack\""],"ATM Jackpotting":["misp-galaxy:financial-fraud=\"ATM Jackpotting\""],"ATM Shimming":["misp-galaxy:financial-fraud=\"ATM Shimming\""],"ATM skimming":["misp-galaxy:financial-fraud=\"ATM skimming\""],"Account-Checking Services":["misp-galaxy:financial-fraud=\"Account-Checking Services\""],"Business Email Compromise":["misp-galaxy:financial-fraud=\"Business Email Compromise\""],"Compromised Account Credentials":["misp-galaxy:financial-fraud=\"Compromised Account Credentials\""],"Compromised Intellectual Property (IP)":["misp-galaxy:financial-fraud=\"Compromised Intellectual Property (IP)\""],"Compromised Payment Cards":["misp-galaxy:financial-fraud=\"Compromised Payment Cards\""],"Compromised Personally Identifiable Information (PII)":["misp-galaxy:financial-fraud=\"Compromised Personally Identifiable Information (PII)\""],"Cryptocurrency Exchange":["misp-galaxy:financial-fraud=\"Cryptocurrency Exchange\""],"CxO Fraud":["misp-galaxy:financial-fraud=\"CxO Fraud\""],"Fund Transfer":["misp-galaxy:financial-fraud=\"Fund Transfer\""],"Insider Trading":["misp-galaxy:financial-fraud=\"Insider Trading\""],"Malware":["misp-galaxy:financial-fraud=\"Malware\""],"Money Mules":["misp-galaxy:financial-fraud=\"Money Mules\""],"POS Skimming":["misp-galaxy:financial-fraud=\"POS Skimming\""],"Phishing":["misp-galaxy:financial-fraud=\"Phishing\""],"Prepaid Cards":["misp-galaxy:financial-fraud=\"Prepaid Cards\""],"Resell Stolen Data":["misp-galaxy:financial-fraud=\"Resell Stolen Data\""],"SWIFT Transaction":["misp-galaxy:financial-fraud=\"SWIFT Transaction\""],"Scam":["misp-galaxy:financial-fraud=\"Scam\""],"Social Media Scams":["misp-galaxy:financial-fraud=\"Social Media Scams\""],"Spear phishing":["misp-galaxy:financial-fraud=\"Spear phishing\""],"Vishing":["misp-galaxy:financial-fraud=\"Vishing\""],"Breach of voters privacy during the casting of votes":["misp-galaxy:guidelines=\"Breach of voters privacy during the casting of votes\""],"Defacement, DoS or overload of websites or other systems used for publication of the results":["misp-galaxy:guidelines=\"Defacement, DoS or overload of websites or other systems used for publication of the results\""],"Deleting or tampering with voter data":["misp-galaxy:guidelines=\"Deleting or tampering with voter data\""],"DoS or overload of government websites":["misp-galaxy:guidelines=\"DoS or overload of government websites\""],"DoS or overload of party\/campaign registration, causing them to miss the deadline":["misp-galaxy:guidelines=\"DoS or overload of party\/campaign registration, causing them to miss the deadline\""],"DoS or overload of voter registration system, suppressing voters":["misp-galaxy:guidelines=\"DoS or overload of voter registration system, suppressing voters\""],"Fabricated signatures from sponsor":["misp-galaxy:guidelines=\"Fabricated signatures from sponsor\""],"Hacking campaign websites (defacement, DoS)":["misp-galaxy:guidelines=\"Hacking campaign websites (defacement, DoS)\""],"Hacking campaign websites, spreading misinformation on the election process, registered parties\/candidates, or results":["misp-galaxy:guidelines=\"Hacking campaign websites, spreading misinformation on the election process, registered parties\/candidates, or results\""],"Hacking candidate laptops or email accounts":["misp-galaxy:guidelines=\"Hacking candidate laptops or email accounts\""],"Hacking of internal systems used by media or press":["misp-galaxy:guidelines=\"Hacking of internal systems used by media or press\""],"Hacking\/misconfiguration of government servers, communication networks, or endpoints":["misp-galaxy:guidelines=\"Hacking\/misconfiguration of government servers, communication networks, or endpoints\""],"Identity fraud during voter registration":["misp-galaxy:guidelines=\"Identity fraud during voter registration\""],"Leak of confidential information":["misp-galaxy:guidelines=\"Leak of confidential information\""],"Misconfiguration of a website":["misp-galaxy:guidelines=\"Misconfiguration of a website\""],"Software bug altering results":["misp-galaxy:guidelines=\"Software bug altering results\""],"Tampering or DoS of communication links uesd to transfer (interim) results":["misp-galaxy:guidelines=\"Tampering or DoS of communication links uesd to transfer (interim) results\""],"Tampering or DoS of voting and\/or vote confidentiality during or after the elections":["misp-galaxy:guidelines=\"Tampering or DoS of voting and\/or vote confidentiality during or after the elections\""],"Tampering with logs\/journals":["misp-galaxy:guidelines=\"Tampering with logs\/journals\""],"Tampering with registrations":["misp-galaxy:guidelines=\"Tampering with registrations\""],"Tampering with supply chain involved in the movement or transfer data":["misp-galaxy:guidelines=\"Tampering with supply chain involved in the movement or transfer data\""],"Tampering, DoS or overload of the systems used for counting or aggregating results":["misp-galaxy:guidelines=\"Tampering, DoS or overload of the systems used for counting or aggregating results\""],"Tampering, DoS, or overload of media communication links":["misp-galaxy:guidelines=\"Tampering, DoS, or overload of media communication links\""],"7ev3n":["misp-galaxy:malpedia=\"7ev3n\"","misp-galaxy:ransomware=\"7ev3n\""],"9002 RAT":["misp-galaxy:malpedia=\"9002 RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\""],"Hydraq":["misp-galaxy:malpedia=\"9002 RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\"","misp-galaxy:tool=\"Aurora\""],"McRAT":["misp-galaxy:malpedia=\"9002 RAT\""],"AIRBREAK":["misp-galaxy:malpedia=\"AIRBREAK\"","misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"Orz":["misp-galaxy:malpedia=\"AIRBREAK\"","misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"ALPC Local PrivEsc":["misp-galaxy:malpedia=\"ALPC Local PrivEsc\""],"AMTsol":["misp-galaxy:malpedia=\"AMTsol\""],"Adupihan":["misp-galaxy:malpedia=\"AMTsol\""],"ANTAK":["misp-galaxy:malpedia=\"ANTAK\""],"APT3 Keylogger":["misp-galaxy:malpedia=\"APT3 Keylogger\""],"ARS VBS Loader":["misp-galaxy:malpedia=\"ARS VBS Loader\"","misp-galaxy:rat=\"ARS VBS Loader\""],"ASPC":["misp-galaxy:malpedia=\"ASPC\""],"ATI-Agent":["misp-galaxy:malpedia=\"ATI-Agent\""],"ATMSpitter":["misp-galaxy:malpedia=\"ATMSpitter\""],"ATMii":["misp-galaxy:malpedia=\"ATMii\""],"ATMitch":["misp-galaxy:malpedia=\"ATMitch\""],"AVCrypt":["misp-galaxy:malpedia=\"AVCrypt\""],"AbaddonPOS":["misp-galaxy:malpedia=\"AbaddonPOS\""],"PinkKite":["misp-galaxy:malpedia=\"AbaddonPOS\""],"Abbath Banker":["misp-galaxy:malpedia=\"Abbath Banker\""],"AcridRain":["misp-galaxy:malpedia=\"AcridRain\""],"Acronym":["misp-galaxy:malpedia=\"Acronym\""],"AdKoob":["misp-galaxy:malpedia=\"AdKoob\""],"AdWind":["misp-galaxy:malpedia=\"AdWind\""],"JBifrost":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:rat=\"Adwind RAT\""],"JSocket":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"UNRECOM":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:rat=\"Adwind RAT\""],"AdamLocker":["misp-galaxy:malpedia=\"AdamLocker\""],"AdultSwine":["misp-galaxy:malpedia=\"AdultSwine\""],"AdvisorsBot":["misp-galaxy:malpedia=\"AdvisorsBot\""],"Adylkuzz":["misp-galaxy:malpedia=\"Adylkuzz\""],"Agent Tesla":["misp-galaxy:malpedia=\"Agent Tesla\"","misp-galaxy:mitre-malware=\"Agent Tesla - S0331\"","misp-galaxy:tool=\"Agent Tesla\""],"Agent.BTZ":["misp-galaxy:malpedia=\"Agent.BTZ\"","misp-galaxy:tool=\"Agent.BTZ\""],"ComRAT":["misp-galaxy:malpedia=\"Agent.BTZ\"","misp-galaxy:mitre-enterprise-attack-malware=\"ComRAT - S0126\"","misp-galaxy:mitre-malware=\"ComRAT - S0126\"","misp-galaxy:rat=\"ComRAT\""],"Sun rootkit":["misp-galaxy:malpedia=\"Agent.BTZ\""],"Aldibot":["misp-galaxy:malpedia=\"Aldibot\""],"Alina POS":["misp-galaxy:malpedia=\"Alina POS\""],"alina_eagle":["misp-galaxy:malpedia=\"Alina POS\""],"alina_spark":["misp-galaxy:malpedia=\"Alina POS\""],"katrina":["misp-galaxy:malpedia=\"Alina POS\""],"Allaple":["misp-galaxy:malpedia=\"Allaple\""],"Starman":["misp-galaxy:malpedia=\"Allaple\""],"Alma Communicator":["misp-galaxy:malpedia=\"Alma Communicator\""],"AlmaLocker":["misp-galaxy:malpedia=\"AlmaLocker\""],"AlphaLocker":["misp-galaxy:malpedia=\"AlphaLocker\"","misp-galaxy:ransomware=\"Alpha Ransomware\""],"AlphaNC":["misp-galaxy:malpedia=\"AlphaNC\""],"Alphabet Ransomware":["misp-galaxy:malpedia=\"Alphabet Ransomware\"","misp-galaxy:ransomware=\"Alphabet Ransomware\""],"Alreay":["misp-galaxy:malpedia=\"Alreay\""],"Olmarik":["misp-galaxy:malpedia=\"Alureon\""],"Pihar":["misp-galaxy:malpedia=\"Alureon\""],"TDL":["misp-galaxy:malpedia=\"Alureon\""],"Amadey":["misp-galaxy:malpedia=\"Amadey\""],"Anatova Ransomware":["misp-galaxy:malpedia=\"Anatova Ransomware\""],"AndroRAT":["misp-galaxy:malpedia=\"AndroRAT\"","misp-galaxy:mitre-malware=\"AndroRAT - S0292\"","misp-galaxy:mitre-mobile-attack-malware=\"AndroRAT - MOB-S0008\""],"Andromeda":["misp-galaxy:malpedia=\"Andromeda\"","misp-galaxy:tool=\"Gamarue\""],"B106-Gamarue":["misp-galaxy:malpedia=\"Andromeda\""],"B67-SS-Gamarue":["misp-galaxy:malpedia=\"Andromeda\""],"Gamarue":["misp-galaxy:malpedia=\"Andromeda\"","misp-galaxy:tool=\"Gamarue\""],"b66":["misp-galaxy:malpedia=\"Andromeda\""],"Anel":["misp-galaxy:malpedia=\"Anel\""],"Antilam":["misp-galaxy:malpedia=\"Antilam\""],"Latinus":["misp-galaxy:malpedia=\"Antilam\""],"Anubis":["misp-galaxy:malpedia=\"Anubis\""],"AnubisSpy":["misp-galaxy:malpedia=\"AnubisSpy\""],"Apocalipto":["misp-galaxy:malpedia=\"Apocalipto\""],"Apocalypse":["misp-galaxy:malpedia=\"Apocalypse\"","misp-galaxy:ransomware=\"Apocalypse\"","misp-galaxy:rat=\"Apocalypse\""],"AppleJeus":["misp-galaxy:malpedia=\"AppleJeus\""],"ArdaMax":["misp-galaxy:malpedia=\"ArdaMax\""],"Arefty":["misp-galaxy:malpedia=\"Arefty\""],"Arik Keylogger":["misp-galaxy:malpedia=\"Arik Keylogger\""],"Aaron Keylogger":["misp-galaxy:malpedia=\"Arik Keylogger\""],"Arkei Stealer":["misp-galaxy:malpedia=\"Arkei Stealer\""],"Artra Downloader":["misp-galaxy:malpedia=\"Artra Downloader\""],"Asacub":["misp-galaxy:malpedia=\"Asacub\""],"AscentLoader":["misp-galaxy:malpedia=\"AscentLoader\""],"BadSrc":["misp-galaxy:malpedia=\"Asprox\""],"AthenaGo RAT":["misp-galaxy:malpedia=\"AthenaGo RAT\""],"Atmosphere":["misp-galaxy:malpedia=\"Atmosphere\""],"August Stealer":["misp-galaxy:malpedia=\"August Stealer\"","misp-galaxy:tool=\"August\""],"Auriga":["misp-galaxy:malpedia=\"Auriga\""],"Riodrv":["misp-galaxy:malpedia=\"Auriga\""],"Aurora":["misp-galaxy:malpedia=\"Aurora\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\"","misp-galaxy:tool=\"Aurora\""],"AutoCAD Downloader":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"Acad.Bursted":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"Duxfas":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"AvastDisabler":["misp-galaxy:malpedia=\"AvastDisabler\""],"Ave Maria":["misp-galaxy:malpedia=\"Ave Maria\"","misp-galaxy:stealer=\"Ave Maria\""],"AVE_MARIA":["misp-galaxy:malpedia=\"Ave Maria\""],"Aveo":["misp-galaxy:malpedia=\"Aveo\""],"Avzhan":["misp-galaxy:malpedia=\"Avzhan\""],"Ayegent":["misp-galaxy:malpedia=\"Ayegent\""],"Azorult":["misp-galaxy:malpedia=\"Azorult\"","misp-galaxy:mitre-malware=\"Azorult - S0344\""],"PuffStealer":["misp-galaxy:malpedia=\"Azorult\""],"Rultazo":["misp-galaxy:malpedia=\"Azorult\""],"BABYMETAL":["misp-galaxy:malpedia=\"BABYMETAL\""],"BACKBEND":["misp-galaxy:malpedia=\"BACKBEND\""],"BBSRAT":["misp-galaxy:malpedia=\"BBSRAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"BBSRAT - S0127\"","misp-galaxy:mitre-malware=\"BBSRAT - S0127\""],"BCMPUPnP_Hunter":["misp-galaxy:malpedia=\"BCMPUPnP_Hunter\""],"BELLHOP":["misp-galaxy:malpedia=\"BELLHOP\""],"BKA Trojaner":["misp-galaxy:malpedia=\"BKA Trojaner\""],"bwin3_bka":["misp-galaxy:malpedia=\"BKA Trojaner\""],"BLACKCOFFEE":["misp-galaxy:malpedia=\"BLACKCOFFEE\"","misp-galaxy:mitre-enterprise-attack-malware=\"BLACKCOFFEE - S0069\"","misp-galaxy:mitre-malware=\"BLACKCOFFEE - S0069\""],"BONDUPDATER":["misp-galaxy:malpedia=\"BONDUPDATER\"","misp-galaxy:mitre-malware=\"BONDUPDATER - S0360\"","misp-galaxy:rat=\"BONDUPDATER\""],"Glimpse":["misp-galaxy:malpedia=\"BONDUPDATER\""],"BRAIN":["misp-galaxy:malpedia=\"BRAIN\""],"BS2005":["misp-galaxy:malpedia=\"BS2005\"","misp-galaxy:mitre-enterprise-attack-malware=\"BS2005 - S0014\"","misp-galaxy:mitre-malware=\"BS2005 - S0014\"","misp-galaxy:tool=\"Hoardy\""],"BTCWare":["misp-galaxy:malpedia=\"BTCWare\""],"BUBBLEWRAP":["misp-galaxy:malpedia=\"BUBBLEWRAP\"","misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"BYEBY":["misp-galaxy:malpedia=\"BYEBY\""],"Babar":["misp-galaxy:malpedia=\"Babar\"","misp-galaxy:tool=\"Babar\""],"SNOWBALL":["misp-galaxy:malpedia=\"Babar\""],"BabyLon RAT":["misp-galaxy:malpedia=\"BabyLon RAT\""],"BackNet":["misp-galaxy:malpedia=\"BackNet\""],"BackSwap":["misp-galaxy:malpedia=\"BackSwap\""],"BadEncript":["misp-galaxy:malpedia=\"BadEncript\""],"BadNews":["misp-galaxy:malpedia=\"BadNews\""],"Bahamut (Android)":["misp-galaxy:malpedia=\"Bahamut (Android)\""],"Bahamut (Windows)":["misp-galaxy:malpedia=\"Bahamut (Windows)\""],"Baldir":["misp-galaxy:malpedia=\"Baldir\""],"Baldr":["misp-galaxy:malpedia=\"Baldir\""],"Banatrix":["misp-galaxy:malpedia=\"Banatrix\""],"Bankshot":["misp-galaxy:malpedia=\"Bankshot\"","misp-galaxy:mitre-malware=\"Bankshot - S0239\"","misp-galaxy:tool=\"Bankshot\""],"Banload":["misp-galaxy:malpedia=\"Banload\"","misp-galaxy:tool=\"Banload\""],"Bart":["misp-galaxy:malpedia=\"Bart\"","misp-galaxy:ransomware=\"Bart\""],"gayfgt":["misp-galaxy:malpedia=\"Bashlite\""],"lizkebab":["misp-galaxy:malpedia=\"Bashlite\""],"qbot":["misp-galaxy:malpedia=\"Bashlite\""],"torlus":["misp-galaxy:malpedia=\"Bashlite\""],"BatchWiper":["misp-galaxy:malpedia=\"BatchWiper\""],"Batel":["misp-galaxy:malpedia=\"Batel\""],"Bateleur":["misp-galaxy:malpedia=\"Bateleur\"","misp-galaxy:tool=\"Bateleur\""],"Beapy":["misp-galaxy:malpedia=\"Beapy\""],"Bedep":["misp-galaxy:malpedia=\"Bedep\"","misp-galaxy:tool=\"Bedep\""],"Bella":["misp-galaxy:malpedia=\"Bella\""],"Belonard":["misp-galaxy:malpedia=\"Belonard\""],"Berbomthum":["misp-galaxy:malpedia=\"Berbomthum\""],"BernhardPOS":["misp-galaxy:malpedia=\"BernhardPOS\""],"Neurevt":["misp-galaxy:malpedia=\"BetaBot\""],"Bezigate":["misp-galaxy:malpedia=\"Bezigate\""],"BfBot":["misp-galaxy:malpedia=\"BfBot\""],"BianLian":["misp-galaxy:malpedia=\"BianLian\""],"BillGates":["misp-galaxy:malpedia=\"BillGates\""],"BioData":["misp-galaxy:malpedia=\"BioData\""],"Biscuit":["misp-galaxy:malpedia=\"Biscuit\""],"zxdosml":["misp-galaxy:malpedia=\"Biscuit\""],"Bitsran":["misp-galaxy:malpedia=\"Bitsran\""],"Bitter RAT":["misp-galaxy:malpedia=\"Bitter RAT\""],"BlackEnergy":["misp-galaxy:malpedia=\"BlackEnergy\"","misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\"","misp-galaxy:threat-actor=\"Sandworm\"","misp-galaxy:tool=\"BlackEnergy\""],"BlackPOS":["misp-galaxy:malpedia=\"BlackPOS\""],"Kaptoxa":["misp-galaxy:malpedia=\"BlackPOS\""],"POSWDS":["misp-galaxy:malpedia=\"BlackPOS\""],"Reedum":["misp-galaxy:malpedia=\"BlackPOS\""],"BlackRevolution":["misp-galaxy:malpedia=\"BlackRevolution\""],"BlackRouter":["misp-galaxy:malpedia=\"BlackRouter\""],"BLACKHEART":["misp-galaxy:malpedia=\"BlackRouter\""],"BlackShades":["misp-galaxy:malpedia=\"BlackShades\""],"Boaxxe":["misp-galaxy:malpedia=\"Boaxxe\""],"Bohmini":["misp-galaxy:malpedia=\"Bohmini\""],"Bolek":["misp-galaxy:malpedia=\"Bolek\""],"KBOT":["misp-galaxy:malpedia=\"Bolek\""],"Bouncer":["misp-galaxy:malpedia=\"Bouncer\""],"Bozok":["misp-galaxy:malpedia=\"Bozok\"","misp-galaxy:rat=\"Bozok\""],"Brambul":["misp-galaxy:malpedia=\"Brambul\"","misp-galaxy:tool=\"Brambul\""],"BravoNC":["misp-galaxy:malpedia=\"BravoNC\""],"BreachRAT":["misp-galaxy:malpedia=\"BreachRAT\""],"Breakthrough":["misp-galaxy:malpedia=\"Breakthrough\""],"Bredolab":["misp-galaxy:malpedia=\"Bredolab\""],"BrickerBot":["misp-galaxy:malpedia=\"BrickerBot\""],"BrushaLoader":["misp-galaxy:malpedia=\"BrushaLoader\""],"BrutPOS":["misp-galaxy:malpedia=\"BrutPOS\""],"Buhtrap":["misp-galaxy:malpedia=\"Buhtrap\""],"Ratopak":["misp-galaxy:malpedia=\"Buhtrap\""],"Bundestrojaner":["misp-galaxy:malpedia=\"Bundestrojaner\""],"0zapftis":["misp-galaxy:malpedia=\"Bundestrojaner\""],"R2D2":["misp-galaxy:malpedia=\"Bundestrojaner\""],"Bunitu":["misp-galaxy:malpedia=\"Bunitu\""],"Buterat":["misp-galaxy:malpedia=\"Buterat\""],"spyvoltar":["misp-galaxy:malpedia=\"Buterat\""],"Yimfoca":["misp-galaxy:malpedia=\"Buzus\""],"CACTUSTORCH":["misp-galaxy:malpedia=\"CACTUSTORCH\""],"CCleaner Backdoor":["misp-galaxy:malpedia=\"CCleaner Backdoor\""],"CDorked":["misp-galaxy:malpedia=\"CDorked\""],"CDorked.A":["misp-galaxy:malpedia=\"CDorked\""],"CHINACHOPPER":["misp-galaxy:malpedia=\"CHINACHOPPER\""],"CMSBrute":["misp-galaxy:malpedia=\"CMSBrute\""],"CMSTAR":["misp-galaxy:malpedia=\"CMSTAR\""],"meciv":["misp-galaxy:malpedia=\"CMSTAR\""],"CREAMSICLE":["misp-galaxy:malpedia=\"CREAMSICLE\""],"CabArt":["misp-galaxy:malpedia=\"CabArt\""],"CadelSpy":["misp-galaxy:malpedia=\"CadelSpy\""],"Cadelle":["misp-galaxy:malpedia=\"CadelSpy\"","misp-galaxy:threat-actor=\"Cadelle\""],"Cannibal Rat":["misp-galaxy:malpedia=\"Cannibal Rat\""],"Cannon":["misp-galaxy:malpedia=\"Cannon\"","misp-galaxy:mitre-malware=\"Cannon - S0351\""],"Carbanak":["misp-galaxy:malpedia=\"Carbanak\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\"","misp-galaxy:threat-actor=\"Anunak\""],"Anunak":["misp-galaxy:malpedia=\"Carbanak\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\"","misp-galaxy:threat-actor=\"Anunak\""],"Carberp":["misp-galaxy:malpedia=\"Carberp\""],"Cardinal RAT":["misp-galaxy:malpedia=\"Cardinal RAT\"","misp-galaxy:mitre-malware=\"Cardinal RAT - S0348\"","misp-galaxy:tool=\"Cardinal RAT\""],"Careto":["misp-galaxy:malpedia=\"Careto\"","misp-galaxy:threat-actor=\"Careto\""],"Appetite":["misp-galaxy:malpedia=\"Careto\""],"Mask":["misp-galaxy:malpedia=\"Careto\"","misp-galaxy:threat-actor=\"Careto\""],"CarrotBat":["misp-galaxy:malpedia=\"CarrotBat\""],"Casper":["misp-galaxy:malpedia=\"Casper\"","misp-galaxy:tool=\"Casper\""],"Catchamas":["misp-galaxy:malpedia=\"Catchamas\"","misp-galaxy:mitre-malware=\"Catchamas - S0261\""],"Catelites":["misp-galaxy:malpedia=\"Catelites\""],"CenterPOS":["misp-galaxy:malpedia=\"CenterPOS\""],"cerebrus":["misp-galaxy:malpedia=\"CenterPOS\""],"Cerber":["misp-galaxy:malpedia=\"Cerber\"","misp-galaxy:ransomware=\"Cerber\""],"Cerbu":["misp-galaxy:malpedia=\"Cerbu\""],"ChChes":["misp-galaxy:malpedia=\"ChChes\"","misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"Ham Backdoor":["misp-galaxy:malpedia=\"ChChes\""],"Chainshot":["misp-galaxy:malpedia=\"Chainshot\"","misp-galaxy:tool=\"Chainshot\""],"Chapro":["misp-galaxy:malpedia=\"Chapro\""],"Charger":["misp-galaxy:malpedia=\"Charger\"","misp-galaxy:mitre-malware=\"Charger - S0323\"","misp-galaxy:mitre-mobile-attack-malware=\"Charger - MOB-S0039\""],"CherryPicker POS":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherry_picker":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherrypicker":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherrypickerpos":["misp-galaxy:malpedia=\"CherryPicker POS\""],"ChewBacca":["misp-galaxy:malpedia=\"ChewBacca\""],"Chinad":["misp-galaxy:malpedia=\"Chinad\""],"Chir":["misp-galaxy:malpedia=\"Chir\""],"Chrysaor":["misp-galaxy:malpedia=\"Chrysaor\"","misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\"","misp-galaxy:tool=\"Chrysaor\""],"JigglyPuff":["misp-galaxy:malpedia=\"Chrysaor\""],"Pegasus":["misp-galaxy:malpedia=\"Chrysaor\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus - MOB-S0005\"","misp-galaxy:tool=\"Chrysaor\""],"AndroKINS":["misp-galaxy:malpedia=\"Chthonic\""],"Client Maximus":["misp-galaxy:malpedia=\"Client Maximus\"","misp-galaxy:rat=\"Client Maximus\""],"Clientor":["misp-galaxy:malpedia=\"Clientor\""],"Clipper":["misp-galaxy:malpedia=\"Clipper\""],"Cloud Duke":["misp-galaxy:malpedia=\"Cloud Duke\""],"CoalaBot":["misp-galaxy:malpedia=\"CoalaBot\"","misp-galaxy:tool=\"CoalaBot\""],"CobInt":["misp-galaxy:malpedia=\"CobInt\""],"COOLPANTS":["misp-galaxy:malpedia=\"CobInt\""],"Cobalt Strike":["misp-galaxy:malpedia=\"Cobalt Strike\"","misp-galaxy:mitre-enterprise-attack-tool=\"Cobalt Strike - S0154\"","misp-galaxy:mitre-tool=\"Cobalt Strike - S0154\"","misp-galaxy:rat=\"Cobalt Strike\""],"Cobian RAT":["misp-galaxy:malpedia=\"Cobian RAT\"","misp-galaxy:mitre-malware=\"Cobian RAT - S0338\"","misp-galaxy:rat=\"Cobian RAT\""],"Cobra Carbon System":["misp-galaxy:malpedia=\"Cobra Carbon System\""],"Carbon":["misp-galaxy:malpedia=\"Cobra Carbon System\"","misp-galaxy:mitre-malware=\"Carbon - S0335\""],"CockBlocker":["misp-galaxy:malpedia=\"CockBlocker\""],"CodeKey":["misp-galaxy:malpedia=\"CodeKey\""],"Cohhoc":["misp-galaxy:malpedia=\"Cohhoc\""],"CoinThief":["misp-galaxy:malpedia=\"CoinThief\""],"Coinminer":["misp-galaxy:malpedia=\"Coinminer\""],"Coldroot RAT":["misp-galaxy:malpedia=\"Coldroot RAT\""],"Colony":["misp-galaxy:malpedia=\"Colony\""],"Bandios":["misp-galaxy:malpedia=\"Colony\""],"GrayBird":["misp-galaxy:malpedia=\"Colony\""],"Combojack":["misp-galaxy:malpedia=\"Combojack\""],"Combos":["misp-galaxy:malpedia=\"Combos\""],"CometBot":["misp-galaxy:malpedia=\"CometBot\""],"ComodoSec":["misp-galaxy:malpedia=\"ComodoSec\""],"Computrace":["misp-galaxy:malpedia=\"Computrace\""],"lojack":["misp-galaxy:malpedia=\"Computrace\""],"ComradeCircle":["misp-galaxy:malpedia=\"ComradeCircle\""],"downadup":["misp-galaxy:malpedia=\"Conficker\""],"traffic converter":["misp-galaxy:malpedia=\"Conficker\""],"Confucius":["misp-galaxy:malpedia=\"Confucius\""],"Connic":["misp-galaxy:malpedia=\"Connic\""],"SpyBanker":["misp-galaxy:malpedia=\"Connic\"","misp-galaxy:malpedia=\"SpyBanker\""],"Contopee":["misp-galaxy:malpedia=\"Contopee\""],"CookieBag":["misp-galaxy:malpedia=\"CookieBag\""],"CoreDN":["misp-galaxy:malpedia=\"CoreDN\""],"Coreshell":["misp-galaxy:malpedia=\"Coreshell\""],"CpuMeaner":["misp-galaxy:malpedia=\"CpuMeaner\"","misp-galaxy:tool=\"CpuMeaner\""],"Cpuminer (Android)":["misp-galaxy:malpedia=\"Cpuminer (Android)\""],"Cpuminer (ELF)":["misp-galaxy:malpedia=\"Cpuminer (ELF)\""],"Cr1ptT0r":["misp-galaxy:malpedia=\"Cr1ptT0r\"","misp-galaxy:ransomware=\"Cr1ptT0r\""],"CriptTor":["misp-galaxy:malpedia=\"Cr1ptT0r\""],"CradleCore":["misp-galaxy:malpedia=\"CradleCore\""],"CrashOverride":["misp-galaxy:malpedia=\"CrashOverride\""],"Crash":["misp-galaxy:malpedia=\"CrashOverride\""],"Industroyer":["misp-galaxy:malpedia=\"CrashOverride\""],"CreativeUpdater":["misp-galaxy:malpedia=\"CreativeUpdater\""],"Credraptor":["misp-galaxy:malpedia=\"Credraptor\""],"Crenufs":["misp-galaxy:malpedia=\"Crenufs\""],"Crimson RAT":["misp-galaxy:malpedia=\"Crimson RAT\""],"SEEDOOR":["misp-galaxy:malpedia=\"Crimson RAT\""],"Crimson":["misp-galaxy:malpedia=\"Crimson\"","misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\"","misp-galaxy:rat=\"Crimson\"","misp-galaxy:tool=\"Crimson\""],"Crisis (OS X)":["misp-galaxy:malpedia=\"Crisis (OS X)\""],"Crisis (Windows)":["misp-galaxy:malpedia=\"Crisis (Windows)\""],"CrossRAT":["misp-galaxy:malpedia=\"CrossRAT\"","misp-galaxy:mitre-malware=\"CrossRAT - S0235\""],"Trupto":["misp-galaxy:malpedia=\"CrossRAT\""],"Crossrider":["misp-galaxy:malpedia=\"Crossrider\""],"CryLocker":["misp-galaxy:malpedia=\"CryLocker\"","misp-galaxy:ransomware=\"CryLocker\""],"Cryakl":["misp-galaxy:malpedia=\"Cryakl\"","misp-galaxy:ransomware=\"Cryakl\"","misp-galaxy:ransomware=\"Offline ransomware\""],"CrypMic":["misp-galaxy:malpedia=\"CrypMic\""],"Crypt0l0cker":["misp-galaxy:malpedia=\"Crypt0l0cker\""],"CryptXXXX":["misp-galaxy:malpedia=\"CryptXXXX\""],"CryptoFortress":["misp-galaxy:malpedia=\"CryptoFortress\"","misp-galaxy:ransomware=\"CryptoFortress\"","misp-galaxy:ransomware=\"TorrentLocker\""],"CryptoLocker":["misp-galaxy:malpedia=\"CryptoLocker\"","misp-galaxy:ransomware=\"CryptoLocker\""],"CryptoLuck":["misp-galaxy:malpedia=\"CryptoLuck\""],"CryptoMix":["misp-galaxy:malpedia=\"CryptoMix\"","misp-galaxy:ransomware=\"CryptoMix\""],"CryptFile2":["misp-galaxy:malpedia=\"CryptoMix\""],"CryptoNight":["misp-galaxy:malpedia=\"CryptoNight\""],"CryptoRansomeware":["misp-galaxy:malpedia=\"CryptoRansomeware\"","misp-galaxy:ransomware=\"CryptoRansomeware\""],"CryptoShield":["misp-galaxy:malpedia=\"CryptoShield\""],"CryptoShuffler":["misp-galaxy:malpedia=\"CryptoShuffler\""],"CryptoWire":["misp-galaxy:malpedia=\"CryptoWire\"","misp-galaxy:ransomware=\"Owl\""],"Cryptorium":["misp-galaxy:malpedia=\"Cryptorium\""],"Cryptowall":["misp-galaxy:malpedia=\"Cryptowall\""],"CsExt":["misp-galaxy:malpedia=\"CsExt\""],"Cuegoe":["misp-galaxy:malpedia=\"Cuegoe\""],"Windshield?":["misp-galaxy:malpedia=\"Cuegoe\""],"Cueisfry":["misp-galaxy:malpedia=\"Cueisfry\""],"CukieGrab":["misp-galaxy:malpedia=\"CukieGrab\""],"Roblox Trade Assist":["misp-galaxy:malpedia=\"CukieGrab\""],"Cutlet":["misp-galaxy:malpedia=\"Cutlet\""],"CyberGate":["misp-galaxy:malpedia=\"CyberGate\"","misp-galaxy:rat=\"CyberGate\""],"Rebhip":["misp-galaxy:malpedia=\"CyberGate\""],"CyberSplitter":["misp-galaxy:malpedia=\"CyberSplitter\"","misp-galaxy:ransomware=\"Cyber SpLiTTer Vbs\""],"CycBot":["misp-galaxy:malpedia=\"CycBot\""],"DDKONG":["misp-galaxy:malpedia=\"DDKONG\"","misp-galaxy:mitre-malware=\"DDKONG - S0255\"","misp-galaxy:tool=\"DDKONG\""],"DMA Locker":["misp-galaxy:malpedia=\"DMA Locker\""],"DMSniff":["misp-galaxy:malpedia=\"DMSniff\""],"DNSMessenger":["misp-galaxy:malpedia=\"DNSMessenger\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\"","misp-galaxy:rat=\"DNSMessenger\""],"TEXTMATE":["misp-galaxy:malpedia=\"DNSMessenger\"","misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\""],"DNSRat":["misp-galaxy:malpedia=\"DNSRat\""],"DNSbot":["misp-galaxy:malpedia=\"DNSRat\""],"DNSpionage":["misp-galaxy:malpedia=\"DNSpionage\"","misp-galaxy:threat-actor=\"DNSpionage\""],"Agent Drable":["misp-galaxy:malpedia=\"DNSpionage\""],"Webmask":["misp-galaxy:malpedia=\"DNSpionage\""],"DRIFTPIN":["misp-galaxy:malpedia=\"DRIFTPIN\"","misp-galaxy:tool=\"Agent ORM\""],"Spy.Agent.ORM":["misp-galaxy:malpedia=\"DRIFTPIN\""],"Toshliph":["misp-galaxy:malpedia=\"DRIFTPIN\""],"DROPSHOT":["misp-galaxy:malpedia=\"DROPSHOT\""],"DUBrute":["misp-galaxy:malpedia=\"DUBrute\""],"Dairy":["misp-galaxy:malpedia=\"Dairy\""],"DarkComet":["misp-galaxy:malpedia=\"DarkComet\"","misp-galaxy:mitre-malware=\"DarkComet - S0334\"","misp-galaxy:rat=\"DarkComet\""],"Fynloski":["misp-galaxy:malpedia=\"DarkComet\"","misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"klovbot":["misp-galaxy:malpedia=\"DarkComet\""],"DarkHotel":["misp-galaxy:malpedia=\"DarkHotel\"","misp-galaxy:threat-actor=\"DarkHotel\""],"DarkMegi":["misp-galaxy:malpedia=\"DarkMegi\""],"DarkPulsar":["misp-galaxy:malpedia=\"DarkPulsar\"","misp-galaxy:tool=\"DarkPulsar\""],"DarkShell":["misp-galaxy:malpedia=\"DarkShell\""],"DarkStRat":["misp-galaxy:malpedia=\"DarkStRat\""],"DarkTequila":["misp-galaxy:malpedia=\"DarkTequila\""],"Darkmoon":["misp-galaxy:malpedia=\"Darkmoon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Darkmoon - S0209\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\""],"Chymine":["misp-galaxy:malpedia=\"Darkmoon\""],"Darksky":["misp-galaxy:malpedia=\"Darksky\""],"Darktrack RAT":["misp-galaxy:malpedia=\"Darktrack RAT\""],"DarthMiner":["misp-galaxy:malpedia=\"DarthMiner\"","misp-galaxy:tool=\"DarthMiner\""],"Daserf":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Muirim":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Nioupale":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Datper":["misp-galaxy:malpedia=\"Datper\""],"Decebal":["misp-galaxy:malpedia=\"Decebal\""],"Delta(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Delta(Alfa,Bravo, ...)\""],"Dented":["misp-galaxy:malpedia=\"Dented\""],"DeputyDog":["misp-galaxy:malpedia=\"DeputyDog\""],"DeriaLock":["misp-galaxy:malpedia=\"DeriaLock\""],"Derusbi":["misp-galaxy:malpedia=\"Derusbi\"","misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\"","misp-galaxy:tool=\"Derusbi\""],"PHOTO":["misp-galaxy:malpedia=\"Derusbi\"","misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\""],"Devil's Rat":["misp-galaxy:malpedia=\"Devil's Rat\""],"Dexter":["misp-galaxy:malpedia=\"Dexter\""],"LusyPOS":["misp-galaxy:malpedia=\"Dexter\""],"Dharma":["misp-galaxy:malpedia=\"Dharma\""],"Arena":["misp-galaxy:malpedia=\"Dharma\""],"Crysis":["misp-galaxy:malpedia=\"Dharma\""],"DiamondFox":["misp-galaxy:malpedia=\"DiamondFox\""],"Crystal":["misp-galaxy:malpedia=\"DiamondFox\""],"Gorynch":["misp-galaxy:malpedia=\"DiamondFox\""],"Gorynych":["misp-galaxy:malpedia=\"DiamondFox\""],"Dimnie":["misp-galaxy:malpedia=\"Dimnie\"","misp-galaxy:tool=\"Dimnie\""],"DirCrypt":["misp-galaxy:malpedia=\"DirCrypt\"","misp-galaxy:ransomware=\"DirCrypt\""],"DispenserXFS":["misp-galaxy:malpedia=\"DispenserXFS\""],"DistTrack":["misp-galaxy:malpedia=\"DistTrack\"","misp-galaxy:tool=\"Shamoon\""],"Dockster":["misp-galaxy:malpedia=\"Dockster\""],"DogHousePower":["misp-galaxy:malpedia=\"DogHousePower\""],"Shelma":["misp-galaxy:malpedia=\"DogHousePower\""],"Dorshel":["misp-galaxy:malpedia=\"Dorshel\""],"DoublePulsar":["misp-galaxy:malpedia=\"DoublePulsar\""],"DownPaper":["misp-galaxy:malpedia=\"DownPaper\"","misp-galaxy:mitre-enterprise-attack-malware=\"DownPaper - S0186\"","misp-galaxy:mitre-malware=\"DownPaper - S0186\""],"Downdelph":["misp-galaxy:malpedia=\"Downdelph\"","misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\"","misp-galaxy:tool=\"Downdelph\""],"DELPHACY":["misp-galaxy:malpedia=\"Downdelph\""],"Downeks":["misp-galaxy:malpedia=\"Downeks\""],"DramNudge":["misp-galaxy:malpedia=\"DramNudge\""],"DreamBot":["misp-galaxy:malpedia=\"DreamBot\""],"DtBackdoor":["misp-galaxy:malpedia=\"DtBackdoor\""],"DuQu":["misp-galaxy:malpedia=\"DuQu\""],"DualToy (Android)":["misp-galaxy:malpedia=\"DualToy (Android)\""],"DualToy (Windows)":["misp-galaxy:malpedia=\"DualToy (Windows)\""],"DualToy (iOS)":["misp-galaxy:malpedia=\"DualToy (iOS)\""],"Dumador":["misp-galaxy:malpedia=\"Dumador\""],"Dummy":["misp-galaxy:malpedia=\"Dummy\""],"Duuzer":["misp-galaxy:malpedia=\"Duuzer\""],"Dvmap":["misp-galaxy:malpedia=\"Dvmap\""],"EDA2":["misp-galaxy:malpedia=\"EDA2\"","misp-galaxy:ransomware=\"HiddenTear\""],"EHDevel":["misp-galaxy:malpedia=\"EHDevel\""],"ELMER":["misp-galaxy:malpedia=\"ELMER\"","misp-galaxy:mitre-enterprise-attack-malware=\"ELMER - S0064\"","misp-galaxy:mitre-malware=\"ELMER - S0064\""],"Elmost":["misp-galaxy:malpedia=\"ELMER\""],"EVILNUM (Javascript)":["misp-galaxy:malpedia=\"EVILNUM (Javascript)\""],"EVILNUM (Windows)":["misp-galaxy:malpedia=\"EVILNUM (Windows)\""],"Ebury":["misp-galaxy:malpedia=\"Ebury\"","misp-galaxy:mitre-malware=\"Ebury - S0377\""],"Eleanor":["misp-galaxy:malpedia=\"Eleanor\""],"ElectricPowder":["misp-galaxy:malpedia=\"ElectricPowder\""],"Elirks":["misp-galaxy:malpedia=\"Elirks\"","misp-galaxy:tool=\"Elirks\""],"Elise":["misp-galaxy:malpedia=\"Elise\"","misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\"","misp-galaxy:threat-actor=\"Lotus Panda\"","misp-galaxy:tool=\"Elise Backdoor\""],"Emdivi":["misp-galaxy:malpedia=\"Emdivi\"","misp-galaxy:threat-actor=\"Blue Termite\"","misp-galaxy:tool=\"Emdivi\""],"Heodo":["misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\""],"Empire Downloader":["misp-galaxy:malpedia=\"Empire Downloader\""],"Enfal":["misp-galaxy:malpedia=\"Enfal\"","misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\""],"Lurid":["misp-galaxy:malpedia=\"Enfal\"","misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\"","misp-galaxy:threat-actor=\"Mirage\""],"EquationDrug":["misp-galaxy:malpedia=\"EquationDrug\"","misp-galaxy:tool=\"EquationDrug\""],"Equationgroup (Sorting)":["misp-galaxy:malpedia=\"Equationgroup (Sorting)\""],"Erebus (ELF)":["misp-galaxy:malpedia=\"Erebus (ELF)\""],"Erebus (Windows)":["misp-galaxy:malpedia=\"Erebus (Windows)\""],"Eredel":["misp-galaxy:malpedia=\"Eredel\""],"EternalPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"BadRabbit":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:ransomware=\"Bad Rabbit\""],"Diskcoder.C":["misp-galaxy:malpedia=\"EternalPetya\""],"ExPetr":["misp-galaxy:malpedia=\"EternalPetya\""],"NonPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"NotPetya":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\"","misp-galaxy:tool=\"NotPetya\""],"Nyetya":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petna":["misp-galaxy:malpedia=\"EternalPetya\""],"Pnyetya":["misp-galaxy:malpedia=\"EternalPetya\""],"nPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"EtumBot":["misp-galaxy:malpedia=\"EtumBot\""],"HighTide":["misp-galaxy:malpedia=\"EtumBot\""],"EvilGrab":["misp-galaxy:malpedia=\"EvilGrab\"","misp-galaxy:mitre-enterprise-attack-malware=\"EvilGrab - S0152\"","misp-galaxy:mitre-malware=\"EvilGrab - S0152\"","misp-galaxy:tool=\"EvilGrab\""],"Vidgrab":["misp-galaxy:malpedia=\"EvilGrab\""],"EvilOSX":["misp-galaxy:malpedia=\"EvilOSX\""],"EvilPony":["misp-galaxy:malpedia=\"EvilPony\""],"CREstealer":["misp-galaxy:malpedia=\"EvilPony\""],"Evilbunny":["misp-galaxy:malpedia=\"Evilbunny\""],"Evrial":["misp-galaxy:malpedia=\"Evrial\""],"Excalibur":["misp-galaxy:malpedia=\"Excalibur\""],"Saber":["misp-galaxy:malpedia=\"Excalibur\""],"Sabresac":["misp-galaxy:malpedia=\"Excalibur\""],"Exile RAT":["misp-galaxy:malpedia=\"Exile RAT\""],"ExoBot":["misp-galaxy:malpedia=\"ExoBot\"","misp-galaxy:malpedia=\"Marcher\""],"Exodus":["misp-galaxy:malpedia=\"Exodus\""],"Eye Pyramid":["misp-galaxy:malpedia=\"Eye Pyramid\""],"FBot":["misp-galaxy:malpedia=\"FBot\""],"FEimea RAT":["misp-galaxy:malpedia=\"FEimea RAT\""],"FF RAT":["misp-galaxy:malpedia=\"FF RAT\""],"FLASHFLOOD":["misp-galaxy:malpedia=\"FLASHFLOOD\"","misp-galaxy:mitre-enterprise-attack-malware=\"FLASHFLOOD - S0036\"","misp-galaxy:mitre-malware=\"FLASHFLOOD - S0036\""],"FailyTale":["misp-galaxy:malpedia=\"FailyTale\""],"Fake Pornhub":["misp-galaxy:malpedia=\"Fake Pornhub\""],"FakeDGA":["misp-galaxy:malpedia=\"FakeDGA\""],"WillExec":["misp-galaxy:malpedia=\"FakeDGA\""],"FakeGram":["misp-galaxy:malpedia=\"FakeGram\""],"FakeTGram":["misp-galaxy:malpedia=\"FakeGram\""],"FakeRean":["misp-galaxy:malpedia=\"FakeRean\""],"Braviax":["misp-galaxy:malpedia=\"FakeRean\""],"FakeSpy":["misp-galaxy:malpedia=\"FakeSpy\""],"FakeTC":["misp-galaxy:malpedia=\"FakeTC\""],"Fanny":["misp-galaxy:malpedia=\"Fanny\"","misp-galaxy:tool=\"Fanny\""],"FantomCrypt":["misp-galaxy:malpedia=\"FantomCrypt\""],"Farseer":["misp-galaxy:malpedia=\"Farseer\""],"FastCash":["misp-galaxy:malpedia=\"FastCash\""],"FastPOS":["misp-galaxy:malpedia=\"FastPOS\""],"Felismus":["misp-galaxy:malpedia=\"Felismus\"","misp-galaxy:mitre-enterprise-attack-malware=\"Felismus - S0171\"","misp-galaxy:mitre-malware=\"Felismus - S0171\""],"Felixroot":["misp-galaxy:malpedia=\"Felixroot\""],"FileIce":["misp-galaxy:malpedia=\"FileIce\""],"Filecoder":["misp-galaxy:malpedia=\"Filecoder\""],"FinFisher RAT":["misp-galaxy:malpedia=\"FinFisher RAT\""],"FinSpy":["misp-galaxy:malpedia=\"FinFisher RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"Final1stSpy":["misp-galaxy:malpedia=\"Final1stSpy\""],"FindPOS":["misp-galaxy:malpedia=\"FindPOS\""],"Poseidon":["misp-galaxy:malpedia=\"FindPOS\""],"FireCrypt":["misp-galaxy:malpedia=\"FireCrypt\"","misp-galaxy:ransomware=\"FireCrypt\""],"FireMalv":["misp-galaxy:malpedia=\"FireMalv\"","misp-galaxy:tool=\"FireMalv\""],"Fireball":["misp-galaxy:malpedia=\"Fireball\"","misp-galaxy:tool=\"Fireball\""],"FirstRansom":["misp-galaxy:malpedia=\"FirstRansom\""],"Flame":["misp-galaxy:malpedia=\"Flame\"","misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\"","misp-galaxy:tool=\"Flame\""],"FlashBack":["misp-galaxy:malpedia=\"FlashBack\""],"FlawedAmmyy":["misp-galaxy:malpedia=\"FlawedAmmyy\"","misp-galaxy:rat=\"FlawedAmmyy\""],"FlawedGrace":["misp-galaxy:malpedia=\"FlawedGrace\"","misp-galaxy:rat=\"FlawedGrace\""],"FlexNet":["misp-galaxy:malpedia=\"FlexNet\""],"gugi":["misp-galaxy:malpedia=\"FlexNet\""],"FlexiSpy (Android)":["misp-galaxy:malpedia=\"FlexiSpy (Android)\""],"FlexiSpy (Windows)":["misp-galaxy:malpedia=\"FlexiSpy (Windows)\""],"FlexiSpy (symbian)":["misp-galaxy:malpedia=\"FlexiSpy (symbian)\""],"FlokiBot":["misp-galaxy:malpedia=\"FlokiBot\""],"FlowerShop":["misp-galaxy:malpedia=\"FlowerShop\""],"Floxif":["misp-galaxy:malpedia=\"Floxif\""],"Flusihoc":["misp-galaxy:malpedia=\"Flusihoc\""],"Formbook":["misp-galaxy:malpedia=\"Formbook\""],"FormerFirstRAT":["misp-galaxy:malpedia=\"FormerFirstRAT\""],"ffrat":["misp-galaxy:malpedia=\"FormerFirstRAT\""],"Freenki Loader":["misp-galaxy:malpedia=\"Freenki Loader\""],"FriedEx":["misp-galaxy:malpedia=\"FriedEx\""],"BitPaymer":["misp-galaxy:malpedia=\"FriedEx\"","misp-galaxy:ransomware=\"BitPaymer\""],"FruitFly":["misp-galaxy:malpedia=\"FruitFly\"","misp-galaxy:mitre-malware=\"FruitFly - S0277\"","misp-galaxy:tool=\"FruitFly\""],"Quimitchin":["misp-galaxy:malpedia=\"FruitFly\""],"Furtim":["misp-galaxy:malpedia=\"Furtim\""],"GEMCUTTER":["misp-galaxy:malpedia=\"GEMCUTTER\""],"GPCode":["misp-galaxy:malpedia=\"GPCode\"","misp-galaxy:ransomware=\"OMG! Ransomware\""],"GPlayed":["misp-galaxy:malpedia=\"GPlayed\""],"GREASE":["misp-galaxy:malpedia=\"GREASE\""],"GROK":["misp-galaxy:malpedia=\"GROK\""],"GalaxyLoader":["misp-galaxy:malpedia=\"GalaxyLoader\""],"Gameover DGA":["misp-galaxy:malpedia=\"Gameover DGA\""],"Gameover P2P":["misp-galaxy:malpedia=\"Gameover P2P\""],"GOZ":["misp-galaxy:malpedia=\"Gameover P2P\""],"ZeuS P2P":["misp-galaxy:malpedia=\"Gameover P2P\""],"Gamotrol":["misp-galaxy:malpedia=\"Gamotrol\""],"Gandcrab":["misp-galaxy:malpedia=\"Gandcrab\""],"GrandCrab":["misp-galaxy:malpedia=\"Gandcrab\""],"Gaudox":["misp-galaxy:malpedia=\"Gaudox\""],"Gauss":["misp-galaxy:malpedia=\"Gauss\""],"Gazer":["misp-galaxy:malpedia=\"Gazer\"","misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"WhiteBear":["misp-galaxy:malpedia=\"Gazer\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"GearInformer":["misp-galaxy:malpedia=\"GearInformer\""],"GetMail":["misp-galaxy:malpedia=\"GetMail\""],"GetMyPass":["misp-galaxy:malpedia=\"GetMyPass\""],"getmypos":["misp-galaxy:malpedia=\"GetMyPass\""],"Gh0stnet":["misp-galaxy:malpedia=\"Gh0stnet\""],"Remosh":["misp-galaxy:malpedia=\"Gh0stnet\""],"Ghole":["misp-galaxy:malpedia=\"Ghole\""],"CoreImpact (Modified)":["misp-galaxy:malpedia=\"Ghole\""],"Gholee":["misp-galaxy:malpedia=\"Ghole\""],"Ghost RAT":["misp-galaxy:malpedia=\"Ghost RAT\""],"Gh0st RAT":["misp-galaxy:malpedia=\"Ghost RAT\"","misp-galaxy:rat=\"Gh0st RAT\""],"PCRat":["misp-galaxy:malpedia=\"Ghost RAT\""],"GhostAdmin":["misp-galaxy:malpedia=\"GhostAdmin\"","misp-galaxy:tool=\"GhostAdmin\""],"Ghost iBot":["misp-galaxy:malpedia=\"GhostAdmin\""],"GhostMiner":["misp-galaxy:malpedia=\"GhostMiner\"","misp-galaxy:tool=\"GhostMiner\""],"GlanceLove":["misp-galaxy:malpedia=\"GlanceLove\""],"GlassRAT":["misp-galaxy:malpedia=\"GlassRAT\""],"Glasses":["misp-galaxy:malpedia=\"Glasses\""],"Wordpress Bruteforcer":["misp-galaxy:malpedia=\"Glasses\""],"GlitchPOS":["misp-galaxy:malpedia=\"GlitchPOS\""],"Globe":["misp-galaxy:malpedia=\"Globe\""],"GlobeImposter":["misp-galaxy:malpedia=\"GlobeImposter\"","misp-galaxy:ransomware=\"Fake Globe Ransomware\"","misp-galaxy:ransomware=\"GlobeImposter\""],"GlooxMail":["misp-galaxy:malpedia=\"GlooxMail\""],"Glupteba":["misp-galaxy:malpedia=\"Glupteba\""],"Godzilla Loader":["misp-galaxy:malpedia=\"Godzilla Loader\""],"Goggles":["misp-galaxy:malpedia=\"Goggles\""],"GoldDragon":["misp-galaxy:malpedia=\"GoldDragon\""],"GoldenEye":["misp-galaxy:malpedia=\"GoldenEye\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petya\/Mischa":["misp-galaxy:malpedia=\"GoldenEye\""],"GoldenRAT":["misp-galaxy:malpedia=\"GoldenRAT\""],"Golroted":["misp-galaxy:malpedia=\"Golroted\""],"GooPic Drooper":["misp-galaxy:malpedia=\"GooPic Drooper\""],"Goodor":["misp-galaxy:malpedia=\"Goodor\""],"Fuerboos":["misp-galaxy:malpedia=\"Goodor\""],"GoogleDrive RAT":["misp-galaxy:malpedia=\"GoogleDrive RAT\""],"GootKit":["misp-galaxy:malpedia=\"GootKit\"","misp-galaxy:tool=\"GootKit\""],"Xswkit":["misp-galaxy:malpedia=\"GootKit\""],"talalpek":["misp-galaxy:malpedia=\"GootKit\""],"GovRAT":["misp-galaxy:malpedia=\"GovRAT\"","misp-galaxy:rat=\"GovRAT\""],"Gozi CRM":["misp-galaxy:malpedia=\"Gozi\""],"GrabBot":["misp-galaxy:malpedia=\"GrabBot\""],"Graftor":["misp-galaxy:malpedia=\"Graftor\"","misp-galaxy:tool=\"Aumlib\""],"Grateful POS":["misp-galaxy:malpedia=\"Grateful POS\""],"FrameworkPOS":["misp-galaxy:malpedia=\"Grateful POS\""],"trinity":["misp-galaxy:malpedia=\"Grateful POS\""],"Gratem":["misp-galaxy:malpedia=\"Gratem\""],"Gravity RAT":["misp-galaxy:malpedia=\"Gravity RAT\""],"GreenShaitan":["misp-galaxy:malpedia=\"GreenShaitan\""],"eoehttp":["misp-galaxy:malpedia=\"GreenShaitan\""],"GreyEnergy":["misp-galaxy:malpedia=\"GreyEnergy\"","misp-galaxy:mitre-malware=\"GreyEnergy - S0342\"","misp-galaxy:threat-actor=\"GreyEnergy\""],"Griffon":["misp-galaxy:malpedia=\"Griffon\""],"GuiInject":["misp-galaxy:malpedia=\"GuiInject\""],"Gustuff":["misp-galaxy:malpedia=\"Gustuff\""],"H1N1 Loader":["misp-galaxy:malpedia=\"H1N1 Loader\""],"HALFBAKED":["misp-galaxy:malpedia=\"HALFBAKED\"","misp-galaxy:mitre-enterprise-attack-malware=\"HALFBAKED - S0151\"","misp-galaxy:mitre-malware=\"HALFBAKED - S0151\"","misp-galaxy:tool=\"VB Flash\""],"HLUX":["misp-galaxy:malpedia=\"HLUX\""],"HOPLIGHT":["misp-galaxy:malpedia=\"HOPLIGHT\"","misp-galaxy:mitre-malware=\"HOPLIGHT - S0376\""],"HTML5 Encoding":["misp-galaxy:malpedia=\"HTML5 Encoding\""],"HTran":["misp-galaxy:malpedia=\"HTran\"","misp-galaxy:tool=\"Htran\""],"HUC Packet Transmit Tool":["misp-galaxy:malpedia=\"HTran\"","misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"HackSpy":["misp-galaxy:malpedia=\"HackSpy\""],"Hacksfase":["misp-galaxy:malpedia=\"Hacksfase\""],"Haiduc":["misp-galaxy:malpedia=\"Haiduc\""],"Hakai":["misp-galaxy:malpedia=\"Hakai\""],"Hamweq":["misp-galaxy:malpedia=\"Hamweq\""],"Hancitor":["misp-galaxy:malpedia=\"Hancitor\"","misp-galaxy:tool=\"Hancitor\""],"Chanitor":["misp-galaxy:malpedia=\"Hancitor\"","misp-galaxy:tool=\"Hancitor\""],"HappyLocker (HiddenTear?)":["misp-galaxy:malpedia=\"HappyLocker (HiddenTear?)\""],"Harnig":["misp-galaxy:malpedia=\"Harnig\""],"Piptea":["misp-galaxy:malpedia=\"Harnig\""],"Havex RAT":["misp-galaxy:malpedia=\"Havex RAT\"","misp-galaxy:tool=\"Havex RAT\""],"HawkEye Keylogger":["misp-galaxy:malpedia=\"HawkEye Keylogger\""],"HawkEye Reborn":["misp-galaxy:malpedia=\"HawkEye Keylogger\""],"Predator Pain":["misp-galaxy:malpedia=\"HawkEye Keylogger\"","misp-galaxy:rat=\"Predator Pain\""],"Helauto":["misp-galaxy:malpedia=\"Helauto\""],"Helminth":["misp-galaxy:malpedia=\"Helminth\"","misp-galaxy:mitre-enterprise-attack-malware=\"Helminth - S0170\"","misp-galaxy:mitre-malware=\"Helminth - S0170\""],"Heloag":["misp-galaxy:malpedia=\"Heloag\""],"Herbst":["misp-galaxy:malpedia=\"Herbst\"","misp-galaxy:ransomware=\"Herbst\""],"Heriplor":["misp-galaxy:malpedia=\"Heriplor\""],"Hermes Ransomware":["misp-galaxy:malpedia=\"Hermes Ransomware\"","misp-galaxy:ransomware=\"Hermes Ransomware\""],"Hermes":["misp-galaxy:malpedia=\"Hermes\""],"HeroRAT":["misp-galaxy:malpedia=\"HeroRAT\""],"HerpesBot":["misp-galaxy:malpedia=\"HerpesBot\""],"HesperBot":["misp-galaxy:malpedia=\"HesperBot\""],"Hi-Zor RAT":["misp-galaxy:malpedia=\"Hi-Zor RAT\""],"HiKit":["misp-galaxy:malpedia=\"HiKit\""],"HiddenLotus":["misp-galaxy:malpedia=\"HiddenLotus\""],"HiddenTear":["misp-galaxy:malpedia=\"HiddenTear\"","misp-galaxy:ransomware=\"HiddenTear\""],"HideDRV":["misp-galaxy:malpedia=\"HideDRV\""],"HtBot":["misp-galaxy:malpedia=\"HtBot\""],"HttpBrowser":["misp-galaxy:malpedia=\"HttpBrowser\""],"Hworm":["misp-galaxy:malpedia=\"Hworm\"","misp-galaxy:tool=\"Hworm\""],"houdini":["misp-galaxy:malpedia=\"Hworm\""],"HyperBro":["misp-galaxy:malpedia=\"HyperBro\""],"IDKEY":["misp-galaxy:malpedia=\"IDKEY\""],"IISniff":["misp-galaxy:malpedia=\"IISniff\""],"IRONHALO":["misp-galaxy:malpedia=\"IRONHALO\""],"IRRat":["misp-galaxy:malpedia=\"IRRat\""],"ISFB":["misp-galaxy:malpedia=\"ISFB\""],"Pandemyia":["misp-galaxy:malpedia=\"ISFB\""],"ISMAgent":["misp-galaxy:malpedia=\"ISMAgent\""],"ISMDoor":["misp-galaxy:malpedia=\"ISMDoor\""],"ISR Stealer":["misp-galaxy:malpedia=\"ISR Stealer\""],"IcedID Downloader":["misp-galaxy:malpedia=\"IcedID Downloader\""],"BokBot":["misp-galaxy:malpedia=\"IcedID\""],"Icefog":["misp-galaxy:malpedia=\"Icefog\""],"Imecab":["misp-galaxy:malpedia=\"Imecab\""],"Imminent Monitor RAT":["misp-galaxy:malpedia=\"Imminent Monitor RAT\""],"Infy":["misp-galaxy:malpedia=\"Infy\"","misp-galaxy:threat-actor=\"Infy\""],"Foudre":["misp-galaxy:malpedia=\"Infy\""],"InnaputRAT":["misp-galaxy:malpedia=\"InnaputRAT\"","misp-galaxy:mitre-malware=\"InnaputRAT - S0259\""],"InvisiMole":["misp-galaxy:malpedia=\"InvisiMole\"","misp-galaxy:mitre-malware=\"InvisiMole - S0260\"","misp-galaxy:tool=\"InvisiMole\""],"IoT Reaper":["misp-galaxy:malpedia=\"IoT Reaper\""],"IoTroop":["misp-galaxy:malpedia=\"IoT Reaper\""],"Reaper":["misp-galaxy:malpedia=\"IoT Reaper\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"Irc16":["misp-galaxy:malpedia=\"Irc16\""],"IsSpace":["misp-galaxy:malpedia=\"IsSpace\"","misp-galaxy:tool=\"IsSpace\""],"IsraBye":["misp-galaxy:malpedia=\"IsraBye\"","misp-galaxy:ransomware=\"IsraBye\""],"JCry":["misp-galaxy:malpedia=\"JCry\""],"JQJSNICKER":["misp-galaxy:malpedia=\"JQJSNICKER\""],"JackPOS":["misp-galaxy:malpedia=\"JackPOS\""],"JadeRAT":["misp-galaxy:malpedia=\"JadeRAT\"","misp-galaxy:rat=\"JadeRAT\""],"Jaff":["misp-galaxy:malpedia=\"Jaff\"","misp-galaxy:ransomware=\"Jaff\""],"Jager Decryptor":["misp-galaxy:malpedia=\"Jager Decryptor\""],"Jaku":["misp-galaxy:malpedia=\"Jaku\""],"C3PRO-RACOON":["misp-galaxy:malpedia=\"Jaku\""],"KCNA Infostealer":["misp-galaxy:malpedia=\"Jaku\""],"Reconcyc":["misp-galaxy:malpedia=\"Jaku\""],"Jasus":["misp-galaxy:malpedia=\"Jasus\""],"JavaDispCash":["misp-galaxy:malpedia=\"JavaDispCash\""],"JenX":["misp-galaxy:malpedia=\"JenX\""],"Jigsaw":["misp-galaxy:malpedia=\"Jigsaw\"","misp-galaxy:ransomware=\"Jigsaw\""],"Jimmy":["misp-galaxy:malpedia=\"Jimmy\"","misp-galaxy:malpedia=\"Neutrino POS\""],"Joanap":["misp-galaxy:malpedia=\"Joanap\""],"Joao":["misp-galaxy:malpedia=\"Joao\"","misp-galaxy:tool=\"Joao\""],"Jolob":["misp-galaxy:malpedia=\"Jolob\"","misp-galaxy:tool=\"Jolob\""],"JripBot":["misp-galaxy:malpedia=\"JripBot\""],"KAgent":["misp-galaxy:malpedia=\"KAgent\""],"KEYMARBLE":["misp-galaxy:malpedia=\"KEYMARBLE\"","misp-galaxy:mitre-malware=\"KEYMARBLE - S0271\"","misp-galaxy:tool=\"KEYMARBLE\""],"KHRAT":["misp-galaxy:malpedia=\"KHRAT\"","misp-galaxy:tool=\"KHRAT\""],"KINS":["misp-galaxy:malpedia=\"KINS\""],"KLRD":["misp-galaxy:malpedia=\"KLRD\""],"KOMPROGO":["misp-galaxy:malpedia=\"KOMPROGO\"","misp-galaxy:mitre-enterprise-attack-malware=\"KOMPROGO - S0156\"","misp-galaxy:mitre-malware=\"KOMPROGO - S0156\""],"KPOT Stealer":["misp-galaxy:malpedia=\"KPOT Stealer\""],"KSL0T":["misp-galaxy:malpedia=\"KSL0T\""],"Kaiten":["misp-galaxy:malpedia=\"Kaiten\""],"STD":["misp-galaxy:malpedia=\"Kaiten\""],"Karagany":["misp-galaxy:malpedia=\"Karagany\""],"Kardon Loader":["misp-galaxy:malpedia=\"Kardon Loader\""],"Karkoff":["misp-galaxy:malpedia=\"Karkoff\"","misp-galaxy:tool=\"Karkoff\""],"KasperAgent":["misp-galaxy:malpedia=\"KasperAgent\""],"Kazuar":["misp-galaxy:malpedia=\"Kazuar\"","misp-galaxy:mitre-malware=\"Kazuar - S0265\"","misp-galaxy:tool=\"Kazuar\""],"KeRanger":["misp-galaxy:malpedia=\"KeRanger\"","misp-galaxy:ransomware=\"KeRanger\""],"Kegotip":["misp-galaxy:malpedia=\"Kegotip\""],"KerrDown":["misp-galaxy:malpedia=\"KerrDown\""],"KevDroid":["misp-galaxy:malpedia=\"KevDroid\""],"KeyBase":["misp-galaxy:malpedia=\"KeyBase\""],"Kibex":["misp-galaxy:malpedia=\"KeyBase\""],"KeyBoy":["misp-galaxy:malpedia=\"KeyBoy\"","misp-galaxy:malpedia=\"Yahoyah\"","misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\"","misp-galaxy:threat-actor=\"Pirate Panda\"","misp-galaxy:tool=\"KeyBoy\""],"TSSL":["misp-galaxy:malpedia=\"KeyBoy\""],"KeyPass":["misp-galaxy:malpedia=\"KeyPass\"","misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"KEYPASS\""],"Keydnap":["misp-galaxy:malpedia=\"Keydnap\"","misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"Kikothac":["misp-galaxy:malpedia=\"Kikothac\""],"KillDisk":["misp-galaxy:malpedia=\"KillDisk\"","misp-galaxy:tool=\"KillDisk Wiper\""],"Kitmos":["misp-galaxy:malpedia=\"Kitmos\""],"KitM":["misp-galaxy:malpedia=\"Kitmos\""],"KleptoParasite Stealer":["misp-galaxy:malpedia=\"KleptoParasite Stealer\""],"Joglog":["misp-galaxy:malpedia=\"KleptoParasite Stealer\""],"Koadic":["misp-galaxy:malpedia=\"Koadic\"","misp-galaxy:mitre-tool=\"Koadic - S0250\"","misp-galaxy:tool=\"Koadic\""],"KokoKrypt":["misp-galaxy:malpedia=\"KokoKrypt\""],"Koler":["misp-galaxy:malpedia=\"Koler\""],"Komplex":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"Komplex - S0162\"","misp-galaxy:mitre-malware=\"Komplex - S0162\""],"JHUHUGIT":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"JKEYSKW":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"SedUploader":["misp-galaxy:malpedia=\"Komplex\""],"Konni":["misp-galaxy:malpedia=\"Konni\"","misp-galaxy:rat=\"Konni\""],"KoobFace":["misp-galaxy:malpedia=\"KoobFace\""],"KopiLuwak":["misp-galaxy:malpedia=\"KopiLuwak\""],"Korlia":["misp-galaxy:malpedia=\"Korlia\""],"Bisonal":["misp-galaxy:malpedia=\"Korlia\"","misp-galaxy:mitre-malware=\"Bisonal - S0268\"","misp-galaxy:tool=\"Bisonal\""],"Kovter":["misp-galaxy:malpedia=\"Kovter\""],"KrBanker":["misp-galaxy:malpedia=\"KrBanker\""],"BlackMoon":["misp-galaxy:malpedia=\"KrBanker\""],"KrDownloader":["misp-galaxy:malpedia=\"KrDownloader\""],"Osiris":["misp-galaxy:malpedia=\"Kronos\""],"Kuaibu":["misp-galaxy:malpedia=\"Kuaibu\""],"Barys":["misp-galaxy:malpedia=\"Kuaibu\""],"Gofot":["misp-galaxy:malpedia=\"Kuaibu\""],"Kuaibpy":["misp-galaxy:malpedia=\"Kuaibu\""],"Kuluoz":["misp-galaxy:malpedia=\"Kuluoz\""],"Kurton":["misp-galaxy:malpedia=\"Kurton\""],"Kutaki":["misp-galaxy:malpedia=\"Kutaki\""],"Kwampirs":["misp-galaxy:malpedia=\"Kwampirs\"","misp-galaxy:mitre-malware=\"Kwampirs - S0236\"","misp-galaxy:tool=\"Kwampirs\""],"LOWBALL":["misp-galaxy:malpedia=\"LOWBALL\"","misp-galaxy:mitre-enterprise-attack-malware=\"LOWBALL - S0042\"","misp-galaxy:mitre-malware=\"LOWBALL - S0042\""],"Lady":["misp-galaxy:malpedia=\"Lady\""],"Lambert":["misp-galaxy:malpedia=\"Lambert\""],"Lamdelin":["misp-galaxy:malpedia=\"Lamdelin\""],"Laoshu":["misp-galaxy:malpedia=\"Laoshu\""],"LatentBot":["misp-galaxy:malpedia=\"LatentBot\""],"Lazarus (Android)":["misp-galaxy:malpedia=\"Lazarus (Android)\""],"Lazarus (Windows)":["misp-galaxy:malpedia=\"Lazarus (Windows)\""],"Lazarus ELF Backdoor":["misp-galaxy:malpedia=\"Lazarus ELF Backdoor\""],"Laziok":["misp-galaxy:malpedia=\"Laziok\"","misp-galaxy:tool=\"Trojan.Laziok\""],"LazyCat":["misp-galaxy:malpedia=\"LazyCat\""],"Leash":["misp-galaxy:malpedia=\"Leash\""],"Leouncia":["misp-galaxy:malpedia=\"Leouncia\""],"shoco":["misp-galaxy:malpedia=\"Leouncia\""],"Leverage":["misp-galaxy:malpedia=\"Leverage\""],"LimeRAT":["misp-galaxy:malpedia=\"LimeRAT\""],"Limitail":["misp-galaxy:malpedia=\"Limitail\""],"Listrix":["misp-galaxy:malpedia=\"Listrix\""],"LiteHTTP":["misp-galaxy:malpedia=\"LiteHTTP\""],"LoJax":["misp-galaxy:malpedia=\"LoJax\"","misp-galaxy:tool=\"LoJax\""],"LockPOS":["misp-galaxy:malpedia=\"LockPOS\""],"LockerGoga":["misp-galaxy:malpedia=\"LockerGoga\"","misp-galaxy:ransomware=\"LockerGoga\""],"Locky (Decryptor)":["misp-galaxy:malpedia=\"Locky (Decryptor)\""],"Locky Loader":["misp-galaxy:malpedia=\"Locky Loader\""],"Locky":["misp-galaxy:malpedia=\"Locky\"","misp-galaxy:ransomware=\"Locky\""],"Loda":["misp-galaxy:malpedia=\"Loda\""],"Nymeria":["misp-galaxy:malpedia=\"Loda\""],"LogPOS":["misp-galaxy:malpedia=\"LogPOS\""],"Logedrut":["misp-galaxy:malpedia=\"Logedrut\""],"Loki Password Stealer (PWS)":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\""],"Loki":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\"","misp-galaxy:malpedia=\"Loki\""],"LokiPWS":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\""],"Lordix":["misp-galaxy:malpedia=\"Lordix\""],"LuckyCat":["misp-galaxy:malpedia=\"LuckyCat\""],"Luminosity RAT":["misp-galaxy:malpedia=\"Luminosity RAT\""],"LunchMoney":["misp-galaxy:malpedia=\"LunchMoney\""],"Lurk":["misp-galaxy:malpedia=\"Lurk\""],"Luzo":["misp-galaxy:malpedia=\"Luzo\""],"Lyposit":["misp-galaxy:malpedia=\"Lyposit\""],"Adneukine":["misp-galaxy:malpedia=\"Lyposit\""],"Bomba Locker":["misp-galaxy:malpedia=\"Lyposit\""],"Lucky Locker":["misp-galaxy:malpedia=\"Lyposit\""],"MAPIget":["misp-galaxy:malpedia=\"MAPIget\""],"MBRlock":["misp-galaxy:malpedia=\"MBRlock\""],"DexLocker":["misp-galaxy:malpedia=\"MBRlock\""],"MECHANICAL":["misp-galaxy:malpedia=\"MECHANICAL\""],"MILKMAID":["misp-galaxy:malpedia=\"MILKMAID\""],"MM Core":["misp-galaxy:malpedia=\"MM Core\"","misp-galaxy:tool=\"MM Core\""],"MPKBot":["misp-galaxy:malpedia=\"MPKBot\""],"MPK":["misp-galaxy:malpedia=\"MPKBot\""],"MS Exchange Tool":["misp-galaxy:malpedia=\"MS Exchange Tool\""],"MaMi":["misp-galaxy:malpedia=\"MaMi\""],"MacDownloader":["misp-galaxy:malpedia=\"MacDownloader\"","misp-galaxy:tool=\"MacDownloader\""],"MacInstaller":["misp-galaxy:malpedia=\"MacInstaller\""],"MacRansom":["misp-galaxy:malpedia=\"MacRansom\"","misp-galaxy:ransomware=\"MacRansom\""],"MacSpy":["misp-galaxy:malpedia=\"MacSpy\"","misp-galaxy:mitre-malware=\"MacSpy - S0282\"","misp-galaxy:rat=\"MacSpy\""],"MacVX":["misp-galaxy:malpedia=\"MacVX\""],"Machete":["misp-galaxy:malpedia=\"Machete\"","misp-galaxy:threat-actor=\"El Machete\""],"El Machete":["misp-galaxy:malpedia=\"Machete\"","misp-galaxy:threat-actor=\"El Machete\""],"MadMax":["misp-galaxy:malpedia=\"MadMax\""],"Magala":["misp-galaxy:malpedia=\"Magala\""],"Magniber":["misp-galaxy:malpedia=\"Magniber\""],"Maintools.js":["misp-galaxy:malpedia=\"Maintools.js\""],"MajikPos":["misp-galaxy:malpedia=\"MajikPos\""],"MakLoader":["misp-galaxy:malpedia=\"MakLoader\""],"Makadocs":["misp-galaxy:malpedia=\"Makadocs\""],"Maktub":["misp-galaxy:malpedia=\"Maktub\""],"MalumPOS":["misp-galaxy:malpedia=\"MalumPOS\""],"Mamba":["misp-galaxy:malpedia=\"Mamba\"","misp-galaxy:ransomware=\"HDDCryptor\""],"DiskCryptor":["misp-galaxy:malpedia=\"Mamba\""],"HDDCryptor":["misp-galaxy:malpedia=\"Mamba\"","misp-galaxy:ransomware=\"HDDCryptor\""],"ManItsMe":["misp-galaxy:malpedia=\"ManItsMe\""],"ManameCrypt":["misp-galaxy:malpedia=\"ManameCrypt\""],"CryptoHost":["misp-galaxy:malpedia=\"ManameCrypt\"","misp-galaxy:ransomware=\"CryptoHost\""],"Mangzamel":["misp-galaxy:malpedia=\"Mangzamel\""],"junidor":["misp-galaxy:malpedia=\"Mangzamel\""],"mengkite":["misp-galaxy:malpedia=\"Mangzamel\""],"vedratve":["misp-galaxy:malpedia=\"Mangzamel\""],"Manifestus":["misp-galaxy:malpedia=\"Manifestus\"","misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"Marap":["misp-galaxy:malpedia=\"Marap\""],"Marcher":["misp-galaxy:malpedia=\"Marcher\"","misp-galaxy:mitre-malware=\"Marcher - S0317\""],"Masuta":["misp-galaxy:malpedia=\"Masuta\"","misp-galaxy:tool=\"Masuta\""],"PureMasuta":["misp-galaxy:malpedia=\"Masuta\"","misp-galaxy:tool=\"Masuta\""],"Matrix Ransom":["misp-galaxy:malpedia=\"Matrix Ransom\""],"Matryoshka RAT":["misp-galaxy:malpedia=\"Matryoshka RAT\""],"Matsnu":["misp-galaxy:malpedia=\"Matsnu\""],"MazarBot":["misp-galaxy:malpedia=\"MazarBot\""],"Mebromi":["misp-galaxy:malpedia=\"Mebromi\""],"MyBios":["misp-galaxy:malpedia=\"Mebromi\""],"Medre":["misp-galaxy:malpedia=\"Medre\""],"Medusa":["misp-galaxy:malpedia=\"Medusa\""],"Merlin":["misp-galaxy:malpedia=\"Merlin\""],"Metamorfo":["misp-galaxy:malpedia=\"Metamorfo\""],"Casbaneiro":["misp-galaxy:malpedia=\"Metamorfo\""],"Mewsei":["misp-galaxy:malpedia=\"Mewsei\""],"MiKey":["misp-galaxy:malpedia=\"MiKey\""],"Miancha":["misp-galaxy:malpedia=\"Miancha\""],"Micrass":["misp-galaxy:malpedia=\"Micrass\""],"Microcin":["misp-galaxy:malpedia=\"Microcin\"","misp-galaxy:threat-actor=\"Microcin\""],"Micropsia":["misp-galaxy:malpedia=\"Micropsia\"","misp-galaxy:mitre-malware=\"Micropsia - S0339\""],"Mikoponi":["misp-galaxy:malpedia=\"Mikoponi\""],"MimiKatz":["misp-galaxy:malpedia=\"MimiKatz\""],"MiniASP":["misp-galaxy:malpedia=\"MiniASP\""],"Mirage":["misp-galaxy:malpedia=\"Mirage\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"MirageFox":["misp-galaxy:malpedia=\"MirageFox\"","misp-galaxy:mitre-malware=\"MirageFox - S0280\""],"Mirai (ELF)":["misp-galaxy:malpedia=\"Mirai (ELF)\""],"Mirai (Windows)":["misp-galaxy:malpedia=\"Mirai (Windows)\""],"Misdat":["misp-galaxy:malpedia=\"Misdat\"","misp-galaxy:mitre-enterprise-attack-malware=\"Misdat - S0083\"","misp-galaxy:mitre-malware=\"Misdat - S0083\""],"Misfox":["misp-galaxy:malpedia=\"Misfox\""],"MixFox":["misp-galaxy:malpedia=\"Misfox\""],"ModPack":["misp-galaxy:malpedia=\"Misfox\""],"Miuref":["misp-galaxy:malpedia=\"Miuref\""],"MobiRAT":["misp-galaxy:malpedia=\"MobiRAT\""],"Mocton":["misp-galaxy:malpedia=\"Mocton\""],"ModPOS":["misp-galaxy:malpedia=\"ModPOS\""],"straxbot":["misp-galaxy:malpedia=\"ModPOS\""],"Moker":["misp-galaxy:malpedia=\"Moker\""],"Mokes (ELF)":["misp-galaxy:malpedia=\"Mokes (ELF)\""],"Mokes (OS X)":["misp-galaxy:malpedia=\"Mokes (OS X)\""],"Mokes (Windows)":["misp-galaxy:malpedia=\"Mokes (Windows)\""],"Mole":["misp-galaxy:malpedia=\"Mole\""],"Molerat Loader":["misp-galaxy:malpedia=\"Molerat Loader\""],"Monero Miner":["misp-galaxy:malpedia=\"Monero Miner\""],"CoinMiner":["misp-galaxy:malpedia=\"Monero Miner\"","misp-galaxy:tool=\"CoinMiner\""],"MoonWind":["misp-galaxy:malpedia=\"MoonWind\"","misp-galaxy:mitre-enterprise-attack-malware=\"MoonWind - S0149\"","misp-galaxy:mitre-malware=\"MoonWind - S0149\"","misp-galaxy:rat=\"MoonWind\"","misp-galaxy:tool=\"MoonWind\""],"Moose":["misp-galaxy:malpedia=\"Moose\""],"More_eggs":["misp-galaxy:malpedia=\"More_eggs\"","misp-galaxy:mitre-malware=\"More_eggs - S0284\""],"SpicyOmelette":["misp-galaxy:malpedia=\"More_eggs\"","misp-galaxy:tool=\"SpicyOmelette\""],"Morphine":["misp-galaxy:malpedia=\"Morphine\""],"Morto":["misp-galaxy:malpedia=\"Morto\""],"Mosquito":["misp-galaxy:malpedia=\"Mosquito\"","misp-galaxy:mitre-malware=\"Mosquito - S0256\""],"Moure":["misp-galaxy:malpedia=\"Moure\""],"MrBlack":["misp-galaxy:malpedia=\"MrBlack\""],"Mughthesec":["misp-galaxy:malpedia=\"Mughthesec\"","misp-galaxy:tool=\"Mughthesec\""],"Multigrain POS":["misp-galaxy:malpedia=\"Multigrain POS\""],"Mutabaha":["misp-galaxy:malpedia=\"Mutabaha\""],"MyKings Spreader":["misp-galaxy:malpedia=\"MyKings Spreader\""],"MyloBot":["misp-galaxy:malpedia=\"MyloBot\""],"N40":["misp-galaxy:malpedia=\"N40\""],"NETEAGLE":["misp-galaxy:malpedia=\"NETEAGLE\"","misp-galaxy:mitre-enterprise-attack-malware=\"NETEAGLE - S0034\"","misp-galaxy:mitre-malware=\"NETEAGLE - S0034\""],"ScoutEagle":["misp-galaxy:malpedia=\"NETEAGLE\""],"Nabucur":["misp-galaxy:malpedia=\"Nabucur\""],"Nagini":["misp-galaxy:malpedia=\"Nagini\""],"Naikon":["misp-galaxy:malpedia=\"Naikon\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Naikon - G0019\"","misp-galaxy:mitre-intrusion-set=\"Naikon - G0019\"","misp-galaxy:threat-actor=\"Naikon\""],"NanHaiShu":["misp-galaxy:malpedia=\"NanHaiShu\"","misp-galaxy:mitre-enterprise-attack-malware=\"NanHaiShu - S0228\"","misp-galaxy:mitre-malware=\"NanHaiShu - S0228\"","misp-galaxy:tool=\"NanHaiShu\""],"NanoLocker":["misp-galaxy:malpedia=\"NanoLocker\"","misp-galaxy:ransomware=\"NanoLocker\""],"Nanocore RAT":["misp-galaxy:malpedia=\"Nanocore RAT\""],"Narilam":["misp-galaxy:malpedia=\"Narilam\""],"Nautilus":["misp-galaxy:malpedia=\"Nautilus\"","misp-galaxy:tool=\"Nautilus\""],"NavRAT":["misp-galaxy:malpedia=\"NavRAT\"","misp-galaxy:mitre-malware=\"NavRAT - S0247\"","misp-galaxy:rat=\"NavRAT\""],"Necurs":["misp-galaxy:malpedia=\"Necurs\"","misp-galaxy:tool=\"Necurs\""],"nucurs":["misp-galaxy:malpedia=\"Necurs\""],"Nemim":["misp-galaxy:malpedia=\"Nemim\"","misp-galaxy:threat-actor=\"DarkHotel\""],"Nemain":["misp-galaxy:malpedia=\"Nemim\""],"NetC":["misp-galaxy:malpedia=\"NetC\"","misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"NetSupportManager RAT":["misp-galaxy:malpedia=\"NetSupportManager RAT\""],"NetTraveler":["misp-galaxy:malpedia=\"NetTraveler\"","misp-galaxy:mitre-enterprise-attack-malware=\"NetTraveler - S0033\"","misp-galaxy:mitre-malware=\"NetTraveler - S0033\"","misp-galaxy:threat-actor=\"NetTraveler\"","misp-galaxy:tool=\"NetTraveler\""],"TravNet":["misp-galaxy:malpedia=\"NetTraveler\"","misp-galaxy:threat-actor=\"NetTraveler\"","misp-galaxy:tool=\"NetTraveler\""],"NetWire RC":["misp-galaxy:malpedia=\"NetWire RC\""],"Recam":["misp-galaxy:malpedia=\"NetWire RC\""],"Netrepser":["misp-galaxy:malpedia=\"Netrepser\""],"Neuron":["misp-galaxy:malpedia=\"Neuron\"","misp-galaxy:tool=\"Neuron\""],"Neutrino POS":["misp-galaxy:malpedia=\"Neutrino POS\""],"Kasidet":["misp-galaxy:malpedia=\"Neutrino\"","misp-galaxy:mitre-enterprise-attack-malware=\"Kasidet - S0088\"","misp-galaxy:mitre-malware=\"Kasidet - S0088\""],"NewCT":["misp-galaxy:malpedia=\"NewCT\"","misp-galaxy:tool=\"NewCT\""],"CT":["misp-galaxy:malpedia=\"NewCT\""],"NewCore RAT":["misp-galaxy:malpedia=\"NewCore RAT\""],"NewPosThings":["misp-galaxy:malpedia=\"NewPosThings\""],"NewsReels":["misp-galaxy:malpedia=\"NewsReels\""],"Nexster Bot":["misp-galaxy:malpedia=\"Nexster Bot\""],"NexusLogger":["misp-galaxy:malpedia=\"NexusLogger\""],"Ngioweb":["misp-galaxy:malpedia=\"Ngioweb\""],"NgrBot":["misp-galaxy:malpedia=\"NgrBot\""],"Nitol":["misp-galaxy:malpedia=\"Nitol\""],"NjRAT":["misp-galaxy:malpedia=\"NjRAT\""],"Bladabindi":["misp-galaxy:malpedia=\"NjRAT\"","misp-galaxy:tool=\"njRAT\""],"Nocturnal Stealer":["misp-galaxy:malpedia=\"Nocturnal Stealer\"","misp-galaxy:stealer=\"Nocturnal Stealer\""],"Nokki":["misp-galaxy:malpedia=\"Nokki\""],"Nozelesn (Decryptor)":["misp-galaxy:malpedia=\"Nozelesn (Decryptor)\""],"Nymaim":["misp-galaxy:malpedia=\"Nymaim\"","misp-galaxy:tool=\"Nymaim\""],"nymain":["misp-galaxy:malpedia=\"Nymaim\""],"Nymaim2":["misp-galaxy:malpedia=\"Nymaim2\""],"OLDBAIT":["misp-galaxy:malpedia=\"OLDBAIT\"","misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\"","misp-galaxy:tool=\"OLDBAIT\""],"Sasfis":["misp-galaxy:malpedia=\"OLDBAIT\"","misp-galaxy:malpedia=\"Sasfis\"","misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\"","misp-galaxy:tool=\"OLDBAIT\""],"ONHAT":["misp-galaxy:malpedia=\"ONHAT\""],"ORANGEADE":["misp-galaxy:malpedia=\"ORANGEADE\""],"OceanLotus":["misp-galaxy:malpedia=\"OceanLotus\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"Oceansalt":["misp-galaxy:malpedia=\"Oceansalt\""],"Octopus":["misp-galaxy:malpedia=\"Octopus\"","misp-galaxy:mitre-malware=\"Octopus - S0340\""],"OddJob":["misp-galaxy:malpedia=\"OddJob\""],"Odinaff":["misp-galaxy:malpedia=\"Odinaff\"","misp-galaxy:tool=\"Odinaff\""],"OilRig":["misp-galaxy:malpedia=\"OilRig\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"OilRig - G0049\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"CHRYSENE\"","misp-galaxy:threat-actor=\"OilRig\""],"Olympic Destroyer":["misp-galaxy:malpedia=\"Olympic Destroyer\"","misp-galaxy:mitre-malware=\"Olympic Destroyer - S0365\"","misp-galaxy:tool=\"Olympic Destroyer\""],"Olyx":["misp-galaxy:malpedia=\"Olyx\""],"OmniRAT":["misp-galaxy:malpedia=\"OmniRAT\"","misp-galaxy:rat=\"OmniRAT\""],"OneKeyLocker":["misp-galaxy:malpedia=\"OneKeyLocker\""],"OnionDuke":["misp-galaxy:malpedia=\"OnionDuke\"","misp-galaxy:mitre-enterprise-attack-malware=\"OnionDuke - S0052\"","misp-galaxy:mitre-malware=\"OnionDuke - S0052\""],"OnlinerSpambot":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"Onliner":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"SBot":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"OopsIE":["misp-galaxy:malpedia=\"OopsIE\"","misp-galaxy:mitre-malware=\"OopsIE - S0264\""],"OpBlockBuster":["misp-galaxy:malpedia=\"OpBlockBuster\""],"OpGhoul":["misp-galaxy:malpedia=\"OpGhoul\""],"Opachki":["misp-galaxy:malpedia=\"Opachki\""],"OrcaRAT":["misp-galaxy:malpedia=\"OrcaRAT\""],"Orcus RAT":["misp-galaxy:malpedia=\"Orcus RAT\""],"Ordinypt":["misp-galaxy:malpedia=\"Ordinypt\"","misp-galaxy:tool=\"Ordinypt\""],"Outlook Backdoor":["misp-galaxy:malpedia=\"Outlook Backdoor\""],"Overlay RAT":["misp-galaxy:malpedia=\"Overlay RAT\""],"OvidiyStealer":["misp-galaxy:malpedia=\"OvidiyStealer\""],"PAS":["misp-galaxy:malpedia=\"PAS\""],"PC Surveillance System":["misp-galaxy:malpedia=\"PC Surveillance System\""],"PSS":["misp-galaxy:malpedia=\"PC Surveillance System\""],"PHOREAL":["misp-galaxy:malpedia=\"PHOREAL\"","misp-galaxy:mitre-enterprise-attack-malware=\"PHOREAL - S0158\"","misp-galaxy:mitre-malware=\"PHOREAL - S0158\""],"Rizzo":["misp-galaxy:malpedia=\"PHOREAL\""],"PLAINTEE":["misp-galaxy:malpedia=\"PLAINTEE\"","misp-galaxy:mitre-malware=\"PLAINTEE - S0254\"","misp-galaxy:tool=\"PLAINTEE\""],"PLEAD":["misp-galaxy:malpedia=\"PLEAD\"","misp-galaxy:tool=\"PLEAD\""],"TSCookie":["misp-galaxy:malpedia=\"PLEAD\"","misp-galaxy:tool=\"TSCookie\""],"POSHSPY":["misp-galaxy:malpedia=\"POSHSPY\"","misp-galaxy:mitre-enterprise-attack-malware=\"POSHSPY - S0150\"","misp-galaxy:mitre-malware=\"POSHSPY - S0150\""],"POWERPIPE":["misp-galaxy:malpedia=\"POWERPIPE\""],"POWERSOURCE":["misp-galaxy:malpedia=\"POWERSOURCE\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\""],"POWERSTATS":["misp-galaxy:malpedia=\"POWERSTATS\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSTATS - S0223\"","misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"Valyria":["misp-galaxy:malpedia=\"POWERSTATS\""],"POWRUNER":["misp-galaxy:malpedia=\"POWRUNER\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWRUNER - S0184\"","misp-galaxy:mitre-malware=\"POWRUNER - S0184\""],"PadCrypt":["misp-galaxy:malpedia=\"PadCrypt\"","misp-galaxy:ransomware=\"PadCrypt\""],"PandaBanker":["misp-galaxy:malpedia=\"PandaBanker\""],"ZeusPanda":["misp-galaxy:malpedia=\"PandaBanker\""],"Patcher":["misp-galaxy:malpedia=\"Patcher\"","misp-galaxy:ransomware=\"FileCoder\"","misp-galaxy:ransomware=\"Patcher\""],"FileCoder":["misp-galaxy:malpedia=\"Patcher\"","misp-galaxy:ransomware=\"FileCoder\""],"Findzip":["misp-galaxy:malpedia=\"Patcher\""],"Peepy RAT":["misp-galaxy:malpedia=\"Peepy RAT\""],"Penco":["misp-galaxy:malpedia=\"Penco\""],"Penquin Turla":["misp-galaxy:malpedia=\"Penquin Turla\""],"PerlBot":["misp-galaxy:malpedia=\"PerlBot\""],"DDoS Perl IrcBot":["misp-galaxy:malpedia=\"PerlBot\""],"ShellBot":["misp-galaxy:malpedia=\"PerlBot\""],"PetrWrap":["misp-galaxy:malpedia=\"PetrWrap\""],"Petya":["misp-galaxy:malpedia=\"Petya\"","misp-galaxy:ransomware=\"Petya\""],"PhanDoor":["misp-galaxy:malpedia=\"PhanDoor\""],"Philadephia Ransom":["misp-galaxy:malpedia=\"Philadephia Ransom\""],"Phorpiex":["misp-galaxy:malpedia=\"Phorpiex\""],"Trik":["misp-galaxy:malpedia=\"Phorpiex\""],"PintSized":["misp-galaxy:malpedia=\"PintSized\""],"Pirrit":["misp-galaxy:malpedia=\"Pirrit\""],"Pitou":["misp-galaxy:malpedia=\"Pitou\""],"PittyTiger RAT":["misp-galaxy:malpedia=\"PittyTiger RAT\""],"Pkybot":["misp-galaxy:malpedia=\"Pkybot\""],"Bublik":["misp-galaxy:malpedia=\"Pkybot\""],"Pykbot":["misp-galaxy:malpedia=\"Pkybot\""],"TBag":["misp-galaxy:malpedia=\"Pkybot\""],"Plexor":["misp-galaxy:malpedia=\"Plexor\"","misp-galaxy:tool=\"Plexor\""],"Ploutus ATM":["misp-galaxy:malpedia=\"Ploutus ATM\""],"PlugX":["misp-galaxy:malpedia=\"PlugX\"","misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\"","misp-galaxy:rat=\"PlugX\"","misp-galaxy:tool=\"PlugX\""],"Korplug":["misp-galaxy:malpedia=\"PlugX\"","misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\"","misp-galaxy:rat=\"PlugX\"","misp-galaxy:tool=\"PlugX\""],"Poison Ivy":["misp-galaxy:malpedia=\"Poison Ivy\"","misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\"","misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"pivy":["misp-galaxy:malpedia=\"Poison Ivy\""],"poisonivy":["misp-galaxy:malpedia=\"Poison Ivy\"","misp-galaxy:tool=\"poisonivy\""],"Polyglot":["misp-galaxy:malpedia=\"Polyglot\"","misp-galaxy:ransomware=\"Polyglot\""],"Pony":["misp-galaxy:malpedia=\"Pony\"","misp-galaxy:tool=\"Hancitor\""],"Fareit":["misp-galaxy:malpedia=\"Pony\"","misp-galaxy:tool=\"Fareit\""],"Siplog":["misp-galaxy:malpedia=\"Pony\""],"PoohMilk Loader":["misp-galaxy:malpedia=\"PoohMilk Loader\""],"Popcorn Time":["misp-galaxy:malpedia=\"Popcorn Time\""],"PoshC2":["misp-galaxy:malpedia=\"PoshC2\"","misp-galaxy:mitre-tool=\"PoshC2 - S0378\""],"Poweliks Dropper":["misp-galaxy:malpedia=\"Poweliks Dropper\""],"PowerDuke":["misp-galaxy:malpedia=\"PowerDuke\"","misp-galaxy:mitre-enterprise-attack-malware=\"PowerDuke - S0139\"","misp-galaxy:mitre-malware=\"PowerDuke - S0139\""],"PowerPool":["misp-galaxy:malpedia=\"PowerPool\"","misp-galaxy:threat-actor=\"PowerPool\""],"PowerRatankba":["misp-galaxy:malpedia=\"PowerRatankba\"","misp-galaxy:tool=\"PowerRatankba\""],"PowerSpritz":["misp-galaxy:malpedia=\"PowerSpritz\"","misp-galaxy:tool=\"PowerSpritz\""],"PowerWare":["misp-galaxy:malpedia=\"PowerWare\"","misp-galaxy:ransomware=\"PowerWare\""],"Powersniff":["misp-galaxy:malpedia=\"Powersniff\""],"Powmet":["misp-galaxy:malpedia=\"Powmet\""],"Predator The Thief":["misp-galaxy:malpedia=\"Predator The Thief\""],"Premier RAT":["misp-galaxy:malpedia=\"Premier RAT\""],"PresFox":["misp-galaxy:malpedia=\"PresFox\""],"Prikorma":["misp-galaxy:malpedia=\"Prikorma\""],"Prilex":["misp-galaxy:malpedia=\"Prilex\""],"PrincessLocker":["misp-galaxy:malpedia=\"PrincessLocker\""],"Project Alice":["misp-galaxy:malpedia=\"Project Alice\""],"AliceATM":["misp-galaxy:malpedia=\"Project Alice\""],"PrAlice":["misp-galaxy:malpedia=\"Project Alice\""],"Proton RAT":["misp-galaxy:malpedia=\"Proton RAT\""],"Calisto":["misp-galaxy:malpedia=\"Proton RAT\"","misp-galaxy:mitre-malware=\"Calisto - S0274\""],"PsiX":["misp-galaxy:malpedia=\"PsiX\""],"Pteranodon":["misp-galaxy:malpedia=\"Pteranodon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Pteranodon - S0147\"","misp-galaxy:mitre-malware=\"Pteranodon - S0147\""],"PubNubRAT":["misp-galaxy:malpedia=\"PubNubRAT\""],"Punkey POS":["misp-galaxy:malpedia=\"Punkey POS\""],"Putabmow":["misp-galaxy:malpedia=\"Putabmow\""],"PvzOut":["misp-galaxy:malpedia=\"PvzOut\""],"Pwnet":["misp-galaxy:malpedia=\"Pwnet\"","misp-galaxy:tool=\"Pwnet\""],"PyLocky":["misp-galaxy:malpedia=\"PyLocky\""],"Locky Locker":["misp-galaxy:malpedia=\"PyLocky\""],"Pykspa":["misp-galaxy:malpedia=\"Pykspa\""],"QHost":["misp-galaxy:malpedia=\"QHost\""],"Tolouge":["misp-galaxy:malpedia=\"QHost\""],"QRat":["misp-galaxy:malpedia=\"QRat\""],"Quaverse RAT":["misp-galaxy:malpedia=\"QRat\""],"QUADAGENT":["misp-galaxy:malpedia=\"QUADAGENT\"","misp-galaxy:mitre-malware=\"QUADAGENT - S0269\""],"Qaccel":["misp-galaxy:malpedia=\"Qaccel\""],"QakBot":["misp-galaxy:malpedia=\"QakBot\""],"Qbot":["misp-galaxy:malpedia=\"QakBot\"","misp-galaxy:tool=\"Akbot\""],"Qarallax RAT":["misp-galaxy:malpedia=\"Qarallax RAT\""],"Qealler":["misp-galaxy:malpedia=\"Qealler\""],"QtBot":["misp-galaxy:malpedia=\"QtBot\""],"qtproject":["misp-galaxy:malpedia=\"QtBot\""],"Quant Loader":["misp-galaxy:malpedia=\"Quant Loader\"","misp-galaxy:tool=\"Quant Loader\""],"Quasar RAT":["misp-galaxy:malpedia=\"Quasar RAT\"","misp-galaxy:rat=\"Quasar RAT\""],"Qulab":["misp-galaxy:malpedia=\"Qulab\""],"RCS":["misp-galaxy:malpedia=\"RCS\""],"Remote Control System":["misp-galaxy:malpedia=\"RCS\""],"RGDoor":["misp-galaxy:malpedia=\"RGDoor\"","misp-galaxy:mitre-malware=\"RGDoor - S0258\""],"RMS":["misp-galaxy:malpedia=\"RMS\""],"Remote Manipulator System":["misp-galaxy:malpedia=\"RMS\""],"RTM":["misp-galaxy:malpedia=\"RTM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-enterprise-attack-malware=\"RTM - S0148\"","misp-galaxy:mitre-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-malware=\"RTM - S0148\"","misp-galaxy:threat-actor=\"RTM\""],"RadRAT":["misp-galaxy:malpedia=\"RadRAT\"","misp-galaxy:rat=\"RadRAT\""],"Radamant":["misp-galaxy:malpedia=\"Radamant\"","misp-galaxy:ransomware=\"Radamant\""],"Rakhni":["misp-galaxy:malpedia=\"Rakhni\"","misp-galaxy:ransomware=\"Bandarchor\"","misp-galaxy:ransomware=\"Rakhni\""],"Rakos":["misp-galaxy:malpedia=\"Rakos\""],"Rambo":["misp-galaxy:malpedia=\"Rambo\""],"brebsd":["misp-galaxy:malpedia=\"Rambo\""],"Ramdo":["misp-galaxy:malpedia=\"Ramdo\""],"Ranscam":["misp-galaxy:malpedia=\"Ranscam\"","misp-galaxy:ransomware=\"CryptoFinancial\""],"Ransoc":["misp-galaxy:malpedia=\"Ransoc\"","misp-galaxy:ransomware=\"Ransoc\""],"Ransomlock":["misp-galaxy:malpedia=\"Ransomlock\""],"WinLock":["misp-galaxy:malpedia=\"Ransomlock\""],"Rapid Ransom":["misp-galaxy:malpedia=\"Rapid Ransom\""],"RapidStealer":["misp-galaxy:malpedia=\"RapidStealer\""],"Rarog":["misp-galaxy:malpedia=\"Rarog\""],"RatabankaPOS":["misp-galaxy:malpedia=\"RatabankaPOS\""],"Ratty":["misp-galaxy:malpedia=\"Ratty\"","misp-galaxy:rat=\"Ratty\""],"RawPOS":["misp-galaxy:malpedia=\"RawPOS\"","misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"Raxir":["misp-galaxy:malpedia=\"Raxir\""],"Reaver":["misp-galaxy:malpedia=\"Reaver\"","misp-galaxy:mitre-enterprise-attack-malware=\"Reaver - S0172\"","misp-galaxy:mitre-malware=\"Reaver - S0172\"","misp-galaxy:tool=\"Reaver\""],"Red Alert":["misp-galaxy:malpedia=\"Red Alert\"","misp-galaxy:ransomware=\"Red Alert\""],"Red Gambler":["misp-galaxy:malpedia=\"Red Gambler\""],"RedAlpha":["misp-galaxy:malpedia=\"RedAlpha\"","misp-galaxy:threat-actor=\"RedAlpha\""],"RedLeaves":["misp-galaxy:malpedia=\"RedLeaves\"","misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\"","misp-galaxy:rat=\"RedLeaves\""],"Redaman":["misp-galaxy:malpedia=\"Redaman\""],"Redyms":["misp-galaxy:malpedia=\"Redyms\""],"Regin":["misp-galaxy:malpedia=\"Regin\"","misp-galaxy:mitre-enterprise-attack-malware=\"Regin - S0019\"","misp-galaxy:mitre-malware=\"Regin - S0019\"","misp-galaxy:tool=\"Regin\""],"Remcos":["misp-galaxy:malpedia=\"Remcos\"","misp-galaxy:mitre-tool=\"Remcos - S0332\"","misp-galaxy:rat=\"Remcos\""],"Remexi":["misp-galaxy:malpedia=\"Remexi\"","misp-galaxy:mitre-malware=\"Remexi - S0375\""],"Remsec":["misp-galaxy:malpedia=\"Remsec\"","misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Remy":["misp-galaxy:malpedia=\"Remy\""],"Rerdom":["misp-galaxy:malpedia=\"Rerdom\""],"Retadup":["misp-galaxy:malpedia=\"Retadup\""],"Retefe (Android)":["misp-galaxy:malpedia=\"Retefe (Android)\""],"Retefe (Windows)":["misp-galaxy:malpedia=\"Retefe (Windows)\""],"Revenge RAT":["misp-galaxy:malpedia=\"Revenge RAT\""],"Revetrat":["misp-galaxy:malpedia=\"Revenge RAT\""],"Rex":["misp-galaxy:malpedia=\"Rex\""],"Rietspoof":["misp-galaxy:malpedia=\"Rietspoof\""],"Rifdoor":["misp-galaxy:malpedia=\"Rifdoor\""],"Rikamanu":["misp-galaxy:malpedia=\"Rikamanu\""],"Rincux":["misp-galaxy:malpedia=\"Rincux\""],"Ripper ATM":["misp-galaxy:malpedia=\"Ripper ATM\""],"Roaming Mantis":["misp-galaxy:malpedia=\"Roaming Mantis\"","misp-galaxy:threat-actor=\"Roaming Mantis\"","misp-galaxy:tool=\"Roaming Mantis\""],"Rockloader":["misp-galaxy:malpedia=\"Rockloader\""],"Rofin":["misp-galaxy:malpedia=\"Rofin\""],"RogueRobin":["misp-galaxy:malpedia=\"RogueRobin\"","misp-galaxy:mitre-malware=\"RogueRobin - S0270\""],"RogueRobinNET":["misp-galaxy:malpedia=\"RogueRobinNET\""],"RokRAT":["misp-galaxy:malpedia=\"RokRAT\""],"Rokku":["misp-galaxy:malpedia=\"Rokku\"","misp-galaxy:ransomware=\"Rokku\""],"Rombertik":["misp-galaxy:malpedia=\"Rombertik\""],"CarbonGrabber":["misp-galaxy:malpedia=\"Rombertik\""],"Romeo(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Romeo(Alfa,Bravo, ...)\""],"Roopirs":["misp-galaxy:malpedia=\"Roopirs\""],"Roseam":["misp-galaxy:malpedia=\"Roseam\""],"RotorCrypt":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"RotoCrypt":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"Rotor":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"Rakhni\""],"Rover":["misp-galaxy:malpedia=\"Rover\"","misp-galaxy:mitre-enterprise-attack-malware=\"Rover - S0090\"","misp-galaxy:mitre-malware=\"Rover - S0090\""],"Rovnix":["misp-galaxy:malpedia=\"Rovnix\"","misp-galaxy:tool=\"Rovnix\""],"BkLoader":["misp-galaxy:malpedia=\"Rovnix\""],"Cidox":["misp-galaxy:malpedia=\"Rovnix\""],"Mayachok":["misp-galaxy:malpedia=\"Rovnix\""],"Royal DNS":["misp-galaxy:malpedia=\"Royal DNS\""],"RoyalCli":["misp-galaxy:malpedia=\"RoyalCli\"","misp-galaxy:tool=\"RoyalCli\""],"Rozena":["misp-galaxy:malpedia=\"Rozena\""],"Ruckguv":["misp-galaxy:malpedia=\"Ruckguv\"","misp-galaxy:tool=\"Ruckguv\""],"Rumish":["misp-galaxy:malpedia=\"Rumish\""],"Rurktar":["misp-galaxy:malpedia=\"Rurktar\"","misp-galaxy:rat=\"Rurktar\""],"RCSU":["misp-galaxy:malpedia=\"Rurktar\""],"Ryuk":["misp-galaxy:malpedia=\"Ryuk\""],"SAGE":["misp-galaxy:malpedia=\"SAGE\""],"Saga":["misp-galaxy:malpedia=\"SAGE\""],"SHAPESHIFT":["misp-galaxy:malpedia=\"SHAPESHIFT\""],"SHARPKNOT":["misp-galaxy:malpedia=\"SHARPKNOT\"","misp-galaxy:tool=\"SHARPKNOT\""],"Bitrep":["misp-galaxy:malpedia=\"SHARPKNOT\""],"SHIPSHAPE":["misp-galaxy:malpedia=\"SHIPSHAPE\"","misp-galaxy:mitre-enterprise-attack-malware=\"SHIPSHAPE - S0028\"","misp-galaxy:mitre-malware=\"SHIPSHAPE - S0028\""],"SMSspy":["misp-galaxy:malpedia=\"SMSspy\""],"SNEEPY":["misp-galaxy:malpedia=\"SNEEPY\""],"ByeByeShell":["misp-galaxy:malpedia=\"SNEEPY\""],"SNS Locker":["misp-galaxy:malpedia=\"SNS Locker\""],"SOUNDBITE":["misp-galaxy:malpedia=\"SOUNDBITE\"","misp-galaxy:mitre-enterprise-attack-malware=\"SOUNDBITE - S0157\"","misp-galaxy:mitre-malware=\"SOUNDBITE - S0157\""],"denis":["misp-galaxy:malpedia=\"SOUNDBITE\""],"SPACESHIP":["misp-galaxy:malpedia=\"SPACESHIP\"","misp-galaxy:mitre-enterprise-attack-malware=\"SPACESHIP - S0035\"","misp-galaxy:mitre-malware=\"SPACESHIP - S0035\""],"SQLRat":["misp-galaxy:malpedia=\"SQLRat\""],"SSHDoor":["misp-galaxy:malpedia=\"SSHDoor\"","misp-galaxy:tool=\"SSHDoor\""],"STOP Ransomware":["misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"STOP Ransomware\""],"Djvu":["misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"Djvu\""],"Sakula RAT":["misp-galaxy:malpedia=\"Sakula RAT\""],"Sakurel":["misp-galaxy:malpedia=\"Sakula RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\"","misp-galaxy:tool=\"Sakula\""],"Salgorea":["misp-galaxy:malpedia=\"Salgorea\""],"SamSam":["misp-galaxy:malpedia=\"SamSam\"","misp-galaxy:mitre-malware=\"SamSam - S0370\"","misp-galaxy:ransomware=\"Samas-Samsam\""],"Sanny":["misp-galaxy:malpedia=\"Sanny\""],"Daws":["misp-galaxy:malpedia=\"Sanny\""],"Saphyra":["misp-galaxy:malpedia=\"Saphyra\""],"SappyCache":["misp-galaxy:malpedia=\"SappyCache\""],"Sarhust":["misp-galaxy:malpedia=\"Sarhust\""],"Hussarini":["misp-galaxy:malpedia=\"Sarhust\""],"Satan Ransomware":["misp-galaxy:malpedia=\"Satan Ransomware\"","misp-galaxy:ransomware=\"Satan Ransomware\""],"DBGer":["misp-galaxy:malpedia=\"Satan Ransomware\""],"Lucky Ransomware":["misp-galaxy:malpedia=\"Satan Ransomware\"","misp-galaxy:ransomware=\"Lucky Ransomware\""],"Satana":["misp-galaxy:malpedia=\"Satana\"","misp-galaxy:ransomware=\"Satana\""],"Sathurbot":["misp-galaxy:malpedia=\"Sathurbot\"","misp-galaxy:tool=\"Sathurbot\""],"Sauron Locker":["misp-galaxy:malpedia=\"Sauron Locker\""],"ScanPOS":["misp-galaxy:malpedia=\"ScanPOS\""],"Schneiken":["misp-galaxy:malpedia=\"Schneiken\""],"Scote":["misp-galaxy:malpedia=\"Scote\""],"ScreenLocker":["misp-galaxy:malpedia=\"ScreenLocker\""],"SeDll":["misp-galaxy:malpedia=\"SeDll\""],"SeaDaddy":["misp-galaxy:malpedia=\"SeaDaddy\"","misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"SeaSalt":["misp-galaxy:malpedia=\"SeaSalt\""],"Sedreco":["misp-galaxy:malpedia=\"Sedreco\"","misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"azzy":["misp-galaxy:malpedia=\"Sedreco\""],"eviltoss":["misp-galaxy:malpedia=\"Sedreco\""],"Seduploader":["misp-galaxy:malpedia=\"Seduploader\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"carberplike":["misp-galaxy:malpedia=\"Seduploader\""],"downrage":["misp-galaxy:malpedia=\"Seduploader\""],"jhuhugit":["misp-galaxy:malpedia=\"Seduploader\""],"jkeyskw":["misp-galaxy:malpedia=\"Seduploader\""],"SendSafe":["misp-galaxy:malpedia=\"SendSafe\""],"Serpico":["misp-galaxy:malpedia=\"Serpico\"","misp-galaxy:ransomware=\"Serpico\""],"ShadowPad":["misp-galaxy:malpedia=\"ShadowPad\"","misp-galaxy:tool=\"ShadowPad\""],"XShellGhost":["misp-galaxy:malpedia=\"ShadowPad\""],"Shakti":["misp-galaxy:malpedia=\"Shakti\""],"ShellBind":["misp-galaxy:malpedia=\"ShellBind\""],"ShellLocker":["misp-galaxy:malpedia=\"ShellLocker\""],"Shifu":["misp-galaxy:malpedia=\"Shifu\"","misp-galaxy:tool=\"Shifu\""],"Shim RAT":["misp-galaxy:malpedia=\"Shim RAT\""],"Shishiga":["misp-galaxy:malpedia=\"Shishiga\""],"Shujin":["misp-galaxy:malpedia=\"Shujin\"","misp-galaxy:ransomware=\"Shujin\""],"Shurl0ckr":["misp-galaxy:malpedia=\"Shurl0ckr\""],"Shylock":["misp-galaxy:malpedia=\"Shylock\""],"Caphaw":["misp-galaxy:malpedia=\"Shylock\""],"SideWinder":["misp-galaxy:malpedia=\"SideWinder\""],"Sierra(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Sierra(Alfa,Bravo, ...)\""],"Destover":["misp-galaxy:malpedia=\"Sierra(Alfa,Bravo, ...)\""],"Siggen6":["misp-galaxy:malpedia=\"Siggen6\""],"Silence DDoS":["misp-galaxy:malpedia=\"Silence DDoS\""],"Silence":["misp-galaxy:malpedia=\"Silence\"","misp-galaxy:threat-actor=\"Silence group\"","misp-galaxy:tool=\"Silence\""],"TrueBot":["misp-galaxy:malpedia=\"Silence\""],"Silon":["misp-galaxy:malpedia=\"Silon\""],"Siluhdur":["misp-galaxy:malpedia=\"Siluhdur\""],"iBank":["misp-galaxy:malpedia=\"Simda\""],"Mebroot":["misp-galaxy:malpedia=\"Sinowal\""],"Quarian":["misp-galaxy:malpedia=\"Sinowal\""],"Theola":["misp-galaxy:malpedia=\"Sinowal\""],"Sisfader":["misp-galaxy:malpedia=\"Sisfader\"","misp-galaxy:rat=\"Sisfader\""],"Skarab Ransom":["misp-galaxy:malpedia=\"Skarab Ransom\""],"Skyplex":["misp-galaxy:malpedia=\"Skyplex\""],"Slave":["misp-galaxy:malpedia=\"Slave\""],"Slempo":["misp-galaxy:malpedia=\"Slempo\"","misp-galaxy:tool=\"Slempo\""],"Slingshot":["misp-galaxy:malpedia=\"Slingshot\"","misp-galaxy:threat-actor=\"Slingshot\""],"Slocker":["misp-galaxy:malpedia=\"Slocker\""],"SmokeLoader":["misp-galaxy:malpedia=\"SmokeLoader\"","misp-galaxy:tool=\"Smoke Loader\""],"Dofoil":["misp-galaxy:malpedia=\"SmokeLoader\"","misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\""],"Smrss32 Ransomware":["misp-galaxy:malpedia=\"Smrss32 Ransomware\""],"SnatchLoader":["misp-galaxy:malpedia=\"SnatchLoader\""],"Snojan":["misp-galaxy:malpedia=\"Snojan\""],"Sobaken":["misp-galaxy:malpedia=\"Sobaken\""],"Socks5 Systemz":["misp-galaxy:malpedia=\"Socks5 Systemz\""],"SocksBot":["misp-galaxy:malpedia=\"SocksBot\""],"BIRDDOG":["misp-galaxy:malpedia=\"SocksBot\""],"Nadrac":["misp-galaxy:malpedia=\"SocksBot\""],"Solarbot":["misp-galaxy:malpedia=\"Solarbot\""],"Napolar":["misp-galaxy:malpedia=\"Solarbot\""],"Sorgu":["misp-galaxy:malpedia=\"Sorgu\""],"Spamtorte":["misp-galaxy:malpedia=\"Spamtorte\""],"SpeakUp":["misp-galaxy:malpedia=\"SpeakUp\"","misp-galaxy:mitre-malware=\"SpeakUp - S0374\""],"Spedear":["misp-galaxy:malpedia=\"Spedear\""],"Spora":["misp-galaxy:malpedia=\"Spora\""],"SpyBot":["misp-galaxy:malpedia=\"SpyBot\""],"SpyNote":["misp-galaxy:malpedia=\"SpyNote\"","misp-galaxy:rat=\"SpyNote\""],"SquirtDanger":["misp-galaxy:malpedia=\"SquirtDanger\""],"SslMM":["misp-galaxy:malpedia=\"SslMM\"","misp-galaxy:mitre-enterprise-attack-malware=\"SslMM - S0058\"","misp-galaxy:mitre-malware=\"SslMM - S0058\""],"Stabuniq":["misp-galaxy:malpedia=\"Stabuniq\""],"Stampedo":["misp-galaxy:malpedia=\"Stampedo\""],"Stantinko":["misp-galaxy:malpedia=\"Stantinko\""],"StarCruft":["misp-galaxy:malpedia=\"StarCruft\"","misp-galaxy:threat-actor=\"APT37\""],"StarLoader":["misp-galaxy:malpedia=\"StarLoader\""],"StarsyPound":["misp-galaxy:malpedia=\"StarsyPound\""],"StartPage":["misp-galaxy:malpedia=\"StartPage\""],"Easy Television Access Now":["misp-galaxy:malpedia=\"StartPage\""],"Stealth Mango":["misp-galaxy:malpedia=\"Stealth Mango\"","misp-galaxy:mitre-malware=\"Stealth Mango - S0328\""],"StealthAgent":["misp-galaxy:malpedia=\"StealthAgent\""],"StealthWorker Go":["misp-galaxy:malpedia=\"StealthWorker Go\""],"StegoLoader":["misp-galaxy:malpedia=\"StegoLoader\""],"Stinger":["misp-galaxy:malpedia=\"Stinger\""],"Stration":["misp-galaxy:malpedia=\"Stration\""],"Stresspaint":["misp-galaxy:malpedia=\"Stresspaint\""],"StrongPity":["misp-galaxy:malpedia=\"StrongPity\"","misp-galaxy:threat-actor=\"PROMETHIUM\""],"Stuxnet":["misp-galaxy:malpedia=\"Stuxnet\"","misp-galaxy:tool=\"Stuxnet\""],"SunOrcal":["misp-galaxy:malpedia=\"SunOrcal\"","misp-galaxy:tool=\"SunOrcal\""],"Sunless":["misp-galaxy:malpedia=\"Sunless\""],"SuppoBox":["misp-galaxy:malpedia=\"SuppoBox\""],"Bayrob":["misp-galaxy:malpedia=\"SuppoBox\""],"Nivdort":["misp-galaxy:malpedia=\"SuppoBox\""],"SupremeBot":["misp-galaxy:malpedia=\"SupremeBot\""],"BlazeBot":["misp-galaxy:malpedia=\"SupremeBot\""],"Swift?":["misp-galaxy:malpedia=\"Swift?\""],"Sword":["misp-galaxy:malpedia=\"Sword\""],"SynAck":["misp-galaxy:malpedia=\"SynAck\"","misp-galaxy:mitre-malware=\"SynAck - S0242\"","misp-galaxy:ransomware=\"SynAck\""],"SynFlooder":["misp-galaxy:malpedia=\"SynFlooder\""],"SyncCrypt":["misp-galaxy:malpedia=\"SyncCrypt\"","misp-galaxy:ransomware=\"SyncCrypt\""],"Synth Loader":["misp-galaxy:malpedia=\"Synth Loader\""],"Sys10":["misp-galaxy:malpedia=\"Sys10\"","misp-galaxy:mitre-enterprise-attack-malware=\"Sys10 - S0060\"","misp-galaxy:mitre-malware=\"Sys10 - S0060\""],"SysGet":["misp-galaxy:malpedia=\"SysGet\""],"SysScan":["misp-galaxy:malpedia=\"SysScan\""],"Syscon":["misp-galaxy:malpedia=\"Syscon\""],"Sysraw Stealer":["misp-galaxy:malpedia=\"Sysraw Stealer\""],"Clipsa":["misp-galaxy:malpedia=\"Sysraw Stealer\""],"Szribi":["misp-galaxy:malpedia=\"Szribi\""],"TDTESS":["misp-galaxy:malpedia=\"TDTESS\"","misp-galaxy:mitre-enterprise-attack-malware=\"TDTESS - S0164\"","misp-galaxy:mitre-malware=\"TDTESS - S0164\""],"TURNEDUP":["misp-galaxy:malpedia=\"TURNEDUP\"","misp-galaxy:mitre-enterprise-attack-malware=\"TURNEDUP - S0199\"","misp-galaxy:mitre-malware=\"TURNEDUP - S0199\""],"TabMsgSQL":["misp-galaxy:malpedia=\"TabMsgSQL\""],"TalentRAT":["misp-galaxy:malpedia=\"TalentRAT\""],"Assassin RAT":["misp-galaxy:malpedia=\"TalentRAT\""],"Taleret":["misp-galaxy:malpedia=\"Taleret\""],"Tandfuy":["misp-galaxy:malpedia=\"Tandfuy\""],"Tapaoux":["misp-galaxy:malpedia=\"Tapaoux\"","misp-galaxy:threat-actor=\"DarkHotel\""],"Tarsip":["misp-galaxy:malpedia=\"Tarsip\""],"Tater PrivEsc":["misp-galaxy:malpedia=\"Tater PrivEsc\""],"TeamBot":["misp-galaxy:malpedia=\"TeamBot\""],"FINTEAM":["misp-galaxy:malpedia=\"TeamBot\""],"TefoSteal":["misp-galaxy:malpedia=\"TefoSteal\""],"TeleBot":["misp-galaxy:malpedia=\"TeleBot\""],"TeleDoor":["misp-galaxy:malpedia=\"TeleDoor\""],"TeleRAT":["misp-galaxy:malpedia=\"TeleRAT\""],"Tempedreve":["misp-galaxy:malpedia=\"Tempedreve\""],"TemptingCedar Spyware":["misp-galaxy:malpedia=\"TemptingCedar Spyware\""],"Terminator RAT":["misp-galaxy:malpedia=\"Terminator RAT\""],"Fakem RAT":["misp-galaxy:malpedia=\"Terminator RAT\"","misp-galaxy:tool=\"Fakem RAT\""],"Termite":["misp-galaxy:malpedia=\"Termite\""],"TeslaCrypt":["misp-galaxy:malpedia=\"TeslaCrypt\""],"cryptesla":["misp-galaxy:malpedia=\"TeslaCrypt\""],"Thanatos Ransomware":["misp-galaxy:malpedia=\"Thanatos Ransomware\""],"Thanatos":["misp-galaxy:malpedia=\"Thanatos\"","misp-galaxy:ransomware=\"Thanatos\""],"Alphabot":["misp-galaxy:malpedia=\"Thanatos\""],"ThreeByte":["misp-galaxy:malpedia=\"ThreeByte\""],"ThumbThief":["misp-galaxy:malpedia=\"ThumbThief\""],"ThunderShell":["misp-galaxy:malpedia=\"ThunderShell\""],"Thunker":["misp-galaxy:malpedia=\"Thunker\""],"Tidepool":["misp-galaxy:malpedia=\"Tidepool\""],"Illi":["misp-galaxy:malpedia=\"Tinba\""],"TinyLoader":["misp-galaxy:malpedia=\"TinyLoader\""],"TinyMet":["misp-galaxy:malpedia=\"TinyMet\""],"TiniMet":["misp-galaxy:malpedia=\"TinyMet\""],"TinyTyphon":["misp-galaxy:malpedia=\"TinyTyphon\"","misp-galaxy:tool=\"TinyTyphon\""],"TinyZ":["misp-galaxy:malpedia=\"TinyZ\""],"Catelites Android Bot":["misp-galaxy:malpedia=\"TinyZ\""],"MarsElite Android Bot":["misp-galaxy:malpedia=\"TinyZ\""],"TinyZbot":["misp-galaxy:malpedia=\"TinyZbot\""],"Tiop":["misp-galaxy:malpedia=\"Tiop\""],"Titan":["misp-galaxy:malpedia=\"Titan\""],"TorrentLocker":["misp-galaxy:malpedia=\"TorrentLocker\"","misp-galaxy:ransomware=\"TorrentLocker\""],"TreasureHunter":["misp-galaxy:malpedia=\"TreasureHunter\""],"huntpos":["misp-galaxy:malpedia=\"TreasureHunter\""],"Triada":["misp-galaxy:malpedia=\"Triada\""],"TrickBot":["misp-galaxy:malpedia=\"TrickBot\"","misp-galaxy:mitre-malware=\"TrickBot - S0266\"","misp-galaxy:tool=\"Trick Bot\""],"TheTrick":["misp-galaxy:malpedia=\"TrickBot\""],"TrickLoader":["misp-galaxy:malpedia=\"TrickBot\"","misp-galaxy:tool=\"Trick Bot\""],"Triton":["misp-galaxy:malpedia=\"Triton\""],"HatMan":["misp-galaxy:malpedia=\"Triton\""],"Trisis":["misp-galaxy:malpedia=\"Triton\""],"Trochilus RAT":["misp-galaxy:malpedia=\"Trochilus RAT\""],"Troldesh":["misp-galaxy:malpedia=\"Troldesh\""],"Shade":["misp-galaxy:malpedia=\"Troldesh\""],"Trump Bot":["misp-galaxy:malpedia=\"Trump Bot\""],"Trump Ransom":["misp-galaxy:malpedia=\"Trump Ransom\""],"Tsifiri":["misp-galaxy:malpedia=\"Tsifiri\""],"Tsunami (ELF)":["misp-galaxy:malpedia=\"Tsunami (ELF)\""],"Amnesia":["misp-galaxy:malpedia=\"Tsunami (ELF)\"","misp-galaxy:malpedia=\"Tsunami\""],"Radiation":["misp-galaxy:malpedia=\"Tsunami (ELF)\"","misp-galaxy:malpedia=\"Tsunami\""],"Tsunami (OS X)":["misp-galaxy:malpedia=\"Tsunami (OS X)\""],"Tsunami":["misp-galaxy:malpedia=\"Tsunami\""],"Turla RAT":["misp-galaxy:malpedia=\"Turla RAT\""],"TwoFace":["misp-galaxy:malpedia=\"TwoFace\"","misp-galaxy:tool=\"TwoFace\""],"HyperShell":["misp-galaxy:malpedia=\"TwoFace\""],"Tyupkin":["misp-galaxy:malpedia=\"Tyupkin\""],"UACMe":["misp-galaxy:malpedia=\"UACMe\"","misp-galaxy:mitre-enterprise-attack-tool=\"UACMe - S0116\"","misp-galaxy:mitre-tool=\"UACMe - S0116\""],"Akagi":["misp-galaxy:malpedia=\"UACMe\""],"UDPoS":["misp-galaxy:malpedia=\"UDPoS\""],"UFR Stealer":["misp-galaxy:malpedia=\"UFR Stealer\""],"Usteal":["misp-galaxy:malpedia=\"UFR Stealer\""],"UPAS":["misp-galaxy:malpedia=\"UPAS\""],"Rombrast":["misp-galaxy:malpedia=\"UPAS\""],"Uiwix":["misp-galaxy:malpedia=\"Uiwix\""],"Umbreon":["misp-galaxy:malpedia=\"Umbreon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Umbreon - S0221\"","misp-galaxy:mitre-malware=\"Umbreon - S0221\"","misp-galaxy:tool=\"Umbreon\""],"Espeon":["misp-galaxy:malpedia=\"Umbreon\""],"Unidentified 001":["misp-galaxy:malpedia=\"Unidentified 001\""],"Unidentified 003":["misp-galaxy:malpedia=\"Unidentified 003\""],"Unidentified 006":["misp-galaxy:malpedia=\"Unidentified 006\""],"Unidentified 013 (Korean)":["misp-galaxy:malpedia=\"Unidentified 013 (Korean)\""],"Unidentified 020 (Vault7)":["misp-galaxy:malpedia=\"Unidentified 020 (Vault7)\""],"Unidentified 022 (Ransom)":["misp-galaxy:malpedia=\"Unidentified 022 (Ransom)\""],"Unidentified 023":["misp-galaxy:malpedia=\"Unidentified 023\""],"Unidentified 024 (Ransomware)":["misp-galaxy:malpedia=\"Unidentified 024 (Ransomware)\""],"Unidentified 025 (Clickfraud)":["misp-galaxy:malpedia=\"Unidentified 025 (Clickfraud)\""],"Unidentified 028":["misp-galaxy:malpedia=\"Unidentified 028\""],"Unidentified 029":["misp-galaxy:malpedia=\"Unidentified 029\""],"Unidentified 031":["misp-galaxy:malpedia=\"Unidentified 031\""],"Unidentified 032":["misp-galaxy:malpedia=\"Unidentified 032\""],"Unidentified 033":["misp-galaxy:malpedia=\"Unidentified 033\""],"Unidentified 035":["misp-galaxy:malpedia=\"Unidentified 035\""],"Unidentified 037":["misp-galaxy:malpedia=\"Unidentified 037\""],"Unidentified 038":["misp-galaxy:malpedia=\"Unidentified 038\""],"Unidentified 039":["misp-galaxy:malpedia=\"Unidentified 039\""],"Unidentified 041":["misp-galaxy:malpedia=\"Unidentified 041\""],"Unidentified 042":["misp-galaxy:malpedia=\"Unidentified 042\""],"Unidentified 044":["misp-galaxy:malpedia=\"Unidentified 044\""],"Unidentified 045":["misp-galaxy:malpedia=\"Unidentified 045\""],"Unidentified 046":["misp-galaxy:malpedia=\"Unidentified 046\""],"Unidentified 047":["misp-galaxy:malpedia=\"Unidentified 047\""],"Unidentified 048 (Lazarus?)":["misp-galaxy:malpedia=\"Unidentified 048 (Lazarus?)\""],"Unidentified 049 (Lazarus\/RAT)":["misp-galaxy:malpedia=\"Unidentified 049 (Lazarus\/RAT)\""],"Unidentified 050 (APT32 Profiler)":["misp-galaxy:malpedia=\"Unidentified 050 (APT32 Profiler)\""],"Unidentified 051":["misp-galaxy:malpedia=\"Unidentified 051\""],"Unidentified 052":["misp-galaxy:malpedia=\"Unidentified 052\""],"Unidentified 053 (Wonknu?)":["misp-galaxy:malpedia=\"Unidentified 053 (Wonknu?)\""],"Unidentified 055":["misp-galaxy:malpedia=\"Unidentified 055\""],"Unidentified 057":["misp-galaxy:malpedia=\"Unidentified 057\""],"Unidentified 058":["misp-galaxy:malpedia=\"Unidentified 058\""],"Unidentified APK 001":["misp-galaxy:malpedia=\"Unidentified APK 001\""],"Unidentified APK 002":["misp-galaxy:malpedia=\"Unidentified APK 002\""],"Unidentified ASP 001 (Webshell)":["misp-galaxy:malpedia=\"Unidentified ASP 001 (Webshell)\""],"Unlock92":["misp-galaxy:malpedia=\"Unlock92\""],"Upatre":["misp-galaxy:malpedia=\"Upatre\"","misp-galaxy:tool=\"Upatre\""],"Urausy":["misp-galaxy:malpedia=\"Urausy\""],"UrlZone":["misp-galaxy:malpedia=\"UrlZone\""],"Uroburos (OS X)":["misp-galaxy:malpedia=\"Uroburos (OS X)\""],"Uroburos (Windows)":["misp-galaxy:malpedia=\"Uroburos (Windows)\""],"Snake":["misp-galaxy:malpedia=\"Uroburos (Windows)\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"VMzeus":["misp-galaxy:malpedia=\"VM Zeus\""],"Zberp":["misp-galaxy:malpedia=\"VM Zeus\""],"ZeusVM":["misp-galaxy:malpedia=\"VM Zeus\""],"Catch":["misp-galaxy:malpedia=\"Vawtrak\""],"NeverQuest":["misp-galaxy:malpedia=\"Vawtrak\""],"grabnew":["misp-galaxy:malpedia=\"Vawtrak\""],"VegaLocker":["misp-galaxy:malpedia=\"VegaLocker\""],"Vega":["misp-galaxy:malpedia=\"VegaLocker\""],"Velso Ransomware":["misp-galaxy:malpedia=\"Velso Ransomware\""],"Venus Locker":["misp-galaxy:malpedia=\"Venus Locker\""],"Vermin":["misp-galaxy:malpedia=\"Vermin\""],"Vflooder":["misp-galaxy:malpedia=\"Vflooder\""],"Viper RAT":["misp-galaxy:malpedia=\"Viper RAT\""],"Vobfus":["misp-galaxy:malpedia=\"Vobfus\""],"Volgmer":["misp-galaxy:malpedia=\"Volgmer\"","misp-galaxy:mitre-enterprise-attack-malware=\"Volgmer - S0180\"","misp-galaxy:mitre-malware=\"Volgmer - S0180\"","misp-galaxy:tool=\"Volgmer\""],"FALLCHILL":["misp-galaxy:malpedia=\"Volgmer\"","misp-galaxy:mitre-enterprise-attack-malware=\"FALLCHILL - S0181\"","misp-galaxy:mitre-malware=\"FALLCHILL - S0181\"","misp-galaxy:rat=\"FALLCHILL\""],"Manuscrypt":["misp-galaxy:malpedia=\"Volgmer\""],"Vreikstadi":["misp-galaxy:malpedia=\"Vreikstadi\""],"WMI Ghost":["misp-galaxy:malpedia=\"WMI Ghost\""],"Syndicasec":["misp-galaxy:malpedia=\"WMI Ghost\""],"Wimmie":["misp-galaxy:malpedia=\"WMI Ghost\""],"WMImplant":["misp-galaxy:malpedia=\"WMImplant\""],"WSCSPL":["misp-galaxy:malpedia=\"WSCSPL\""],"WSO":["misp-galaxy:malpedia=\"WSO\""],"Webshell by Orb":["misp-galaxy:malpedia=\"WSO\""],"WallyShack":["misp-galaxy:malpedia=\"WallyShack\""],"WannaCryptor":["misp-galaxy:malpedia=\"WannaCryptor\""],"Wana Decrypt0r":["misp-galaxy:malpedia=\"WannaCryptor\""],"WannaCry":["misp-galaxy:malpedia=\"WannaCryptor\"","misp-galaxy:mitre-malware=\"WannaCry - S0366\"","misp-galaxy:ransomware=\"WannaCry\"","misp-galaxy:ransomware=\"WannaCry\""],"Wcry":["misp-galaxy:malpedia=\"WannaCryptor\""],"WaterMiner":["misp-galaxy:malpedia=\"WaterMiner\""],"WaterSpout":["misp-galaxy:malpedia=\"WaterSpout\""],"WebC2-AdSpace":["misp-galaxy:malpedia=\"WebC2-AdSpace\""],"WebC2-Ausov":["misp-galaxy:malpedia=\"WebC2-Ausov\""],"WebC2-Bolid":["misp-galaxy:malpedia=\"WebC2-Bolid\""],"WebC2-Cson":["misp-galaxy:malpedia=\"WebC2-Cson\""],"WebC2-DIV":["misp-galaxy:malpedia=\"WebC2-DIV\""],"WebC2-GreenCat":["misp-galaxy:malpedia=\"WebC2-GreenCat\""],"WebC2-Head":["misp-galaxy:malpedia=\"WebC2-Head\""],"WebC2-Kt3":["misp-galaxy:malpedia=\"WebC2-Kt3\""],"WebC2-Qbp":["misp-galaxy:malpedia=\"WebC2-Qbp\""],"WebC2-Rave":["misp-galaxy:malpedia=\"WebC2-Rave\""],"WebC2-Table":["misp-galaxy:malpedia=\"WebC2-Table\""],"WebC2-UGX":["misp-galaxy:malpedia=\"WebC2-UGX\""],"WebC2-Yahoo":["misp-galaxy:malpedia=\"WebC2-Yahoo\""],"WebMonitor RAT":["misp-galaxy:malpedia=\"WebMonitor RAT\""],"WildFire":["misp-galaxy:malpedia=\"WildFire\""],"WinMM":["misp-galaxy:malpedia=\"WinMM\"","misp-galaxy:mitre-enterprise-attack-malware=\"WinMM - S0059\"","misp-galaxy:mitre-malware=\"WinMM - S0059\""],"WinPot":["misp-galaxy:malpedia=\"WinPot\""],"ATMPot":["misp-galaxy:malpedia=\"WinPot\""],"WindTail":["misp-galaxy:malpedia=\"WindTail\""],"Winnti (OS X)":["misp-galaxy:malpedia=\"Winnti (OS X)\""],"Winnti (Windows)":["misp-galaxy:malpedia=\"Winnti (Windows)\""],"Winsloader":["misp-galaxy:malpedia=\"Winsloader\""],"Wipbot":["misp-galaxy:malpedia=\"Wipbot\"","misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"WireLurker (OS X)":["misp-galaxy:malpedia=\"WireLurker (OS X)\""],"WireLurker (iOS)":["misp-galaxy:malpedia=\"WireLurker (iOS)\""],"WireX":["misp-galaxy:malpedia=\"WireX\""],"Wirenet (ELF)":["misp-galaxy:malpedia=\"Wirenet (ELF)\""],"Wirenet (OS X)":["misp-galaxy:malpedia=\"Wirenet (OS X)\""],"WndTest":["misp-galaxy:malpedia=\"WndTest\""],"Wonknu":["misp-galaxy:malpedia=\"Wonknu\""],"Woolger":["misp-galaxy:malpedia=\"Woolger\""],"WoolenLogger":["misp-galaxy:malpedia=\"Woolger\""],"X-Agent (Android)":["misp-galaxy:malpedia=\"X-Agent (Android)\""],"Popr-d30":["misp-galaxy:malpedia=\"X-Agent (Android)\""],"X-Agent (ELF)":["misp-galaxy:malpedia=\"X-Agent (ELF)\""],"chopstick":["misp-galaxy:malpedia=\"X-Agent (ELF)\"","misp-galaxy:malpedia=\"X-Agent (Windows)\""],"fysbis":["misp-galaxy:malpedia=\"X-Agent (ELF)\""],"splm":["misp-galaxy:malpedia=\"X-Agent (ELF)\"","misp-galaxy:malpedia=\"X-Agent (Windows)\""],"X-Agent (OS X)":["misp-galaxy:malpedia=\"X-Agent (OS X)\""],"X-Agent (Windows)":["misp-galaxy:malpedia=\"X-Agent (Windows)\""],"X-Tunnel (.NET)":["misp-galaxy:malpedia=\"X-Tunnel (.NET)\""],"X-Tunnel":["misp-galaxy:malpedia=\"X-Tunnel\"","misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\"","misp-galaxy:tool=\"X-Tunnel\""],"xaps":["misp-galaxy:malpedia=\"X-Tunnel\""],"XBTL":["misp-galaxy:malpedia=\"XBTL\""],"XBot POS":["misp-galaxy:malpedia=\"XBot POS\""],"XLoader":["misp-galaxy:malpedia=\"XLoader\"","misp-galaxy:mitre-malware=\"XLoader - S0318\""],"XOR DDoS":["misp-galaxy:malpedia=\"XOR DDoS\""],"XP PrivEsc (CVE-2014-4076)":["misp-galaxy:malpedia=\"XP PrivEsc (CVE-2014-4076)\""],"XPCTRA":["misp-galaxy:malpedia=\"XPCTRA\""],"Expectra":["misp-galaxy:malpedia=\"XPCTRA\""],"XRat":["misp-galaxy:malpedia=\"XRat\""],"XSLCmd":["misp-galaxy:malpedia=\"XSLCmd\""],"Xaynnalc":["misp-galaxy:malpedia=\"Xaynnalc\""],"Xbash":["misp-galaxy:malpedia=\"Xbash\"","misp-galaxy:mitre-malware=\"Xbash - S0341\"","misp-galaxy:tool=\"Xbash\""],"Xpan":["misp-galaxy:malpedia=\"Xpan\""],"Xtreme RAT":["misp-galaxy:malpedia=\"Xtreme RAT\""],"ExtRat":["misp-galaxy:malpedia=\"Xtreme RAT\""],"Xwo":["misp-galaxy:malpedia=\"Xwo\""],"Yahoyah":["misp-galaxy:malpedia=\"Yahoyah\"","misp-galaxy:tool=\"Yahoyah\""],"YellYouth":["misp-galaxy:malpedia=\"YellYouth\""],"Yort":["misp-galaxy:malpedia=\"Yort\""],"YoungLotus":["misp-galaxy:malpedia=\"YoungLotus\""],"DarkShare":["misp-galaxy:malpedia=\"YoungLotus\""],"ZXShell":["misp-galaxy:malpedia=\"ZXShell\"","misp-galaxy:tool=\"ZXShell\""],"Sensocode":["misp-galaxy:malpedia=\"ZXShell\""],"Zebrocy (AutoIT)":["misp-galaxy:malpedia=\"Zebrocy (AutoIT)\""],"Zebrocy":["misp-galaxy:malpedia=\"Zebrocy\"","misp-galaxy:mitre-malware=\"Zebrocy - S0251\"","misp-galaxy:tool=\"Zebrocy\""],"Zekapab":["misp-galaxy:malpedia=\"Zebrocy\"","misp-galaxy:tool=\"Zebrocy\""],"Zedhou":["misp-galaxy:malpedia=\"Zedhou\""],"Zen":["misp-galaxy:malpedia=\"Zen\""],"ZeroAccess":["misp-galaxy:malpedia=\"ZeroAccess\""],"Max++":["misp-galaxy:malpedia=\"ZeroAccess\""],"Sirefef":["misp-galaxy:malpedia=\"ZeroAccess\"","misp-galaxy:tool=\"Sirefef\""],"Smiscer":["misp-galaxy:malpedia=\"ZeroAccess\""],"ZeroEvil":["misp-galaxy:malpedia=\"ZeroEvil\""],"ZeroT":["misp-galaxy:malpedia=\"ZeroT\"","misp-galaxy:mitre-enterprise-attack-malware=\"ZeroT - S0230\"","misp-galaxy:mitre-malware=\"ZeroT - S0230\"","misp-galaxy:tool=\"ZeroT\""],"Zeus MailSniffer":["misp-galaxy:malpedia=\"Zeus MailSniffer\""],"Zeus OpenSSL":["misp-galaxy:malpedia=\"Zeus OpenSSL\""],"XSphinx":["misp-galaxy:malpedia=\"Zeus OpenSSL\""],"Zezin":["misp-galaxy:malpedia=\"Zezin\""],"ZhCat":["misp-galaxy:malpedia=\"ZhCat\""],"ZhMimikatz":["misp-galaxy:malpedia=\"ZhMimikatz\""],"Zloader":["misp-galaxy:malpedia=\"Zloader\""],"DELoader":["misp-galaxy:malpedia=\"Zloader\""],"Terdot":["misp-galaxy:malpedia=\"Zloader\""],"Zollard":["misp-galaxy:malpedia=\"Zollard\""],"darlloz":["misp-galaxy:malpedia=\"Zollard\""],"ZooPark":["misp-galaxy:malpedia=\"ZooPark\"","misp-galaxy:threat-actor=\"ZooPark\""],"ZoxPNG":["misp-galaxy:malpedia=\"ZoxPNG\""],"gresim":["misp-galaxy:malpedia=\"ZoxPNG\""],"Ztorg":["misp-galaxy:malpedia=\"Ztorg\""],"Qysly":["misp-galaxy:malpedia=\"Ztorg\""],"Zyklon":["misp-galaxy:malpedia=\"Zyklon\"","misp-galaxy:ransomware=\"Zyklon\""],"abantes":["misp-galaxy:malpedia=\"abantes\""],"backspace":["misp-galaxy:malpedia=\"backspace\""],"badflick":["misp-galaxy:malpedia=\"badflick\""],"bangat":["misp-galaxy:malpedia=\"bangat\""],"beendoor":["misp-galaxy:malpedia=\"beendoor\""],"c0d0so0":["misp-galaxy:malpedia=\"c0d0so0\""],"concealment_troy":["misp-galaxy:malpedia=\"concealment_troy\""],"elf.vpnfilter":["misp-galaxy:malpedia=\"elf.vpnfilter\""],"elf.wellmess":["misp-galaxy:malpedia=\"elf.wellmess\""],"ext4":["misp-galaxy:malpedia=\"ext4\""],"gamapos":["misp-galaxy:malpedia=\"gamapos\""],"pios":["misp-galaxy:malpedia=\"gamapos\""],"gcman":["misp-galaxy:malpedia=\"gcman\""],"gsecdump":["misp-galaxy:malpedia=\"gsecdump\"","misp-galaxy:mitre-enterprise-attack-tool=\"gsecdump - S0008\"","misp-galaxy:mitre-tool=\"gsecdump - S0008\""],"himan":["misp-galaxy:malpedia=\"himan\""],"homefry":["misp-galaxy:malpedia=\"homefry\""],"htpRAT":["misp-galaxy:malpedia=\"htpRAT\"","misp-galaxy:rat=\"htpRAT\""],"http_troy":["misp-galaxy:malpedia=\"http_troy\""],"httpdropper":["misp-galaxy:malpedia=\"httpdropper\""],"httpdr0pper":["misp-galaxy:malpedia=\"httpdropper\""],"iMuler":["misp-galaxy:malpedia=\"iMuler\""],"Revir":["misp-galaxy:malpedia=\"iMuler\""],"iSpy Keylogger":["misp-galaxy:malpedia=\"iSpy Keylogger\""],"jRAT":["misp-galaxy:malpedia=\"jRAT\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"jRAT\""],"Jacksbot":["misp-galaxy:malpedia=\"jRAT\""],"jSpy":["misp-galaxy:malpedia=\"jSpy\"","misp-galaxy:rat=\"jSpy\""],"magecart":["misp-galaxy:malpedia=\"magecart\""],"mozart":["misp-galaxy:malpedia=\"mozart\""],"murkytop":["misp-galaxy:malpedia=\"murkytop\""],"nRansom":["misp-galaxy:malpedia=\"nRansom\""],"nitlove":["misp-galaxy:malpedia=\"nitlove\""],"owaauth":["misp-galaxy:malpedia=\"owaauth\""],"luckyowa":["misp-galaxy:malpedia=\"owaauth\""],"paladin":["misp-galaxy:malpedia=\"paladin\""],"parasite_http":["misp-galaxy:malpedia=\"parasite_http\""],"pgift":["misp-galaxy:malpedia=\"pgift\""],"ReRol":["misp-galaxy:malpedia=\"pgift\""],"pipcreat":["misp-galaxy:malpedia=\"pipcreat\""],"pirpi":["misp-galaxy:malpedia=\"pirpi\""],"playwork":["misp-galaxy:malpedia=\"playwork\""],"ployx":["misp-galaxy:malpedia=\"ployx\""],"pngdowner":["misp-galaxy:malpedia=\"pngdowner\"","misp-galaxy:mitre-enterprise-attack-malware=\"pngdowner - S0067\"","misp-galaxy:mitre-malware=\"pngdowner - S0067\""],"portless":["misp-galaxy:malpedia=\"portless\""],"poscardstealer":["misp-galaxy:malpedia=\"poscardstealer\""],"powerkatz":["misp-galaxy:malpedia=\"powerkatz\""],"prb_backdoor":["misp-galaxy:malpedia=\"prb_backdoor\""],"pupy (ELF)":["misp-galaxy:malpedia=\"pupy (ELF)\""],"pupy (Python)":["misp-galaxy:malpedia=\"pupy (Python)\""],"pupy (Windows)":["misp-galaxy:malpedia=\"pupy (Windows)\""],"pupy":["misp-galaxy:malpedia=\"pupy\""],"pwnpos":["misp-galaxy:malpedia=\"pwnpos\""],"r2r2":["misp-galaxy:malpedia=\"r2r2\""],"r980":["misp-galaxy:malpedia=\"r980\""],"rarstar":["misp-galaxy:malpedia=\"rarstar\""],"rdasrv":["misp-galaxy:malpedia=\"rdasrv\""],"reGeorg":["misp-galaxy:malpedia=\"reGeorg\"","misp-galaxy:tool=\"reGeorg\""],"rock":["misp-galaxy:malpedia=\"rock\""],"yellowalbatross":["misp-galaxy:malpedia=\"rock\""],"rtpos":["misp-galaxy:malpedia=\"rtpos\""],"running_rat":["misp-galaxy:malpedia=\"running_rat\""],"sLoad":["misp-galaxy:malpedia=\"sLoad\""],"scanbox":["misp-galaxy:malpedia=\"scanbox\""],"shadowhammer":["misp-galaxy:malpedia=\"shadowhammer\""],"shareip":["misp-galaxy:malpedia=\"shareip\""],"remotecmd":["misp-galaxy:malpedia=\"shareip\""],"smac":["misp-galaxy:malpedia=\"smac\""],"speccom":["misp-galaxy:malpedia=\"smac\""],"soraya":["misp-galaxy:malpedia=\"soraya\""],"sykipot":["misp-galaxy:malpedia=\"sykipot\""],"getkys":["misp-galaxy:malpedia=\"sykipot\""],"systemd":["misp-galaxy:malpedia=\"systemd\""],"tDiscoverer":["misp-galaxy:malpedia=\"tDiscoverer\""],"tRat":["misp-galaxy:malpedia=\"tRat\""],"taidoor":["misp-galaxy:malpedia=\"taidoor\""],"simbot":["misp-galaxy:malpedia=\"taidoor\""],"vSkimmer":["misp-galaxy:malpedia=\"vSkimmer\""],"vidar":["misp-galaxy:malpedia=\"vidar\""],"virdetdoor":["misp-galaxy:malpedia=\"virdetdoor\""],"w32times":["misp-galaxy:malpedia=\"w32times\""],"win.spynet_rat":["misp-galaxy:malpedia=\"win.spynet_rat\""],"win.unidentified_005":["misp-galaxy:malpedia=\"win.unidentified_005\""],"witchcoven":["misp-galaxy:malpedia=\"witchcoven\""],"woody":["misp-galaxy:malpedia=\"woody\""],"xsPlus":["misp-galaxy:malpedia=\"xsPlus\""],"nokian":["misp-galaxy:malpedia=\"xsPlus\""],"xxmm":["misp-galaxy:malpedia=\"xxmm\""],"ShadowWalker":["misp-galaxy:malpedia=\"xxmm\""],"yayih":["misp-galaxy:malpedia=\"yayih\""],"aumlib":["misp-galaxy:malpedia=\"yayih\""],"bbsinfo":["misp-galaxy:malpedia=\"yayih\""],"yty":["misp-galaxy:malpedia=\"yty\"","misp-galaxy:mitre-malware=\"yty - S0248\""],"BARIUM":["misp-galaxy:microsoft-activity-group=\"BARIUM\""],"DUBNIUM":["misp-galaxy:microsoft-activity-group=\"DUBNIUM\"","misp-galaxy:threat-actor=\"DarkHotel\""],"darkhotel":["misp-galaxy:microsoft-activity-group=\"DUBNIUM\""],"LEAD":["misp-galaxy:microsoft-activity-group=\"LEAD\""],"NEODYMIUM":["misp-galaxy:microsoft-activity-group=\"NEODYMIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:mitre-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:threat-actor=\"NEODYMIUM\""],"PLATINUM":["misp-galaxy:microsoft-activity-group=\"PLATINUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:mitre-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:threat-actor=\"PLATINUM\""],"PROMETHIUM":["misp-galaxy:microsoft-activity-group=\"PROMETHIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:mitre-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:threat-actor=\"PROMETHIUM\""],"STRONTIUM":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT 28":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT28":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Pawn Storm":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Fancy Bear":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Sednit":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\"","misp-galaxy:tool=\"GAMEFISH\""],"TsarTeam":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"TG-4127":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Group-4127":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"Grey-Cloud":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\""],"TERBIUM":["misp-galaxy:microsoft-activity-group=\"TERBIUM\"","misp-galaxy:threat-actor=\"TERBIUM\""],"ZIRCONIUM":["misp-galaxy:microsoft-activity-group=\"ZIRCONIUM\"","misp-galaxy:threat-actor=\"APT31\""],"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\""],"C-Major":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\"","misp-galaxy:threat-actor=\"Operation C-Major\""],"Transparent Tribe":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\"","misp-galaxy:threat-actor=\"Operation C-Major\""],".bash_profile and .bashrc - T1156":["misp-galaxy:mitre-attack-pattern=\".bash_profile and .bashrc - T1156\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\".bash_profile and .bashrc - T1156\""],"Abuse Accessibility Features - T1453":["misp-galaxy:mitre-attack-pattern=\"Abuse Accessibility Features - T1453\""],"Abuse Device Administrator Access to Prevent Removal - T1401":["misp-galaxy:mitre-attack-pattern=\"Abuse Device Administrator Access to Prevent Removal - T1401\""],"Abuse of iOS Enterprise App Signing Key - T1445":["misp-galaxy:mitre-attack-pattern=\"Abuse of iOS Enterprise App Signing Key - T1445\""],"Access Calendar Entries - T1435":["misp-galaxy:mitre-attack-pattern=\"Access Calendar Entries - T1435\""],"Access Call Log - T1433":["misp-galaxy:mitre-attack-pattern=\"Access Call Log - T1433\""],"Access Contact List - T1432":["misp-galaxy:mitre-attack-pattern=\"Access Contact List - T1432\""],"Access Sensitive Data in Device Logs - T1413":["misp-galaxy:mitre-attack-pattern=\"Access Sensitive Data in Device Logs - T1413\""],"Access Sensitive Data or Credentials in Files - T1409":["misp-galaxy:mitre-attack-pattern=\"Access Sensitive Data or Credentials in Files - T1409\""],"Access Token Manipulation - T1134":["misp-galaxy:mitre-attack-pattern=\"Access Token Manipulation - T1134\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Access Token Manipulation - T1134\""],"Accessibility Features - T1015":["misp-galaxy:mitre-attack-pattern=\"Accessibility Features - T1015\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Accessibility Features - T1015\""],"Account Discovery - T1087":["misp-galaxy:mitre-attack-pattern=\"Account Discovery - T1087\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Account Discovery - T1087\""],"Account Manipulation - T1098":["misp-galaxy:mitre-attack-pattern=\"Account Manipulation - T1098\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Account Manipulation - T1098\""],"Acquire OSINT data sets and information - T1247":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1247\""],"Acquire OSINT data sets and information - T1266":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1266\""],"Acquire OSINT data sets and information - T1277":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1277\""],"Acquire and\/or use 3rd party infrastructure services - T1307":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - T1307\""],"Acquire and\/or use 3rd party infrastructure services - T1329":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - T1329\""],"Acquire and\/or use 3rd party software services - T1308":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party software services - T1308\""],"Acquire and\/or use 3rd party software services - T1330":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party software services - T1330\""],"Acquire or compromise 3rd party signing certificates - T1310":["misp-galaxy:mitre-attack-pattern=\"Acquire or compromise 3rd party signing certificates - T1310\""],"Acquire or compromise 3rd party signing certificates - T1332":["misp-galaxy:mitre-attack-pattern=\"Acquire or compromise 3rd party signing certificates - T1332\""],"Aggregate individual's digital footprint - T1275":["misp-galaxy:mitre-attack-pattern=\"Aggregate individual's digital footprint - T1275\""],"Alternate Network Mediums - T1438":["misp-galaxy:mitre-attack-pattern=\"Alternate Network Mediums - T1438\""],"Analyze application security posture - T1293":["misp-galaxy:mitre-attack-pattern=\"Analyze application security posture - T1293\""],"Analyze architecture and configuration posture - T1288":["misp-galaxy:mitre-attack-pattern=\"Analyze architecture and configuration posture - T1288\""],"Analyze business processes - T1301":["misp-galaxy:mitre-attack-pattern=\"Analyze business processes - T1301\""],"Analyze data collected - T1287":["misp-galaxy:mitre-attack-pattern=\"Analyze data collected - T1287\""],"Analyze hardware\/software security defensive capabilities - T1294":["misp-galaxy:mitre-attack-pattern=\"Analyze hardware\/software security defensive capabilities - T1294\""],"Analyze organizational skillsets and deficiencies - T1289":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1289\""],"Analyze organizational skillsets and deficiencies - T1297":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1297\""],"Analyze organizational skillsets and deficiencies - T1300":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1300\""],"Analyze presence of outsourced capabilities - T1303":["misp-galaxy:mitre-attack-pattern=\"Analyze presence of outsourced capabilities - T1303\""],"Analyze social and business relationships, interests, and affiliations - T1295":["misp-galaxy:mitre-attack-pattern=\"Analyze social and business relationships, interests, and affiliations - T1295\""],"Android Intent Hijacking - T1416":["misp-galaxy:mitre-attack-pattern=\"Android Intent Hijacking - T1416\""],"Anonymity services - T1306":["misp-galaxy:mitre-attack-pattern=\"Anonymity services - T1306\""],"App Auto-Start at Device Boot - T1402":["misp-galaxy:mitre-attack-pattern=\"App Auto-Start at Device Boot - T1402\""],"App Delivered via Email Attachment - T1434":["misp-galaxy:mitre-attack-pattern=\"App Delivered via Email Attachment - T1434\""],"App Delivered via Web Download - T1431":["misp-galaxy:mitre-attack-pattern=\"App Delivered via Web Download - T1431\""],"AppCert DLLs - T1182":["misp-galaxy:mitre-attack-pattern=\"AppCert DLLs - T1182\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppCert DLLs - T1182\""],"AppInit DLLs - T1103":["misp-galaxy:mitre-attack-pattern=\"AppInit DLLs - T1103\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppInit DLLs - T1103\""],"AppleScript - T1155":["misp-galaxy:mitre-attack-pattern=\"AppleScript - T1155\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppleScript - T1155\""],"Application Deployment Software - T1017":["misp-galaxy:mitre-attack-pattern=\"Application Deployment Software - T1017\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Deployment Software - T1017\""],"Application Discovery - T1418":["misp-galaxy:mitre-attack-pattern=\"Application Discovery - T1418\""],"Application Shimming - T1138":["misp-galaxy:mitre-attack-pattern=\"Application Shimming - T1138\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Shimming - T1138\""],"Application Window Discovery - T1010":["misp-galaxy:mitre-attack-pattern=\"Application Window Discovery - T1010\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Window Discovery - T1010\""],"Assess KITs\/KIQs benefits - T1229":["misp-galaxy:mitre-attack-pattern=\"Assess KITs\/KIQs benefits - T1229\""],"Assess current holdings, needs, and wants - T1236":["misp-galaxy:mitre-attack-pattern=\"Assess current holdings, needs, and wants - T1236\""],"Assess leadership areas of interest - T1224":["misp-galaxy:mitre-attack-pattern=\"Assess leadership areas of interest - T1224\""],"Assess opportunities created by business deals - T1299":["misp-galaxy:mitre-attack-pattern=\"Assess opportunities created by business deals - T1299\""],"Assess security posture of physical locations - T1302":["misp-galaxy:mitre-attack-pattern=\"Assess security posture of physical locations - T1302\""],"Assess targeting options - T1296":["misp-galaxy:mitre-attack-pattern=\"Assess targeting options - T1296\""],"Assess vulnerability of 3rd party vendors - T1298":["misp-galaxy:mitre-attack-pattern=\"Assess vulnerability of 3rd party vendors - T1298\""],"Assign KITs, KIQs, and\/or intelligence requirements - T1238":["misp-galaxy:mitre-attack-pattern=\"Assign KITs, KIQs, and\/or intelligence requirements - T1238\""],"Assign KITs\/KIQs into categories - T1228":["misp-galaxy:mitre-attack-pattern=\"Assign KITs\/KIQs into categories - T1228\""],"Attack PC via USB Connection - T1427":["misp-galaxy:mitre-attack-pattern=\"Attack PC via USB Connection - T1427\""],"Audio Capture - T1123":["misp-galaxy:mitre-attack-pattern=\"Audio Capture - T1123\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Audio Capture - T1123\""],"Authentication Package - T1131":["misp-galaxy:mitre-attack-pattern=\"Authentication Package - T1131\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Authentication Package - T1131\""],"Authentication attempt - T1381":["misp-galaxy:mitre-attack-pattern=\"Authentication attempt - T1381\""],"Authorized user performs requested cyber action - T1386":["misp-galaxy:mitre-attack-pattern=\"Authorized user performs requested cyber action - T1386\""],"Automated Collection - T1119":["misp-galaxy:mitre-attack-pattern=\"Automated Collection - T1119\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Automated Collection - T1119\""],"Automated Exfiltration - T1020":["misp-galaxy:mitre-attack-pattern=\"Automated Exfiltration - T1020\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Automated Exfiltration - T1020\""],"Automated system performs requested action - T1384":["misp-galaxy:mitre-attack-pattern=\"Automated system performs requested action - T1384\""],"BITS Jobs - T1197":["misp-galaxy:mitre-attack-pattern=\"BITS Jobs - T1197\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"BITS Jobs - T1197\""],"Bash History - T1139":["misp-galaxy:mitre-attack-pattern=\"Bash History - T1139\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bash History - T1139\""],"Binary Padding - T1009":["misp-galaxy:mitre-attack-pattern=\"Binary Padding - T1009\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Binary Padding - T1009\""],"Biometric Spoofing - T1460":["misp-galaxy:mitre-attack-pattern=\"Biometric Spoofing - T1460\""],"Bootkit - T1067":["misp-galaxy:mitre-attack-pattern=\"Bootkit - T1067\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bootkit - T1067\""],"Browser Bookmark Discovery - T1217":["misp-galaxy:mitre-attack-pattern=\"Browser Bookmark Discovery - T1217\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Browser Bookmark Discovery - T1217\""],"Browser Extensions - T1176":["misp-galaxy:mitre-attack-pattern=\"Browser Extensions - T1176\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Browser Extensions - T1176\""],"Brute Force - T1110":["misp-galaxy:mitre-attack-pattern=\"Brute Force - T1110\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Brute Force - T1110\""],"Build and configure delivery systems - T1347":["misp-galaxy:mitre-attack-pattern=\"Build and configure delivery systems - T1347\""],"Build or acquire exploits - T1349":["misp-galaxy:mitre-attack-pattern=\"Build or acquire exploits - T1349\""],"Build social network persona - T1341":["misp-galaxy:mitre-attack-pattern=\"Build social network persona - T1341\""],"Buy domain name - T1328":["misp-galaxy:mitre-attack-pattern=\"Buy domain name - T1328\""],"Bypass User Account Control - T1088":["misp-galaxy:mitre-attack-pattern=\"Bypass User Account Control - T1088\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bypass User Account Control - T1088\""],"C2 protocol development - T1352":["misp-galaxy:mitre-attack-pattern=\"C2 protocol development - T1352\""],"CMSTP - T1191":["misp-galaxy:mitre-attack-pattern=\"CMSTP - T1191\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"CMSTP - T1191\""],"Capture Clipboard Data - T1414":["misp-galaxy:mitre-attack-pattern=\"Capture Clipboard Data - T1414\""],"Capture SMS Messages - T1412":["misp-galaxy:mitre-attack-pattern=\"Capture SMS Messages - T1412\""],"Change Default File Association - T1042":["misp-galaxy:mitre-attack-pattern=\"Change Default File Association - T1042\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Change Default File Association - T1042\""],"Choose pre-compromised mobile app developer account credentials or signing keys - T1391":["misp-galaxy:mitre-attack-pattern=\"Choose pre-compromised mobile app developer account credentials or signing keys - T1391\""],"Choose pre-compromised persona and affiliated accounts - T1343":["misp-galaxy:mitre-attack-pattern=\"Choose pre-compromised persona and affiliated accounts - T1343\""],"Clear Command History - T1146":["misp-galaxy:mitre-attack-pattern=\"Clear Command History - T1146\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Clear Command History - T1146\""],"Clipboard Data - T1115":["misp-galaxy:mitre-attack-pattern=\"Clipboard Data - T1115\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Clipboard Data - T1115\""],"Code Signing - T1116":["misp-galaxy:mitre-attack-pattern=\"Code Signing - T1116\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Code Signing - T1116\""],"Command-Line Interface - T1059":["misp-galaxy:mitre-attack-pattern=\"Command-Line Interface - T1059\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Command-Line Interface - T1059\""],"Common, high volume protocols and software - T1321":["misp-galaxy:mitre-attack-pattern=\"Common, high volume protocols and software - T1321\""],"Commonly Used Port - T1043":["misp-galaxy:mitre-attack-pattern=\"Commonly Used Port - T1043\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Commonly Used Port - T1043\""],"Commonly Used Port - T1436":["misp-galaxy:mitre-attack-pattern=\"Commonly Used Port - T1436\""],"Communication Through Removable Media - T1092":["misp-galaxy:mitre-attack-pattern=\"Communication Through Removable Media - T1092\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Communication Through Removable Media - T1092\""],"Compile After Delivery - T1500":["misp-galaxy:mitre-attack-pattern=\"Compile After Delivery - T1500\""],"Compiled HTML File - T1223":["misp-galaxy:mitre-attack-pattern=\"Compiled HTML File - T1223\""],"Component Firmware - T1109":["misp-galaxy:mitre-attack-pattern=\"Component Firmware - T1109\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Component Firmware - T1109\""],"Component Object Model Hijacking - T1122":["misp-galaxy:mitre-attack-pattern=\"Component Object Model Hijacking - T1122\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Component Object Model Hijacking - T1122\""],"Compromise 3rd party infrastructure to support delivery - T1312":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - T1312\""],"Compromise 3rd party infrastructure to support delivery - T1334":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - T1334\""],"Compromise 3rd party or closed-source vulnerability\/exploit information - T1354":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party or closed-source vulnerability\/exploit information - T1354\""],"Compromise of externally facing system - T1388":["misp-galaxy:mitre-attack-pattern=\"Compromise of externally facing system - T1388\""],"Conduct active scanning - T1254":["misp-galaxy:mitre-attack-pattern=\"Conduct active scanning - T1254\""],"Conduct cost\/benefit analysis - T1226":["misp-galaxy:mitre-attack-pattern=\"Conduct cost\/benefit analysis - T1226\""],"Conduct passive scanning - T1253":["misp-galaxy:mitre-attack-pattern=\"Conduct passive scanning - T1253\""],"Conduct social engineering - T1249":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1249\""],"Conduct social engineering - T1268":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1268\""],"Conduct social engineering - T1279":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1279\""],"Conduct social engineering or HUMINT operation - T1376":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering or HUMINT operation - T1376\""],"Confirmation of launched compromise achieved - T1383":["misp-galaxy:mitre-attack-pattern=\"Confirmation of launched compromise achieved - T1383\""],"Connection Proxy - T1090":["misp-galaxy:mitre-attack-pattern=\"Connection Proxy - T1090\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Connection Proxy - T1090\""],"Control Panel Items - T1196":["misp-galaxy:mitre-attack-pattern=\"Control Panel Items - T1196\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Control Panel Items - T1196\""],"Create Account - T1136":["misp-galaxy:mitre-attack-pattern=\"Create Account - T1136\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Create Account - T1136\""],"Create backup infrastructure - T1339":["misp-galaxy:mitre-attack-pattern=\"Create backup infrastructure - T1339\""],"Create custom payloads - T1345":["misp-galaxy:mitre-attack-pattern=\"Create custom payloads - T1345\""],"Create implementation plan - T1232":["misp-galaxy:mitre-attack-pattern=\"Create implementation plan - T1232\""],"Create infected removable media - T1355":["misp-galaxy:mitre-attack-pattern=\"Create infected removable media - T1355\""],"Create strategic plan - T1231":["misp-galaxy:mitre-attack-pattern=\"Create strategic plan - T1231\""],"Credential Dumping - T1003":["misp-galaxy:mitre-attack-pattern=\"Credential Dumping - T1003\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credential Dumping - T1003\""],"Credential pharming - T1374":["misp-galaxy:mitre-attack-pattern=\"Credential pharming - T1374\""],"Credentials in Files - T1081":["misp-galaxy:mitre-attack-pattern=\"Credentials in Files - T1081\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credentials in Files - T1081\""],"Credentials in Registry - T1214":["misp-galaxy:mitre-attack-pattern=\"Credentials in Registry - T1214\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credentials in Registry - T1214\""],"Custom Command and Control Protocol - T1094":["misp-galaxy:mitre-attack-pattern=\"Custom Command and Control Protocol - T1094\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Custom Command and Control Protocol - T1094\""],"Custom Cryptographic Protocol - T1024":["misp-galaxy:mitre-attack-pattern=\"Custom Cryptographic Protocol - T1024\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Custom Cryptographic Protocol - T1024\""],"DCShadow - T1207":["misp-galaxy:mitre-attack-pattern=\"DCShadow - T1207\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DCShadow - T1207\""],"DLL Search Order Hijacking - T1038":["misp-galaxy:mitre-attack-pattern=\"DLL Search Order Hijacking - T1038\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DLL Search Order Hijacking - T1038\""],"DLL Side-Loading - T1073":["misp-galaxy:mitre-attack-pattern=\"DLL Side-Loading - T1073\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DLL Side-Loading - T1073\""],"DNS poisoning - T1382":["misp-galaxy:mitre-attack-pattern=\"DNS poisoning - T1382\""],"DNSCalc - T1324":["misp-galaxy:mitre-attack-pattern=\"DNSCalc - T1324\""],"Data Compressed - T1002":["misp-galaxy:mitre-attack-pattern=\"Data Compressed - T1002\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Compressed - T1002\""],"Data Destruction - T1485":["misp-galaxy:mitre-attack-pattern=\"Data Destruction - T1485\""],"Data Encoding - T1132":["misp-galaxy:mitre-attack-pattern=\"Data Encoding - T1132\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Encoding - T1132\""],"Data Encrypted - T1022":["misp-galaxy:mitre-attack-pattern=\"Data Encrypted - T1022\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Encrypted - T1022\""],"Data Encrypted for Impact - T1486":["misp-galaxy:mitre-attack-pattern=\"Data Encrypted for Impact - T1486\""],"Data Hiding - T1320":["misp-galaxy:mitre-attack-pattern=\"Data Hiding - T1320\""],"Data Obfuscation - T1001":["misp-galaxy:mitre-attack-pattern=\"Data Obfuscation - T1001\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Obfuscation - T1001\""],"Data Staged - T1074":["misp-galaxy:mitre-attack-pattern=\"Data Staged - T1074\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Staged - T1074\""],"Data Transfer Size Limits - T1030":["misp-galaxy:mitre-attack-pattern=\"Data Transfer Size Limits - T1030\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Transfer Size Limits - T1030\""],"Data from Information Repositories - T1213":["misp-galaxy:mitre-attack-pattern=\"Data from Information Repositories - T1213\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Information Repositories - T1213\""],"Data from Local System - T1005":["misp-galaxy:mitre-attack-pattern=\"Data from Local System - T1005\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Local System - T1005\""],"Data from Network Shared Drive - T1039":["misp-galaxy:mitre-attack-pattern=\"Data from Network Shared Drive - T1039\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Network Shared Drive - T1039\""],"Data from Removable Media - T1025":["misp-galaxy:mitre-attack-pattern=\"Data from Removable Media - T1025\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Removable Media - T1025\""],"Defacement - T1491":["misp-galaxy:mitre-attack-pattern=\"Defacement - T1491\""],"Deliver Malicious App via Authorized App Store - T1475":["misp-galaxy:mitre-attack-pattern=\"Deliver Malicious App via Authorized App Store - T1475\""],"Deliver Malicious App via Other Means - T1476":["misp-galaxy:mitre-attack-pattern=\"Deliver Malicious App via Other Means - T1476\""],"Deobfuscate\/Decode Files or Information - T1140":["misp-galaxy:mitre-attack-pattern=\"Deobfuscate\/Decode Files or Information - T1140\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Deobfuscate\/Decode Files or Information - T1140\""],"Deploy exploit using advertising - T1380":["misp-galaxy:mitre-attack-pattern=\"Deploy exploit using advertising - T1380\""],"Derive intelligence requirements - T1230":["misp-galaxy:mitre-attack-pattern=\"Derive intelligence requirements - T1230\""],"Detect App Analysis Environment - T1440":["misp-galaxy:mitre-attack-pattern=\"Detect App Analysis Environment - T1440\""],"Determine 3rd party infrastructure services - T1260":["misp-galaxy:mitre-attack-pattern=\"Determine 3rd party infrastructure services - T1260\""],"Determine 3rd party infrastructure services - T1284":["misp-galaxy:mitre-attack-pattern=\"Determine 3rd party infrastructure services - T1284\""],"Determine approach\/attack vector - T1245":["misp-galaxy:mitre-attack-pattern=\"Determine approach\/attack vector - T1245\""],"Determine centralization of IT management - T1285":["misp-galaxy:mitre-attack-pattern=\"Determine centralization of IT management - T1285\""],"Determine domain and IP address space - T1250":["misp-galaxy:mitre-attack-pattern=\"Determine domain and IP address space - T1250\""],"Determine external network trust dependencies - T1259":["misp-galaxy:mitre-attack-pattern=\"Determine external network trust dependencies - T1259\""],"Determine firmware version - T1258":["misp-galaxy:mitre-attack-pattern=\"Determine firmware version - T1258\""],"Determine highest level tactical element - T1243":["misp-galaxy:mitre-attack-pattern=\"Determine highest level tactical element - T1243\""],"Determine operational element - T1242":["misp-galaxy:mitre-attack-pattern=\"Determine operational element - T1242\""],"Determine physical locations - T1282":["misp-galaxy:mitre-attack-pattern=\"Determine physical locations - T1282\""],"Determine secondary level tactical element - T1244":["misp-galaxy:mitre-attack-pattern=\"Determine secondary level tactical element - T1244\""],"Determine strategic target - T1241":["misp-galaxy:mitre-attack-pattern=\"Determine strategic target - T1241\""],"Develop KITs\/KIQs - T1227":["misp-galaxy:mitre-attack-pattern=\"Develop KITs\/KIQs - T1227\""],"Develop social network persona digital footprint - T1342":["misp-galaxy:mitre-attack-pattern=\"Develop social network persona digital footprint - T1342\""],"Device Type Discovery - T1419":["misp-galaxy:mitre-attack-pattern=\"Device Type Discovery - T1419\""],"Device Unlock Code Guessing or Brute Force - T1459":["misp-galaxy:mitre-attack-pattern=\"Device Unlock Code Guessing or Brute Force - T1459\""],"Disabling Security Tools - T1089":["misp-galaxy:mitre-attack-pattern=\"Disabling Security Tools - T1089\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Disabling Security Tools - T1089\""],"Discover new exploits and monitor exploit-provider forums - T1350":["misp-galaxy:mitre-attack-pattern=\"Discover new exploits and monitor exploit-provider forums - T1350\""],"Discover target logon\/email address format - T1255":["misp-galaxy:mitre-attack-pattern=\"Discover target logon\/email address format - T1255\""],"Disguise Root\/Jailbreak Indicators - T1408":["misp-galaxy:mitre-attack-pattern=\"Disguise Root\/Jailbreak Indicators - T1408\""],"Disk Content Wipe - T1488":["misp-galaxy:mitre-attack-pattern=\"Disk Content Wipe - T1488\""],"Disk Structure Wipe - T1487":["misp-galaxy:mitre-attack-pattern=\"Disk Structure Wipe - T1487\""],"Disseminate removable media - T1379":["misp-galaxy:mitre-attack-pattern=\"Disseminate removable media - T1379\""],"Distribute malicious software development tools - T1394":["misp-galaxy:mitre-attack-pattern=\"Distribute malicious software development tools - T1394\""],"Distributed Component Object Model - T1175":["misp-galaxy:mitre-attack-pattern=\"Distributed Component Object Model - T1175\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Distributed Component Object Model - T1175\""],"Domain Fronting - T1172":["misp-galaxy:mitre-attack-pattern=\"Domain Fronting - T1172\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Domain Fronting - T1172\""],"Domain Generation Algorithms (DGA) - T1323":["misp-galaxy:mitre-attack-pattern=\"Domain Generation Algorithms (DGA) - T1323\""],"Domain Generation Algorithms - T1483":["misp-galaxy:mitre-attack-pattern=\"Domain Generation Algorithms - T1483\""],"Domain Trust Discovery - T1482":["misp-galaxy:mitre-attack-pattern=\"Domain Trust Discovery - T1482\""],"Domain registration hijacking - T1326":["misp-galaxy:mitre-attack-pattern=\"Domain registration hijacking - T1326\""],"Downgrade to Insecure Protocols - T1466":["misp-galaxy:mitre-attack-pattern=\"Downgrade to Insecure Protocols - T1466\""],"Download New Code at Runtime - T1407":["misp-galaxy:mitre-attack-pattern=\"Download New Code at Runtime - T1407\""],"Drive-by Compromise - T1189":["misp-galaxy:mitre-attack-pattern=\"Drive-by Compromise - T1189\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Drive-by Compromise - T1189\""],"Drive-by Compromise - T1456":["misp-galaxy:mitre-attack-pattern=\"Drive-by Compromise - T1456\""],"Dumpster dive - T1286":["misp-galaxy:mitre-attack-pattern=\"Dumpster dive - T1286\""],"Dylib Hijacking - T1157":["misp-galaxy:mitre-attack-pattern=\"Dylib Hijacking - T1157\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Dylib Hijacking - T1157\""],"Dynamic DNS - T1311":["misp-galaxy:mitre-attack-pattern=\"Dynamic DNS - T1311\""],"Dynamic DNS - T1333":["misp-galaxy:mitre-attack-pattern=\"Dynamic DNS - T1333\""],"Dynamic Data Exchange - T1173":["misp-galaxy:mitre-attack-pattern=\"Dynamic Data Exchange - T1173\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Dynamic Data Exchange - T1173\""],"Eavesdrop on Insecure Network Communication - T1439":["misp-galaxy:mitre-attack-pattern=\"Eavesdrop on Insecure Network Communication - T1439\""],"Email Collection - T1114":["misp-galaxy:mitre-attack-pattern=\"Email Collection - T1114\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Email Collection - T1114\""],"Encrypt Files - T1471":["misp-galaxy:mitre-attack-pattern=\"Encrypt Files - T1471\""],"Encrypt Files for Ransom - T1471":["misp-galaxy:mitre-attack-pattern=\"Encrypt Files for Ransom - T1471\""],"Endpoint Denial of Service - T1499":["misp-galaxy:mitre-attack-pattern=\"Endpoint Denial of Service - T1499\""],"Enumerate client configurations - T1262":["misp-galaxy:mitre-attack-pattern=\"Enumerate client configurations - T1262\""],"Enumerate externally facing software applications technologies, languages, and dependencies - T1261":["misp-galaxy:mitre-attack-pattern=\"Enumerate externally facing software applications technologies, languages, and dependencies - T1261\""],"Execution Guardrails - T1480":["misp-galaxy:mitre-attack-pattern=\"Execution Guardrails - T1480\""],"Execution through API - T1106":["misp-galaxy:mitre-attack-pattern=\"Execution through API - T1106\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Execution through API - T1106\""],"Execution through Module Load - T1129":["misp-galaxy:mitre-attack-pattern=\"Execution through Module Load - T1129\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Execution through Module Load - T1129\""],"Exfiltration Over Alternative Protocol - T1048":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Alternative Protocol - T1048\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Alternative Protocol - T1048\""],"Exfiltration Over Command and Control Channel - T1041":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Command and Control Channel - T1041\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Command and Control Channel - T1041\""],"Exfiltration Over Other Network Medium - T1011":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Other Network Medium - T1011\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Other Network Medium - T1011\""],"Exfiltration Over Physical Medium - T1052":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Physical Medium - T1052\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Physical Medium - T1052\""],"Exploit Baseband Vulnerability - T1455":["misp-galaxy:mitre-attack-pattern=\"Exploit Baseband Vulnerability - T1455\""],"Exploit Enterprise Resources - T1428":["misp-galaxy:mitre-attack-pattern=\"Exploit Enterprise Resources - T1428\""],"Exploit OS Vulnerability - T1404":["misp-galaxy:mitre-attack-pattern=\"Exploit OS Vulnerability - T1404\""],"Exploit Public-Facing Application - T1190":["misp-galaxy:mitre-attack-pattern=\"Exploit Public-Facing Application - T1190\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploit Public-Facing Application - T1190\""],"Exploit SS7 to Redirect Phone Calls\/SMS - T1449":["misp-galaxy:mitre-attack-pattern=\"Exploit SS7 to Redirect Phone Calls\/SMS - T1449\""],"Exploit SS7 to Track Device Location - T1450":["misp-galaxy:mitre-attack-pattern=\"Exploit SS7 to Track Device Location - T1450\""],"Exploit TEE Vulnerability - T1405":["misp-galaxy:mitre-attack-pattern=\"Exploit TEE Vulnerability - T1405\""],"Exploit public-facing application - T1377":["misp-galaxy:mitre-attack-pattern=\"Exploit public-facing application - T1377\""],"Exploit via Charging Station or PC - T1458":["misp-galaxy:mitre-attack-pattern=\"Exploit via Charging Station or PC - T1458\""],"Exploit via Radio Interfaces - T1477":["misp-galaxy:mitre-attack-pattern=\"Exploit via Radio Interfaces - T1477\""],"Exploitation for Client Execution - T1203":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Client Execution - T1203\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Client Execution - T1203\""],"Exploitation for Credential Access - T1212":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Credential Access - T1212\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Credential Access - T1212\""],"Exploitation for Defense Evasion - T1211":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Defense Evasion - T1211\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Defense Evasion - T1211\""],"Exploitation for Privilege Escalation - T1068":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Privilege Escalation - T1068\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Privilege Escalation - T1068\""],"Exploitation of Remote Services - T1210":["misp-galaxy:mitre-attack-pattern=\"Exploitation of Remote Services - T1210\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation of Remote Services - T1210\""],"External Remote Services - T1133":["misp-galaxy:mitre-attack-pattern=\"External Remote Services - T1133\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"External Remote Services - T1133\""],"Extra Window Memory Injection - T1181":["misp-galaxy:mitre-attack-pattern=\"Extra Window Memory Injection - T1181\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Extra Window Memory Injection - T1181\""],"Fake Developer Accounts - T1442":["misp-galaxy:mitre-attack-pattern=\"Fake Developer Accounts - T1442\""],"Fallback Channels - T1008":["misp-galaxy:mitre-attack-pattern=\"Fallback Channels - T1008\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Fallback Channels - T1008\""],"Fast Flux DNS - T1325":["misp-galaxy:mitre-attack-pattern=\"Fast Flux DNS - T1325\""],"File Deletion - T1107":["misp-galaxy:mitre-attack-pattern=\"File Deletion - T1107\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File Deletion - T1107\""],"File Permissions Modification - T1222":["misp-galaxy:mitre-attack-pattern=\"File Permissions Modification - T1222\""],"File System Logical Offsets - T1006":["misp-galaxy:mitre-attack-pattern=\"File System Logical Offsets - T1006\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File System Logical Offsets - T1006\""],"File System Permissions Weakness - T1044":["misp-galaxy:mitre-attack-pattern=\"File System Permissions Weakness - T1044\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File System Permissions Weakness - T1044\""],"File and Directory Discovery - T1083":["misp-galaxy:mitre-attack-pattern=\"File and Directory Discovery - T1083\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File and Directory Discovery - T1083\""],"File and Directory Discovery - T1420":["misp-galaxy:mitre-attack-pattern=\"File and Directory Discovery - T1420\""],"Firmware Corruption - T1495":["misp-galaxy:mitre-attack-pattern=\"Firmware Corruption - T1495\""],"Forced Authentication - T1187":["misp-galaxy:mitre-attack-pattern=\"Forced Authentication - T1187\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Forced Authentication - T1187\""],"Friend\/Follow\/Connect to targets of interest - T1344":["misp-galaxy:mitre-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - T1344\""],"Friend\/Follow\/Connect to targets of interest - T1364":["misp-galaxy:mitre-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - T1364\""],"Gatekeeper Bypass - T1144":["misp-galaxy:mitre-attack-pattern=\"Gatekeeper Bypass - T1144\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Gatekeeper Bypass - T1144\""],"Generate Fraudulent Advertising Revenue - T1472":["misp-galaxy:mitre-attack-pattern=\"Generate Fraudulent Advertising Revenue - T1472\""],"Generate analyst intelligence requirements - T1234":["misp-galaxy:mitre-attack-pattern=\"Generate analyst intelligence requirements - T1234\""],"Graphical User Interface - T1061":["misp-galaxy:mitre-attack-pattern=\"Graphical User Interface - T1061\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Graphical User Interface - T1061\""],"Group Policy Modification - T1484":["misp-galaxy:mitre-attack-pattern=\"Group Policy Modification - T1484\""],"HISTCONTROL - T1148":["misp-galaxy:mitre-attack-pattern=\"HISTCONTROL - T1148\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"HISTCONTROL - T1148\""],"Hardware Additions - T1200":["misp-galaxy:mitre-attack-pattern=\"Hardware Additions - T1200\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hardware Additions - T1200\""],"Hardware or software supply chain implant - T1365":["misp-galaxy:mitre-attack-pattern=\"Hardware or software supply chain implant - T1365\""],"Hidden Files and Directories - T1158":["misp-galaxy:mitre-attack-pattern=\"Hidden Files and Directories - T1158\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Files and Directories - T1158\""],"Hidden Users - T1147":["misp-galaxy:mitre-attack-pattern=\"Hidden Users - T1147\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Users - T1147\""],"Hidden Window - T1143":["misp-galaxy:mitre-attack-pattern=\"Hidden Window - T1143\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Window - T1143\""],"Hooking - T1179":["misp-galaxy:mitre-attack-pattern=\"Hooking - T1179\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hooking - T1179\""],"Host-based hiding techniques - T1314":["misp-galaxy:mitre-attack-pattern=\"Host-based hiding techniques - T1314\""],"Human performs requested action of physical nature - T1385":["misp-galaxy:mitre-attack-pattern=\"Human performs requested action of physical nature - T1385\""],"Hypervisor - T1062":["misp-galaxy:mitre-attack-pattern=\"Hypervisor - T1062\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hypervisor - T1062\""],"Identify analyst level gaps - T1233":["misp-galaxy:mitre-attack-pattern=\"Identify analyst level gaps - T1233\""],"Identify business processes\/tempo - T1280":["misp-galaxy:mitre-attack-pattern=\"Identify business processes\/tempo - T1280\""],"Identify business relationships - T1272":["misp-galaxy:mitre-attack-pattern=\"Identify business relationships - T1272\""],"Identify business relationships - T1283":["misp-galaxy:mitre-attack-pattern=\"Identify business relationships - T1283\""],"Identify gap areas - T1225":["misp-galaxy:mitre-attack-pattern=\"Identify gap areas - T1225\""],"Identify groups\/roles - T1270":["misp-galaxy:mitre-attack-pattern=\"Identify groups\/roles - T1270\""],"Identify job postings and needs\/gaps - T1248":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1248\""],"Identify job postings and needs\/gaps - T1267":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1267\""],"Identify job postings and needs\/gaps - T1278":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1278\""],"Identify people of interest - T1269":["misp-galaxy:mitre-attack-pattern=\"Identify people of interest - T1269\""],"Identify personnel with an authority\/privilege - T1271":["misp-galaxy:mitre-attack-pattern=\"Identify personnel with an authority\/privilege - T1271\""],"Identify resources required to build capabilities - T1348":["misp-galaxy:mitre-attack-pattern=\"Identify resources required to build capabilities - T1348\""],"Identify security defensive capabilities - T1263":["misp-galaxy:mitre-attack-pattern=\"Identify security defensive capabilities - T1263\""],"Identify sensitive personnel information - T1274":["misp-galaxy:mitre-attack-pattern=\"Identify sensitive personnel information - T1274\""],"Identify supply chains - T1246":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1246\""],"Identify supply chains - T1265":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1265\""],"Identify supply chains - T1276":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1276\""],"Identify technology usage patterns - T1264":["misp-galaxy:mitre-attack-pattern=\"Identify technology usage patterns - T1264\""],"Identify vulnerabilities in third-party software libraries - T1389":["misp-galaxy:mitre-attack-pattern=\"Identify vulnerabilities in third-party software libraries - T1389\""],"Identify web defensive services - T1256":["misp-galaxy:mitre-attack-pattern=\"Identify web defensive services - T1256\""],"Image File Execution Options Injection - T1183":["misp-galaxy:mitre-attack-pattern=\"Image File Execution Options Injection - T1183\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Image File Execution Options Injection - T1183\""],"Indicator Blocking - T1054":["misp-galaxy:mitre-attack-pattern=\"Indicator Blocking - T1054\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Blocking - T1054\""],"Indicator Removal from Tools - T1066":["misp-galaxy:mitre-attack-pattern=\"Indicator Removal from Tools - T1066\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Removal from Tools - T1066\""],"Indicator Removal on Host - T1070":["misp-galaxy:mitre-attack-pattern=\"Indicator Removal on Host - T1070\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Removal on Host - T1070\""],"Indirect Command Execution - T1202":["misp-galaxy:mitre-attack-pattern=\"Indirect Command Execution - T1202\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indirect Command Execution - T1202\""],"Inhibit System Recovery - T1490":["misp-galaxy:mitre-attack-pattern=\"Inhibit System Recovery - T1490\""],"Input Capture - T1056":["misp-galaxy:mitre-attack-pattern=\"Input Capture - T1056\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Input Capture - T1056\""],"Input Prompt - T1141":["misp-galaxy:mitre-attack-pattern=\"Input Prompt - T1141\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Input Prompt - T1141\""],"Insecure Third-Party Libraries - T1425":["misp-galaxy:mitre-attack-pattern=\"Insecure Third-Party Libraries - T1425\""],"Install Insecure or Malicious Configuration - T1478":["misp-galaxy:mitre-attack-pattern=\"Install Insecure or Malicious Configuration - T1478\""],"Install Root Certificate - T1130":["misp-galaxy:mitre-attack-pattern=\"Install Root Certificate - T1130\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Install Root Certificate - T1130\""],"Install and configure hardware, network, and systems - T1336":["misp-galaxy:mitre-attack-pattern=\"Install and configure hardware, network, and systems - T1336\""],"InstallUtil - T1118":["misp-galaxy:mitre-attack-pattern=\"InstallUtil - T1118\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"InstallUtil - T1118\""],"Jamming or Denial of Service - T1464":["misp-galaxy:mitre-attack-pattern=\"Jamming or Denial of Service - T1464\""],"Kerberoasting - T1208":["misp-galaxy:mitre-attack-pattern=\"Kerberoasting - T1208\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Kerberoasting - T1208\""],"Kernel Modules and Extensions - T1215":["misp-galaxy:mitre-attack-pattern=\"Kernel Modules and Extensions - T1215\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Kernel Modules and Extensions - T1215\""],"Keychain - T1142":["misp-galaxy:mitre-attack-pattern=\"Keychain - T1142\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Keychain - T1142\""],"LC_LOAD_DYLIB Addition - T1161":["misp-galaxy:mitre-attack-pattern=\"LC_LOAD_DYLIB Addition - T1161\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LC_LOAD_DYLIB Addition - T1161\""],"LC_MAIN Hijacking - T1149":["misp-galaxy:mitre-attack-pattern=\"LC_MAIN Hijacking - T1149\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LC_MAIN Hijacking - T1149\""],"LLMNR\/NBT-NS Poisoning - T1171":["misp-galaxy:mitre-attack-pattern=\"LLMNR\/NBT-NS Poisoning - T1171\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LLMNR\/NBT-NS Poisoning - T1171\""],"LLMNR\/NBT-NS Poisoning and Relay - T1171":["misp-galaxy:mitre-attack-pattern=\"LLMNR\/NBT-NS Poisoning and Relay - T1171\""],"LSASS Driver - T1177":["misp-galaxy:mitre-attack-pattern=\"LSASS Driver - T1177\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LSASS Driver - T1177\""],"Launch Agent - T1159":["misp-galaxy:mitre-attack-pattern=\"Launch Agent - T1159\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launch Agent - T1159\""],"Launch Daemon - T1160":["misp-galaxy:mitre-attack-pattern=\"Launch Daemon - T1160\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launch Daemon - T1160\""],"Launchctl - T1152":["misp-galaxy:mitre-attack-pattern=\"Launchctl - T1152\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launchctl - T1152\""],"Leverage compromised 3rd party resources - T1375":["misp-galaxy:mitre-attack-pattern=\"Leverage compromised 3rd party resources - T1375\""],"Local Job Scheduling - T1168":["misp-galaxy:mitre-attack-pattern=\"Local Job Scheduling - T1168\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Local Job Scheduling - T1168\""],"Local Network Configuration Discovery - T1422":["misp-galaxy:mitre-attack-pattern=\"Local Network Configuration Discovery - T1422\""],"Local Network Connections Discovery - T1421":["misp-galaxy:mitre-attack-pattern=\"Local Network Connections Discovery - T1421\""],"Location Tracking - T1430":["misp-galaxy:mitre-attack-pattern=\"Location Tracking - T1430\""],"Lock User Out of Device - T1446":["misp-galaxy:mitre-attack-pattern=\"Lock User Out of Device - T1446\""],"Lockscreen Bypass - T1461":["misp-galaxy:mitre-attack-pattern=\"Lockscreen Bypass - T1461\""],"Login Item - T1162":["misp-galaxy:mitre-attack-pattern=\"Login Item - T1162\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Login Item - T1162\""],"Logon Scripts - T1037":["misp-galaxy:mitre-attack-pattern=\"Logon Scripts - T1037\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Logon Scripts - T1037\""],"Malicious Media Content - T1457":["misp-galaxy:mitre-attack-pattern=\"Malicious Media Content - T1457\""],"Malicious SMS Message - T1454":["misp-galaxy:mitre-attack-pattern=\"Malicious SMS Message - T1454\""],"Malicious Software Development Tools - T1462":["misp-galaxy:mitre-attack-pattern=\"Malicious Software Development Tools - T1462\""],"Malicious Third Party Keyboard App - T1417":["misp-galaxy:mitre-attack-pattern=\"Malicious Third Party Keyboard App - T1417\""],"Malicious or Vulnerable Built-in Device Functionality - T1473":["misp-galaxy:mitre-attack-pattern=\"Malicious or Vulnerable Built-in Device Functionality - T1473\""],"Man in the Browser - T1185":["misp-galaxy:mitre-attack-pattern=\"Man in the Browser - T1185\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Man in the Browser - T1185\""],"Manipulate App Store Rankings or Ratings - T1452":["misp-galaxy:mitre-attack-pattern=\"Manipulate App Store Rankings or Ratings - T1452\""],"Manipulate Device Communication - T1463":["misp-galaxy:mitre-attack-pattern=\"Manipulate Device Communication - T1463\""],"Map network topology - T1252":["misp-galaxy:mitre-attack-pattern=\"Map network topology - T1252\""],"Masquerading - T1036":["misp-galaxy:mitre-attack-pattern=\"Masquerading - T1036\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Masquerading - T1036\""],"Microphone or Camera Recordings - T1429":["misp-galaxy:mitre-attack-pattern=\"Microphone or Camera Recordings - T1429\""],"Mine social media - T1273":["misp-galaxy:mitre-attack-pattern=\"Mine social media - T1273\""],"Mine technical blogs\/forums - T1257":["misp-galaxy:mitre-attack-pattern=\"Mine technical blogs\/forums - T1257\""],"Misattributable credentials - T1322":["misp-galaxy:mitre-attack-pattern=\"Misattributable credentials - T1322\""],"Modify Existing Service - T1031":["misp-galaxy:mitre-attack-pattern=\"Modify Existing Service - T1031\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Modify Existing Service - T1031\""],"Modify OS Kernel or Boot Partition - T1398":["misp-galaxy:mitre-attack-pattern=\"Modify OS Kernel or Boot Partition - T1398\""],"Modify Registry - T1112":["misp-galaxy:mitre-attack-pattern=\"Modify Registry - T1112\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Modify Registry - T1112\""],"Modify System Partition - T1400":["misp-galaxy:mitre-attack-pattern=\"Modify System Partition - T1400\""],"Modify Trusted Execution Environment - T1399":["misp-galaxy:mitre-attack-pattern=\"Modify Trusted Execution Environment - T1399\""],"Modify cached executable code - T1403":["misp-galaxy:mitre-attack-pattern=\"Modify cached executable code - T1403\""],"Mshta - T1170":["misp-galaxy:mitre-attack-pattern=\"Mshta - T1170\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Mshta - T1170\""],"Multi-Stage Channels - T1104":["misp-galaxy:mitre-attack-pattern=\"Multi-Stage Channels - T1104\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multi-Stage Channels - T1104\""],"Multi-hop Proxy - T1188":["misp-galaxy:mitre-attack-pattern=\"Multi-hop Proxy - T1188\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multi-hop Proxy - T1188\""],"Multiband Communication - T1026":["misp-galaxy:mitre-attack-pattern=\"Multiband Communication - T1026\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multiband Communication - T1026\""],"Multilayer Encryption - T1079":["misp-galaxy:mitre-attack-pattern=\"Multilayer Encryption - T1079\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multilayer Encryption - T1079\""],"NTFS File Attributes - T1096":["misp-galaxy:mitre-attack-pattern=\"NTFS File Attributes - T1096\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"NTFS File Attributes - T1096\""],"Netsh Helper DLL - T1128":["misp-galaxy:mitre-attack-pattern=\"Netsh Helper DLL - T1128\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Netsh Helper DLL - T1128\""],"Network Denial of Service - T1498":["misp-galaxy:mitre-attack-pattern=\"Network Denial of Service - T1498\""],"Network Service Scanning - T1046":["misp-galaxy:mitre-attack-pattern=\"Network Service Scanning - T1046\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Service Scanning - T1046\""],"Network Service Scanning - T1423":["misp-galaxy:mitre-attack-pattern=\"Network Service Scanning - T1423\""],"Network Share Connection Removal - T1126":["misp-galaxy:mitre-attack-pattern=\"Network Share Connection Removal - T1126\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Share Connection Removal - T1126\""],"Network Share Discovery - T1135":["misp-galaxy:mitre-attack-pattern=\"Network Share Discovery - T1135\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Share Discovery - T1135\""],"Network Sniffing - T1040":["misp-galaxy:mitre-attack-pattern=\"Network Sniffing - T1040\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Sniffing - T1040\""],"Network Traffic Capture or Redirection - T1410":["misp-galaxy:mitre-attack-pattern=\"Network Traffic Capture or Redirection - T1410\""],"Network-based hiding techniques - T1315":["misp-galaxy:mitre-attack-pattern=\"Network-based hiding techniques - T1315\""],"New Service - T1050":["misp-galaxy:mitre-attack-pattern=\"New Service - T1050\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"New Service - T1050\""],"Non-traditional or less attributable payment options - T1316":["misp-galaxy:mitre-attack-pattern=\"Non-traditional or less attributable payment options - T1316\""],"OS-vendor provided communication channels - T1390":["misp-galaxy:mitre-attack-pattern=\"OS-vendor provided communication channels - T1390\""],"Obfuscate infrastructure - T1309":["misp-galaxy:mitre-attack-pattern=\"Obfuscate infrastructure - T1309\""],"Obfuscate infrastructure - T1331":["misp-galaxy:mitre-attack-pattern=\"Obfuscate infrastructure - T1331\""],"Obfuscate operational infrastructure - T1318":["misp-galaxy:mitre-attack-pattern=\"Obfuscate operational infrastructure - T1318\""],"Obfuscate or encrypt code - T1319":["misp-galaxy:mitre-attack-pattern=\"Obfuscate or encrypt code - T1319\""],"Obfuscated Files or Information - T1027":["misp-galaxy:mitre-attack-pattern=\"Obfuscated Files or Information - T1027\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Obfuscated Files or Information - T1027\""],"Obfuscated Files or Information - T1406":["misp-galaxy:mitre-attack-pattern=\"Obfuscated Files or Information - T1406\""],"Obfuscated or Encrypted Payload - T1406":["misp-galaxy:mitre-attack-pattern=\"Obfuscated or Encrypted Payload - T1406\""],"Obfuscation or cryptography - T1313":["misp-galaxy:mitre-attack-pattern=\"Obfuscation or cryptography - T1313\""],"Obtain Apple iOS enterprise distribution key pair and certificate - T1392":["misp-galaxy:mitre-attack-pattern=\"Obtain Apple iOS enterprise distribution key pair and certificate - T1392\""],"Obtain Device Cloud Backups - T1470":["misp-galaxy:mitre-attack-pattern=\"Obtain Device Cloud Backups - T1470\""],"Obtain booter\/stressor subscription - T1396":["misp-galaxy:mitre-attack-pattern=\"Obtain booter\/stressor subscription - T1396\""],"Obtain domain\/IP registration information - T1251":["misp-galaxy:mitre-attack-pattern=\"Obtain domain\/IP registration information - T1251\""],"Obtain templates\/branding materials - T1281":["misp-galaxy:mitre-attack-pattern=\"Obtain templates\/branding materials - T1281\""],"Obtain\/re-use payloads - T1346":["misp-galaxy:mitre-attack-pattern=\"Obtain\/re-use payloads - T1346\""],"Office Application Startup - T1137":["misp-galaxy:mitre-attack-pattern=\"Office Application Startup - T1137\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Office Application Startup - T1137\""],"Pass the Hash - T1075":["misp-galaxy:mitre-attack-pattern=\"Pass the Hash - T1075\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Pass the Hash - T1075\""],"Pass the Ticket - T1097":["misp-galaxy:mitre-attack-pattern=\"Pass the Ticket - T1097\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Pass the Ticket - T1097\""],"Password Filter DLL - T1174":["misp-galaxy:mitre-attack-pattern=\"Password Filter DLL - T1174\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Password Filter DLL - T1174\""],"Password Policy Discovery - T1201":["misp-galaxy:mitre-attack-pattern=\"Password Policy Discovery - T1201\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Password Policy Discovery - T1201\""],"Path Interception - T1034":["misp-galaxy:mitre-attack-pattern=\"Path Interception - T1034\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Path Interception - T1034\""],"Peripheral Device Discovery - T1120":["misp-galaxy:mitre-attack-pattern=\"Peripheral Device Discovery - T1120\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Peripheral Device Discovery - T1120\""],"Permission Groups Discovery - T1069":["misp-galaxy:mitre-attack-pattern=\"Permission Groups Discovery - T1069\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Permission Groups Discovery - T1069\""],"Plist Modification - T1150":["misp-galaxy:mitre-attack-pattern=\"Plist Modification - T1150\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Plist Modification - T1150\""],"Port Knocking - T1205":["misp-galaxy:mitre-attack-pattern=\"Port Knocking - T1205\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Port Knocking - T1205\""],"Port Monitors - T1013":["misp-galaxy:mitre-attack-pattern=\"Port Monitors - T1013\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Port Monitors - T1013\""],"Port redirector - T1363":["misp-galaxy:mitre-attack-pattern=\"Port redirector - T1363\""],"Post compromise tool development - T1353":["misp-galaxy:mitre-attack-pattern=\"Post compromise tool development - T1353\""],"PowerShell - T1086":["misp-galaxy:mitre-attack-pattern=\"PowerShell - T1086\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"PowerShell - T1086\""],"Premium SMS Toll Fraud - T1448":["misp-galaxy:mitre-attack-pattern=\"Premium SMS Toll Fraud - T1448\""],"Private Keys - T1145":["misp-galaxy:mitre-attack-pattern=\"Private Keys - T1145\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Private Keys - T1145\""],"Private whois services - T1305":["misp-galaxy:mitre-attack-pattern=\"Private whois services - T1305\""],"Process Discovery - T1057":["misp-galaxy:mitre-attack-pattern=\"Process Discovery - T1057\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Discovery - T1057\""],"Process Discovery - T1424":["misp-galaxy:mitre-attack-pattern=\"Process Discovery - T1424\""],"Process Doppelg\u00e4nging - T1186":["misp-galaxy:mitre-attack-pattern=\"Process Doppelg\u00e4nging - T1186\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Doppelg\u00e4nging - T1186\""],"Process Hollowing - T1093":["misp-galaxy:mitre-attack-pattern=\"Process Hollowing - T1093\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Hollowing - T1093\""],"Process Injection - T1055":["misp-galaxy:mitre-attack-pattern=\"Process Injection - T1055\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Injection - T1055\""],"Procure required equipment and software - T1335":["misp-galaxy:mitre-attack-pattern=\"Procure required equipment and software - T1335\""],"Proxy\/protocol relays - T1304":["misp-galaxy:mitre-attack-pattern=\"Proxy\/protocol relays - T1304\""],"Push-notification client-side exploit - T1373":["misp-galaxy:mitre-attack-pattern=\"Push-notification client-side exploit - T1373\""],"Query Registry - T1012":["misp-galaxy:mitre-attack-pattern=\"Query Registry - T1012\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Query Registry - T1012\""],"Rc.common - T1163":["misp-galaxy:mitre-attack-pattern=\"Rc.common - T1163\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rc.common - T1163\""],"Re-opened Applications - T1164":["misp-galaxy:mitre-attack-pattern=\"Re-opened Applications - T1164\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Re-opened Applications - T1164\""],"Receive KITs\/KIQs and determine requirements - T1239":["misp-galaxy:mitre-attack-pattern=\"Receive KITs\/KIQs and determine requirements - T1239\""],"Receive operator KITs\/KIQs tasking - T1235":["misp-galaxy:mitre-attack-pattern=\"Receive operator KITs\/KIQs tasking - T1235\""],"Redundant Access - T1108":["misp-galaxy:mitre-attack-pattern=\"Redundant Access - T1108\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Redundant Access - T1108\""],"Registry Run Keys \/ Startup Folder - T1060":["misp-galaxy:mitre-attack-pattern=\"Registry Run Keys \/ Startup Folder - T1060\""],"Regsvcs\/Regasm - T1121":["misp-galaxy:mitre-attack-pattern=\"Regsvcs\/Regasm - T1121\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Regsvcs\/Regasm - T1121\""],"Regsvr32 - T1117":["misp-galaxy:mitre-attack-pattern=\"Regsvr32 - T1117\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Regsvr32 - T1117\""],"Remote Access Tools - T1219":["misp-galaxy:mitre-attack-pattern=\"Remote Access Tools - T1219\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Access Tools - T1219\""],"Remote Desktop Protocol - T1076":["misp-galaxy:mitre-attack-pattern=\"Remote Desktop Protocol - T1076\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Desktop Protocol - T1076\""],"Remote File Copy - T1105":["misp-galaxy:mitre-attack-pattern=\"Remote File Copy - T1105\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote File Copy - T1105\""],"Remote Services - T1021":["misp-galaxy:mitre-attack-pattern=\"Remote Services - T1021\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Services - T1021\""],"Remote System Discovery - T1018":["misp-galaxy:mitre-attack-pattern=\"Remote System Discovery - T1018\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote System Discovery - T1018\""],"Remote access tool development - T1351":["misp-galaxy:mitre-attack-pattern=\"Remote access tool development - T1351\""],"Remotely Install Application - T1443":["misp-galaxy:mitre-attack-pattern=\"Remotely Install Application - T1443\""],"Remotely Track Device Without Authorization - T1468":["misp-galaxy:mitre-attack-pattern=\"Remotely Track Device Without Authorization - T1468\""],"Remotely Wipe Data Without Authorization - T1469":["misp-galaxy:mitre-attack-pattern=\"Remotely Wipe Data Without Authorization - T1469\""],"Repackaged Application - T1444":["misp-galaxy:mitre-attack-pattern=\"Repackaged Application - T1444\""],"Replace legitimate binary with malware - T1378":["misp-galaxy:mitre-attack-pattern=\"Replace legitimate binary with malware - T1378\""],"Replication Through Removable Media - T1091":["misp-galaxy:mitre-attack-pattern=\"Replication Through Removable Media - T1091\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Replication Through Removable Media - T1091\""],"Research relevant vulnerabilities\/CVEs - T1291":["misp-galaxy:mitre-attack-pattern=\"Research relevant vulnerabilities\/CVEs - T1291\""],"Research visibility gap of security vendors - T1290":["misp-galaxy:mitre-attack-pattern=\"Research visibility gap of security vendors - T1290\""],"Resource Hijacking - T1496":["misp-galaxy:mitre-attack-pattern=\"Resource Hijacking - T1496\""],"Review logs and residual traces - T1358":["misp-galaxy:mitre-attack-pattern=\"Review logs and residual traces - T1358\""],"Rogue Cellular Base Station - T1467":["misp-galaxy:mitre-attack-pattern=\"Rogue Cellular Base Station - T1467\""],"Rogue Wi-Fi Access Points - T1465":["misp-galaxy:mitre-attack-pattern=\"Rogue Wi-Fi Access Points - T1465\""],"Rootkit - T1014":["misp-galaxy:mitre-attack-pattern=\"Rootkit - T1014\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rootkit - T1014\""],"Rundll32 - T1085":["misp-galaxy:mitre-attack-pattern=\"Rundll32 - T1085\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rundll32 - T1085\""],"Runtime Data Manipulation - T1494":["misp-galaxy:mitre-attack-pattern=\"Runtime Data Manipulation - T1494\""],"Runtime code download and execution - T1395":["misp-galaxy:mitre-attack-pattern=\"Runtime code download and execution - T1395\""],"SID-History Injection - T1178":["misp-galaxy:mitre-attack-pattern=\"SID-History Injection - T1178\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SID-History Injection - T1178\""],"SIM Card Swap - T1451":["misp-galaxy:mitre-attack-pattern=\"SIM Card Swap - T1451\""],"SIP and Trust Provider Hijacking - T1198":["misp-galaxy:mitre-attack-pattern=\"SIP and Trust Provider Hijacking - T1198\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SIP and Trust Provider Hijacking - T1198\""],"SSH Hijacking - T1184":["misp-galaxy:mitre-attack-pattern=\"SSH Hijacking - T1184\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SSH Hijacking - T1184\""],"SSL certificate acquisition for domain - T1337":["misp-galaxy:mitre-attack-pattern=\"SSL certificate acquisition for domain - T1337\""],"SSL certificate acquisition for trust breaking - T1338":["misp-galaxy:mitre-attack-pattern=\"SSL certificate acquisition for trust breaking - T1338\""],"Scheduled Task - T1053":["misp-galaxy:mitre-attack-pattern=\"Scheduled Task - T1053\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scheduled Task - T1053\""],"Scheduled Transfer - T1029":["misp-galaxy:mitre-attack-pattern=\"Scheduled Transfer - T1029\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scheduled Transfer - T1029\""],"Screen Capture - T1113":["misp-galaxy:mitre-attack-pattern=\"Screen Capture - T1113\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Screen Capture - T1113\""],"Screensaver - T1180":["misp-galaxy:mitre-attack-pattern=\"Screensaver - T1180\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Screensaver - T1180\""],"Scripting - T1064":["misp-galaxy:mitre-attack-pattern=\"Scripting - T1064\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scripting - T1064\""],"Secure and protect infrastructure - T1317":["misp-galaxy:mitre-attack-pattern=\"Secure and protect infrastructure - T1317\""],"Security Software Discovery - T1063":["misp-galaxy:mitre-attack-pattern=\"Security Software Discovery - T1063\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Security Software Discovery - T1063\""],"Security Support Provider - T1101":["misp-galaxy:mitre-attack-pattern=\"Security Support Provider - T1101\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Security Support Provider - T1101\""],"Securityd Memory - T1167":["misp-galaxy:mitre-attack-pattern=\"Securityd Memory - T1167\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Securityd Memory - T1167\""],"Service Execution - T1035":["misp-galaxy:mitre-attack-pattern=\"Service Execution - T1035\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Service Execution - T1035\""],"Service Registry Permissions Weakness - T1058":["misp-galaxy:mitre-attack-pattern=\"Service Registry Permissions Weakness - T1058\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Service Registry Permissions Weakness - T1058\""],"Service Stop - T1489":["misp-galaxy:mitre-attack-pattern=\"Service Stop - T1489\""],"Setuid and Setgid - T1166":["misp-galaxy:mitre-attack-pattern=\"Setuid and Setgid - T1166\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Setuid and Setgid - T1166\""],"Shadow DNS - T1340":["misp-galaxy:mitre-attack-pattern=\"Shadow DNS - T1340\""],"Shared Webroot - T1051":["misp-galaxy:mitre-attack-pattern=\"Shared Webroot - T1051\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Shared Webroot - T1051\""],"Shortcut Modification - T1023":["misp-galaxy:mitre-attack-pattern=\"Shortcut Modification - T1023\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Shortcut Modification - T1023\""],"Signed Binary Proxy Execution - T1218":["misp-galaxy:mitre-attack-pattern=\"Signed Binary Proxy Execution - T1218\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Signed Binary Proxy Execution - T1218\""],"Signed Script Proxy Execution - T1216":["misp-galaxy:mitre-attack-pattern=\"Signed Script Proxy Execution - T1216\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Signed Script Proxy Execution - T1216\""],"Software Packing - T1045":["misp-galaxy:mitre-attack-pattern=\"Software Packing - T1045\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Software Packing - T1045\""],"Source - T1153":["misp-galaxy:mitre-attack-pattern=\"Source - T1153\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Source - T1153\""],"Space after Filename - T1151":["misp-galaxy:mitre-attack-pattern=\"Space after Filename - T1151\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Space after Filename - T1151\""],"Spear phishing messages with malicious attachments - T1367":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with malicious attachments - T1367\""],"Spear phishing messages with malicious links - T1369":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with malicious links - T1369\""],"Spear phishing messages with text only - T1368":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with text only - T1368\""],"Spearphishing Attachment - T1193":["misp-galaxy:mitre-attack-pattern=\"Spearphishing Attachment - T1193\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing Attachment - T1193\""],"Spearphishing Link - T1192":["misp-galaxy:mitre-attack-pattern=\"Spearphishing Link - T1192\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing Link - T1192\""],"Spearphishing for Information - T1397":["misp-galaxy:mitre-attack-pattern=\"Spearphishing for Information - T1397\""],"Spearphishing via Service - T1194":["misp-galaxy:mitre-attack-pattern=\"Spearphishing via Service - T1194\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing via Service - T1194\""],"Standard Application Layer Protocol - T1071":["misp-galaxy:mitre-attack-pattern=\"Standard Application Layer Protocol - T1071\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Application Layer Protocol - T1071\""],"Standard Application Layer Protocol - T1437":["misp-galaxy:mitre-attack-pattern=\"Standard Application Layer Protocol - T1437\""],"Standard Cryptographic Protocol - T1032":["misp-galaxy:mitre-attack-pattern=\"Standard Cryptographic Protocol - T1032\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Cryptographic Protocol - T1032\""],"Standard Non-Application Layer Protocol - T1095":["misp-galaxy:mitre-attack-pattern=\"Standard Non-Application Layer Protocol - T1095\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Non-Application Layer Protocol - T1095\""],"Startup Items - T1165":["misp-galaxy:mitre-attack-pattern=\"Startup Items - T1165\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Startup Items - T1165\""],"Stolen Developer Credentials or Signing Keys - T1441":["misp-galaxy:mitre-attack-pattern=\"Stolen Developer Credentials or Signing Keys - T1441\""],"Stored Data Manipulation - T1492":["misp-galaxy:mitre-attack-pattern=\"Stored Data Manipulation - T1492\""],"Submit KITs, KIQs, and intelligence requirements - T1237":["misp-galaxy:mitre-attack-pattern=\"Submit KITs, KIQs, and intelligence requirements - T1237\""],"Sudo - T1169":["misp-galaxy:mitre-attack-pattern=\"Sudo - T1169\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Sudo - T1169\""],"Sudo Caching - T1206":["misp-galaxy:mitre-attack-pattern=\"Sudo Caching - T1206\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Sudo Caching - T1206\""],"Supply Chain Compromise - T1195":["misp-galaxy:mitre-attack-pattern=\"Supply Chain Compromise - T1195\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Supply Chain Compromise - T1195\""],"Supply Chain Compromise - T1474":["misp-galaxy:mitre-attack-pattern=\"Supply Chain Compromise - T1474\""],"System Firmware - T1019":["misp-galaxy:mitre-attack-pattern=\"System Firmware - T1019\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Firmware - T1019\""],"System Information Discovery - T1082":["misp-galaxy:mitre-attack-pattern=\"System Information Discovery - T1082\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Information Discovery - T1082\""],"System Information Discovery - T1426":["misp-galaxy:mitre-attack-pattern=\"System Information Discovery - T1426\""],"System Network Configuration Discovery - T1016":["misp-galaxy:mitre-attack-pattern=\"System Network Configuration Discovery - T1016\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Network Configuration Discovery - T1016\""],"System Network Configuration Discovery - T1422":["misp-galaxy:mitre-attack-pattern=\"System Network Configuration Discovery - T1422\""],"System Network Connections Discovery - T1049":["misp-galaxy:mitre-attack-pattern=\"System Network Connections Discovery - T1049\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Network Connections Discovery - T1049\""],"System Network Connections Discovery - T1421":["misp-galaxy:mitre-attack-pattern=\"System Network Connections Discovery - T1421\""],"System Owner\/User Discovery - T1033":["misp-galaxy:mitre-attack-pattern=\"System Owner\/User Discovery - T1033\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Owner\/User Discovery - T1033\""],"System Service Discovery - T1007":["misp-galaxy:mitre-attack-pattern=\"System Service Discovery - T1007\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Service Discovery - T1007\""],"System Time Discovery - T1124":["misp-galaxy:mitre-attack-pattern=\"System Time Discovery - T1124\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Time Discovery - T1124\""],"Systemd Service - T1501":["misp-galaxy:mitre-attack-pattern=\"Systemd Service - T1501\""],"Taint Shared Content - T1080":["misp-galaxy:mitre-attack-pattern=\"Taint Shared Content - T1080\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Taint Shared Content - T1080\""],"Targeted client-side exploitation - T1371":["misp-galaxy:mitre-attack-pattern=\"Targeted client-side exploitation - T1371\""],"Targeted social media phishing - T1366":["misp-galaxy:mitre-attack-pattern=\"Targeted social media phishing - T1366\""],"Task requirements - T1240":["misp-galaxy:mitre-attack-pattern=\"Task requirements - T1240\""],"Template Injection - T1221":["misp-galaxy:mitre-attack-pattern=\"Template Injection - T1221\""],"Test ability to evade automated mobile application security analysis performed by app stores - T1393":["misp-galaxy:mitre-attack-pattern=\"Test ability to evade automated mobile application security analysis performed by app stores - T1393\""],"Test callback functionality - T1356":["misp-galaxy:mitre-attack-pattern=\"Test callback functionality - T1356\""],"Test malware in various execution environments - T1357":["misp-galaxy:mitre-attack-pattern=\"Test malware in various execution environments - T1357\""],"Test malware to evade detection - T1359":["misp-galaxy:mitre-attack-pattern=\"Test malware to evade detection - T1359\""],"Test physical access - T1360":["misp-galaxy:mitre-attack-pattern=\"Test physical access - T1360\""],"Test signature detection - T1292":["misp-galaxy:mitre-attack-pattern=\"Test signature detection - T1292\""],"Test signature detection for file upload\/email filters - T1361":["misp-galaxy:mitre-attack-pattern=\"Test signature detection for file upload\/email filters - T1361\""],"Third-party Software - T1072":["misp-galaxy:mitre-attack-pattern=\"Third-party Software - T1072\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Third-party Software - T1072\""],"Time Providers - T1209":["misp-galaxy:mitre-attack-pattern=\"Time Providers - T1209\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Time Providers - T1209\""],"Timestomp - T1099":["misp-galaxy:mitre-attack-pattern=\"Timestomp - T1099\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Timestomp - T1099\""],"Transmitted Data Manipulation - T1493":["misp-galaxy:mitre-attack-pattern=\"Transmitted Data Manipulation - T1493\""],"Trap - T1154":["misp-galaxy:mitre-attack-pattern=\"Trap - T1154\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trap - T1154\""],"Trusted Developer Utilities - T1127":["misp-galaxy:mitre-attack-pattern=\"Trusted Developer Utilities - T1127\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trusted Developer Utilities - T1127\""],"Trusted Relationship - T1199":["misp-galaxy:mitre-attack-pattern=\"Trusted Relationship - T1199\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trusted Relationship - T1199\""],"Two-Factor Authentication Interception - T1111":["misp-galaxy:mitre-attack-pattern=\"Two-Factor Authentication Interception - T1111\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Two-Factor Authentication Interception - T1111\""],"URL Scheme Hijacking - T1415":["misp-galaxy:mitre-attack-pattern=\"URL Scheme Hijacking - T1415\""],"Unauthorized user introduces compromise delivery mechanism - T1387":["misp-galaxy:mitre-attack-pattern=\"Unauthorized user introduces compromise delivery mechanism - T1387\""],"Uncommonly Used Port - T1065":["misp-galaxy:mitre-attack-pattern=\"Uncommonly Used Port - T1065\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Uncommonly Used Port - T1065\""],"Unconditional client-side exploitation\/Injected Website\/Driveby - T1372":["misp-galaxy:mitre-attack-pattern=\"Unconditional client-side exploitation\/Injected Website\/Driveby - T1372\""],"Untargeted client-side exploitation - T1370":["misp-galaxy:mitre-attack-pattern=\"Untargeted client-side exploitation - T1370\""],"Upload, install, and configure software\/tools - T1362":["misp-galaxy:mitre-attack-pattern=\"Upload, install, and configure software\/tools - T1362\""],"Use multiple DNS infrastructures - T1327":["misp-galaxy:mitre-attack-pattern=\"Use multiple DNS infrastructures - T1327\""],"User Execution - T1204":["misp-galaxy:mitre-attack-pattern=\"User Execution - T1204\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"User Execution - T1204\""],"User Interface Spoofing - T1411":["misp-galaxy:mitre-attack-pattern=\"User Interface Spoofing - T1411\""],"Valid Accounts - T1078":["misp-galaxy:mitre-attack-pattern=\"Valid Accounts - T1078\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Valid Accounts - T1078\""],"Video Capture - T1125":["misp-galaxy:mitre-attack-pattern=\"Video Capture - T1125\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Video Capture - T1125\""],"Virtualization\/Sandbox Evasion - T1497":["misp-galaxy:mitre-attack-pattern=\"Virtualization\/Sandbox Evasion - T1497\""],"Web Service - T1102":["misp-galaxy:mitre-attack-pattern=\"Web Service - T1102\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Web Service - T1102\""],"Web Service - T1481":["misp-galaxy:mitre-attack-pattern=\"Web Service - T1481\""],"Web Shell - T1100":["misp-galaxy:mitre-attack-pattern=\"Web Shell - T1100\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Web Shell - T1100\""],"Windows Admin Shares - T1077":["misp-galaxy:mitre-attack-pattern=\"Windows Admin Shares - T1077\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Admin Shares - T1077\""],"Windows Management Instrumentation - T1047":["misp-galaxy:mitre-attack-pattern=\"Windows Management Instrumentation - T1047\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Management Instrumentation - T1047\""],"Windows Management Instrumentation Event Subscription - T1084":["misp-galaxy:mitre-attack-pattern=\"Windows Management Instrumentation Event Subscription - T1084\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Management Instrumentation Event Subscription - T1084\""],"Windows Remote Management - T1028":["misp-galaxy:mitre-attack-pattern=\"Windows Remote Management - T1028\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Remote Management - T1028\""],"Winlogon Helper DLL - T1004":["misp-galaxy:mitre-attack-pattern=\"Winlogon Helper DLL - T1004\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Winlogon Helper DLL - T1004\""],"Wipe Device Data - T1447":["misp-galaxy:mitre-attack-pattern=\"Wipe Device Data - T1447\""],"XSL Script Processing - T1220":["misp-galaxy:mitre-attack-pattern=\"XSL Script Processing - T1220\""],".bash_profile and .bashrc Mitigation - T1156":["misp-galaxy:mitre-course-of-action=\".bash_profile and .bashrc Mitigation - T1156\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\".bash_profile and .bashrc Mitigation - T1156\""],"Access Token Manipulation Mitigation - T1134":["misp-galaxy:mitre-course-of-action=\"Access Token Manipulation Mitigation - T1134\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Access Token Manipulation Mitigation - T1134\""],"Accessibility Features Mitigation - T1015":["misp-galaxy:mitre-course-of-action=\"Accessibility Features Mitigation - T1015\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Accessibility Features Mitigation - T1015\""],"Account Discovery Mitigation - T1087":["misp-galaxy:mitre-course-of-action=\"Account Discovery Mitigation - T1087\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Account Discovery Mitigation - T1087\""],"Account Manipulation Mitigation - T1098":["misp-galaxy:mitre-course-of-action=\"Account Manipulation Mitigation - T1098\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Account Manipulation Mitigation - T1098\""],"AppCert DLLs Mitigation - T1182":["misp-galaxy:mitre-course-of-action=\"AppCert DLLs Mitigation - T1182\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppCert DLLs Mitigation - T1182\""],"AppInit DLLs Mitigation - T1103":["misp-galaxy:mitre-course-of-action=\"AppInit DLLs Mitigation - T1103\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppInit DLLs Mitigation - T1103\""],"AppleScript Mitigation - T1155":["misp-galaxy:mitre-course-of-action=\"AppleScript Mitigation - T1155\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppleScript Mitigation - T1155\""],"Application Deployment Software Mitigation - T1017":["misp-galaxy:mitre-course-of-action=\"Application Deployment Software Mitigation - T1017\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Deployment Software Mitigation - T1017\""],"Application Developer Guidance - M1013":["misp-galaxy:mitre-course-of-action=\"Application Developer Guidance - M1013\""],"Application Shimming Mitigation - T1138":["misp-galaxy:mitre-course-of-action=\"Application Shimming Mitigation - T1138\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Shimming Mitigation - T1138\""],"Application Vetting - M1005":["misp-galaxy:mitre-course-of-action=\"Application Vetting - M1005\""],"Application Window Discovery Mitigation - T1010":["misp-galaxy:mitre-course-of-action=\"Application Window Discovery Mitigation - T1010\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Window Discovery Mitigation - T1010\""],"Attestation - M1002":["misp-galaxy:mitre-course-of-action=\"Attestation - M1002\""],"Audio Capture Mitigation - T1123":["misp-galaxy:mitre-course-of-action=\"Audio Capture Mitigation - T1123\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Audio Capture Mitigation - T1123\""],"Authentication Package Mitigation - T1131":["misp-galaxy:mitre-course-of-action=\"Authentication Package Mitigation - T1131\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Authentication Package Mitigation - T1131\""],"Automated Collection Mitigation - T1119":["misp-galaxy:mitre-course-of-action=\"Automated Collection Mitigation - T1119\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Automated Collection Mitigation - T1119\""],"Automated Exfiltration Mitigation - T1020":["misp-galaxy:mitre-course-of-action=\"Automated Exfiltration Mitigation - T1020\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Automated Exfiltration Mitigation - T1020\""],"BITS Jobs Mitigation - T1197":["misp-galaxy:mitre-course-of-action=\"BITS Jobs Mitigation - T1197\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"BITS Jobs Mitigation - T1197\""],"Bash History Mitigation - T1139":["misp-galaxy:mitre-course-of-action=\"Bash History Mitigation - T1139\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bash History Mitigation - T1139\""],"Binary Padding Mitigation - T1009":["misp-galaxy:mitre-course-of-action=\"Binary Padding Mitigation - T1009\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Binary Padding Mitigation - T1009\""],"Bootkit Mitigation - T1067":["misp-galaxy:mitre-course-of-action=\"Bootkit Mitigation - T1067\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bootkit Mitigation - T1067\""],"Browser Bookmark Discovery Mitigation - T1217":["misp-galaxy:mitre-course-of-action=\"Browser Bookmark Discovery Mitigation - T1217\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Browser Bookmark Discovery Mitigation - T1217\""],"Browser Extensions Mitigation - T1176":["misp-galaxy:mitre-course-of-action=\"Browser Extensions Mitigation - T1176\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Browser Extensions Mitigation - T1176\""],"Brute Force Mitigation - T1110":["misp-galaxy:mitre-course-of-action=\"Brute Force Mitigation - T1110\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Brute Force Mitigation - T1110\""],"Bypass User Account Control Mitigation - T1088":["misp-galaxy:mitre-course-of-action=\"Bypass User Account Control Mitigation - T1088\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bypass User Account Control Mitigation - T1088\""],"CMSTP Mitigation - T1191":["misp-galaxy:mitre-course-of-action=\"CMSTP Mitigation - T1191\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"CMSTP Mitigation - T1191\""],"Caution with Device Administrator Access - M1007":["misp-galaxy:mitre-course-of-action=\"Caution with Device Administrator Access - M1007\""],"Change Default File Association Mitigation - T1042":["misp-galaxy:mitre-course-of-action=\"Change Default File Association Mitigation - T1042\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Change Default File Association Mitigation - T1042\""],"Clear Command History Mitigation - T1146":["misp-galaxy:mitre-course-of-action=\"Clear Command History Mitigation - T1146\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Clear Command History Mitigation - T1146\""],"Clipboard Data Mitigation - T1115":["misp-galaxy:mitre-course-of-action=\"Clipboard Data Mitigation - T1115\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Clipboard Data Mitigation - T1115\""],"Code Signing Mitigation - T1116":["misp-galaxy:mitre-course-of-action=\"Code Signing Mitigation - T1116\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Code Signing Mitigation - T1116\""],"Command-Line Interface Mitigation - T1059":["misp-galaxy:mitre-course-of-action=\"Command-Line Interface Mitigation - T1059\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Command-Line Interface Mitigation - T1059\""],"Commonly Used Port Mitigation - T1043":["misp-galaxy:mitre-course-of-action=\"Commonly Used Port Mitigation - T1043\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Commonly Used Port Mitigation - T1043\""],"Communication Through Removable Media Mitigation - T1092":["misp-galaxy:mitre-course-of-action=\"Communication Through Removable Media Mitigation - T1092\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Communication Through Removable Media Mitigation - T1092\""],"Compile After Delivery Mitigation - T1502":["misp-galaxy:mitre-course-of-action=\"Compile After Delivery Mitigation - T1502\""],"Compiled HTML File Mitigation - T1223":["misp-galaxy:mitre-course-of-action=\"Compiled HTML File Mitigation - T1223\""],"Component Firmware Mitigation - T1109":["misp-galaxy:mitre-course-of-action=\"Component Firmware Mitigation - T1109\""],"Component Object Model Hijacking Mitigation - T1122":["misp-galaxy:mitre-course-of-action=\"Component Object Model Hijacking Mitigation - T1122\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Component Object Model Hijacking Mitigation - T1122\""],"Connection Proxy Mitigation - T1090":["misp-galaxy:mitre-course-of-action=\"Connection Proxy Mitigation - T1090\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Connection Proxy Mitigation - T1090\""],"Control Panel Items Mitigation - T1196":["misp-galaxy:mitre-course-of-action=\"Control Panel Items Mitigation - T1196\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Control Panel Items Mitigation - T1196\""],"Create Account Mitigation - T1136":["misp-galaxy:mitre-course-of-action=\"Create Account Mitigation - T1136\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Create Account Mitigation - T1136\""],"Credential Dumping Mitigation - T1003":["misp-galaxy:mitre-course-of-action=\"Credential Dumping Mitigation - T1003\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credential Dumping Mitigation - T1003\""],"Credentials in Files Mitigation - T1081":["misp-galaxy:mitre-course-of-action=\"Credentials in Files Mitigation - T1081\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credentials in Files Mitigation - T1081\""],"Credentials in Registry Mitigation - T1214":["misp-galaxy:mitre-course-of-action=\"Credentials in Registry Mitigation - T1214\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credentials in Registry Mitigation - T1214\""],"Custom Command and Control Protocol Mitigation - T1094":["misp-galaxy:mitre-course-of-action=\"Custom Command and Control Protocol Mitigation - T1094\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Custom Command and Control Protocol Mitigation - T1094\""],"Custom Cryptographic Protocol Mitigation - T1024":["misp-galaxy:mitre-course-of-action=\"Custom Cryptographic Protocol Mitigation - T1024\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Custom Cryptographic Protocol Mitigation - T1024\""],"DCShadow Mitigation - T1207":["misp-galaxy:mitre-course-of-action=\"DCShadow Mitigation - T1207\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DCShadow Mitigation - T1207\""],"DLL Search Order Hijacking Mitigation - T1038":["misp-galaxy:mitre-course-of-action=\"DLL Search Order Hijacking Mitigation - T1038\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DLL Search Order Hijacking Mitigation - T1038\""],"DLL Side-Loading Mitigation - T1073":["misp-galaxy:mitre-course-of-action=\"DLL Side-Loading Mitigation - T1073\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DLL Side-Loading Mitigation - T1073\""],"Data Compressed Mitigation - T1002":["misp-galaxy:mitre-course-of-action=\"Data Compressed Mitigation - T1002\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Compressed Mitigation - T1002\""],"Data Destruction Mitigation - T1488":["misp-galaxy:mitre-course-of-action=\"Data Destruction Mitigation - T1488\""],"Data Encoding Mitigation - T1132":["misp-galaxy:mitre-course-of-action=\"Data Encoding Mitigation - T1132\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Encoding Mitigation - T1132\""],"Data Encrypted Mitigation - T1022":["misp-galaxy:mitre-course-of-action=\"Data Encrypted Mitigation - T1022\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Encrypted Mitigation - T1022\""],"Data Encrypted for Impact Mitigation - T1486":["misp-galaxy:mitre-course-of-action=\"Data Encrypted for Impact Mitigation - T1486\""],"Data Obfuscation Mitigation - T1001":["misp-galaxy:mitre-course-of-action=\"Data Obfuscation Mitigation - T1001\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Obfuscation Mitigation - T1001\""],"Data Staged Mitigation - T1074":["misp-galaxy:mitre-course-of-action=\"Data Staged Mitigation - T1074\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Staged Mitigation - T1074\""],"Data Transfer Size Limits Mitigation - T1030":["misp-galaxy:mitre-course-of-action=\"Data Transfer Size Limits Mitigation - T1030\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Transfer Size Limits Mitigation - T1030\""],"Data from Information Repositories Mitigation - T1213":["misp-galaxy:mitre-course-of-action=\"Data from Information Repositories Mitigation - T1213\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Information Repositories Mitigation - T1213\""],"Data from Local System Mitigation - T1005":["misp-galaxy:mitre-course-of-action=\"Data from Local System Mitigation - T1005\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Local System Mitigation - T1005\""],"Data from Network Shared Drive Mitigation - T1039":["misp-galaxy:mitre-course-of-action=\"Data from Network Shared Drive Mitigation - T1039\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Network Shared Drive Mitigation - T1039\""],"Data from Removable Media Mitigation - T1025":["misp-galaxy:mitre-course-of-action=\"Data from Removable Media Mitigation - T1025\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Removable Media Mitigation - T1025\""],"Defacement Mitigation - T1491":["misp-galaxy:mitre-course-of-action=\"Defacement Mitigation - T1491\""],"Deobfuscate\/Decode Files or Information Mitigation - T1140":["misp-galaxy:mitre-course-of-action=\"Deobfuscate\/Decode Files or Information Mitigation - T1140\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Deobfuscate\/Decode Files or Information Mitigation - T1140\""],"Deploy Compromised Device Detection Method - M1010":["misp-galaxy:mitre-course-of-action=\"Deploy Compromised Device Detection Method - M1010\""],"Disabling Security Tools Mitigation - T1089":["misp-galaxy:mitre-course-of-action=\"Disabling Security Tools Mitigation - T1089\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Disabling Security Tools Mitigation - T1089\""],"Distributed Component Object Model Mitigation - T1175":["misp-galaxy:mitre-course-of-action=\"Distributed Component Object Model Mitigation - T1175\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Distributed Component Object Model Mitigation - T1175\""],"Domain Fronting Mitigation - T1172":["misp-galaxy:mitre-course-of-action=\"Domain Fronting Mitigation - T1172\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Domain Fronting Mitigation - T1172\""],"Domain Generation Algorithms Mitigation - T1483":["misp-galaxy:mitre-course-of-action=\"Domain Generation Algorithms Mitigation - T1483\""],"Domain Trust Discovery Mitigation - T1482":["misp-galaxy:mitre-course-of-action=\"Domain Trust Discovery Mitigation - T1482\""],"Drive-by Compromise Mitigation - T1189":["misp-galaxy:mitre-course-of-action=\"Drive-by Compromise Mitigation - T1189\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Drive-by Compromise Mitigation - T1189\""],"Dylib Hijacking Mitigation - T1157":["misp-galaxy:mitre-course-of-action=\"Dylib Hijacking Mitigation - T1157\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Dylib Hijacking Mitigation - T1157\""],"Dynamic Data Exchange Mitigation - T1173":["misp-galaxy:mitre-course-of-action=\"Dynamic Data Exchange Mitigation - T1173\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Dynamic Data Exchange Mitigation - T1173\""],"Email Collection Mitigation - T1114":["misp-galaxy:mitre-course-of-action=\"Email Collection Mitigation - T1114\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Email Collection Mitigation - T1114\""],"Encrypt Network Traffic - M1009":["misp-galaxy:mitre-course-of-action=\"Encrypt Network Traffic - M1009\""],"Endpoint Denial of Service Mitigation - T1499":["misp-galaxy:mitre-course-of-action=\"Endpoint Denial of Service Mitigation - T1499\""],"Enterprise Policy - M1012":["misp-galaxy:mitre-course-of-action=\"Enterprise Policy - M1012\""],"Environmental Keying Mitigation - T1480":["misp-galaxy:mitre-course-of-action=\"Environmental Keying Mitigation - T1480\""],"Execution through API Mitigation - T1106":["misp-galaxy:mitre-course-of-action=\"Execution through API Mitigation - T1106\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Execution through API Mitigation - T1106\""],"Execution through Module Load Mitigation - T1129":["misp-galaxy:mitre-course-of-action=\"Execution through Module Load Mitigation - T1129\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Execution through Module Load Mitigation - T1129\""],"Exfiltration Over Alternative Protocol Mitigation - T1048":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Alternative Protocol Mitigation - T1048\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Alternative Protocol Mitigation - T1048\""],"Exfiltration Over Command and Control Channel Mitigation - T1041":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Command and Control Channel Mitigation - T1041\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Command and Control Channel Mitigation - T1041\""],"Exfiltration Over Other Network Medium Mitigation - T1011":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Other Network Medium Mitigation - T1011\""],"Exfiltration Over Physical Medium Mitigation - T1052":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Physical Medium Mitigation - T1052\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Physical Medium Mitigation - T1052\""],"Exploit Public-Facing Application Mitigation - T1190":["misp-galaxy:mitre-course-of-action=\"Exploit Public-Facing Application Mitigation - T1190\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploit Public-Facing Application Mitigation - T1190\""],"Exploitation for Client Execution Mitigation - T1203":["misp-galaxy:mitre-course-of-action=\"Exploitation for Client Execution Mitigation - T1203\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Client Execution Mitigation - T1203\""],"Exploitation for Credential Access Mitigation - T1212":["misp-galaxy:mitre-course-of-action=\"Exploitation for Credential Access Mitigation - T1212\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Credential Access Mitigation - T1212\""],"Exploitation for Defense Evasion Mitigation - T1211":["misp-galaxy:mitre-course-of-action=\"Exploitation for Defense Evasion Mitigation - T1211\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Defense Evasion Mitigation - T1211\""],"Exploitation for Privilege Escalation Mitigation - T1068":["misp-galaxy:mitre-course-of-action=\"Exploitation for Privilege Escalation Mitigation - T1068\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Privilege Escalation Mitigation - T1068\""],"Exploitation of Remote Services Mitigation - T1210":["misp-galaxy:mitre-course-of-action=\"Exploitation of Remote Services Mitigation - T1210\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation of Remote Services Mitigation - T1210\""],"External Remote Services Mitigation - T1133":["misp-galaxy:mitre-course-of-action=\"External Remote Services Mitigation - T1133\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"External Remote Services Mitigation - T1133\""],"Extra Window Memory Injection Mitigation - T1181":["misp-galaxy:mitre-course-of-action=\"Extra Window Memory Injection Mitigation - T1181\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Extra Window Memory Injection Mitigation - T1181\""],"Fallback Channels Mitigation - T1008":["misp-galaxy:mitre-course-of-action=\"Fallback Channels Mitigation - T1008\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Fallback Channels Mitigation - T1008\""],"File Deletion Mitigation - T1107":["misp-galaxy:mitre-course-of-action=\"File Deletion Mitigation - T1107\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File Deletion Mitigation - T1107\""],"File Permissions Modification Mitigation - T1222":["misp-galaxy:mitre-course-of-action=\"File Permissions Modification Mitigation - T1222\""],"File System Logical Offsets Mitigation - T1006":["misp-galaxy:mitre-course-of-action=\"File System Logical Offsets Mitigation - T1006\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File System Logical Offsets Mitigation - T1006\""],"File System Permissions Weakness Mitigation - T1044":["misp-galaxy:mitre-course-of-action=\"File System Permissions Weakness Mitigation - T1044\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File System Permissions Weakness Mitigation - T1044\""],"File and Directory Discovery Mitigation - T1083":["misp-galaxy:mitre-course-of-action=\"File and Directory Discovery Mitigation - T1083\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File and Directory Discovery Mitigation - T1083\""],"Firmware Corruption Mitigation - T1495":["misp-galaxy:mitre-course-of-action=\"Firmware Corruption Mitigation - T1495\""],"Forced Authentication Mitigation - T1187":["misp-galaxy:mitre-course-of-action=\"Forced Authentication Mitigation - T1187\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Forced Authentication Mitigation - T1187\""],"Gatekeeper Bypass Mitigation - T1144":["misp-galaxy:mitre-course-of-action=\"Gatekeeper Bypass Mitigation - T1144\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Gatekeeper Bypass Mitigation - T1144\""],"Graphical User Interface Mitigation - T1061":["misp-galaxy:mitre-course-of-action=\"Graphical User Interface Mitigation - T1061\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Graphical User Interface Mitigation - T1061\""],"Group Policy Modification Mitigation - T1484":["misp-galaxy:mitre-course-of-action=\"Group Policy Modification Mitigation - T1484\""],"HISTCONTROL Mitigation - T1148":["misp-galaxy:mitre-course-of-action=\"HISTCONTROL Mitigation - T1148\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"HISTCONTROL Mitigation - T1148\""],"Hardware Additions Mitigation - T1200":["misp-galaxy:mitre-course-of-action=\"Hardware Additions Mitigation - T1200\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hardware Additions Mitigation - T1200\""],"Hidden Files and Directories Mitigation - T1158":["misp-galaxy:mitre-course-of-action=\"Hidden Files and Directories Mitigation - T1158\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Files and Directories Mitigation - T1158\""],"Hidden Users Mitigation - T1147":["misp-galaxy:mitre-course-of-action=\"Hidden Users Mitigation - T1147\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Users Mitigation - T1147\""],"Hidden Window Mitigation - T1143":["misp-galaxy:mitre-course-of-action=\"Hidden Window Mitigation - T1143\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Window Mitigation - T1143\""],"Hooking Mitigation - T1179":["misp-galaxy:mitre-course-of-action=\"Hooking Mitigation - T1179\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hooking Mitigation - T1179\""],"Hypervisor Mitigation - T1062":["misp-galaxy:mitre-course-of-action=\"Hypervisor Mitigation - T1062\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hypervisor Mitigation - T1062\""],"Image File Execution Options Injection Mitigation - T1183":["misp-galaxy:mitre-course-of-action=\"Image File Execution Options Injection Mitigation - T1183\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Image File Execution Options Injection Mitigation - T1183\""],"Indicator Blocking Mitigation - T1054":["misp-galaxy:mitre-course-of-action=\"Indicator Blocking Mitigation - T1054\""],"Indicator Removal from Tools Mitigation - T1066":["misp-galaxy:mitre-course-of-action=\"Indicator Removal from Tools Mitigation - T1066\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indicator Removal from Tools Mitigation - T1066\""],"Indicator Removal on Host Mitigation - T1070":["misp-galaxy:mitre-course-of-action=\"Indicator Removal on Host Mitigation - T1070\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indicator Removal on Host Mitigation - T1070\""],"Indirect Command Execution Mitigation - T1202":["misp-galaxy:mitre-course-of-action=\"Indirect Command Execution Mitigation - T1202\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indirect Command Execution Mitigation - T1202\""],"Inhibit System Recovery Mitigation - T1490":["misp-galaxy:mitre-course-of-action=\"Inhibit System Recovery Mitigation - T1490\""],"Input Capture Mitigation - T1056":["misp-galaxy:mitre-course-of-action=\"Input Capture Mitigation - T1056\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Input Capture Mitigation - T1056\""],"Input Prompt Mitigation - T1141":["misp-galaxy:mitre-course-of-action=\"Input Prompt Mitigation - T1141\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Input Prompt Mitigation - T1141\""],"Install Root Certificate Mitigation - T1130":["misp-galaxy:mitre-course-of-action=\"Install Root Certificate Mitigation - T1130\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Install Root Certificate Mitigation - T1130\""],"InstallUtil Mitigation - T1118":["misp-galaxy:mitre-course-of-action=\"InstallUtil Mitigation - T1118\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"InstallUtil Mitigation - T1118\""],"Interconnection Filtering - M1014":["misp-galaxy:mitre-course-of-action=\"Interconnection Filtering - M1014\""],"Kerberoasting Mitigation - T1208":["misp-galaxy:mitre-course-of-action=\"Kerberoasting Mitigation - T1208\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Kerberoasting Mitigation - T1208\""],"Kernel Modules and Extensions Mitigation - T1215":["misp-galaxy:mitre-course-of-action=\"Kernel Modules and Extensions Mitigation - T1215\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Kernel Modules and Extensions Mitigation - T1215\""],"Keychain Mitigation - T1142":["misp-galaxy:mitre-course-of-action=\"Keychain Mitigation - T1142\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Keychain Mitigation - T1142\""],"LC_LOAD_DYLIB Addition Mitigation - T1161":["misp-galaxy:mitre-course-of-action=\"LC_LOAD_DYLIB Addition Mitigation - T1161\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LC_LOAD_DYLIB Addition Mitigation - T1161\""],"LC_MAIN Hijacking Mitigation - T1149":["misp-galaxy:mitre-course-of-action=\"LC_MAIN Hijacking Mitigation - T1149\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LC_MAIN Hijacking Mitigation - T1149\""],"LLMNR\/NBT-NS Poisoning Mitigation - T1171":["misp-galaxy:mitre-course-of-action=\"LLMNR\/NBT-NS Poisoning Mitigation - T1171\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LLMNR\/NBT-NS Poisoning Mitigation - T1171\""],"LSASS Driver Mitigation - T1177":["misp-galaxy:mitre-course-of-action=\"LSASS Driver Mitigation - T1177\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LSASS Driver Mitigation - T1177\""],"Launch Agent Mitigation - T1159":["misp-galaxy:mitre-course-of-action=\"Launch Agent Mitigation - T1159\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launch Agent Mitigation - T1159\""],"Launch Daemon Mitigation - T1160":["misp-galaxy:mitre-course-of-action=\"Launch Daemon Mitigation - T1160\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launch Daemon Mitigation - T1160\""],"Launchctl Mitigation - T1152":["misp-galaxy:mitre-course-of-action=\"Launchctl Mitigation - T1152\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launchctl Mitigation - T1152\""],"Local Job Scheduling Mitigation - T1168":["misp-galaxy:mitre-course-of-action=\"Local Job Scheduling Mitigation - T1168\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Local Job Scheduling Mitigation - T1168\""],"Lock Bootloader - M1003":["misp-galaxy:mitre-course-of-action=\"Lock Bootloader - M1003\""],"Login Item Mitigation - T1162":["misp-galaxy:mitre-course-of-action=\"Login Item Mitigation - T1162\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Login Item Mitigation - T1162\""],"Logon Scripts Mitigation - T1037":["misp-galaxy:mitre-course-of-action=\"Logon Scripts Mitigation - T1037\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Logon Scripts Mitigation - T1037\""],"Man in the Browser Mitigation - T1185":["misp-galaxy:mitre-course-of-action=\"Man in the Browser Mitigation - T1185\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Man in the Browser Mitigation - T1185\""],"Masquerading Mitigation - T1036":["misp-galaxy:mitre-course-of-action=\"Masquerading Mitigation - T1036\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Masquerading Mitigation - T1036\""],"Modify Existing Service Mitigation - T1031":["misp-galaxy:mitre-course-of-action=\"Modify Existing Service Mitigation - T1031\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Modify Existing Service Mitigation - T1031\""],"Modify Registry Mitigation - T1112":["misp-galaxy:mitre-course-of-action=\"Modify Registry Mitigation - T1112\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Modify Registry Mitigation - T1112\""],"Mshta Mitigation - T1170":["misp-galaxy:mitre-course-of-action=\"Mshta Mitigation - T1170\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Mshta Mitigation - T1170\""],"Multi-Stage Channels Mitigation - T1104":["misp-galaxy:mitre-course-of-action=\"Multi-Stage Channels Mitigation - T1104\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multi-Stage Channels Mitigation - T1104\""],"Multi-hop Proxy Mitigation - T1188":["misp-galaxy:mitre-course-of-action=\"Multi-hop Proxy Mitigation - T1188\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multi-hop Proxy Mitigation - T1188\""],"Multiband Communication Mitigation - T1026":["misp-galaxy:mitre-course-of-action=\"Multiband Communication Mitigation - T1026\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multiband Communication Mitigation - T1026\""],"Multilayer Encryption Mitigation - T1079":["misp-galaxy:mitre-course-of-action=\"Multilayer Encryption Mitigation - T1079\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multilayer Encryption Mitigation - T1079\""],"NTFS File Attributes Mitigation - T1096":["misp-galaxy:mitre-course-of-action=\"NTFS File Attributes Mitigation - T1096\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"NTFS File Attributes Mitigation - T1096\""],"Netsh Helper DLL Mitigation - T1128":["misp-galaxy:mitre-course-of-action=\"Netsh Helper DLL Mitigation - T1128\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Netsh Helper DLL Mitigation - T1128\""],"Network Denial of Service Mitigation - T1498":["misp-galaxy:mitre-course-of-action=\"Network Denial of Service Mitigation - T1498\""],"Network Service Scanning Mitigation - T1046":["misp-galaxy:mitre-course-of-action=\"Network Service Scanning Mitigation - T1046\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Service Scanning Mitigation - T1046\""],"Network Share Connection Removal Mitigation - T1126":["misp-galaxy:mitre-course-of-action=\"Network Share Connection Removal Mitigation - T1126\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Share Connection Removal Mitigation - T1126\""],"Network Share Discovery Mitigation - T1135":["misp-galaxy:mitre-course-of-action=\"Network Share Discovery Mitigation - T1135\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Share Discovery Mitigation - T1135\""],"Network Sniffing Mitigation - T1040":["misp-galaxy:mitre-course-of-action=\"Network Sniffing Mitigation - T1040\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Sniffing Mitigation - T1040\""],"New Service Mitigation - T1050":["misp-galaxy:mitre-course-of-action=\"New Service Mitigation - T1050\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"New Service Mitigation - T1050\""],"Obfuscated Files or Information Mitigation - T1027":["misp-galaxy:mitre-course-of-action=\"Obfuscated Files or Information Mitigation - T1027\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Obfuscated Files or Information Mitigation - T1027\""],"Office Application Startup Mitigation - T1137":["misp-galaxy:mitre-course-of-action=\"Office Application Startup Mitigation - T1137\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Office Application Startup Mitigation - T1137\""],"Pass the Hash Mitigation - T1075":["misp-galaxy:mitre-course-of-action=\"Pass the Hash Mitigation - T1075\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Pass the Hash Mitigation - T1075\""],"Pass the Ticket Mitigation - T1097":["misp-galaxy:mitre-course-of-action=\"Pass the Ticket Mitigation - T1097\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Pass the Ticket Mitigation - T1097\""],"Password Filter DLL Mitigation - T1174":["misp-galaxy:mitre-course-of-action=\"Password Filter DLL Mitigation - T1174\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Password Filter DLL Mitigation - T1174\""],"Password Policy Discovery Mitigation - T1201":["misp-galaxy:mitre-course-of-action=\"Password Policy Discovery Mitigation - T1201\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Password Policy Discovery Mitigation - T1201\""],"Path Interception Mitigation - T1034":["misp-galaxy:mitre-course-of-action=\"Path Interception Mitigation - T1034\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Path Interception Mitigation - T1034\""],"Peripheral Device Discovery Mitigation - T1120":["misp-galaxy:mitre-course-of-action=\"Peripheral Device Discovery Mitigation - T1120\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Peripheral Device Discovery Mitigation - T1120\""],"Permission Groups Discovery Mitigation - T1069":["misp-galaxy:mitre-course-of-action=\"Permission Groups Discovery Mitigation - T1069\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Permission Groups Discovery Mitigation - T1069\""],"Plist Modification Mitigation - T1150":["misp-galaxy:mitre-course-of-action=\"Plist Modification Mitigation - T1150\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Plist Modification Mitigation - T1150\""],"Port Knocking Mitigation - T1205":["misp-galaxy:mitre-course-of-action=\"Port Knocking Mitigation - T1205\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Port Knocking Mitigation - T1205\""],"Port Monitors Mitigation - T1013":["misp-galaxy:mitre-course-of-action=\"Port Monitors Mitigation - T1013\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Port Monitors Mitigation - T1013\""],"PowerShell Mitigation - T1086":["misp-galaxy:mitre-course-of-action=\"PowerShell Mitigation - T1086\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"PowerShell Mitigation - T1086\""],"Private Keys Mitigation - T1145":["misp-galaxy:mitre-course-of-action=\"Private Keys Mitigation - T1145\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Private Keys Mitigation - T1145\""],"Process Discovery Mitigation - T1057":["misp-galaxy:mitre-course-of-action=\"Process Discovery Mitigation - T1057\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Discovery Mitigation - T1057\""],"Process Doppelg\u00e4nging Mitigation - T1186":["misp-galaxy:mitre-course-of-action=\"Process Doppelg\u00e4nging Mitigation - T1186\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Doppelg\u00e4nging Mitigation - T1186\""],"Process Hollowing Mitigation - T1093":["misp-galaxy:mitre-course-of-action=\"Process Hollowing Mitigation - T1093\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Hollowing Mitigation - T1093\""],"Process Injection Mitigation - T1055":["misp-galaxy:mitre-course-of-action=\"Process Injection Mitigation - T1055\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Injection Mitigation - T1055\""],"Query Registry Mitigation - T1012":["misp-galaxy:mitre-course-of-action=\"Query Registry Mitigation - T1012\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Query Registry Mitigation - T1012\""],"Rc.common Mitigation - T1163":["misp-galaxy:mitre-course-of-action=\"Rc.common Mitigation - T1163\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rc.common Mitigation - T1163\""],"Re-opened Applications Mitigation - T1164":["misp-galaxy:mitre-course-of-action=\"Re-opened Applications Mitigation - T1164\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Re-opened Applications Mitigation - T1164\""],"Redundant Access Mitigation - T1108":["misp-galaxy:mitre-course-of-action=\"Redundant Access Mitigation - T1108\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Redundant Access Mitigation - T1108\""],"Registry Run Keys \/ Startup Folder Mitigation - T1060":["misp-galaxy:mitre-course-of-action=\"Registry Run Keys \/ Startup Folder Mitigation - T1060\""],"Regsvcs\/Regasm Mitigation - T1121":["misp-galaxy:mitre-course-of-action=\"Regsvcs\/Regasm Mitigation - T1121\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Regsvcs\/Regasm Mitigation - T1121\""],"Regsvr32 Mitigation - T1117":["misp-galaxy:mitre-course-of-action=\"Regsvr32 Mitigation - T1117\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Regsvr32 Mitigation - T1117\""],"Remote Access Tools Mitigation - T1219":["misp-galaxy:mitre-course-of-action=\"Remote Access Tools Mitigation - T1219\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Access Tools Mitigation - T1219\""],"Remote Desktop Protocol Mitigation - T1076":["misp-galaxy:mitre-course-of-action=\"Remote Desktop Protocol Mitigation - T1076\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Desktop Protocol Mitigation - T1076\""],"Remote File Copy Mitigation - T1105":["misp-galaxy:mitre-course-of-action=\"Remote File Copy Mitigation - T1105\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote File Copy Mitigation - T1105\""],"Remote Services Mitigation - T1021":["misp-galaxy:mitre-course-of-action=\"Remote Services Mitigation - T1021\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Services Mitigation - T1021\""],"Remote System Discovery Mitigation - T1018":["misp-galaxy:mitre-course-of-action=\"Remote System Discovery Mitigation - T1018\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote System Discovery Mitigation - T1018\""],"Replication Through Removable Media Mitigation - T1091":["misp-galaxy:mitre-course-of-action=\"Replication Through Removable Media Mitigation - T1091\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Replication Through Removable Media Mitigation - T1091\""],"Resource Hijacking Mitigation - T1496":["misp-galaxy:mitre-course-of-action=\"Resource Hijacking Mitigation - T1496\""],"Rootkit Mitigation - T1014":["misp-galaxy:mitre-course-of-action=\"Rootkit Mitigation - T1014\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rootkit Mitigation - T1014\""],"Rundll32 Mitigation - T1085":["misp-galaxy:mitre-course-of-action=\"Rundll32 Mitigation - T1085\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rundll32 Mitigation - T1085\""],"Runtime Data Manipulation Mitigation - T1494":["misp-galaxy:mitre-course-of-action=\"Runtime Data Manipulation Mitigation - T1494\""],"SID-History Injection Mitigation - T1178":["misp-galaxy:mitre-course-of-action=\"SID-History Injection Mitigation - T1178\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SID-History Injection Mitigation - T1178\""],"SIP and Trust Provider Hijacking Mitigation - T1198":["misp-galaxy:mitre-course-of-action=\"SIP and Trust Provider Hijacking Mitigation - T1198\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SIP and Trust Provider Hijacking Mitigation - T1198\""],"SSH Hijacking Mitigation - T1184":["misp-galaxy:mitre-course-of-action=\"SSH Hijacking Mitigation - T1184\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SSH Hijacking Mitigation - T1184\""],"Scheduled Task Mitigation - T1053":["misp-galaxy:mitre-course-of-action=\"Scheduled Task Mitigation - T1053\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scheduled Task Mitigation - T1053\""],"Scheduled Transfer Mitigation - T1029":["misp-galaxy:mitre-course-of-action=\"Scheduled Transfer Mitigation - T1029\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scheduled Transfer Mitigation - T1029\""],"Screen Capture Mitigation - T1113":["misp-galaxy:mitre-course-of-action=\"Screen Capture Mitigation - T1113\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Screen Capture Mitigation - T1113\""],"Screensaver Mitigation - T1180":["misp-galaxy:mitre-course-of-action=\"Screensaver Mitigation - T1180\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Screensaver Mitigation - T1180\""],"Scripting Mitigation - T1064":["misp-galaxy:mitre-course-of-action=\"Scripting Mitigation - T1064\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scripting Mitigation - T1064\""],"Security Software Discovery Mitigation - T1063":["misp-galaxy:mitre-course-of-action=\"Security Software Discovery Mitigation - T1063\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Security Software Discovery Mitigation - T1063\""],"Security Support Provider Mitigation - T1101":["misp-galaxy:mitre-course-of-action=\"Security Support Provider Mitigation - T1101\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Security Support Provider Mitigation - T1101\""],"Security Updates - M1001":["misp-galaxy:mitre-course-of-action=\"Security Updates - M1001\""],"Service Execution Mitigation - T1035":["misp-galaxy:mitre-course-of-action=\"Service Execution Mitigation - T1035\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Service Execution Mitigation - T1035\""],"Service Registry Permissions Weakness Mitigation - T1058":["misp-galaxy:mitre-course-of-action=\"Service Registry Permissions Weakness Mitigation - T1058\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Service Registry Permissions Weakness Mitigation - T1058\""],"Service Stop Mitigation - T1489":["misp-galaxy:mitre-course-of-action=\"Service Stop Mitigation - T1489\""],"Setuid and Setgid Mitigation - T1166":["misp-galaxy:mitre-course-of-action=\"Setuid and Setgid Mitigation - T1166\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Setuid and Setgid Mitigation - T1166\""],"Shared Webroot Mitigation - T1051":["misp-galaxy:mitre-course-of-action=\"Shared Webroot Mitigation - T1051\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Shared Webroot Mitigation - T1051\""],"Shortcut Modification Mitigation - T1023":["misp-galaxy:mitre-course-of-action=\"Shortcut Modification Mitigation - T1023\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Shortcut Modification Mitigation - T1023\""],"Signed Binary Proxy Execution Mitigation - T1218":["misp-galaxy:mitre-course-of-action=\"Signed Binary Proxy Execution Mitigation - T1218\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Signed Binary Proxy Execution Mitigation - T1218\""],"Signed Script Proxy Execution Mitigation - T1216":["misp-galaxy:mitre-course-of-action=\"Signed Script Proxy Execution Mitigation - T1216\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Signed Script Proxy Execution Mitigation - T1216\""],"Software Packing Mitigation - T1045":["misp-galaxy:mitre-course-of-action=\"Software Packing Mitigation - T1045\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Software Packing Mitigation - T1045\""],"Source Mitigation - T1153":["misp-galaxy:mitre-course-of-action=\"Source Mitigation - T1153\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Source Mitigation - T1153\""],"Space after Filename Mitigation - T1151":["misp-galaxy:mitre-course-of-action=\"Space after Filename Mitigation - T1151\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Space after Filename Mitigation - T1151\""],"Spearphishing Attachment Mitigation - T1193":["misp-galaxy:mitre-course-of-action=\"Spearphishing Attachment Mitigation - T1193\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing Attachment Mitigation - T1193\""],"Spearphishing Link Mitigation - T1192":["misp-galaxy:mitre-course-of-action=\"Spearphishing Link Mitigation - T1192\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing Link Mitigation - T1192\""],"Spearphishing via Service Mitigation - T1194":["misp-galaxy:mitre-course-of-action=\"Spearphishing via Service Mitigation - T1194\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing via Service Mitigation - T1194\""],"Standard Application Layer Protocol Mitigation - T1071":["misp-galaxy:mitre-course-of-action=\"Standard Application Layer Protocol Mitigation - T1071\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Application Layer Protocol Mitigation - T1071\""],"Standard Cryptographic Protocol Mitigation - T1032":["misp-galaxy:mitre-course-of-action=\"Standard Cryptographic Protocol Mitigation - T1032\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Cryptographic Protocol Mitigation - T1032\""],"Standard Non-Application Layer Protocol Mitigation - T1095":["misp-galaxy:mitre-course-of-action=\"Standard Non-Application Layer Protocol Mitigation - T1095\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Non-Application Layer Protocol Mitigation - T1095\""],"Startup Items Mitigation - T1165":["misp-galaxy:mitre-course-of-action=\"Startup Items Mitigation - T1165\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Startup Items Mitigation - T1165\""],"Stored Data Manipulation Mitigation - T1492":["misp-galaxy:mitre-course-of-action=\"Stored Data Manipulation Mitigation - T1492\""],"Sudo Caching Mitigation - T1206":["misp-galaxy:mitre-course-of-action=\"Sudo Caching Mitigation - T1206\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Sudo Caching Mitigation - T1206\""],"Sudo Mitigation - T1169":["misp-galaxy:mitre-course-of-action=\"Sudo Mitigation - T1169\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Sudo Mitigation - T1169\""],"Supply Chain Compromise Mitigation - T1195":["misp-galaxy:mitre-course-of-action=\"Supply Chain Compromise Mitigation - T1195\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Supply Chain Compromise Mitigation - T1195\""],"System Firmware Mitigation - T1019":["misp-galaxy:mitre-course-of-action=\"System Firmware Mitigation - T1019\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Firmware Mitigation - T1019\""],"System Information Discovery Mitigation - T1082":["misp-galaxy:mitre-course-of-action=\"System Information Discovery Mitigation - T1082\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Information Discovery Mitigation - T1082\""],"System Network Configuration Discovery Mitigation - T1016":["misp-galaxy:mitre-course-of-action=\"System Network Configuration Discovery Mitigation - T1016\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Network Configuration Discovery Mitigation - T1016\""],"System Network Connections Discovery Mitigation - T1049":["misp-galaxy:mitre-course-of-action=\"System Network Connections Discovery Mitigation - T1049\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Network Connections Discovery Mitigation - T1049\""],"System Owner\/User Discovery Mitigation - T1033":["misp-galaxy:mitre-course-of-action=\"System Owner\/User Discovery Mitigation - T1033\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Owner\/User Discovery Mitigation - T1033\""],"System Owner\/User Discovery Mitigation - T1482":["misp-galaxy:mitre-course-of-action=\"System Owner\/User Discovery Mitigation - T1482\""],"System Partition Integrity - M1004":["misp-galaxy:mitre-course-of-action=\"System Partition Integrity - M1004\""],"System Service Discovery Mitigation - T1007":["misp-galaxy:mitre-course-of-action=\"System Service Discovery Mitigation - T1007\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Service Discovery Mitigation - T1007\""],"System Time Discovery Mitigation - T1124":["misp-galaxy:mitre-course-of-action=\"System Time Discovery Mitigation - T1124\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Time Discovery Mitigation - T1124\""],"Systemd Service Mitigation - T1501":["misp-galaxy:mitre-course-of-action=\"Systemd Service Mitigation - T1501\""],"Taint Shared Content Mitigation - T1080":["misp-galaxy:mitre-course-of-action=\"Taint Shared Content Mitigation - T1080\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Taint Shared Content Mitigation - T1080\""],"Template Injection Mitigation - T1221":["misp-galaxy:mitre-course-of-action=\"Template Injection Mitigation - T1221\""],"Third-party Software Mitigation - T1072":["misp-galaxy:mitre-course-of-action=\"Third-party Software Mitigation - T1072\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Third-party Software Mitigation - T1072\""],"Time Providers Mitigation - T1209":["misp-galaxy:mitre-course-of-action=\"Time Providers Mitigation - T1209\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Time Providers Mitigation - T1209\""],"Timestomp Mitigation - T1099":["misp-galaxy:mitre-course-of-action=\"Timestomp Mitigation - T1099\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Timestomp Mitigation - T1099\""],"Transmitted Data Manipulation Mitigation - T1493":["misp-galaxy:mitre-course-of-action=\"Transmitted Data Manipulation Mitigation - T1493\""],"Trap Mitigation - T1154":["misp-galaxy:mitre-course-of-action=\"Trap Mitigation - T1154\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trap Mitigation - T1154\""],"Trusted Developer Utilities Mitigation - T1127":["misp-galaxy:mitre-course-of-action=\"Trusted Developer Utilities Mitigation - T1127\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trusted Developer Utilities Mitigation - T1127\""],"Trusted Relationship Mitigation - T1199":["misp-galaxy:mitre-course-of-action=\"Trusted Relationship Mitigation - T1199\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trusted Relationship Mitigation - T1199\""],"Two-Factor Authentication Interception Mitigation - T1111":["misp-galaxy:mitre-course-of-action=\"Two-Factor Authentication Interception Mitigation - T1111\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Two-Factor Authentication Interception Mitigation - T1111\""],"Uncommonly Used Port Mitigation - T1065":["misp-galaxy:mitre-course-of-action=\"Uncommonly Used Port Mitigation - T1065\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Uncommonly Used Port Mitigation - T1065\""],"Use Device-Provided Credential Storage - M1008":["misp-galaxy:mitre-course-of-action=\"Use Device-Provided Credential Storage - M1008\""],"Use Recent OS Version - M1006":["misp-galaxy:mitre-course-of-action=\"Use Recent OS Version - M1006\""],"User Execution Mitigation - T1204":["misp-galaxy:mitre-course-of-action=\"User Execution Mitigation - T1204\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"User Execution Mitigation - T1204\""],"User Guidance - M1011":["misp-galaxy:mitre-course-of-action=\"User Guidance - M1011\""],"Valid Accounts Mitigation - T1078":["misp-galaxy:mitre-course-of-action=\"Valid Accounts Mitigation - T1078\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Valid Accounts Mitigation - T1078\""],"Video Capture Mitigation - T1125":["misp-galaxy:mitre-course-of-action=\"Video Capture Mitigation - T1125\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Video Capture Mitigation - T1125\""],"Virtualization\/Sandbox Evasion Mitigation - T1497":["misp-galaxy:mitre-course-of-action=\"Virtualization\/Sandbox Evasion Mitigation - T1497\""],"Web Service Mitigation - T1102":["misp-galaxy:mitre-course-of-action=\"Web Service Mitigation - T1102\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Web Service Mitigation - T1102\""],"Web Shell Mitigation - T1100":["misp-galaxy:mitre-course-of-action=\"Web Shell Mitigation - T1100\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Web Shell Mitigation - T1100\""],"Windows Admin Shares Mitigation - T1077":["misp-galaxy:mitre-course-of-action=\"Windows Admin Shares Mitigation - T1077\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Admin Shares Mitigation - T1077\""],"Windows Management Instrumentation Event Subscription Mitigation - T1084":["misp-galaxy:mitre-course-of-action=\"Windows Management Instrumentation Event Subscription Mitigation - T1084\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Management Instrumentation Event Subscription Mitigation - T1084\""],"Windows Management Instrumentation Mitigation - T1047":["misp-galaxy:mitre-course-of-action=\"Windows Management Instrumentation Mitigation - T1047\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Management Instrumentation Mitigation - T1047\""],"Windows Remote Management Mitigation - T1028":["misp-galaxy:mitre-course-of-action=\"Windows Remote Management Mitigation - T1028\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Remote Management Mitigation - T1028\""],"Winlogon Helper DLL Mitigation - T1004":["misp-galaxy:mitre-course-of-action=\"Winlogon Helper DLL Mitigation - T1004\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Winlogon Helper DLL Mitigation - T1004\""],"XSL Script Processing Mitigation - T1220":["misp-galaxy:mitre-course-of-action=\"XSL Script Processing Mitigation - T1220\""],"Registry Run Keys \/ Start Folder - T1060":["misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Registry Run Keys \/ Start Folder - T1060\""],"Registry Run Keys \/ Start Folder Mitigation - T1060":["misp-galaxy:mitre-enterprise-attack-course-of-action=\"Registry Run Keys \/ Start Folder Mitigation - T1060\""],"APT1 - G0006":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\""],"APT1":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Crew":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"APT12 - G0005":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\""],"APT12":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"IXESHE":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"DynCalc":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"Numbered Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"DNSCALC":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\""],"APT16 - G0023":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT16 - G0023\""],"APT16":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:threat-actor=\"APT 16\""],"APT17 - G0025":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\""],"APT17":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Deputy Dog":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"APT18 - G0026":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\""],"APT18":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"Threat Group-0416":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\""],"TG-0416":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"Dynamite Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"APT28 - G0007":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\""],"Tsar Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Threat Group-4127":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\""],"APT29 - G0016":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\""],"APT29":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"The Dukes":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"Cozy Bear":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"CozyDuke":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"APT3 - G0022":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\""],"APT3":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Gothic Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Pirpi":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\"","misp-galaxy:tool=\"Pirpi\""],"UPS Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Buckeye":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Threat Group-0110":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\""],"TG-0110":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"APT30 - G0013":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT30 - G0013\"","misp-galaxy:mitre-intrusion-set=\"APT30 - G0013\""],"APT30":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT30 - G0013\"","misp-galaxy:mitre-intrusion-set=\"APT30 - G0013\"","misp-galaxy:threat-actor=\"APT 30\"","misp-galaxy:threat-actor=\"Naikon\""],"APT32 - G0050":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\""],"APT32":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"OceanLotus Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"APT33 - G0064":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT33 - G0064\"","misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\""],"APT33":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT33 - G0064\"","misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\"","misp-galaxy:threat-actor=\"APT33\"","misp-galaxy:threat-actor=\"MAGNALLIUM\""],"APT34 - G0057":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT34 - G0057\"","misp-galaxy:mitre-intrusion-set=\"APT34 - G0057\""],"APT34":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT34 - G0057\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"APT34\"","misp-galaxy:threat-actor=\"OilRig\""],"APT37 - G0067":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\""],"APT37":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"ScarCruft":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Group123":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"TEMP.Reaper":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\""],"Axiom - G0001":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\""],"Axiom":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\"","misp-galaxy:threat-actor=\"Axiom\""],"Group 72":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\"","misp-galaxy:threat-actor=\"Axiom\""],"BRONZE BUTLER - G0060":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"BRONZE BUTLER":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"REDBALDKNIGHT":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"Tick":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:threat-actor=\"Tick\""],"BlackOasis - G0063":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:mitre-intrusion-set=\"BlackOasis - G0063\""],"BlackOasis":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:mitre-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:threat-actor=\"BlackOasis\"","misp-galaxy:tool=\"FINSPY\""],"Carbanak - G0008":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\""],"Carbon Spider":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:threat-actor=\"Anunak\""],"Charming Kitten - G0058":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:mitre-intrusion-set=\"Charming Kitten - G0058\""],"Charming Kitten":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:mitre-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:threat-actor=\"Charming Kitten\""],"Cleaver - G0003":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\""],"Cleaver":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cleaver\""],"TG-2889":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Threat Group 2889":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"CopyKittens - G0052":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:mitre-intrusion-set=\"CopyKittens - G0052\""],"CopyKittens":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:mitre-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:threat-actor=\"CopyKittens\""],"Darkhotel - G0012":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Darkhotel - G0012\"","misp-galaxy:mitre-intrusion-set=\"Darkhotel - G0012\""],"Darkhotel":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Darkhotel - G0012\"","misp-galaxy:mitre-intrusion-set=\"Darkhotel - G0012\""],"Deep Panda - G0009":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\""],"Deep Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Shell Crew":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"WebMasters":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"KungFu Kittens":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"PinkPanther":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Black Vine":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Hurricane Panda\"","misp-galaxy:threat-actor=\"Shell Crew\""],"DragonOK - G0017":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:mitre-intrusion-set=\"DragonOK - G0017\""],"DragonOK":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:mitre-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:threat-actor=\"DragonOK\""],"Dragonfly - G0035":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\""],"Dragonfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:threat-actor=\"Energetic Bear\""],"Energetic Bear":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:threat-actor=\"Energetic Bear\""],"Dust Storm - G0031":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:mitre-intrusion-set=\"Dust Storm - G0031\""],"Dust Storm":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:mitre-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:threat-actor=\"Dust Storm\""],"Elderwood - G0066":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\""],"Elderwood":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Elderwood Gang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Beijing Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Sneaky Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Equation - G0020":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Equation - G0020\"","misp-galaxy:mitre-intrusion-set=\"Equation - G0020\""],"Equation":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Equation - G0020\"","misp-galaxy:mitre-intrusion-set=\"Equation - G0020\""],"FIN10 - G0051":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:mitre-intrusion-set=\"FIN10 - G0051\""],"FIN10":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:mitre-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:threat-actor=\"FIN10\""],"FIN5 - G0053":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:mitre-intrusion-set=\"FIN5 - G0053\""],"FIN5":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:mitre-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:threat-actor=\"FIN5\""],"FIN6 - G0037":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:mitre-intrusion-set=\"FIN6 - G0037\""],"FIN6":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:mitre-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:threat-actor=\"FIN6\""],"FIN7 - G0046":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:mitre-intrusion-set=\"FIN7 - G0046\""],"FIN7":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:mitre-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:threat-actor=\"Anunak\""],"FIN8 - G0061":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:mitre-intrusion-set=\"FIN8 - G0061\""],"FIN8":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:mitre-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:threat-actor=\"FIN8\""],"GCMAN - G0036":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:mitre-intrusion-set=\"GCMAN - G0036\""],"GCMAN":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:mitre-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:threat-actor=\"GCMAN\""],"Gamaredon Group - G0047":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:mitre-intrusion-set=\"Gamaredon Group - G0047\""],"Gamaredon Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:mitre-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:threat-actor=\"Gamaredon Group\""],"Group5 - G0043":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Group5 - G0043\"","misp-galaxy:mitre-intrusion-set=\"Group5 - G0043\""],"Group5":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Group5 - G0043\"","misp-galaxy:mitre-intrusion-set=\"Group5 - G0043\"","misp-galaxy:threat-actor=\"Group5\""],"Ke3chang - G0004":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Ke3chang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Lazarus Group - G0032":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Lazarus Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"HIDDEN COBRA":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Guardians of Peace":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"ZINC":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"NICKEL ACADEMY":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Leviathan - G0065":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\""],"Leviathan":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"TEMP.Periscope":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"Lotus Blossom - G0030":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\""],"Lotus Blossom":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"Spring Dragon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"MONSOON - G0042":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MONSOON - G0042\"","misp-galaxy:mitre-intrusion-set=\"MONSOON - G0042\""],"Magic Hound - G0059":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\""],"Magic Hound":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Cleaver\""],"Rocket Kitten":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Operation Saffron Rose":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\""],"Ajax Security Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Flying Kitten\""],"Operation Woolen-Goldfish":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Newscaster":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Charming Kitten\""],"Cobalt Gypsy":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"OilRig\""],"Moafee - G0002":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Moafee - G0002\"","misp-galaxy:mitre-intrusion-set=\"Moafee - G0002\""],"Moafee":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Moafee - G0002\"","misp-galaxy:mitre-intrusion-set=\"Moafee - G0002\"","misp-galaxy:threat-actor=\"DragonOK\""],"Molerats - G0021":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\""],"Molerats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"Operation Molerats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"Gaza Cybergang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"MuddyWater - G0069":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\""],"MuddyWater":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"TEMP.Zagros":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"NEODYMIUM - G0055":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:mitre-intrusion-set=\"NEODYMIUM - G0055\""],"Naikon - G0019":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Naikon - G0019\"","misp-galaxy:mitre-intrusion-set=\"Naikon - G0019\""],"Night Dragon - G0014":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\""],"Night Dragon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:threat-actor=\"Night Dragon\""],"Musical Chairs":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\""],"OilRig - G0049":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"OilRig - G0049\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\""],"PLATINUM - G0068":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:mitre-intrusion-set=\"PLATINUM - G0068\""],"PROMETHIUM - G0056":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:mitre-intrusion-set=\"PROMETHIUM - G0056\""],"Patchwork - G0040":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"Patchwork":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"Dropping Elephant":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"Chinastrats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"MONSOON":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"Operation Hangover":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"PittyTiger - G0011":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:mitre-intrusion-set=\"PittyTiger - G0011\""],"PittyTiger":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:mitre-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:threat-actor=\"Pitty Panda\""],"Poseidon Group - G0033":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:mitre-intrusion-set=\"Poseidon Group - G0033\""],"Poseidon Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:mitre-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:threat-actor=\"Poseidon Group\""],"Putter Panda - G0024":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\""],"Putter Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\""],"APT2":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\""],"MSUpdater":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\"","misp-galaxy:tool=\"MSUpdater\""],"RTM - G0048":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-intrusion-set=\"RTM - G0048\""],"Sandworm Team - G0034":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\""],"Sandworm Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:threat-actor=\"Sandworm\""],"Quedagh":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:threat-actor=\"Sandworm\""],"Scarlet Mimic - G0029":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:mitre-intrusion-set=\"Scarlet Mimic - G0029\""],"Scarlet Mimic":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:mitre-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:threat-actor=\"Scarlet Mimic\""],"Sowbug - G0054":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:mitre-intrusion-set=\"Sowbug - G0054\""],"Sowbug":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:mitre-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:threat-actor=\"Sowbug\""],"Stealth Falcon - G0038":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:mitre-intrusion-set=\"Stealth Falcon - G0038\""],"Stealth Falcon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:mitre-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:threat-actor=\"Stealth Falcon\""],"Strider - G0041":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\""],"Strider":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\"","misp-galaxy:threat-actor=\"ProjectSauron\""],"ProjectSauron":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-malware=\"Remsec - S0125\"","misp-galaxy:threat-actor=\"ProjectSauron\""],"Suckfly - G0039":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:mitre-intrusion-set=\"Suckfly - G0039\""],"Suckfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:mitre-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:threat-actor=\"Suckfly\""],"TA459 - G0062":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"TA459 - G0062\"","misp-galaxy:mitre-intrusion-set=\"TA459 - G0062\""],"TA459":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"TA459 - G0062\"","misp-galaxy:mitre-intrusion-set=\"TA459 - G0062\"","misp-galaxy:threat-actor=\"TA459\""],"Taidoor - G0015":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-intrusion-set=\"Taidoor - G0015\""],"Taidoor":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-enterprise-attack-malware=\"Taidoor - S0011\"","misp-galaxy:mitre-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-malware=\"Taidoor - S0011\"","misp-galaxy:threat-actor=\"Taidoor\"","misp-galaxy:tool=\"Taidoor\""],"Threat Group-1314 - G0028":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"Threat Group-1314":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"TG-1314":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"Threat Group-3390 - G0027":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\""],"Threat Group-3390":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"TG-3390":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"Emissary Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"BRONZE UNION":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\""],"Turla - G0010":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"Turla":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"Waterbug":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\""],"Winnti Group - G0044":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\""],"Winnti Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:threat-actor=\"Axiom\""],"Blackfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:threat-actor=\"Axiom\""],"admin@338 - G0018":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:mitre-intrusion-set=\"admin@338 - G0018\""],"admin@338":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:mitre-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:threat-actor=\"Temper Panda\""],"menuPass - G0045":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\""],"menuPass":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"Stone Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"APT10":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"Red Apollo":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"CVNX":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"3PARA RAT - S0066":["misp-galaxy:mitre-enterprise-attack-malware=\"3PARA RAT - S0066\"","misp-galaxy:mitre-malware=\"3PARA RAT - S0066\""],"3PARA RAT":["misp-galaxy:mitre-enterprise-attack-malware=\"3PARA RAT - S0066\"","misp-galaxy:mitre-malware=\"3PARA RAT - S0066\"","misp-galaxy:rat=\"3PARA RAT\""],"4H RAT - S0065":["misp-galaxy:mitre-enterprise-attack-malware=\"4H RAT - S0065\"","misp-galaxy:mitre-malware=\"4H RAT - S0065\""],"4H RAT":["misp-galaxy:mitre-enterprise-attack-malware=\"4H RAT - S0065\"","misp-galaxy:mitre-malware=\"4H RAT - S0065\"","misp-galaxy:rat=\"4H RAT\""],"ADVSTORESHELL - S0045":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\""],"ADVSTORESHELL":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"NETUI":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"EVILTOSS":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"AZZY":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"ASPXSpy - S0073":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"ASPXSpy":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"ASPXTool":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"Agent.btz - S0092":["misp-galaxy:mitre-enterprise-attack-malware=\"Agent.btz - S0092\"","misp-galaxy:mitre-malware=\"Agent.btz - S0092\""],"Agent.btz":["misp-galaxy:mitre-enterprise-attack-malware=\"Agent.btz - S0092\"","misp-galaxy:mitre-malware=\"Agent.btz - S0092\""],"AutoIt backdoor - S0129":["misp-galaxy:mitre-enterprise-attack-malware=\"AutoIt backdoor - S0129\"","misp-galaxy:mitre-malware=\"AutoIt backdoor - S0129\""],"AutoIt backdoor":["misp-galaxy:mitre-enterprise-attack-malware=\"AutoIt backdoor - S0129\"","misp-galaxy:mitre-malware=\"AutoIt backdoor - S0129\""],"BACKSPACE - S0031":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\""],"BACKSPACE":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\""],"Lecna":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\"","misp-galaxy:tool=\"Backspace\""],"BADNEWS - S0128":["misp-galaxy:mitre-enterprise-attack-malware=\"BADNEWS - S0128\"","misp-galaxy:mitre-malware=\"BADNEWS - S0128\""],"BADNEWS":["misp-galaxy:mitre-enterprise-attack-malware=\"BADNEWS - S0128\"","misp-galaxy:mitre-malware=\"BADNEWS - S0128\""],"BBSRAT - S0127":["misp-galaxy:mitre-enterprise-attack-malware=\"BBSRAT - S0127\"","misp-galaxy:mitre-malware=\"BBSRAT - S0127\""],"BISCUIT - S0017":["misp-galaxy:mitre-enterprise-attack-malware=\"BISCUIT - S0017\"","misp-galaxy:mitre-malware=\"BISCUIT - S0017\""],"BISCUIT":["misp-galaxy:mitre-enterprise-attack-malware=\"BISCUIT - S0017\"","misp-galaxy:mitre-malware=\"BISCUIT - S0017\"","misp-galaxy:tool=\"BISCUIT\""],"BLACKCOFFEE - S0069":["misp-galaxy:mitre-enterprise-attack-malware=\"BLACKCOFFEE - S0069\"","misp-galaxy:mitre-malware=\"BLACKCOFFEE - S0069\""],"BOOTRASH - S0114":["misp-galaxy:mitre-enterprise-attack-malware=\"BOOTRASH - S0114\"","misp-galaxy:mitre-malware=\"BOOTRASH - S0114\""],"BOOTRASH":["misp-galaxy:mitre-enterprise-attack-malware=\"BOOTRASH - S0114\"","misp-galaxy:mitre-malware=\"BOOTRASH - S0114\""],"BS2005 - S0014":["misp-galaxy:mitre-enterprise-attack-malware=\"BS2005 - S0014\"","misp-galaxy:mitre-malware=\"BS2005 - S0014\""],"BUBBLEWRAP - S0043":["misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"Backdoor.APT.FakeWinHTTPHelper":["misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"Backdoor.Oldrea - S0093":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\""],"Backdoor.Oldrea":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\""],"Havex":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:threat-actor=\"Energetic Bear\"","misp-galaxy:tool=\"Havex RAT\""],"BlackEnergy - S0089":["misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\""],"Black Energy":["misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\"","misp-galaxy:threat-actor=\"Sandworm\""],"Briba - S0204":["misp-galaxy:mitre-enterprise-attack-malware=\"Briba - S0204\"","misp-galaxy:mitre-malware=\"Briba - S0204\""],"Briba":["misp-galaxy:mitre-enterprise-attack-malware=\"Briba - S0204\"","misp-galaxy:mitre-malware=\"Briba - S0204\""],"CALENDAR - S0025":["misp-galaxy:mitre-enterprise-attack-malware=\"CALENDAR - S0025\"","misp-galaxy:mitre-malware=\"CALENDAR - S0025\""],"CALENDAR":["misp-galaxy:mitre-enterprise-attack-malware=\"CALENDAR - S0025\"","misp-galaxy:mitre-malware=\"CALENDAR - S0025\"","misp-galaxy:tool=\"CALENDAR\""],"CCBkdr - S0222":["misp-galaxy:mitre-enterprise-attack-malware=\"CCBkdr - S0222\"","misp-galaxy:mitre-malware=\"CCBkdr - S0222\""],"CCBkdr":["misp-galaxy:mitre-enterprise-attack-malware=\"CCBkdr - S0222\"","misp-galaxy:mitre-malware=\"CCBkdr - S0222\""],"CHOPSTICK - S0023":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"CHOPSTICK":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"SPLM":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"Xagent":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"X-Agent":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-mobile-attack-malware=\"X-Agent - MOB-S0030\"","misp-galaxy:tool=\"X-Agent\""],"webhp":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"CORALDECK - S0212":["misp-galaxy:mitre-enterprise-attack-malware=\"CORALDECK - S0212\"","misp-galaxy:mitre-malware=\"CORALDECK - S0212\""],"CORALDECK":["misp-galaxy:mitre-enterprise-attack-malware=\"CORALDECK - S0212\"","misp-galaxy:mitre-malware=\"CORALDECK - S0212\"","misp-galaxy:tool=\"CORALDECK\""],"CORESHELL - S0137":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\""],"CORESHELL":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:tool=\"CORESHELL\""],"SOURFACE":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:tool=\"SOURFACE\""],"CallMe - S0077":["misp-galaxy:mitre-enterprise-attack-malware=\"CallMe - S0077\"","misp-galaxy:mitre-malware=\"CallMe - S0077\""],"CallMe":["misp-galaxy:mitre-enterprise-attack-malware=\"CallMe - S0077\"","misp-galaxy:mitre-malware=\"CallMe - S0077\""],"Carbanak - S0030":["misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\""],"ChChes - S0144":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"Scorpion":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"HAYMAKER":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\"","misp-galaxy:tool=\"HAYMAKER\""],"Chaos - S0220":["misp-galaxy:mitre-enterprise-attack-malware=\"Chaos - S0220\"","misp-galaxy:mitre-malware=\"Chaos - S0220\""],"Chaos":["misp-galaxy:mitre-enterprise-attack-malware=\"Chaos - S0220\"","misp-galaxy:mitre-malware=\"Chaos - S0220\""],"Cherry Picker - S0107":["misp-galaxy:mitre-enterprise-attack-malware=\"Cherry Picker - S0107\"","misp-galaxy:mitre-malware=\"Cherry Picker - S0107\""],"Cherry Picker":["misp-galaxy:mitre-enterprise-attack-malware=\"Cherry Picker - S0107\"","misp-galaxy:mitre-malware=\"Cherry Picker - S0107\""],"China Chopper - S0020":["misp-galaxy:mitre-enterprise-attack-malware=\"China Chopper - S0020\"","misp-galaxy:mitre-malware=\"China Chopper - S0020\""],"China Chopper":["misp-galaxy:mitre-enterprise-attack-malware=\"China Chopper - S0020\"","misp-galaxy:mitre-malware=\"China Chopper - S0020\"","misp-galaxy:tool=\"China Chopper\""],"CloudDuke - S0054":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"CloudDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"MiniDionis":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"CloudLook":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"ComRAT - S0126":["misp-galaxy:mitre-enterprise-attack-malware=\"ComRAT - S0126\"","misp-galaxy:mitre-malware=\"ComRAT - S0126\""],"CosmicDuke - S0050":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"CosmicDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"TinyBaron":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"BotgenStudios":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"NemesisGemina":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"CozyCar - S0046":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\""],"CozyCar":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"CozyBear":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"Cozer":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"EuroAPT":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"Crimson - S0115":["misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\""],"MSIL\/Crimson":["misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\""],"DOGCALL - S0213":["misp-galaxy:mitre-enterprise-attack-malware=\"DOGCALL - S0213\"","misp-galaxy:mitre-malware=\"DOGCALL - S0213\""],"DOGCALL":["misp-galaxy:mitre-enterprise-attack-malware=\"DOGCALL - S0213\"","misp-galaxy:mitre-malware=\"DOGCALL - S0213\"","misp-galaxy:tool=\"DOGCALL\""],"Darkmoon - S0209":["misp-galaxy:mitre-enterprise-attack-malware=\"Darkmoon - S0209\"","misp-galaxy:mitre-malware=\"Darkmoon - S0209\""],"Daserf - S0187":["misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Derusbi - S0021":["misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\""],"Dipsind - S0200":["misp-galaxy:mitre-enterprise-attack-malware=\"Dipsind - S0200\"","misp-galaxy:mitre-malware=\"Dipsind - S0200\""],"Dipsind":["misp-galaxy:mitre-enterprise-attack-malware=\"Dipsind - S0200\"","misp-galaxy:mitre-malware=\"Dipsind - S0200\""],"DownPaper - S0186":["misp-galaxy:mitre-enterprise-attack-malware=\"DownPaper - S0186\"","misp-galaxy:mitre-malware=\"DownPaper - S0186\""],"Downdelph - S0134":["misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\""],"Delphacy":["misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\""],"Duqu - S0038":["misp-galaxy:mitre-enterprise-attack-malware=\"Duqu - S0038\"","misp-galaxy:mitre-malware=\"Duqu - S0038\""],"Duqu":["misp-galaxy:mitre-enterprise-attack-malware=\"Duqu - S0038\"","misp-galaxy:mitre-malware=\"Duqu - S0038\"","misp-galaxy:tool=\"Duqu\""],"DustySky - S0062":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\""],"DustySky":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\""],"NeD Worm":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\"","misp-galaxy:tool=\"NeD Worm\""],"Dyre - S0024":["misp-galaxy:mitre-enterprise-attack-malware=\"Dyre - S0024\"","misp-galaxy:mitre-malware=\"Dyre - S0024\""],"ELMER - S0064":["misp-galaxy:mitre-enterprise-attack-malware=\"ELMER - S0064\"","misp-galaxy:mitre-malware=\"ELMER - S0064\""],"Elise - S0081":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"BKDR_ESILE":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"Page":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"Emissary - S0082":["misp-galaxy:mitre-enterprise-attack-malware=\"Emissary - S0082\"","misp-galaxy:mitre-malware=\"Emissary - S0082\""],"Emissary":["misp-galaxy:mitre-enterprise-attack-malware=\"Emissary - S0082\"","misp-galaxy:mitre-malware=\"Emissary - S0082\""],"Epic - S0091":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\""],"Epic":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\""],"Tavdig":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"WorldCupSec":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"TadjMakhal":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"EvilGrab - S0152":["misp-galaxy:mitre-enterprise-attack-malware=\"EvilGrab - S0152\"","misp-galaxy:mitre-malware=\"EvilGrab - S0152\""],"FALLCHILL - S0181":["misp-galaxy:mitre-enterprise-attack-malware=\"FALLCHILL - S0181\"","misp-galaxy:mitre-malware=\"FALLCHILL - S0181\""],"FLASHFLOOD - S0036":["misp-galaxy:mitre-enterprise-attack-malware=\"FLASHFLOOD - S0036\"","misp-galaxy:mitre-malware=\"FLASHFLOOD - S0036\""],"FLIPSIDE - S0173":["misp-galaxy:mitre-enterprise-attack-malware=\"FLIPSIDE - S0173\"","misp-galaxy:mitre-malware=\"FLIPSIDE - S0173\""],"FLIPSIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"FLIPSIDE - S0173\"","misp-galaxy:mitre-malware=\"FLIPSIDE - S0173\""],"FakeM - S0076":["misp-galaxy:mitre-enterprise-attack-malware=\"FakeM - S0076\"","misp-galaxy:mitre-malware=\"FakeM - S0076\""],"FakeM":["misp-galaxy:mitre-enterprise-attack-malware=\"FakeM - S0076\"","misp-galaxy:mitre-malware=\"FakeM - S0076\""],"Felismus - S0171":["misp-galaxy:mitre-enterprise-attack-malware=\"Felismus - S0171\"","misp-galaxy:mitre-malware=\"Felismus - S0171\""],"FinFisher - S0182":["misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"FinFisher":["misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"Flame - S0143":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"Flamer":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"sKyWIper":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"GLOOXMAIL - S0026":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\""],"GLOOXMAIL":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:tool=\"GLOOXMAIL\""],"Trojan.GTALK":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\""],"Gazer - S0168":["misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"GeminiDuke - S0049":["misp-galaxy:mitre-enterprise-attack-malware=\"GeminiDuke - S0049\"","misp-galaxy:mitre-malware=\"GeminiDuke - S0049\""],"GeminiDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"GeminiDuke - S0049\"","misp-galaxy:mitre-malware=\"GeminiDuke - S0049\"","misp-galaxy:tool=\"GeminiDuke\""],"H1N1 - S0132":["misp-galaxy:mitre-enterprise-attack-malware=\"H1N1 - S0132\"","misp-galaxy:mitre-malware=\"H1N1 - S0132\""],"H1N1":["misp-galaxy:mitre-enterprise-attack-malware=\"H1N1 - S0132\"","misp-galaxy:mitre-malware=\"H1N1 - S0132\""],"HALFBAKED - S0151":["misp-galaxy:mitre-enterprise-attack-malware=\"HALFBAKED - S0151\"","misp-galaxy:mitre-malware=\"HALFBAKED - S0151\""],"HAMMERTOSS - S0037":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HAMMERTOSS":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HammerDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"NetDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HAPPYWORK - S0214":["misp-galaxy:mitre-enterprise-attack-malware=\"HAPPYWORK - S0214\"","misp-galaxy:mitre-malware=\"HAPPYWORK - S0214\""],"HAPPYWORK":["misp-galaxy:mitre-enterprise-attack-malware=\"HAPPYWORK - S0214\"","misp-galaxy:mitre-malware=\"HAPPYWORK - S0214\"","misp-galaxy:tool=\"HAPPYWORK\""],"HDoor - S0061":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"HDoor":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"Custom HDoor":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"HIDEDRV - S0135":["misp-galaxy:mitre-enterprise-attack-malware=\"HIDEDRV - S0135\"","misp-galaxy:mitre-malware=\"HIDEDRV - S0135\""],"HIDEDRV":["misp-galaxy:mitre-enterprise-attack-malware=\"HIDEDRV - S0135\"","misp-galaxy:mitre-malware=\"HIDEDRV - S0135\""],"HOMEFRY - S0232":["misp-galaxy:mitre-enterprise-attack-malware=\"HOMEFRY - S0232\"","misp-galaxy:mitre-malware=\"HOMEFRY - S0232\""],"HOMEFRY":["misp-galaxy:mitre-enterprise-attack-malware=\"HOMEFRY - S0232\"","misp-galaxy:mitre-malware=\"HOMEFRY - S0232\""],"HTTPBrowser - S0070":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"HTTPBrowser":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\"","misp-galaxy:tool=\"HTTPBrowser\""],"Token Control":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"HttpDump":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"Hacking Team UEFI Rootkit - S0047":["misp-galaxy:mitre-enterprise-attack-malware=\"Hacking Team UEFI Rootkit - S0047\"","misp-galaxy:mitre-malware=\"Hacking Team UEFI Rootkit - S0047\""],"Hacking Team UEFI Rootkit":["misp-galaxy:mitre-enterprise-attack-malware=\"Hacking Team UEFI Rootkit - S0047\"","misp-galaxy:mitre-malware=\"Hacking Team UEFI Rootkit - S0047\""],"Helminth - S0170":["misp-galaxy:mitre-enterprise-attack-malware=\"Helminth - S0170\"","misp-galaxy:mitre-malware=\"Helminth - S0170\""],"Hi-Zor - S0087":["misp-galaxy:mitre-enterprise-attack-malware=\"Hi-Zor - S0087\"","misp-galaxy:mitre-malware=\"Hi-Zor - S0087\""],"Hi-Zor":["misp-galaxy:mitre-enterprise-attack-malware=\"Hi-Zor - S0087\"","misp-galaxy:mitre-malware=\"Hi-Zor - S0087\"","misp-galaxy:rat=\"Hi-Zor\""],"Hikit - S0009":["misp-galaxy:mitre-enterprise-attack-malware=\"Hikit - S0009\"","misp-galaxy:mitre-malware=\"Hikit - S0009\""],"Hikit":["misp-galaxy:mitre-enterprise-attack-malware=\"Hikit - S0009\"","misp-galaxy:mitre-malware=\"Hikit - S0009\"","misp-galaxy:tool=\"Hikit\""],"Hydraq - S0203":["misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\""],"ISMInjector - S0189":["misp-galaxy:mitre-enterprise-attack-malware=\"ISMInjector - S0189\"","misp-galaxy:mitre-malware=\"ISMInjector - S0189\""],"ISMInjector":["misp-galaxy:mitre-enterprise-attack-malware=\"ISMInjector - S0189\"","misp-galaxy:mitre-malware=\"ISMInjector - S0189\""],"Ixeshe - S0015":["misp-galaxy:mitre-enterprise-attack-malware=\"Ixeshe - S0015\"","misp-galaxy:mitre-malware=\"Ixeshe - S0015\""],"Ixeshe":["misp-galaxy:mitre-enterprise-attack-malware=\"Ixeshe - S0015\"","misp-galaxy:mitre-malware=\"Ixeshe - S0015\""],"JHUHUGIT - S0044":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"GAMEFISH":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"SofacyCarberp":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"JPIN - S0201":["misp-galaxy:mitre-enterprise-attack-malware=\"JPIN - S0201\"","misp-galaxy:mitre-malware=\"JPIN - S0201\""],"JPIN":["misp-galaxy:mitre-enterprise-attack-malware=\"JPIN - S0201\"","misp-galaxy:mitre-malware=\"JPIN - S0201\""],"Janicab - S0163":["misp-galaxy:mitre-enterprise-attack-malware=\"Janicab - S0163\"","misp-galaxy:mitre-malware=\"Janicab - S0163\""],"Janicab":["misp-galaxy:mitre-enterprise-attack-malware=\"Janicab - S0163\"","misp-galaxy:mitre-malware=\"Janicab - S0163\"","misp-galaxy:tool=\"Janicab\""],"KARAE - S0215":["misp-galaxy:mitre-enterprise-attack-malware=\"KARAE - S0215\"","misp-galaxy:mitre-malware=\"KARAE - S0215\""],"KARAE":["misp-galaxy:mitre-enterprise-attack-malware=\"KARAE - S0215\"","misp-galaxy:mitre-malware=\"KARAE - S0215\"","misp-galaxy:tool=\"KARAE\""],"KOMPROGO - S0156":["misp-galaxy:mitre-enterprise-attack-malware=\"KOMPROGO - S0156\"","misp-galaxy:mitre-malware=\"KOMPROGO - S0156\""],"Kasidet - S0088":["misp-galaxy:mitre-enterprise-attack-malware=\"Kasidet - S0088\"","misp-galaxy:mitre-malware=\"Kasidet - S0088\""],"Komplex - S0162":["misp-galaxy:mitre-enterprise-attack-malware=\"Komplex - S0162\"","misp-galaxy:mitre-malware=\"Komplex - S0162\""],"LOWBALL - S0042":["misp-galaxy:mitre-enterprise-attack-malware=\"LOWBALL - S0042\"","misp-galaxy:mitre-malware=\"LOWBALL - S0042\""],"Linfo - S0211":["misp-galaxy:mitre-enterprise-attack-malware=\"Linfo - S0211\"","misp-galaxy:mitre-malware=\"Linfo - S0211\""],"Linfo":["misp-galaxy:mitre-enterprise-attack-malware=\"Linfo - S0211\"","misp-galaxy:mitre-malware=\"Linfo - S0211\""],"Lurid - S0010":["misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\""],"MURKYTOP - S0233":["misp-galaxy:mitre-enterprise-attack-malware=\"MURKYTOP - S0233\"","misp-galaxy:mitre-malware=\"MURKYTOP - S0233\""],"MURKYTOP":["misp-galaxy:mitre-enterprise-attack-malware=\"MURKYTOP - S0233\"","misp-galaxy:mitre-malware=\"MURKYTOP - S0233\""],"Matroyshka - S0167":["misp-galaxy:mitre-enterprise-attack-malware=\"Matroyshka - S0167\"","misp-galaxy:mitre-malware=\"Matroyshka - S0167\""],"Matroyshka":["misp-galaxy:mitre-enterprise-attack-malware=\"Matroyshka - S0167\"","misp-galaxy:mitre-malware=\"Matroyshka - S0167\""],"Miner-C - S0133":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"Miner-C":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"Mal\/Miner-C":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"PhotoMiner":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"MiniDuke - S0051":["misp-galaxy:mitre-enterprise-attack-malware=\"MiniDuke - S0051\"","misp-galaxy:mitre-malware=\"MiniDuke - S0051\""],"MiniDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"MiniDuke - S0051\"","misp-galaxy:mitre-malware=\"MiniDuke - S0051\""],"Mis-Type - S0084":["misp-galaxy:mitre-enterprise-attack-malware=\"Mis-Type - S0084\"","misp-galaxy:mitre-malware=\"Mis-Type - S0084\""],"Mis-Type":["misp-galaxy:mitre-enterprise-attack-malware=\"Mis-Type - S0084\"","misp-galaxy:mitre-malware=\"Mis-Type - S0084\""],"Misdat - S0083":["misp-galaxy:mitre-enterprise-attack-malware=\"Misdat - S0083\"","misp-galaxy:mitre-malware=\"Misdat - S0083\""],"Mivast - S0080":["misp-galaxy:mitre-enterprise-attack-malware=\"Mivast - S0080\"","misp-galaxy:mitre-malware=\"Mivast - S0080\""],"Mivast":["misp-galaxy:mitre-enterprise-attack-malware=\"Mivast - S0080\"","misp-galaxy:mitre-malware=\"Mivast - S0080\""],"MobileOrder - S0079":["misp-galaxy:mitre-enterprise-attack-malware=\"MobileOrder - S0079\"","misp-galaxy:mitre-malware=\"MobileOrder - S0079\""],"MobileOrder":["misp-galaxy:mitre-enterprise-attack-malware=\"MobileOrder - S0079\"","misp-galaxy:mitre-malware=\"MobileOrder - S0079\""],"MoonWind - S0149":["misp-galaxy:mitre-enterprise-attack-malware=\"MoonWind - S0149\"","misp-galaxy:mitre-malware=\"MoonWind - S0149\""],"NETEAGLE - S0034":["misp-galaxy:mitre-enterprise-attack-malware=\"NETEAGLE - S0034\"","misp-galaxy:mitre-malware=\"NETEAGLE - S0034\""],"NETWIRE - S0198":["misp-galaxy:mitre-enterprise-attack-malware=\"NETWIRE - S0198\"","misp-galaxy:mitre-malware=\"NETWIRE - S0198\""],"NETWIRE":["misp-galaxy:mitre-enterprise-attack-malware=\"NETWIRE - S0198\"","misp-galaxy:mitre-malware=\"NETWIRE - S0198\""],"Naid - S0205":["misp-galaxy:mitre-enterprise-attack-malware=\"Naid - S0205\"","misp-galaxy:mitre-malware=\"Naid - S0205\""],"Naid":["misp-galaxy:mitre-enterprise-attack-malware=\"Naid - S0205\"","misp-galaxy:mitre-malware=\"Naid - S0205\"","misp-galaxy:tool=\"Trojan.Naid\""],"NanHaiShu - S0228":["misp-galaxy:mitre-enterprise-attack-malware=\"NanHaiShu - S0228\"","misp-galaxy:mitre-malware=\"NanHaiShu - S0228\""],"Nerex - S0210":["misp-galaxy:mitre-enterprise-attack-malware=\"Nerex - S0210\"","misp-galaxy:mitre-malware=\"Nerex - S0210\""],"Nerex":["misp-galaxy:mitre-enterprise-attack-malware=\"Nerex - S0210\"","misp-galaxy:mitre-malware=\"Nerex - S0210\""],"Net Crawler - S0056":["misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"Net Crawler":["misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"NetTraveler - S0033":["misp-galaxy:mitre-enterprise-attack-malware=\"NetTraveler - S0033\"","misp-galaxy:mitre-malware=\"NetTraveler - S0033\""],"Nidiran - S0118":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"Nidiran":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"Backdoor.Nidiran":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"OLDBAIT - S0138":["misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\""],"OSInfo - S0165":["misp-galaxy:mitre-enterprise-attack-malware=\"OSInfo - S0165\"","misp-galaxy:mitre-malware=\"OSInfo - S0165\""],"OSInfo":["misp-galaxy:mitre-enterprise-attack-malware=\"OSInfo - S0165\"","misp-galaxy:mitre-malware=\"OSInfo - S0165\""],"OnionDuke - S0052":["misp-galaxy:mitre-enterprise-attack-malware=\"OnionDuke - S0052\"","misp-galaxy:mitre-malware=\"OnionDuke - S0052\""],"Orz - S0229":["misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"OwaAuth - S0072":["misp-galaxy:mitre-enterprise-attack-malware=\"OwaAuth - S0072\"","misp-galaxy:mitre-malware=\"OwaAuth - S0072\""],"OwaAuth":["misp-galaxy:mitre-enterprise-attack-malware=\"OwaAuth - S0072\"","misp-galaxy:mitre-malware=\"OwaAuth - S0072\""],"P2P ZeuS - S0016":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"P2P ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"Peer-to-Peer ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"Gameover ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"PHOREAL - S0158":["misp-galaxy:mitre-enterprise-attack-malware=\"PHOREAL - S0158\"","misp-galaxy:mitre-malware=\"PHOREAL - S0158\""],"POORAIM - S0216":["misp-galaxy:mitre-enterprise-attack-malware=\"POORAIM - S0216\"","misp-galaxy:mitre-malware=\"POORAIM - S0216\""],"POORAIM":["misp-galaxy:mitre-enterprise-attack-malware=\"POORAIM - S0216\"","misp-galaxy:mitre-malware=\"POORAIM - S0216\"","misp-galaxy:tool=\"POORAIM\""],"POSHSPY - S0150":["misp-galaxy:mitre-enterprise-attack-malware=\"POSHSPY - S0150\"","misp-galaxy:mitre-malware=\"POSHSPY - S0150\""],"POWERSOURCE - S0145":["misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\""],"POWERSTATS - S0223":["misp-galaxy:mitre-enterprise-attack-malware=\"POWERSTATS - S0223\"","misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"POWRUNER - S0184":["misp-galaxy:mitre-enterprise-attack-malware=\"POWRUNER - S0184\"","misp-galaxy:mitre-malware=\"POWRUNER - S0184\""],"PUNCHBUGGY - S0196":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHBUGGY - S0196\"","misp-galaxy:mitre-malware=\"PUNCHBUGGY - S0196\""],"PUNCHBUGGY":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHBUGGY - S0196\"","misp-galaxy:mitre-malware=\"PUNCHBUGGY - S0196\""],"PUNCHTRACK - S0197":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"PUNCHTRACK":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"PSVC":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"Pasam - S0208":["misp-galaxy:mitre-enterprise-attack-malware=\"Pasam - S0208\"","misp-galaxy:mitre-malware=\"Pasam - S0208\""],"Pasam":["misp-galaxy:mitre-enterprise-attack-malware=\"Pasam - S0208\"","misp-galaxy:mitre-malware=\"Pasam - S0208\""],"PinchDuke - S0048":["misp-galaxy:mitre-enterprise-attack-malware=\"PinchDuke - S0048\"","misp-galaxy:mitre-malware=\"PinchDuke - S0048\""],"PinchDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"PinchDuke - S0048\"","misp-galaxy:mitre-malware=\"PinchDuke - S0048\""],"Pisloader - S0124":["misp-galaxy:mitre-enterprise-attack-malware=\"Pisloader - S0124\"","misp-galaxy:mitre-malware=\"Pisloader - S0124\""],"Pisloader":["misp-galaxy:mitre-enterprise-attack-malware=\"Pisloader - S0124\"","misp-galaxy:mitre-malware=\"Pisloader - S0124\""],"PlugX - S0013":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Sogu":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Kaba":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"PoisonIvy - S0012":["misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\""],"PoisonIvy":["misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\"","misp-galaxy:rat=\"PoisonIvy\""],"Power Loader - S0177":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"Power Loader":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"Win32\/Agent.UAW":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"PowerDuke - S0139":["misp-galaxy:mitre-enterprise-attack-malware=\"PowerDuke - S0139\"","misp-galaxy:mitre-malware=\"PowerDuke - S0139\""],"Prikormka - S0113":["misp-galaxy:mitre-enterprise-attack-malware=\"Prikormka - S0113\"","misp-galaxy:mitre-malware=\"Prikormka - S0113\""],"Prikormka":["misp-galaxy:mitre-enterprise-attack-malware=\"Prikormka - S0113\"","misp-galaxy:mitre-malware=\"Prikormka - S0113\"","misp-galaxy:tool=\"Prikormka\""],"Psylo - S0078":["misp-galaxy:mitre-enterprise-attack-malware=\"Psylo - S0078\"","misp-galaxy:mitre-malware=\"Psylo - S0078\""],"Psylo":["misp-galaxy:mitre-enterprise-attack-malware=\"Psylo - S0078\"","misp-galaxy:mitre-malware=\"Psylo - S0078\""],"Pteranodon - S0147":["misp-galaxy:mitre-enterprise-attack-malware=\"Pteranodon - S0147\"","misp-galaxy:mitre-malware=\"Pteranodon - S0147\""],"RARSTONE - S0055":["misp-galaxy:mitre-enterprise-attack-malware=\"RARSTONE - S0055\"","misp-galaxy:mitre-malware=\"RARSTONE - S0055\""],"RARSTONE":["misp-galaxy:mitre-enterprise-attack-malware=\"RARSTONE - S0055\"","misp-galaxy:mitre-malware=\"RARSTONE - S0055\"","misp-galaxy:tool=\"RARSTONE\""],"RIPTIDE - S0003":["misp-galaxy:mitre-enterprise-attack-malware=\"RIPTIDE - S0003\"","misp-galaxy:mitre-malware=\"RIPTIDE - S0003\""],"RIPTIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"RIPTIDE - S0003\"","misp-galaxy:mitre-malware=\"RIPTIDE - S0003\"","misp-galaxy:tool=\"Etumbot\""],"ROCKBOOT - S0112":["misp-galaxy:mitre-enterprise-attack-malware=\"ROCKBOOT - S0112\"","misp-galaxy:mitre-malware=\"ROCKBOOT - S0112\""],"ROCKBOOT":["misp-galaxy:mitre-enterprise-attack-malware=\"ROCKBOOT - S0112\"","misp-galaxy:mitre-malware=\"ROCKBOOT - S0112\""],"RTM - S0148":["misp-galaxy:mitre-enterprise-attack-malware=\"RTM - S0148\"","misp-galaxy:mitre-malware=\"RTM - S0148\""],"RawPOS - S0169":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"FIENDCRY":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"DUEBREW":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"DRIFTWOOD":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"Reaver - S0172":["misp-galaxy:mitre-enterprise-attack-malware=\"Reaver - S0172\"","misp-galaxy:mitre-malware=\"Reaver - S0172\""],"RedLeaves - S0153":["misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\""],"BUGJUICE":["misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\"","misp-galaxy:tool=\"BUGJUICE\""],"Regin - S0019":["misp-galaxy:mitre-enterprise-attack-malware=\"Regin - S0019\"","misp-galaxy:mitre-malware=\"Regin - S0019\""],"RemoteCMD - S0166":["misp-galaxy:mitre-enterprise-attack-malware=\"RemoteCMD - S0166\"","misp-galaxy:mitre-malware=\"RemoteCMD - S0166\""],"RemoteCMD":["misp-galaxy:mitre-enterprise-attack-malware=\"RemoteCMD - S0166\"","misp-galaxy:mitre-malware=\"RemoteCMD - S0166\""],"Remsec - S0125":["misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Backdoor.Remsec":["misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Rover - S0090":["misp-galaxy:mitre-enterprise-attack-malware=\"Rover - S0090\"","misp-galaxy:mitre-malware=\"Rover - S0090\""],"S-Type - S0085":["misp-galaxy:mitre-enterprise-attack-malware=\"S-Type - S0085\"","misp-galaxy:mitre-malware=\"S-Type - S0085\""],"S-Type":["misp-galaxy:mitre-enterprise-attack-malware=\"S-Type - S0085\"","misp-galaxy:mitre-malware=\"S-Type - S0085\""],"SEASHARPEE - S0185":["misp-galaxy:mitre-enterprise-attack-malware=\"SEASHARPEE - S0185\"","misp-galaxy:mitre-malware=\"SEASHARPEE - S0185\""],"SEASHARPEE":["misp-galaxy:mitre-enterprise-attack-malware=\"SEASHARPEE - S0185\"","misp-galaxy:mitre-malware=\"SEASHARPEE - S0185\""],"SHIPSHAPE - S0028":["misp-galaxy:mitre-enterprise-attack-malware=\"SHIPSHAPE - S0028\"","misp-galaxy:mitre-malware=\"SHIPSHAPE - S0028\""],"SHOTPUT - S0063":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"SHOTPUT":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"Backdoor.APT.CookieCutter":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"SHUTTERSPEED - S0217":["misp-galaxy:mitre-enterprise-attack-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:mitre-malware=\"SHUTTERSPEED - S0217\""],"SHUTTERSPEED":["misp-galaxy:mitre-enterprise-attack-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:mitre-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:tool=\"SHUTTERSPEED\""],"SLOWDRIFT - S0218":["misp-galaxy:mitre-enterprise-attack-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:mitre-malware=\"SLOWDRIFT - S0218\""],"SLOWDRIFT":["misp-galaxy:mitre-enterprise-attack-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:mitre-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:tool=\"SLOWDRIFT\""],"SNUGRIDE - S0159":["misp-galaxy:mitre-enterprise-attack-malware=\"SNUGRIDE - S0159\"","misp-galaxy:mitre-malware=\"SNUGRIDE - S0159\""],"SNUGRIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"SNUGRIDE - S0159\"","misp-galaxy:mitre-malware=\"SNUGRIDE - S0159\"","misp-galaxy:tool=\"SNUGRIDE\""],"SOUNDBITE - S0157":["misp-galaxy:mitre-enterprise-attack-malware=\"SOUNDBITE - S0157\"","misp-galaxy:mitre-malware=\"SOUNDBITE - S0157\""],"SPACESHIP - S0035":["misp-galaxy:mitre-enterprise-attack-malware=\"SPACESHIP - S0035\"","misp-galaxy:mitre-malware=\"SPACESHIP - S0035\""],"Sakula - S0074":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\""],"Sakula":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\"","misp-galaxy:tool=\"Sakula\""],"VIPER":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\""],"SeaDuke - S0053":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"SeaDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\"","misp-galaxy:threat-actor=\"APT 29\""],"SeaDesk":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"Shamoon - S0140":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\""],"Shamoon":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\"","misp-galaxy:tool=\"Shamoon\""],"Disttrack":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\""],"Skeleton Key - S0007":["misp-galaxy:mitre-enterprise-attack-malware=\"Skeleton Key - S0007\"","misp-galaxy:mitre-malware=\"Skeleton Key - S0007\""],"Skeleton Key":["misp-galaxy:mitre-enterprise-attack-malware=\"Skeleton Key - S0007\"","misp-galaxy:mitre-malware=\"Skeleton Key - S0007\""],"Smoke Loader - S0226":["misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\""],"Smoke Loader":["misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\"","misp-galaxy:tool=\"Smoke Loader\""],"SslMM - S0058":["misp-galaxy:mitre-enterprise-attack-malware=\"SslMM - S0058\"","misp-galaxy:mitre-malware=\"SslMM - S0058\""],"Starloader - S0188":["misp-galaxy:mitre-enterprise-attack-malware=\"Starloader - S0188\"","misp-galaxy:mitre-malware=\"Starloader - S0188\""],"Starloader":["misp-galaxy:mitre-enterprise-attack-malware=\"Starloader - S0188\"","misp-galaxy:mitre-malware=\"Starloader - S0188\""],"StreamEx - S0142":["misp-galaxy:mitre-enterprise-attack-malware=\"StreamEx - S0142\"","misp-galaxy:mitre-malware=\"StreamEx - S0142\""],"StreamEx":["misp-galaxy:mitre-enterprise-attack-malware=\"StreamEx - S0142\"","misp-galaxy:mitre-malware=\"StreamEx - S0142\"","misp-galaxy:tool=\"StreamEx\""],"Sykipot - S0018":["misp-galaxy:mitre-enterprise-attack-malware=\"Sykipot - S0018\"","misp-galaxy:mitre-malware=\"Sykipot - S0018\""],"Sykipot":["misp-galaxy:mitre-enterprise-attack-malware=\"Sykipot - S0018\"","misp-galaxy:mitre-malware=\"Sykipot - S0018\"","misp-galaxy:threat-actor=\"Maverick Panda\""],"Sys10 - S0060":["misp-galaxy:mitre-enterprise-attack-malware=\"Sys10 - S0060\"","misp-galaxy:mitre-malware=\"Sys10 - S0060\""],"T9000 - S0098":["misp-galaxy:mitre-enterprise-attack-malware=\"T9000 - S0098\"","misp-galaxy:mitre-malware=\"T9000 - S0098\""],"T9000":["misp-galaxy:mitre-enterprise-attack-malware=\"T9000 - S0098\"","misp-galaxy:mitre-malware=\"T9000 - S0098\"","misp-galaxy:tool=\"T9000\""],"TDTESS - S0164":["misp-galaxy:mitre-enterprise-attack-malware=\"TDTESS - S0164\"","misp-galaxy:mitre-malware=\"TDTESS - S0164\""],"TEXTMATE - S0146":["misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\""],"TINYTYPHON - S0131":["misp-galaxy:mitre-enterprise-attack-malware=\"TINYTYPHON - S0131\"","misp-galaxy:mitre-malware=\"TINYTYPHON - S0131\""],"TINYTYPHON":["misp-galaxy:mitre-enterprise-attack-malware=\"TINYTYPHON - S0131\"","misp-galaxy:mitre-malware=\"TINYTYPHON - S0131\""],"TURNEDUP - S0199":["misp-galaxy:mitre-enterprise-attack-malware=\"TURNEDUP - S0199\"","misp-galaxy:mitre-malware=\"TURNEDUP - S0199\""],"Taidoor - S0011":["misp-galaxy:mitre-enterprise-attack-malware=\"Taidoor - S0011\"","misp-galaxy:mitre-malware=\"Taidoor - S0011\""],"TinyZBot - S0004":["misp-galaxy:mitre-enterprise-attack-malware=\"TinyZBot - S0004\"","misp-galaxy:mitre-malware=\"TinyZBot - S0004\""],"TinyZBot":["misp-galaxy:mitre-enterprise-attack-malware=\"TinyZBot - S0004\"","misp-galaxy:mitre-malware=\"TinyZBot - S0004\"","misp-galaxy:tool=\"TinyZBot\""],"Trojan.Karagany - S0094":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Karagany - S0094\"","misp-galaxy:mitre-malware=\"Trojan.Karagany - S0094\""],"Trojan.Karagany":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Karagany - S0094\"","misp-galaxy:mitre-malware=\"Trojan.Karagany - S0094\""],"Trojan.Mebromi - S0001":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Mebromi - S0001\"","misp-galaxy:mitre-malware=\"Trojan.Mebromi - S0001\""],"Trojan.Mebromi":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Mebromi - S0001\"","misp-galaxy:mitre-malware=\"Trojan.Mebromi - S0001\""],"Truvasys - S0178":["misp-galaxy:mitre-enterprise-attack-malware=\"Truvasys - S0178\"","misp-galaxy:mitre-malware=\"Truvasys - S0178\""],"Truvasys":["misp-galaxy:mitre-enterprise-attack-malware=\"Truvasys - S0178\"","misp-galaxy:mitre-malware=\"Truvasys - S0178\""],"USBStealer - S0136":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"USBStealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\"","misp-galaxy:tool=\"USBStealer\""],"USB Stealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"Win32\/USBStealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"Umbreon - S0221":["misp-galaxy:mitre-enterprise-attack-malware=\"Umbreon - S0221\"","misp-galaxy:mitre-malware=\"Umbreon - S0221\""],"Unknown Logger - S0130":["misp-galaxy:mitre-enterprise-attack-malware=\"Unknown Logger - S0130\"","misp-galaxy:mitre-malware=\"Unknown Logger - S0130\""],"Unknown Logger":["misp-galaxy:mitre-enterprise-attack-malware=\"Unknown Logger - S0130\"","misp-galaxy:mitre-malware=\"Unknown Logger - S0130\""],"Uroburos - S0022":["misp-galaxy:mitre-enterprise-attack-malware=\"Uroburos - S0022\"","misp-galaxy:mitre-malware=\"Uroburos - S0022\""],"Uroburos":["misp-galaxy:mitre-enterprise-attack-malware=\"Uroburos - S0022\"","misp-galaxy:mitre-malware=\"Uroburos - S0022\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"Vasport - S0207":["misp-galaxy:mitre-enterprise-attack-malware=\"Vasport - S0207\"","misp-galaxy:mitre-malware=\"Vasport - S0207\""],"Vasport":["misp-galaxy:mitre-enterprise-attack-malware=\"Vasport - S0207\"","misp-galaxy:mitre-malware=\"Vasport - S0207\""],"Volgmer - S0180":["misp-galaxy:mitre-enterprise-attack-malware=\"Volgmer - S0180\"","misp-galaxy:mitre-malware=\"Volgmer - S0180\""],"WEBC2 - S0109":["misp-galaxy:mitre-enterprise-attack-malware=\"WEBC2 - S0109\"","misp-galaxy:mitre-malware=\"WEBC2 - S0109\""],"WEBC2":["misp-galaxy:mitre-enterprise-attack-malware=\"WEBC2 - S0109\"","misp-galaxy:mitre-malware=\"WEBC2 - S0109\"","misp-galaxy:tool=\"WEBC2\""],"WINDSHIELD - S0155":["misp-galaxy:mitre-enterprise-attack-malware=\"WINDSHIELD - S0155\"","misp-galaxy:mitre-malware=\"WINDSHIELD - S0155\""],"WINDSHIELD":["misp-galaxy:mitre-enterprise-attack-malware=\"WINDSHIELD - S0155\"","misp-galaxy:mitre-malware=\"WINDSHIELD - S0155\""],"WINERACK - S0219":["misp-galaxy:mitre-enterprise-attack-malware=\"WINERACK - S0219\"","misp-galaxy:mitre-malware=\"WINERACK - S0219\""],"WINERACK":["misp-galaxy:mitre-enterprise-attack-malware=\"WINERACK - S0219\"","misp-galaxy:mitre-malware=\"WINERACK - S0219\"","misp-galaxy:tool=\"WINERACK\""],"Wiarp - S0206":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiarp - S0206\"","misp-galaxy:mitre-malware=\"Wiarp - S0206\""],"Wiarp":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiarp - S0206\"","misp-galaxy:mitre-malware=\"Wiarp - S0206\""],"WinMM - S0059":["misp-galaxy:mitre-enterprise-attack-malware=\"WinMM - S0059\"","misp-galaxy:mitre-malware=\"WinMM - S0059\""],"Wingbird - S0176":["misp-galaxy:mitre-enterprise-attack-malware=\"Wingbird - S0176\"","misp-galaxy:mitre-malware=\"Wingbird - S0176\""],"Wingbird":["misp-galaxy:mitre-enterprise-attack-malware=\"Wingbird - S0176\"","misp-galaxy:mitre-malware=\"Wingbird - S0176\""],"Winnti - S0141":["misp-galaxy:mitre-enterprise-attack-malware=\"Winnti - S0141\"","misp-galaxy:mitre-malware=\"Winnti - S0141\""],"Winnti":["misp-galaxy:mitre-enterprise-attack-malware=\"Winnti - S0141\"","misp-galaxy:mitre-malware=\"Winnti - S0141\"","misp-galaxy:tool=\"Winnti\""],"Wiper - S0041":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiper - S0041\"","misp-galaxy:mitre-malware=\"Wiper - S0041\""],"Wiper":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiper - S0041\"","misp-galaxy:mitre-malware=\"Wiper - S0041\""],"XAgentOSX - S0161":["misp-galaxy:mitre-enterprise-attack-malware=\"XAgentOSX - S0161\"","misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XAgentOSX":["misp-galaxy:mitre-enterprise-attack-malware=\"XAgentOSX - S0161\"","misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XTunnel - S0117":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"XTunnel":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\"","misp-galaxy:tool=\"X-Tunnel\""],"XAPS":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"ZLib - S0086":["misp-galaxy:mitre-enterprise-attack-malware=\"ZLib - S0086\"","misp-galaxy:mitre-malware=\"ZLib - S0086\""],"ZLib":["misp-galaxy:mitre-enterprise-attack-malware=\"ZLib - S0086\"","misp-galaxy:mitre-malware=\"ZLib - S0086\""],"ZeroT - S0230":["misp-galaxy:mitre-enterprise-attack-malware=\"ZeroT - S0230\"","misp-galaxy:mitre-malware=\"ZeroT - S0230\""],"Zeroaccess - S0027":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"Zeroaccess":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"Trojan.Zeroaccess":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"adbupd - S0202":["misp-galaxy:mitre-enterprise-attack-malware=\"adbupd - S0202\"","misp-galaxy:mitre-malware=\"adbupd - S0202\""],"adbupd":["misp-galaxy:mitre-enterprise-attack-malware=\"adbupd - S0202\"","misp-galaxy:mitre-malware=\"adbupd - S0202\""],"gh0st - S0032":["misp-galaxy:mitre-enterprise-attack-malware=\"gh0st - S0032\"","misp-galaxy:mitre-malware=\"gh0st - S0032\""],"gh0st":["misp-galaxy:mitre-enterprise-attack-malware=\"gh0st - S0032\"","misp-galaxy:mitre-malware=\"gh0st - S0032\"","misp-galaxy:tool=\"gh0st\""],"hcdLoader - S0071":["misp-galaxy:mitre-enterprise-attack-malware=\"hcdLoader - S0071\"","misp-galaxy:mitre-malware=\"hcdLoader - S0071\""],"hcdLoader":["misp-galaxy:mitre-enterprise-attack-malware=\"hcdLoader - S0071\"","misp-galaxy:mitre-malware=\"hcdLoader - S0071\"","misp-galaxy:rat=\"hcdLoader\""],"httpclient - S0068":["misp-galaxy:mitre-enterprise-attack-malware=\"httpclient - S0068\"","misp-galaxy:mitre-malware=\"httpclient - S0068\""],"httpclient":["misp-galaxy:mitre-enterprise-attack-malware=\"httpclient - S0068\"","misp-galaxy:mitre-malware=\"httpclient - S0068\""],"pngdowner - S0067":["misp-galaxy:mitre-enterprise-attack-malware=\"pngdowner - S0067\"","misp-galaxy:mitre-malware=\"pngdowner - S0067\""],"Arp - S0099":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"Arp":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"arp.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"BITSAdmin - S0190":["misp-galaxy:mitre-enterprise-attack-tool=\"BITSAdmin - S0190\"","misp-galaxy:mitre-tool=\"BITSAdmin - S0190\""],"BITSAdmin":["misp-galaxy:mitre-enterprise-attack-tool=\"BITSAdmin - S0190\"","misp-galaxy:mitre-tool=\"BITSAdmin - S0190\""],"Cachedump - S0119":["misp-galaxy:mitre-enterprise-attack-tool=\"Cachedump - S0119\"","misp-galaxy:mitre-tool=\"Cachedump - S0119\""],"Cachedump":["misp-galaxy:mitre-enterprise-attack-tool=\"Cachedump - S0119\"","misp-galaxy:mitre-tool=\"Cachedump - S0119\""],"Cobalt Strike - S0154":["misp-galaxy:mitre-enterprise-attack-tool=\"Cobalt Strike - S0154\"","misp-galaxy:mitre-tool=\"Cobalt Strike - S0154\""],"FTP - S0095":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"FTP":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"ftp.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"Fgdump - S0120":["misp-galaxy:mitre-enterprise-attack-tool=\"Fgdump - S0120\"","misp-galaxy:mitre-tool=\"Fgdump - S0120\""],"Fgdump":["misp-galaxy:mitre-enterprise-attack-tool=\"Fgdump - S0120\"","misp-galaxy:mitre-tool=\"Fgdump - S0120\""],"Forfiles - S0193":["misp-galaxy:mitre-enterprise-attack-tool=\"Forfiles - S0193\"","misp-galaxy:mitre-tool=\"Forfiles - S0193\""],"Forfiles":["misp-galaxy:mitre-enterprise-attack-tool=\"Forfiles - S0193\"","misp-galaxy:mitre-tool=\"Forfiles - S0193\""],"HTRAN - S0040":["misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"HTRAN":["misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"Havij - S0224":["misp-galaxy:mitre-enterprise-attack-tool=\"Havij - S0224\"","misp-galaxy:mitre-tool=\"Havij - S0224\""],"Havij":["misp-galaxy:mitre-enterprise-attack-tool=\"Havij - S0224\"","misp-galaxy:mitre-tool=\"Havij - S0224\""],"Invoke-PSImage - S0231":["misp-galaxy:mitre-enterprise-attack-tool=\"Invoke-PSImage - S0231\"","misp-galaxy:mitre-tool=\"Invoke-PSImage - S0231\""],"Invoke-PSImage":["misp-galaxy:mitre-enterprise-attack-tool=\"Invoke-PSImage - S0231\"","misp-galaxy:mitre-tool=\"Invoke-PSImage - S0231\""],"Lslsass - S0121":["misp-galaxy:mitre-enterprise-attack-tool=\"Lslsass - S0121\"","misp-galaxy:mitre-tool=\"Lslsass - S0121\""],"Lslsass":["misp-galaxy:mitre-enterprise-attack-tool=\"Lslsass - S0121\"","misp-galaxy:mitre-tool=\"Lslsass - S0121\""],"MimiPenguin - S0179":["misp-galaxy:mitre-enterprise-attack-tool=\"MimiPenguin - S0179\"","misp-galaxy:mitre-tool=\"MimiPenguin - S0179\""],"MimiPenguin":["misp-galaxy:mitre-enterprise-attack-tool=\"MimiPenguin - S0179\"","misp-galaxy:mitre-tool=\"MimiPenguin - S0179\""],"Mimikatz - S0002":["misp-galaxy:mitre-enterprise-attack-tool=\"Mimikatz - S0002\"","misp-galaxy:mitre-tool=\"Mimikatz - S0002\""],"Mimikatz":["misp-galaxy:mitre-enterprise-attack-tool=\"Mimikatz - S0002\"","misp-galaxy:mitre-tool=\"Mimikatz - S0002\"","misp-galaxy:tool=\"Mimikatz\""],"Net - S0039":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"Net":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"net.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"Pass-The-Hash Toolkit - S0122":["misp-galaxy:mitre-enterprise-attack-tool=\"Pass-The-Hash Toolkit - S0122\"","misp-galaxy:mitre-tool=\"Pass-The-Hash Toolkit - S0122\""],"Pass-The-Hash Toolkit":["misp-galaxy:mitre-enterprise-attack-tool=\"Pass-The-Hash Toolkit - S0122\"","misp-galaxy:mitre-tool=\"Pass-The-Hash Toolkit - S0122\""],"Ping - S0097":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"Ping":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"ping.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"PowerSploit - S0194":["misp-galaxy:mitre-enterprise-attack-tool=\"PowerSploit - S0194\"","misp-galaxy:mitre-tool=\"PowerSploit - S0194\""],"PowerSploit":["misp-galaxy:mitre-enterprise-attack-tool=\"PowerSploit - S0194\"","misp-galaxy:mitre-tool=\"PowerSploit - S0194\""],"PsExec - S0029":["misp-galaxy:mitre-enterprise-attack-tool=\"PsExec - S0029\"","misp-galaxy:mitre-tool=\"PsExec - S0029\""],"PsExec":["misp-galaxy:mitre-enterprise-attack-tool=\"PsExec - S0029\"","misp-galaxy:mitre-tool=\"PsExec - S0029\"","misp-galaxy:tool=\"PsExec\""],"Pupy - S0192":["misp-galaxy:mitre-enterprise-attack-tool=\"Pupy - S0192\"","misp-galaxy:mitre-tool=\"Pupy - S0192\""],"Pupy":["misp-galaxy:mitre-enterprise-attack-tool=\"Pupy - S0192\"","misp-galaxy:mitre-tool=\"Pupy - S0192\"","misp-galaxy:rat=\"Pupy\""],"Reg - S0075":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"Reg":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"reg.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"Responder - S0174":["misp-galaxy:mitre-enterprise-attack-tool=\"Responder - S0174\"","misp-galaxy:mitre-tool=\"Responder - S0174\""],"Responder":["misp-galaxy:mitre-enterprise-attack-tool=\"Responder - S0174\"","misp-galaxy:mitre-tool=\"Responder - S0174\""],"SDelete - S0195":["misp-galaxy:mitre-enterprise-attack-tool=\"SDelete - S0195\"","misp-galaxy:mitre-tool=\"SDelete - S0195\""],"SDelete":["misp-galaxy:mitre-enterprise-attack-tool=\"SDelete - S0195\"","misp-galaxy:mitre-tool=\"SDelete - S0195\""],"Systeminfo - S0096":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"Systeminfo":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"systeminfo.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"Tasklist - S0057":["misp-galaxy:mitre-enterprise-attack-tool=\"Tasklist - S0057\"","misp-galaxy:mitre-tool=\"Tasklist - S0057\""],"Tasklist":["misp-galaxy:mitre-enterprise-attack-tool=\"Tasklist - S0057\"","misp-galaxy:mitre-tool=\"Tasklist - S0057\""],"Tor - S0183":["misp-galaxy:mitre-enterprise-attack-tool=\"Tor - S0183\"","misp-galaxy:mitre-tool=\"Tor - S0183\""],"Tor":["misp-galaxy:mitre-enterprise-attack-tool=\"Tor - S0183\"","misp-galaxy:mitre-tool=\"Tor - S0183\""],"UACMe - S0116":["misp-galaxy:mitre-enterprise-attack-tool=\"UACMe - S0116\"","misp-galaxy:mitre-tool=\"UACMe - S0116\""],"Windows Credential Editor - S0005":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"Windows Credential Editor":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"WCE":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"Winexe - S0191":["misp-galaxy:mitre-enterprise-attack-tool=\"Winexe - S0191\"","misp-galaxy:mitre-tool=\"Winexe - S0191\""],"Winexe":["misp-galaxy:mitre-enterprise-attack-tool=\"Winexe - S0191\"","misp-galaxy:mitre-tool=\"Winexe - S0191\"","misp-galaxy:tool=\"Winexe\""],"at - S0110":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"at":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"at.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"certutil - S0160":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"certutil":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"certutil.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"cmd - S0106":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"cmd":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"cmd.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"dsquery - S0105":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"dsquery":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"dsquery.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"gsecdump - S0008":["misp-galaxy:mitre-enterprise-attack-tool=\"gsecdump - S0008\"","misp-galaxy:mitre-tool=\"gsecdump - S0008\""],"ifconfig - S0101":["misp-galaxy:mitre-enterprise-attack-tool=\"ifconfig - S0101\"","misp-galaxy:mitre-tool=\"ifconfig - S0101\""],"ifconfig":["misp-galaxy:mitre-enterprise-attack-tool=\"ifconfig - S0101\"","misp-galaxy:mitre-tool=\"ifconfig - S0101\""],"ipconfig - S0100":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"ipconfig":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"ipconfig.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"meek - S0175":["misp-galaxy:mitre-enterprise-attack-tool=\"meek - S0175\"","misp-galaxy:mitre-tool=\"meek - S0175\""],"meek":["misp-galaxy:mitre-enterprise-attack-tool=\"meek - S0175\"","misp-galaxy:mitre-tool=\"meek - S0175\""],"nbtstat - S0102":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"nbtstat":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"nbtstat.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"netsh - S0108":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netsh":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netsh.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netstat - S0104":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"netstat":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"netstat.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"pwdump - S0006":["misp-galaxy:mitre-enterprise-attack-tool=\"pwdump - S0006\"","misp-galaxy:mitre-tool=\"pwdump - S0006\""],"pwdump":["misp-galaxy:mitre-enterprise-attack-tool=\"pwdump - S0006\"","misp-galaxy:mitre-tool=\"pwdump - S0006\""],"route - S0103":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"route":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"route.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"schtasks - S0111":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"schtasks":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"schtasks.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"spwebmember - S0227":["misp-galaxy:mitre-enterprise-attack-tool=\"spwebmember - S0227\"","misp-galaxy:mitre-tool=\"spwebmember - S0227\""],"spwebmember":["misp-galaxy:mitre-enterprise-attack-tool=\"spwebmember - S0227\"","misp-galaxy:mitre-tool=\"spwebmember - S0227\""],"sqlmap - S0225":["misp-galaxy:mitre-enterprise-attack-tool=\"sqlmap - S0225\"","misp-galaxy:mitre-tool=\"sqlmap - S0225\""],"sqlmap":["misp-galaxy:mitre-enterprise-attack-tool=\"sqlmap - S0225\"","misp-galaxy:mitre-tool=\"sqlmap - S0225\""],"xCmd - S0123":["misp-galaxy:mitre-enterprise-attack-tool=\"xCmd - S0123\"","misp-galaxy:mitre-tool=\"xCmd - S0123\""],"xCmd":["misp-galaxy:mitre-enterprise-attack-tool=\"xCmd - S0123\"","misp-galaxy:mitre-tool=\"xCmd - S0123\""],"APT19 - G0073":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"APT19":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"Codoso":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"C0d0so0":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"Codoso Team":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"Sunshop Group":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"SNAKEMACKEREL":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Swallowtail":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Group 74":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"YTTRIUM":["misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"SeaLotus":["misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"APT-C-00":["misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"Elfin":["misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\"","misp-galaxy:threat-actor=\"APT33\""],"APT38 - G0082":["misp-galaxy:mitre-intrusion-set=\"APT38 - G0082\""],"APT38":["misp-galaxy:mitre-intrusion-set=\"APT38 - G0082\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"APT39 - G0087":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\""],"APT39":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\"","misp-galaxy:threat-actor=\"APT39\""],"Chafer":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\"","misp-galaxy:threat-actor=\"APT39\"","misp-galaxy:threat-actor=\"Chafer\""],"Cobalt Group - G0080":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\""],"Cobalt Group":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt Gang":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt Spider":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Dark Caracal - G0070":["misp-galaxy:mitre-intrusion-set=\"Dark Caracal - G0070\""],"Dark Caracal":["misp-galaxy:mitre-intrusion-set=\"Dark Caracal - G0070\"","misp-galaxy:threat-actor=\"Dark Caracal\""],"DarkHydrus - G0079":["misp-galaxy:mitre-intrusion-set=\"DarkHydrus - G0079\""],"DarkHydrus":["misp-galaxy:mitre-intrusion-set=\"DarkHydrus - G0079\"","misp-galaxy:threat-actor=\"DarkHydrus\""],"Dragonfly 2.0 - G0074":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\""],"Dragonfly 2.0":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\"","misp-galaxy:threat-actor=\"DYMALLOY\""],"Berserk Bear":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\"","misp-galaxy:threat-actor=\"Berserk Bear\"","misp-galaxy:threat-actor=\"TeamSpy Crew\""],"FIN4 - G0085":["misp-galaxy:mitre-intrusion-set=\"FIN4 - G0085\""],"FIN4":["misp-galaxy:mitre-intrusion-set=\"FIN4 - G0085\"","misp-galaxy:threat-actor=\"Wolf Spider\""],"Gallmaker - G0084":["misp-galaxy:mitre-intrusion-set=\"Gallmaker - G0084\""],"Gallmaker":["misp-galaxy:mitre-intrusion-set=\"Gallmaker - G0084\"","misp-galaxy:threat-actor=\"Gallmaker\""],"Gorgon Group - G0078":["misp-galaxy:mitre-intrusion-set=\"Gorgon Group - G0078\""],"Gorgon Group":["misp-galaxy:mitre-intrusion-set=\"Gorgon Group - G0078\"","misp-galaxy:threat-actor=\"The Gorgon Group\""],"Honeybee - G0072":["misp-galaxy:mitre-intrusion-set=\"Honeybee - G0072\""],"Honeybee":["misp-galaxy:mitre-intrusion-set=\"Honeybee - G0072\"","misp-galaxy:threat-actor=\"Honeybee\""],"APT15":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"Vixen Panda":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"GREF":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"Playful Dragon":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"RoyalAPT":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Leafminer - G0077":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\""],"Leafminer":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\""],"Raspite":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\"","misp-galaxy:threat-actor=\"RASPITE\""],"TEMP.Jumper":["misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"APT40":["misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"DRAGONFISH":["misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"APT35":["misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"APT35\"","misp-galaxy:threat-actor=\"Cleaver\""],"Seedworm":["misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"IRN2":["misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"OilRig\""],"HELIX KITTEN":["misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\""],"Orangeworm - G0071":["misp-galaxy:mitre-intrusion-set=\"Orangeworm - G0071\""],"Orangeworm":["misp-galaxy:mitre-intrusion-set=\"Orangeworm - G0071\"","misp-galaxy:threat-actor=\"Orangeworm\""],"Rancor - G0075":["misp-galaxy:mitre-intrusion-set=\"Rancor - G0075\""],"Rancor":["misp-galaxy:mitre-intrusion-set=\"Rancor - G0075\"","misp-galaxy:threat-actor=\"RANCOR\""],"VOODOO BEAR":["misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\""],"SilverTerrier - G0083":["misp-galaxy:mitre-intrusion-set=\"SilverTerrier - G0083\""],"SilverTerrier":["misp-galaxy:mitre-intrusion-set=\"SilverTerrier - G0083\"","misp-galaxy:threat-actor=\"SilverTerrier\""],"Stolen Pencil - G0086":["misp-galaxy:mitre-intrusion-set=\"Stolen Pencil - G0086\""],"Stolen Pencil":["misp-galaxy:mitre-intrusion-set=\"Stolen Pencil - G0086\""],"TEMP.Veles - G0088":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\""],"TEMP.Veles":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\"","misp-galaxy:threat-actor=\"TEMP.Veles\""],"XENOTIME":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\"","misp-galaxy:threat-actor=\"XENOTIME\""],"APT27":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Iron Tiger":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"LuckyMouse":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Thrip - G0076":["misp-galaxy:mitre-intrusion-set=\"Thrip - G0076\""],"Thrip":["misp-galaxy:mitre-intrusion-set=\"Thrip - G0076\"","misp-galaxy:threat-actor=\"Thrip\""],"Tropic Trooper - G0081":["misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\""],"Tropic Trooper":["misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\"","misp-galaxy:threat-actor=\"Tropic Trooper\""],"VENOMOUS BEAR":["misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"Krypton":["misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"HOGFISH":["misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"ANDROIDOS_ANSERVER.A - S0310":["misp-galaxy:mitre-malware=\"ANDROIDOS_ANSERVER.A - S0310\""],"ANDROIDOS_ANSERVER.A":["misp-galaxy:mitre-malware=\"ANDROIDOS_ANSERVER.A - S0310\"","misp-galaxy:mitre-mobile-attack-malware=\"ANDROIDOS_ANSERVER.A - MOB-S0026\""],"Adups - S0309":["misp-galaxy:mitre-malware=\"Adups - S0309\""],"Adups":["misp-galaxy:mitre-malware=\"Adups - S0309\"","misp-galaxy:mitre-mobile-attack-malware=\"Adups - MOB-S0025\""],"Agent Tesla - S0331":["misp-galaxy:mitre-malware=\"Agent Tesla - S0331\""],"Allwinner - S0319":["misp-galaxy:mitre-malware=\"Allwinner - S0319\""],"Allwinner":["misp-galaxy:mitre-malware=\"Allwinner - S0319\""],"AndroRAT - S0292":["misp-galaxy:mitre-malware=\"AndroRAT - S0292\""],"Android Overlay Malware - S0296":["misp-galaxy:mitre-malware=\"Android Overlay Malware - S0296\""],"Android Overlay Malware":["misp-galaxy:mitre-malware=\"Android Overlay Malware - S0296\""],"Android\/Chuli.A - S0304":["misp-galaxy:mitre-malware=\"Android\/Chuli.A - S0304\""],"Android\/Chuli.A":["misp-galaxy:mitre-malware=\"Android\/Chuli.A - S0304\"","misp-galaxy:mitre-mobile-attack-malware=\"Android\/Chuli.A - MOB-S0020\""],"Astaroth - S0373":["misp-galaxy:mitre-malware=\"Astaroth - S0373\""],"Astaroth":["misp-galaxy:mitre-malware=\"Astaroth - S0373\""],"AuditCred - S0347":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"AuditCred":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"Roptimizer":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"Azorult - S0344":["misp-galaxy:mitre-malware=\"Azorult - S0344\""],"BADCALL - S0245":["misp-galaxy:mitre-malware=\"BADCALL - S0245\""],"BADCALL":["misp-galaxy:mitre-malware=\"BADCALL - S0245\""],"BONDUPDATER - S0360":["misp-galaxy:mitre-malware=\"BONDUPDATER - S0360\""],"BadPatch - S0337":["misp-galaxy:mitre-malware=\"BadPatch - S0337\""],"BadPatch":["misp-galaxy:mitre-malware=\"BadPatch - S0337\""],"Bandook - S0234":["misp-galaxy:mitre-malware=\"Bandook - S0234\""],"Bandook":["misp-galaxy:mitre-malware=\"Bandook - S0234\""],"Bankshot - S0239":["misp-galaxy:mitre-malware=\"Bankshot - S0239\""],"Trojan Manuscript":["misp-galaxy:mitre-malware=\"Bankshot - S0239\""],"Bisonal - S0268":["misp-galaxy:mitre-malware=\"Bisonal - S0268\""],"BrainTest - S0293":["misp-galaxy:mitre-malware=\"BrainTest - S0293\""],"BrainTest":["misp-galaxy:mitre-malware=\"BrainTest - S0293\"","misp-galaxy:mitre-mobile-attack-malware=\"BrainTest - MOB-S0009\""],"Brave Prince - S0252":["misp-galaxy:mitre-malware=\"Brave Prince - S0252\""],"Brave Prince":["misp-galaxy:mitre-malware=\"Brave Prince - S0252\""],"Backdoor.SofacyX":["misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"Calisto - S0274":["misp-galaxy:mitre-malware=\"Calisto - S0274\""],"Cannon - S0351":["misp-galaxy:mitre-malware=\"Cannon - S0351\""],"Carbon - S0335":["misp-galaxy:mitre-malware=\"Carbon - S0335\""],"Cardinal RAT - S0348":["misp-galaxy:mitre-malware=\"Cardinal RAT - S0348\""],"Catchamas - S0261":["misp-galaxy:mitre-malware=\"Catchamas - S0261\""],"Charger - S0323":["misp-galaxy:mitre-malware=\"Charger - S0323\""],"Cobian RAT - S0338":["misp-galaxy:mitre-malware=\"Cobian RAT - S0338\""],"CoinTicker - S0369":["misp-galaxy:mitre-malware=\"CoinTicker - S0369\""],"CoinTicker":["misp-galaxy:mitre-malware=\"CoinTicker - S0369\""],"Comnie - S0244":["misp-galaxy:mitre-malware=\"Comnie - S0244\""],"Comnie":["misp-galaxy:mitre-malware=\"Comnie - S0244\"","misp-galaxy:rat=\"Comnie\"","misp-galaxy:threat-actor=\"Blackgear\""],"CrossRAT - S0235":["misp-galaxy:mitre-malware=\"CrossRAT - S0235\""],"DDKONG - S0255":["misp-galaxy:mitre-malware=\"DDKONG - S0255\""],"DarkComet - S0334":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"DarkKomet":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"Krademok":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"FYNLOS":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"DealersChoice - S0243":["misp-galaxy:mitre-malware=\"DealersChoice - S0243\""],"Dendroid - S0301":["misp-galaxy:mitre-malware=\"Dendroid - S0301\""],"Dendroid":["misp-galaxy:mitre-malware=\"Dendroid - S0301\"","misp-galaxy:mitre-mobile-attack-malware=\"Dendroid - MOB-S0017\"","misp-galaxy:rat=\"Dendroid\""],"Denis - S0354":["misp-galaxy:mitre-malware=\"Denis - S0354\""],"Denis":["misp-galaxy:mitre-malware=\"Denis - S0354\""],"Dok - S0281":["misp-galaxy:mitre-malware=\"Dok - S0281\""],"DressCode - S0300":["misp-galaxy:mitre-malware=\"DressCode - S0300\""],"DressCode":["misp-galaxy:mitre-malware=\"DressCode - S0300\"","misp-galaxy:mitre-mobile-attack-malware=\"DressCode - MOB-S0016\""],"DroidJack - S0320":["misp-galaxy:mitre-malware=\"DroidJack - S0320\""],"DroidJack":["misp-galaxy:mitre-malware=\"DroidJack - S0320\"","misp-galaxy:rat=\"DroidJack\""],"DualToy - S0315":["misp-galaxy:mitre-malware=\"DualToy - S0315\""],"DualToy":["misp-galaxy:mitre-malware=\"DualToy - S0315\"","misp-galaxy:mitre-mobile-attack-malware=\"DualToy - MOB-S0031\""],"Ebury - S0377":["misp-galaxy:mitre-malware=\"Ebury - S0377\""],"Emotet - S0367":["misp-galaxy:mitre-malware=\"Emotet - S0367\""],"Exaramel - S0343":["misp-galaxy:mitre-malware=\"Exaramel - S0343\""],"Exaramel":["misp-galaxy:mitre-malware=\"Exaramel - S0343\""],"FELIXROOT - S0267":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"FELIXROOT":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"GreyEnergy mini":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"Final1stspy - S0355":["misp-galaxy:mitre-malware=\"Final1stspy - S0355\""],"Final1stspy":["misp-galaxy:mitre-malware=\"Final1stspy - S0355\""],"FruitFly - S0277":["misp-galaxy:mitre-malware=\"FruitFly - S0277\""],"Gold Dragon - S0249":["misp-galaxy:mitre-malware=\"Gold Dragon - S0249\""],"Gold Dragon":["misp-galaxy:mitre-malware=\"Gold Dragon - S0249\""],"Gooligan - S0290":["misp-galaxy:mitre-malware=\"Gooligan - S0290\""],"Gooligan":["misp-galaxy:mitre-malware=\"Gooligan - S0290\"","misp-galaxy:mitre-mobile-attack-malware=\"Gooligan - MOB-S0006\""],"GravityRAT - S0237":["misp-galaxy:mitre-malware=\"GravityRAT - S0237\""],"GravityRAT":["misp-galaxy:mitre-malware=\"GravityRAT - S0237\"","misp-galaxy:rat=\"GravityRAT\""],"GreyEnergy - S0342":["misp-galaxy:mitre-malware=\"GreyEnergy - S0342\""],"HARDRAIN - S0246":["misp-galaxy:mitre-malware=\"HARDRAIN - S0246\""],"HARDRAIN":["misp-galaxy:mitre-malware=\"HARDRAIN - S0246\""],"HOPLIGHT - S0376":["misp-galaxy:mitre-malware=\"HOPLIGHT - S0376\""],"HummingBad - S0322":["misp-galaxy:mitre-malware=\"HummingBad - S0322\""],"HummingWhale - S0321":["misp-galaxy:mitre-malware=\"HummingWhale - S0321\""],"HummingWhale":["misp-galaxy:mitre-malware=\"HummingWhale - S0321\"","misp-galaxy:mitre-mobile-attack-malware=\"HummingWhale - MOB-S0037\""],"InnaputRAT - S0259":["misp-galaxy:mitre-malware=\"InnaputRAT - S0259\""],"InvisiMole - S0260":["misp-galaxy:mitre-malware=\"InvisiMole - S0260\""],"Trojan.Sofacy":["misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"Judy - S0325":["misp-galaxy:mitre-malware=\"Judy - S0325\""],"KEYMARBLE - S0271":["misp-galaxy:mitre-malware=\"KEYMARBLE - S0271\""],"KONNI - S0356":["misp-galaxy:mitre-malware=\"KONNI - S0356\""],"KONNI":["misp-galaxy:mitre-malware=\"KONNI - S0356\"","misp-galaxy:rat=\"Konni\"","misp-galaxy:tool=\"KONNI\""],"Kazuar - S0265":["misp-galaxy:mitre-malware=\"Kazuar - S0265\""],"KeyRaider - S0288":["misp-galaxy:mitre-malware=\"KeyRaider - S0288\""],"KeyRaider":["misp-galaxy:mitre-malware=\"KeyRaider - S0288\"","misp-galaxy:mitre-mobile-attack-malware=\"KeyRaider - MOB-S0004\""],"Keydnap - S0276":["misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"OSX\/Keydnap":["misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"Kwampirs - S0236":["misp-galaxy:mitre-malware=\"Kwampirs - S0236\""],"Linux Rabbit - S0362":["misp-galaxy:mitre-malware=\"Linux Rabbit - S0362\""],"Linux Rabbit":["misp-galaxy:mitre-malware=\"Linux Rabbit - S0362\""],"LockerGoga - S0372":["misp-galaxy:mitre-malware=\"LockerGoga - S0372\""],"LockerGoga ":["misp-galaxy:mitre-malware=\"LockerGoga - S0372\""],"MacSpy - S0282":["misp-galaxy:mitre-malware=\"MacSpy - S0282\""],"Marcher - S0317":["misp-galaxy:mitre-malware=\"Marcher - S0317\""],"MazarBOT - S0303":["misp-galaxy:mitre-malware=\"MazarBOT - S0303\""],"MazarBOT":["misp-galaxy:mitre-malware=\"MazarBOT - S0303\"","misp-galaxy:mitre-mobile-attack-malware=\"MazarBOT - MOB-S0019\""],"Micropsia - S0339":["misp-galaxy:mitre-malware=\"Micropsia - S0339\""],"MirageFox - S0280":["misp-galaxy:mitre-malware=\"MirageFox - S0280\""],"More_eggs - S0284":["misp-galaxy:mitre-malware=\"More_eggs - S0284\""],"Mosquito - S0256":["misp-galaxy:mitre-malware=\"Mosquito - S0256\""],"NDiskMonitor - S0272":["misp-galaxy:mitre-malware=\"NDiskMonitor - S0272\""],"NDiskMonitor":["misp-galaxy:mitre-malware=\"NDiskMonitor - S0272\""],"NOKKI - S0353":["misp-galaxy:mitre-malware=\"NOKKI - S0353\""],"NOKKI":["misp-galaxy:mitre-malware=\"NOKKI - S0353\"","misp-galaxy:tool=\"NOKKI\""],"NanoCore - S0336":["misp-galaxy:mitre-malware=\"NanoCore - S0336\""],"NanoCore":["misp-galaxy:mitre-malware=\"NanoCore - S0336\"","misp-galaxy:rat=\"NanoCore\"","misp-galaxy:tool=\"NanoCoreRAT\""],"NavRAT - S0247":["misp-galaxy:mitre-malware=\"NavRAT - S0247\""],"NotCompatible - S0299":["misp-galaxy:mitre-malware=\"NotCompatible - S0299\""],"NotCompatible":["misp-galaxy:mitre-malware=\"NotCompatible - S0299\"","misp-galaxy:mitre-mobile-attack-malware=\"NotCompatible - MOB-S0015\""],"NotPetya - S0368":["misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petrwrap":["misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"OBAD - S0286":["misp-galaxy:mitre-malware=\"OBAD - S0286\""],"OBAD":["misp-galaxy:mitre-malware=\"OBAD - S0286\"","misp-galaxy:mitre-mobile-attack-malware=\"OBAD - MOB-S0002\""],"OSX_OCEANLOTUS.D - S0352":["misp-galaxy:mitre-malware=\"OSX_OCEANLOTUS.D - S0352\""],"OSX_OCEANLOTUS.D":["misp-galaxy:mitre-malware=\"OSX_OCEANLOTUS.D - S0352\""],"OceanSalt - S0346":["misp-galaxy:mitre-malware=\"OceanSalt - S0346\""],"OceanSalt":["misp-galaxy:mitre-malware=\"OceanSalt - S0346\""],"Octopus - S0340":["misp-galaxy:mitre-malware=\"Octopus - S0340\""],"OldBoot - S0285":["misp-galaxy:mitre-malware=\"OldBoot - S0285\""],"OldBoot":["misp-galaxy:mitre-malware=\"OldBoot - S0285\"","misp-galaxy:mitre-mobile-attack-malware=\"OldBoot - MOB-S0001\""],"Olympic Destroyer - S0365":["misp-galaxy:mitre-malware=\"Olympic Destroyer - S0365\""],"OopsIE - S0264":["misp-galaxy:mitre-malware=\"OopsIE - S0264\""],"PJApps - S0291":["misp-galaxy:mitre-malware=\"PJApps - S0291\""],"PJApps":["misp-galaxy:mitre-malware=\"PJApps - S0291\"","misp-galaxy:mitre-mobile-attack-malware=\"PJApps - MOB-S0007\""],"PLAINTEE - S0254":["misp-galaxy:mitre-malware=\"PLAINTEE - S0254\""],"Powermud":["misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"POWERTON - S0371":["misp-galaxy:mitre-malware=\"POWERTON - S0371\""],"POWERTON":["misp-galaxy:mitre-malware=\"POWERTON - S0371\""],"Pegasus for Android - S0316":["misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\""],"Pegasus for Android":["misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\""],"Pegasus for iOS - S0289":["misp-galaxy:mitre-malware=\"Pegasus for iOS - S0289\""],"Pegasus for iOS":["misp-galaxy:mitre-malware=\"Pegasus for iOS - S0289\""],"DestroyRAT":["misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Proton - S0279":["misp-galaxy:mitre-malware=\"Proton - S0279\""],"Proton":["misp-galaxy:mitre-malware=\"Proton - S0279\"","misp-galaxy:tool=\"Proton\""],"Proxysvc - S0238":["misp-galaxy:mitre-malware=\"Proxysvc - S0238\""],"Proxysvc":["misp-galaxy:mitre-malware=\"Proxysvc - S0238\"","misp-galaxy:tool=\"Proxysvc\""],"QUADAGENT - S0269":["misp-galaxy:mitre-malware=\"QUADAGENT - S0269\""],"RATANKBA - S0241":["misp-galaxy:mitre-malware=\"RATANKBA - S0241\""],"RATANKBA":["misp-galaxy:mitre-malware=\"RATANKBA - S0241\""],"RCSAndroid - S0295":["misp-galaxy:mitre-malware=\"RCSAndroid - S0295\""],"RCSAndroid":["misp-galaxy:mitre-malware=\"RCSAndroid - S0295\"","misp-galaxy:mitre-mobile-attack-malware=\"RCSAndroid - MOB-S0011\""],"RGDoor - S0258":["misp-galaxy:mitre-malware=\"RGDoor - S0258\""],"ROKRAT - S0240":["misp-galaxy:mitre-malware=\"ROKRAT - S0240\""],"ROKRAT":["misp-galaxy:mitre-malware=\"ROKRAT - S0240\"","misp-galaxy:rat=\"rokrat\""],"RedDrop - S0326":["misp-galaxy:mitre-malware=\"RedDrop - S0326\""],"Remexi - S0375":["misp-galaxy:mitre-malware=\"Remexi - S0375\""],"RogueRobin - S0270":["misp-galaxy:mitre-malware=\"RogueRobin - S0270\""],"RuMMS - S0313":["misp-galaxy:mitre-malware=\"RuMMS - S0313\""],"RuMMS":["misp-galaxy:mitre-malware=\"RuMMS - S0313\"","misp-galaxy:mitre-mobile-attack-malware=\"RuMMS - MOB-S0029\""],"RunningRAT - S0253":["misp-galaxy:mitre-malware=\"RunningRAT - S0253\""],"RunningRAT":["misp-galaxy:mitre-malware=\"RunningRAT - S0253\""],"SamSam - S0370":["misp-galaxy:mitre-malware=\"SamSam - S0370\""],"Samas":["misp-galaxy:mitre-malware=\"SamSam - S0370\""],"Seasalt - S0345":["misp-galaxy:mitre-malware=\"Seasalt - S0345\""],"Seasalt":["misp-galaxy:mitre-malware=\"Seasalt - S0345\""],"ShiftyBug - S0294":["misp-galaxy:mitre-malware=\"ShiftyBug - S0294\""],"ShiftyBug":["misp-galaxy:mitre-malware=\"ShiftyBug - S0294\"","misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Skygofree - S0327":["misp-galaxy:mitre-malware=\"Skygofree - S0327\""],"Socksbot - S0273":["misp-galaxy:mitre-malware=\"Socksbot - S0273\""],"Socksbot":["misp-galaxy:mitre-malware=\"Socksbot - S0273\""],"SpeakUp - S0374":["misp-galaxy:mitre-malware=\"SpeakUp - S0374\""],"SpyDealer - S0324":["misp-galaxy:mitre-malware=\"SpyDealer - S0324\""],"SpyDealer":["misp-galaxy:mitre-malware=\"SpyDealer - S0324\"","misp-galaxy:tool=\"SpyDealer\""],"SpyNote RAT - S0305":["misp-galaxy:mitre-malware=\"SpyNote RAT - S0305\""],"SpyNote RAT":["misp-galaxy:mitre-malware=\"SpyNote RAT - S0305\"","misp-galaxy:mitre-mobile-attack-malware=\"SpyNote RAT - MOB-S0021\""],"Stealth Mango - S0328":["misp-galaxy:mitre-malware=\"Stealth Mango - S0328\""],"SynAck - S0242":["misp-galaxy:mitre-malware=\"SynAck - S0242\""],"TYPEFRAME - S0263":["misp-galaxy:mitre-malware=\"TYPEFRAME - S0263\""],"TYPEFRAME":["misp-galaxy:mitre-malware=\"TYPEFRAME - S0263\"","misp-galaxy:tool=\"TYPEFRAME\""],"Tangelo - S0329":["misp-galaxy:mitre-malware=\"Tangelo - S0329\""],"Tangelo":["misp-galaxy:mitre-malware=\"Tangelo - S0329\""],"TrickBot - S0266":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"Totbrick":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"TSPY_TRICKLOAD":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"Trojan-SMS.AndroidOS.Agent.ao - S0307":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.Agent.ao - S0307\""],"Trojan-SMS.AndroidOS.Agent.ao":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.Agent.ao - S0307\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023\""],"Trojan-SMS.AndroidOS.FakeInst.a - S0306":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - S0306\""],"Trojan-SMS.AndroidOS.FakeInst.a":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - S0306\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022\""],"Trojan-SMS.AndroidOS.OpFake.a - S0308":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.OpFake.a - S0308\""],"Trojan-SMS.AndroidOS.OpFake.a":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.OpFake.a - S0308\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024\""],"Twitoor - S0302":["misp-galaxy:mitre-malware=\"Twitoor - S0302\""],"Twitoor":["misp-galaxy:mitre-malware=\"Twitoor - S0302\"","misp-galaxy:mitre-mobile-attack-malware=\"Twitoor - MOB-S0018\""],"UBoatRAT - S0333":["misp-galaxy:mitre-malware=\"UBoatRAT - S0333\""],"UBoatRAT":["misp-galaxy:mitre-malware=\"UBoatRAT - S0333\"","misp-galaxy:rat=\"UBoatRAT\""],"UPPERCUT - S0275":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\""],"UPPERCUT":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\"","misp-galaxy:tool=\"ANEL\""],"ANEL":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\"","misp-galaxy:tool=\"ANEL\""],"VERMIN - S0257":["misp-galaxy:mitre-malware=\"VERMIN - S0257\""],"VERMIN":["misp-galaxy:mitre-malware=\"VERMIN - S0257\""],"WannaCry - S0366":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCry":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCrypt":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCrypt0r":["misp-galaxy:mitre-malware=\"WannaCry - S0366\"","misp-galaxy:ransomware=\"WannaCry\""],"WCry":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WireLurker - S0312":["misp-galaxy:mitre-malware=\"WireLurker - S0312\""],"WireLurker":["misp-galaxy:mitre-malware=\"WireLurker - S0312\"","misp-galaxy:mitre-mobile-attack-malware=\"WireLurker - MOB-S0028\""],"X-Agent for Android - S0314":["misp-galaxy:mitre-malware=\"X-Agent for Android - S0314\""],"X-Agent for Android":["misp-galaxy:mitre-malware=\"X-Agent for Android - S0314\""],"OSX.Sofacy":["misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XLoader - S0318":["misp-galaxy:mitre-malware=\"XLoader - S0318\""],"Trojan.Shunnael":["misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"Xbash - S0341":["misp-galaxy:mitre-malware=\"Xbash - S0341\""],"XcodeGhost - S0297":["misp-galaxy:mitre-malware=\"XcodeGhost - S0297\""],"XcodeGhost":["misp-galaxy:mitre-malware=\"XcodeGhost - S0297\"","misp-galaxy:mitre-mobile-attack-malware=\"XcodeGhost - MOB-S0013\""],"YiSpecter - S0311":["misp-galaxy:mitre-malware=\"YiSpecter - S0311\""],"YiSpecter":["misp-galaxy:mitre-malware=\"YiSpecter - S0311\"","misp-galaxy:mitre-mobile-attack-malware=\"YiSpecter - MOB-S0027\""],"Zebrocy - S0251":["misp-galaxy:mitre-malware=\"Zebrocy - S0251\""],"ZergHelper - S0287":["misp-galaxy:mitre-malware=\"ZergHelper - S0287\""],"ZergHelper":["misp-galaxy:mitre-malware=\"ZergHelper - S0287\"","misp-galaxy:mitre-mobile-attack-malware=\"ZergHelper - MOB-S0003\""],"Zeus Panda - S0330":["misp-galaxy:mitre-malware=\"Zeus Panda - S0330\""],"gh0st RAT - S0032":["misp-galaxy:mitre-malware=\"gh0st RAT - S0032\""],"gh0st RAT":["misp-galaxy:mitre-malware=\"gh0st RAT - S0032\""],"iKitten - S0278":["misp-galaxy:mitre-malware=\"iKitten - S0278\""],"iKitten":["misp-galaxy:mitre-malware=\"iKitten - S0278\"","misp-galaxy:tool=\"MacDownloader\""],"OSX\/MacDownloader":["misp-galaxy:mitre-malware=\"iKitten - S0278\""],"jRAT - S0283":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"jFrutas":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"jBiFrost":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"Trojan.Maljava":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"yty - S0248":["misp-galaxy:mitre-malware=\"yty - S0248\""],"zwShell - S0350":["misp-galaxy:mitre-malware=\"zwShell - S0350\""],"zwShell":["misp-galaxy:mitre-malware=\"zwShell - S0350\""],"Abuse Accessibility Features - MOB-T1056":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse Accessibility Features - MOB-T1056\""],"Abuse Device Administrator Access to Prevent Removal - MOB-T1004":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse Device Administrator Access to Prevent Removal - MOB-T1004\""],"Abuse of iOS Enterprise App Signing Key - MOB-T1048":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse of iOS Enterprise App Signing Key - MOB-T1048\""],"Access Calendar Entries - MOB-T1038":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Calendar Entries - MOB-T1038\""],"Access Call Log - MOB-T1036":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Call Log - MOB-T1036\""],"Access Contact List - MOB-T1035":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Contact List - MOB-T1035\""],"Access Sensitive Data in Device Logs - MOB-T1016":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Sensitive Data in Device Logs - MOB-T1016\""],"Access Sensitive Data or Credentials in Files - MOB-T1012":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Sensitive Data or Credentials in Files - MOB-T1012\""],"Alternate Network Mediums - MOB-T1041":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Alternate Network Mediums - MOB-T1041\""],"Android Intent Hijacking - MOB-T1019":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Android Intent Hijacking - MOB-T1019\""],"App Auto-Start at Device Boot - MOB-T1005":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Auto-Start at Device Boot - MOB-T1005\""],"App Delivered via Email Attachment - MOB-T1037":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Delivered via Email Attachment - MOB-T1037\""],"App Delivered via Web Download - MOB-T1034":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Delivered via Web Download - MOB-T1034\""],"Application Discovery - MOB-T1021":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Application Discovery - MOB-T1021\""],"Attack PC via USB Connection - MOB-T1030":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Attack PC via USB Connection - MOB-T1030\""],"Biometric Spoofing - MOB-T1063":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Biometric Spoofing - MOB-T1063\""],"Capture Clipboard Data - MOB-T1017":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Capture Clipboard Data - MOB-T1017\""],"Capture SMS Messages - MOB-T1015":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Capture SMS Messages - MOB-T1015\""],"Commonly Used Port - MOB-T1039":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Commonly Used Port - MOB-T1039\""],"Detect App Analysis Environment - MOB-T1043":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Detect App Analysis Environment - MOB-T1043\""],"Device Type Discovery - MOB-T1022":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Device Type Discovery - MOB-T1022\""],"Device Unlock Code Guessing or Brute Force - MOB-T1062":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Device Unlock Code Guessing or Brute Force - MOB-T1062\""],"Disguise Root\/Jailbreak Indicators - MOB-T1011":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Disguise Root\/Jailbreak Indicators - MOB-T1011\""],"Downgrade to Insecure Protocols - MOB-T1069":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Downgrade to Insecure Protocols - MOB-T1069\""],"Download New Code at Runtime - MOB-T1010":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Download New Code at Runtime - MOB-T1010\""],"Eavesdrop on Insecure Network Communication - MOB-T1042":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Eavesdrop on Insecure Network Communication - MOB-T1042\""],"Encrypt Files for Ransom - MOB-T1074":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Encrypt Files for Ransom - MOB-T1074\""],"Exploit Baseband Vulnerability - MOB-T1058":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit Baseband Vulnerability - MOB-T1058\""],"Exploit Enterprise Resources - MOB-T1031":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit Enterprise Resources - MOB-T1031\""],"Exploit OS Vulnerability - MOB-T1007":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit OS Vulnerability - MOB-T1007\""],"Exploit SS7 to Redirect Phone Calls\/SMS - MOB-T1052":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit SS7 to Redirect Phone Calls\/SMS - MOB-T1052\""],"Exploit SS7 to Track Device Location - MOB-T1053":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit SS7 to Track Device Location - MOB-T1053\""],"Exploit TEE Vulnerability - MOB-T1008":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit TEE Vulnerability - MOB-T1008\""],"Exploit via Charging Station or PC - MOB-T1061":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit via Charging Station or PC - MOB-T1061\""],"Fake Developer Accounts - MOB-T1045":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Fake Developer Accounts - MOB-T1045\""],"File and Directory Discovery - MOB-T1023":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"File and Directory Discovery - MOB-T1023\""],"Generate Fraudulent Advertising Revenue - MOB-T1075":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Generate Fraudulent Advertising Revenue - MOB-T1075\""],"Insecure Third-Party Libraries - MOB-T1028":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Insecure Third-Party Libraries - MOB-T1028\""],"Jamming or Denial of Service - MOB-T1067":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Jamming or Denial of Service - MOB-T1067\""],"Local Network Configuration Discovery - MOB-T1025":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Local Network Configuration Discovery - MOB-T1025\""],"Local Network Connections Discovery - MOB-T1024":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Local Network Connections Discovery - MOB-T1024\""],"Location Tracking - MOB-T1033":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Location Tracking - MOB-T1033\""],"Lock User Out of Device - MOB-T1049":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Lock User Out of Device - MOB-T1049\""],"Lockscreen Bypass - MOB-T1064":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Lockscreen Bypass - MOB-T1064\""],"Malicious Media Content - MOB-T1060":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Media Content - MOB-T1060\""],"Malicious SMS Message - MOB-T1057":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious SMS Message - MOB-T1057\""],"Malicious Software Development Tools - MOB-T1065":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Software Development Tools - MOB-T1065\""],"Malicious Third Party Keyboard App - MOB-T1020":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Third Party Keyboard App - MOB-T1020\""],"Malicious Web Content - MOB-T1059":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Web Content - MOB-T1059\""],"Malicious or Vulnerable Built-in Device Functionality - MOB-T1076":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious or Vulnerable Built-in Device Functionality - MOB-T1076\""],"Manipulate App Store Rankings or Ratings - MOB-T1055":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Manipulate App Store Rankings or Ratings - MOB-T1055\""],"Manipulate Device Communication - MOB-T1066":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Manipulate Device Communication - MOB-T1066\""],"Microphone or Camera Recordings - MOB-T1032":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Microphone or Camera Recordings - MOB-T1032\""],"Modify OS Kernel or Boot Partition - MOB-T1001":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify OS Kernel or Boot Partition - MOB-T1001\""],"Modify System Partition - MOB-T1003":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify System Partition - MOB-T1003\""],"Modify Trusted Execution Environment - MOB-T1002":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify Trusted Execution Environment - MOB-T1002\""],"Modify cached executable code - MOB-T1006":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify cached executable code - MOB-T1006\""],"Network Service Scanning - MOB-T1026":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Network Service Scanning - MOB-T1026\""],"Network Traffic Capture or Redirection - MOB-T1013":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Network Traffic Capture or Redirection - MOB-T1013\""],"Obfuscated or Encrypted Payload - MOB-T1009":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Obfuscated or Encrypted Payload - MOB-T1009\""],"Obtain Device Cloud Backups - MOB-T1073":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Obtain Device Cloud Backups - MOB-T1073\""],"Premium SMS Toll Fraud - MOB-T1051":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Premium SMS Toll Fraud - MOB-T1051\""],"Process Discovery - MOB-T1027":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Process Discovery - MOB-T1027\""],"Remotely Install Application - MOB-T1046":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Install Application - MOB-T1046\""],"Remotely Track Device Without Authorization - MOB-T1071":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Track Device Without Authorization - MOB-T1071\""],"Remotely Wipe Data Without Authorization - MOB-T1072":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Wipe Data Without Authorization - MOB-T1072\""],"Repackaged Application - MOB-T1047":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Repackaged Application - MOB-T1047\""],"Rogue Cellular Base Station - MOB-T1070":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Rogue Cellular Base Station - MOB-T1070\""],"Rogue Wi-Fi Access Points - MOB-T1068":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Rogue Wi-Fi Access Points - MOB-T1068\""],"SIM Card Swap - MOB-T1054":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"SIM Card Swap - MOB-T1054\""],"Standard Application Layer Protocol - MOB-T1040":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Standard Application Layer Protocol - MOB-T1040\""],"Stolen Developer Credentials or Signing Keys - MOB-T1044":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Stolen Developer Credentials or Signing Keys - MOB-T1044\""],"System Information Discovery - MOB-T1029":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"System Information Discovery - MOB-T1029\""],"URL Scheme Hijacking - MOB-T1018":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"URL Scheme Hijacking - MOB-T1018\""],"User Interface Spoofing - MOB-T1014":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"User Interface Spoofing - MOB-T1014\""],"Wipe Device Data - MOB-T1050":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Wipe Device Data - MOB-T1050\""],"Application Developer Guidance - MOB-M1013":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Application Developer Guidance - MOB-M1013\""],"Application Vetting - MOB-M1005":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Application Vetting - MOB-M1005\""],"Attestation - MOB-M1002":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Attestation - MOB-M1002\""],"Caution with Device Administrator Access - MOB-M1007":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Caution with Device Administrator Access - MOB-M1007\""],"Deploy Compromised Device Detection Method - MOB-M1010":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Deploy Compromised Device Detection Method - MOB-M1010\""],"Encrypt Network Traffic - MOB-M1009":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Encrypt Network Traffic - MOB-M1009\""],"Enterprise Policy - MOB-M1012":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Enterprise Policy - MOB-M1012\""],"Interconnection Filtering - MOB-M1014":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Interconnection Filtering - MOB-M1014\""],"Lock Bootloader - MOB-M1003":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Lock Bootloader - MOB-M1003\""],"Security Updates - MOB-M1001":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Security Updates - MOB-M1001\""],"System Partition Integrity - MOB-M1004":["misp-galaxy:mitre-mobile-attack-course-of-action=\"System Partition Integrity - MOB-M1004\""],"Use Device-Provided Credential Storage - MOB-M1008":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Use Device-Provided Credential Storage - MOB-M1008\""],"Use Recent OS Version - MOB-M1006":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Use Recent OS Version - MOB-M1006\""],"User Guidance - MOB-M1011":["misp-galaxy:mitre-mobile-attack-course-of-action=\"User Guidance - MOB-M1011\""],"ANDROIDOS_ANSERVER.A - MOB-S0026":["misp-galaxy:mitre-mobile-attack-malware=\"ANDROIDOS_ANSERVER.A - MOB-S0026\""],"Adups - MOB-S0025":["misp-galaxy:mitre-mobile-attack-malware=\"Adups - MOB-S0025\""],"AndroRAT - MOB-S0008":["misp-galaxy:mitre-mobile-attack-malware=\"AndroRAT - MOB-S0008\""],"Android\/Chuli.A - MOB-S0020":["misp-galaxy:mitre-mobile-attack-malware=\"Android\/Chuli.A - MOB-S0020\""],"AndroidOverlayMalware - MOB-S0012":["misp-galaxy:mitre-mobile-attack-malware=\"AndroidOverlayMalware - MOB-S0012\""],"AndroidOverlayMalware":["misp-galaxy:mitre-mobile-attack-malware=\"AndroidOverlayMalware - MOB-S0012\""],"BrainTest - MOB-S0009":["misp-galaxy:mitre-mobile-attack-malware=\"BrainTest - MOB-S0009\""],"Charger - MOB-S0039":["misp-galaxy:mitre-mobile-attack-malware=\"Charger - MOB-S0039\""],"Dendroid - MOB-S0017":["misp-galaxy:mitre-mobile-attack-malware=\"Dendroid - MOB-S0017\""],"DressCode - MOB-S0016":["misp-galaxy:mitre-mobile-attack-malware=\"DressCode - MOB-S0016\""],"DroidJack RAT - MOB-S0036":["misp-galaxy:mitre-mobile-attack-malware=\"DroidJack RAT - MOB-S0036\""],"DroidJack RAT":["misp-galaxy:mitre-mobile-attack-malware=\"DroidJack RAT - MOB-S0036\""],"DualToy - MOB-S0031":["misp-galaxy:mitre-mobile-attack-malware=\"DualToy - MOB-S0031\""],"Gooligan - MOB-S0006":["misp-galaxy:mitre-mobile-attack-malware=\"Gooligan - MOB-S0006\""],"HummingBad - MOB-S0038":["misp-galaxy:mitre-mobile-attack-malware=\"HummingBad - MOB-S0038\""],"HummingWhale - MOB-S0037":["misp-galaxy:mitre-mobile-attack-malware=\"HummingWhale - MOB-S0037\""],"KeyRaider - MOB-S0004":["misp-galaxy:mitre-mobile-attack-malware=\"KeyRaider - MOB-S0004\""],"MazarBOT - MOB-S0019":["misp-galaxy:mitre-mobile-attack-malware=\"MazarBOT - MOB-S0019\""],"NotCompatible - MOB-S0015":["misp-galaxy:mitre-mobile-attack-malware=\"NotCompatible - MOB-S0015\""],"OBAD - MOB-S0002":["misp-galaxy:mitre-mobile-attack-malware=\"OBAD - MOB-S0002\""],"OldBoot - MOB-S0001":["misp-galaxy:mitre-mobile-attack-malware=\"OldBoot - MOB-S0001\""],"PJApps - MOB-S0007":["misp-galaxy:mitre-mobile-attack-malware=\"PJApps - MOB-S0007\""],"Pegasus - MOB-S0005":["misp-galaxy:mitre-mobile-attack-malware=\"Pegasus - MOB-S0005\""],"Pegasus for Android - MOB-S0032":["misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\""],"RCSAndroid - MOB-S0011":["misp-galaxy:mitre-mobile-attack-malware=\"RCSAndroid - MOB-S0011\""],"RuMMS - MOB-S0029":["misp-galaxy:mitre-mobile-attack-malware=\"RuMMS - MOB-S0029\""],"Shedun - MOB-S0010":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Shedun":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Shuanet":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"SpyNote RAT - MOB-S0021":["misp-galaxy:mitre-mobile-attack-malware=\"SpyNote RAT - MOB-S0021\""],"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023\""],"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022\""],"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024\""],"Twitoor - MOB-S0018":["misp-galaxy:mitre-mobile-attack-malware=\"Twitoor - MOB-S0018\""],"WireLurker - MOB-S0028":["misp-galaxy:mitre-mobile-attack-malware=\"WireLurker - MOB-S0028\""],"X-Agent - MOB-S0030":["misp-galaxy:mitre-mobile-attack-malware=\"X-Agent - MOB-S0030\""],"XcodeGhost - MOB-S0013":["misp-galaxy:mitre-mobile-attack-malware=\"XcodeGhost - MOB-S0013\""],"YiSpecter - MOB-S0027":["misp-galaxy:mitre-mobile-attack-malware=\"YiSpecter - MOB-S0027\""],"ZergHelper - MOB-S0003":["misp-galaxy:mitre-mobile-attack-malware=\"ZergHelper - MOB-S0003\""],"Xbot - MOB-S0014":["misp-galaxy:mitre-mobile-attack-tool=\"Xbot - MOB-S0014\""],"Acquire OSINT data sets and information - PRE-T1024":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1024\""],"Acquire OSINT data sets and information - PRE-T1043":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1043\""],"Acquire OSINT data sets and information - PRE-T1054":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1054\""],"Acquire and\/or use 3rd party infrastructure services - PRE-T1084":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - PRE-T1084\""],"Acquire and\/or use 3rd party infrastructure services - PRE-T1106":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - PRE-T1106\""],"Acquire and\/or use 3rd party software services - PRE-T1085":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party software services - PRE-T1085\""],"Acquire and\/or use 3rd party software services - PRE-T1107":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party software services - PRE-T1107\""],"Acquire or compromise 3rd party signing certificates - PRE-T1087":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire or compromise 3rd party signing certificates - PRE-T1087\""],"Acquire or compromise 3rd party signing certificates - PRE-T1109":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire or compromise 3rd party signing certificates - PRE-T1109\""],"Aggregate individual's digital footprint - PRE-T1052":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Aggregate individual's digital footprint - PRE-T1052\""],"Analyze application security posture - PRE-T1070":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze application security posture - PRE-T1070\""],"Analyze architecture and configuration posture - PRE-T1065":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze architecture and configuration posture - PRE-T1065\""],"Analyze business processes - PRE-T1078":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze business processes - PRE-T1078\""],"Analyze data collected - PRE-T1064":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze data collected - PRE-T1064\""],"Analyze hardware\/software security defensive capabilities - PRE-T1071":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze hardware\/software security defensive capabilities - PRE-T1071\""],"Analyze organizational skillsets and deficiencies - PRE-T1066":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1066\""],"Analyze organizational skillsets and deficiencies - PRE-T1074":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1074\""],"Analyze organizational skillsets and deficiencies - PRE-T1077":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1077\""],"Analyze presence of outsourced capabilities - PRE-T1080":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze presence of outsourced capabilities - PRE-T1080\""],"Analyze social and business relationships, interests, and affiliations - PRE-T1072":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze social and business relationships, interests, and affiliations - PRE-T1072\""],"Anonymity services - PRE-T1083":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Anonymity services - PRE-T1083\""],"Assess KITs\/KIQs benefits - PRE-T1006":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess KITs\/KIQs benefits - PRE-T1006\""],"Assess current holdings, needs, and wants - PRE-T1013":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess current holdings, needs, and wants - PRE-T1013\""],"Assess leadership areas of interest - PRE-T1001":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess leadership areas of interest - PRE-T1001\""],"Assess opportunities created by business deals - PRE-T1076":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess opportunities created by business deals - PRE-T1076\""],"Assess security posture of physical locations - PRE-T1079":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess security posture of physical locations - PRE-T1079\""],"Assess targeting options - PRE-T1073":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess targeting options - PRE-T1073\""],"Assess vulnerability of 3rd party vendors - PRE-T1075":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess vulnerability of 3rd party vendors - PRE-T1075\""],"Assign KITs, KIQs, and\/or intelligence requirements - PRE-T1015":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assign KITs, KIQs, and\/or intelligence requirements - PRE-T1015\""],"Assign KITs\/KIQs into categories - PRE-T1005":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assign KITs\/KIQs into categories - PRE-T1005\""],"Authentication attempt - PRE-T1158":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Authentication attempt - PRE-T1158\""],"Authorized user performs requested cyber action - PRE-T1163":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Authorized user performs requested cyber action - PRE-T1163\""],"Automated system performs requested action - PRE-T1161":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Automated system performs requested action - PRE-T1161\""],"Build and configure delivery systems - PRE-T1124":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build and configure delivery systems - PRE-T1124\""],"Build or acquire exploits - PRE-T1126":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build or acquire exploits - PRE-T1126\""],"Build social network persona - PRE-T1118":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build social network persona - PRE-T1118\""],"Buy domain name - PRE-T1105":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Buy domain name - PRE-T1105\""],"C2 protocol development - PRE-T1129":["misp-galaxy:mitre-pre-attack-attack-pattern=\"C2 protocol development - PRE-T1129\""],"Choose pre-compromised mobile app developer account credentials or signing keys - PRE-T1168":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Choose pre-compromised mobile app developer account credentials or signing keys - PRE-T1168\""],"Choose pre-compromised persona and affiliated accounts - PRE-T1120":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Choose pre-compromised persona and affiliated accounts - PRE-T1120\""],"Common, high volume protocols and software - PRE-T1098":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Common, high volume protocols and software - PRE-T1098\""],"Compromise 3rd party infrastructure to support delivery - PRE-T1089":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - PRE-T1089\""],"Compromise 3rd party infrastructure to support delivery - PRE-T1111":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - PRE-T1111\""],"Compromise 3rd party or closed-source vulnerability\/exploit information - PRE-T1131":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party or closed-source vulnerability\/exploit information - PRE-T1131\""],"Compromise of externally facing system - PRE-T1165":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise of externally facing system - PRE-T1165\""],"Conduct active scanning - PRE-T1031":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct active scanning - PRE-T1031\""],"Conduct cost\/benefit analysis - PRE-T1003":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct cost\/benefit analysis - PRE-T1003\""],"Conduct passive scanning - PRE-T1030":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct passive scanning - PRE-T1030\""],"Conduct social engineering - PRE-T1026":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1026\""],"Conduct social engineering - PRE-T1045":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1045\""],"Conduct social engineering - PRE-T1056":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1056\""],"Conduct social engineering or HUMINT operation - PRE-T1153":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering or HUMINT operation - PRE-T1153\""],"Confirmation of launched compromise achieved - PRE-T1160":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Confirmation of launched compromise achieved - PRE-T1160\""],"Create backup infrastructure - PRE-T1116":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create backup infrastructure - PRE-T1116\""],"Create custom payloads - PRE-T1122":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create custom payloads - PRE-T1122\""],"Create implementation plan - PRE-T1009":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create implementation plan - PRE-T1009\""],"Create infected removable media - PRE-T1132":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create infected removable media - PRE-T1132\""],"Create strategic plan - PRE-T1008":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create strategic plan - PRE-T1008\""],"Credential pharming - PRE-T1151":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Credential pharming - PRE-T1151\""],"DNS poisoning - PRE-T1159":["misp-galaxy:mitre-pre-attack-attack-pattern=\"DNS poisoning - PRE-T1159\""],"DNSCalc - PRE-T1101":["misp-galaxy:mitre-pre-attack-attack-pattern=\"DNSCalc - PRE-T1101\""],"Data Hiding - PRE-T1097":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Data Hiding - PRE-T1097\""],"Deploy exploit using advertising - PRE-T1157":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Deploy exploit using advertising - PRE-T1157\""],"Derive intelligence requirements - PRE-T1007":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Derive intelligence requirements - PRE-T1007\""],"Determine 3rd party infrastructure services - PRE-T1037":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine 3rd party infrastructure services - PRE-T1037\""],"Determine 3rd party infrastructure services - PRE-T1061":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine 3rd party infrastructure services - PRE-T1061\""],"Determine approach\/attack vector - PRE-T1022":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine approach\/attack vector - PRE-T1022\""],"Determine centralization of IT management - PRE-T1062":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine centralization of IT management - PRE-T1062\""],"Determine domain and IP address space - PRE-T1027":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine domain and IP address space - PRE-T1027\""],"Determine external network trust dependencies - PRE-T1036":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine external network trust dependencies - PRE-T1036\""],"Determine firmware version - PRE-T1035":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine firmware version - PRE-T1035\""],"Determine highest level tactical element - PRE-T1020":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine highest level tactical element - PRE-T1020\""],"Determine operational element - PRE-T1019":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine operational element - PRE-T1019\""],"Determine physical locations - PRE-T1059":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine physical locations - PRE-T1059\""],"Determine secondary level tactical element - PRE-T1021":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine secondary level tactical element - PRE-T1021\""],"Determine strategic target - PRE-T1018":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine strategic target - PRE-T1018\""],"Develop KITs\/KIQs - PRE-T1004":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Develop KITs\/KIQs - PRE-T1004\""],"Develop social network persona digital footprint - PRE-T1119":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Develop social network persona digital footprint - PRE-T1119\""],"Discover new exploits and monitor exploit-provider forums - PRE-T1127":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Discover new exploits and monitor exploit-provider forums - PRE-T1127\""],"Discover target logon\/email address format - PRE-T1032":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Discover target logon\/email address format - PRE-T1032\""],"Disseminate removable media - PRE-T1156":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Disseminate removable media - PRE-T1156\""],"Distribute malicious software development tools - PRE-T1171":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Distribute malicious software development tools - PRE-T1171\""],"Domain Generation Algorithms (DGA) - PRE-T1100":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Domain Generation Algorithms (DGA) - PRE-T1100\""],"Domain registration hijacking - PRE-T1103":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Domain registration hijacking - PRE-T1103\""],"Dumpster dive - PRE-T1063":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dumpster dive - PRE-T1063\""],"Dynamic DNS - PRE-T1088":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dynamic DNS - PRE-T1088\""],"Dynamic DNS - PRE-T1110":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dynamic DNS - PRE-T1110\""],"Enumerate client configurations - PRE-T1039":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Enumerate client configurations - PRE-T1039\""],"Enumerate externally facing software applications technologies, languages, and dependencies - PRE-T1038":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Enumerate externally facing software applications technologies, languages, and dependencies - PRE-T1038\""],"Exploit public-facing application - PRE-T1154":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Exploit public-facing application - PRE-T1154\""],"Fast Flux DNS - PRE-T1102":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Fast Flux DNS - PRE-T1102\""],"Friend\/Follow\/Connect to targets of interest - PRE-T1121":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - PRE-T1121\""],"Friend\/Follow\/Connect to targets of interest - PRE-T1141":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - PRE-T1141\""],"Generate analyst intelligence requirements - PRE-T1011":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Generate analyst intelligence requirements - PRE-T1011\""],"Hardware or software supply chain implant - PRE-T1142":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Hardware or software supply chain implant - PRE-T1142\""],"Host-based hiding techniques - PRE-T1091":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Host-based hiding techniques - PRE-T1091\""],"Human performs requested action of physical nature - PRE-T1162":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Human performs requested action of physical nature - PRE-T1162\""],"Identify analyst level gaps - PRE-T1010":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify analyst level gaps - PRE-T1010\""],"Identify business processes\/tempo - PRE-T1057":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business processes\/tempo - PRE-T1057\""],"Identify business relationships - PRE-T1049":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business relationships - PRE-T1049\""],"Identify business relationships - PRE-T1060":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business relationships - PRE-T1060\""],"Identify gap areas - PRE-T1002":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify gap areas - PRE-T1002\""],"Identify groups\/roles - PRE-T1047":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify groups\/roles - PRE-T1047\""],"Identify job postings and needs\/gaps - PRE-T1025":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1025\""],"Identify job postings and needs\/gaps - PRE-T1044":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1044\""],"Identify job postings and needs\/gaps - PRE-T1055":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1055\""],"Identify people of interest - PRE-T1046":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify people of interest - PRE-T1046\""],"Identify personnel with an authority\/privilege - PRE-T1048":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify personnel with an authority\/privilege - PRE-T1048\""],"Identify resources required to build capabilities - PRE-T1125":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify resources required to build capabilities - PRE-T1125\""],"Identify security defensive capabilities - PRE-T1040":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify security defensive capabilities - PRE-T1040\""],"Identify sensitive personnel information - PRE-T1051":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify sensitive personnel information - PRE-T1051\""],"Identify supply chains - PRE-T1023":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1023\""],"Identify supply chains - PRE-T1042":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1042\""],"Identify supply chains - PRE-T1053":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1053\""],"Identify technology usage patterns - PRE-T1041":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify technology usage patterns - PRE-T1041\""],"Identify vulnerabilities in third-party software libraries - PRE-T1166":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify vulnerabilities in third-party software libraries - PRE-T1166\""],"Identify web defensive services - PRE-T1033":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify web defensive services - PRE-T1033\""],"Install and configure hardware, network, and systems - PRE-T1113":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Install and configure hardware, network, and systems - PRE-T1113\""],"Leverage compromised 3rd party resources - PRE-T1152":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Leverage compromised 3rd party resources - PRE-T1152\""],"Map network topology - PRE-T1029":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Map network topology - PRE-T1029\""],"Mine social media - PRE-T1050":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Mine social media - PRE-T1050\""],"Mine technical blogs\/forums - PRE-T1034":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Mine technical blogs\/forums - PRE-T1034\""],"Misattributable credentials - PRE-T1099":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Misattributable credentials - PRE-T1099\""],"Network-based hiding techniques - PRE-T1092":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Network-based hiding techniques - PRE-T1092\""],"Non-traditional or less attributable payment options - PRE-T1093":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Non-traditional or less attributable payment options - PRE-T1093\""],"OS-vendor provided communication channels - PRE-T1167":["misp-galaxy:mitre-pre-attack-attack-pattern=\"OS-vendor provided communication channels - PRE-T1167\""],"Obfuscate infrastructure - PRE-T1086":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate infrastructure - PRE-T1086\""],"Obfuscate infrastructure - PRE-T1108":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate infrastructure - PRE-T1108\""],"Obfuscate operational infrastructure - PRE-T1095":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate operational infrastructure - PRE-T1095\""],"Obfuscate or encrypt code - PRE-T1096":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate or encrypt code - PRE-T1096\""],"Obfuscation or cryptography - PRE-T1090":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscation or cryptography - PRE-T1090\""],"Obtain Apple iOS enterprise distribution key pair and certificate - PRE-T1169":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain Apple iOS enterprise distribution key pair and certificate - PRE-T1169\""],"Obtain booter\/stressor subscription - PRE-T1173":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain booter\/stressor subscription - PRE-T1173\""],"Obtain domain\/IP registration information - PRE-T1028":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain domain\/IP registration information - PRE-T1028\""],"Obtain templates\/branding materials - PRE-T1058":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain templates\/branding materials - PRE-T1058\""],"Obtain\/re-use payloads - PRE-T1123":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain\/re-use payloads - PRE-T1123\""],"Port redirector - PRE-T1140":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Port redirector - PRE-T1140\""],"Post compromise tool development - PRE-T1130":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Post compromise tool development - PRE-T1130\""],"Private whois services - PRE-T1082":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Private whois services - PRE-T1082\""],"Procure required equipment and software - PRE-T1112":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Procure required equipment and software - PRE-T1112\""],"Proxy\/protocol relays - PRE-T1081":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Proxy\/protocol relays - PRE-T1081\""],"Push-notification client-side exploit - PRE-T1150":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Push-notification client-side exploit - PRE-T1150\""],"Receive KITs\/KIQs and determine requirements - PRE-T1016":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Receive KITs\/KIQs and determine requirements - PRE-T1016\""],"Receive operator KITs\/KIQs tasking - PRE-T1012":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Receive operator KITs\/KIQs tasking - PRE-T1012\""],"Remote access tool development - PRE-T1128":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Remote access tool development - PRE-T1128\""],"Replace legitimate binary with malware - PRE-T1155":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Replace legitimate binary with malware - PRE-T1155\""],"Research relevant vulnerabilities\/CVEs - PRE-T1068":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Research relevant vulnerabilities\/CVEs - PRE-T1068\""],"Research visibility gap of security vendors - PRE-T1067":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Research visibility gap of security vendors - PRE-T1067\""],"Review logs and residual traces - PRE-T1135":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Review logs and residual traces - PRE-T1135\""],"Runtime code download and execution - PRE-T1172":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Runtime code download and execution - PRE-T1172\""],"SSL certificate acquisition for domain - PRE-T1114":["misp-galaxy:mitre-pre-attack-attack-pattern=\"SSL certificate acquisition for domain - PRE-T1114\""],"SSL certificate acquisition for trust breaking - PRE-T1115":["misp-galaxy:mitre-pre-attack-attack-pattern=\"SSL certificate acquisition for trust breaking - PRE-T1115\""],"Secure and protect infrastructure - PRE-T1094":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Secure and protect infrastructure - PRE-T1094\""],"Shadow DNS - PRE-T1117":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Shadow DNS - PRE-T1117\""],"Spear phishing messages with malicious attachments - PRE-T1144":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with malicious attachments - PRE-T1144\""],"Spear phishing messages with malicious links - PRE-T1146":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with malicious links - PRE-T1146\""],"Spear phishing messages with text only - PRE-T1145":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with text only - PRE-T1145\""],"Spearphishing for Information - PRE-T1174":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spearphishing for Information - PRE-T1174\""],"Submit KITs, KIQs, and intelligence requirements - PRE-T1014":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Submit KITs, KIQs, and intelligence requirements - PRE-T1014\""],"Targeted client-side exploitation - PRE-T1148":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Targeted client-side exploitation - PRE-T1148\""],"Targeted social media phishing - PRE-T1143":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Targeted social media phishing - PRE-T1143\""],"Task requirements - PRE-T1017":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Task requirements - PRE-T1017\""],"Test ability to evade automated mobile application security analysis performed by app stores - PRE-T1170":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test ability to evade automated mobile application security analysis performed by app stores - PRE-T1170\""],"Test callback functionality - PRE-T1133":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test callback functionality - PRE-T1133\""],"Test malware in various execution environments - PRE-T1134":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test malware in various execution environments - PRE-T1134\""],"Test malware to evade detection - PRE-T1136":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test malware to evade detection - PRE-T1136\""],"Test physical access - PRE-T1137":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test physical access - PRE-T1137\""],"Test signature detection - PRE-T1069":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test signature detection - PRE-T1069\""],"Test signature detection for file upload\/email filters - PRE-T1138":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test signature detection for file upload\/email filters - PRE-T1138\""],"Unauthorized user introduces compromise delivery mechanism - PRE-T1164":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Unauthorized user introduces compromise delivery mechanism - PRE-T1164\""],"Unconditional client-side exploitation\/Injected Website\/Driveby - PRE-T1149":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Unconditional client-side exploitation\/Injected Website\/Driveby - PRE-T1149\""],"Untargeted client-side exploitation - PRE-T1147":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Untargeted client-side exploitation - PRE-T1147\""],"Upload, install, and configure software\/tools - PRE-T1139":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Upload, install, and configure software\/tools - PRE-T1139\""],"Use multiple DNS infrastructures - PRE-T1104":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Use multiple DNS infrastructures - PRE-T1104\""],"Empire - S0363":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"EmPyre":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"PowerShell Empire":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"Expand - S0361":["misp-galaxy:mitre-tool=\"Expand - S0361\""],"Expand":["misp-galaxy:mitre-tool=\"Expand - S0361\""],"Impacket - S0357":["misp-galaxy:mitre-tool=\"Impacket - S0357\""],"Impacket":["misp-galaxy:mitre-tool=\"Impacket - S0357\""],"Koadic - S0250":["misp-galaxy:mitre-tool=\"Koadic - S0250\""],"LaZagne - S0349":["misp-galaxy:mitre-tool=\"LaZagne - S0349\""],"LaZagne":["misp-galaxy:mitre-tool=\"LaZagne - S0349\""],"Nltest - S0359":["misp-galaxy:mitre-tool=\"Nltest - S0359\""],"Nltest":["misp-galaxy:mitre-tool=\"Nltest - S0359\""],"PoshC2 - S0378":["misp-galaxy:mitre-tool=\"PoshC2 - S0378\""],"QuasarRAT - S0262":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\""],"QuasarRAT":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\""],"xRAT":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\"","misp-galaxy:rat=\"xRAT\""],"RawDisk - S0364":["misp-galaxy:mitre-tool=\"RawDisk - S0364\""],"RawDisk":["misp-galaxy:mitre-tool=\"RawDisk - S0364\""],"Remcos - S0332":["misp-galaxy:mitre-tool=\"Remcos - S0332\""],"Ruler - S0358":["misp-galaxy:mitre-tool=\"Ruler - S0358\""],"Ruler":["misp-galaxy:mitre-tool=\"Ruler - S0358\""],"Xbot - S0298":["misp-galaxy:mitre-tool=\"Xbot - S0298\""],"ACL":["misp-galaxy:preventive-measure=\"ACL\""],"Backup and Restore Process":["misp-galaxy:preventive-measure=\"Backup and Restore Process\""],"Blacklist-phone-numbers":["misp-galaxy:preventive-measure=\"Blacklist-phone-numbers\""],"Block Macros":["misp-galaxy:preventive-measure=\"Block Macros\""],"Change Default \"Open With\" to Notepad":["misp-galaxy:preventive-measure=\"Change Default \"Open With\" to Notepad\""],"Disable WSH":["misp-galaxy:preventive-measure=\"Disable WSH\""],"EMET":["misp-galaxy:preventive-measure=\"EMET\""],"Enforce UAC Prompt":["misp-galaxy:preventive-measure=\"Enforce UAC Prompt\""],"Execution Prevention":["misp-galaxy:preventive-measure=\"Execution Prevention\""],"File Screening":["misp-galaxy:preventive-measure=\"File Screening\""],"Filter Attachments Level 1":["misp-galaxy:preventive-measure=\"Filter Attachments Level 1\""],"Filter Attachments Level 2":["misp-galaxy:preventive-measure=\"Filter Attachments Level 2\""],"Remove Admin Privileges":["misp-galaxy:preventive-measure=\"Remove Admin Privileges\""],"Restrict Workstation Communication":["misp-galaxy:preventive-measure=\"Restrict Workstation Communication\""],"Restrict program execution #2":["misp-galaxy:preventive-measure=\"Restrict program execution #2\""],"Restrict program execution":["misp-galaxy:preventive-measure=\"Restrict program execution\""],"Sandboxing Email Input":["misp-galaxy:preventive-measure=\"Sandboxing Email Input\""],"Show File Extensions":["misp-galaxy:preventive-measure=\"Show File Extensions\""],"Sysmon":["misp-galaxy:preventive-measure=\"Sysmon\""],"\"prepending (enc) ransomware\" (Not an official name)":["misp-galaxy:ransomware=\"\"prepending (enc) ransomware\" (Not an official name)\""],".CryptoHasYou.":["misp-galaxy:ransomware=\".CryptoHasYou.\""],"777":["misp-galaxy:ransomware=\"777\""],"Sevleg":["misp-galaxy:ransomware=\"777\""],"7Zipper Ransomware":["misp-galaxy:ransomware=\"7Zipper Ransomware\""],"7ev3n-HONE$T":["misp-galaxy:ransomware=\"7ev3n\""],"8lock8":["misp-galaxy:ransomware=\"8lock8\""],"AES-NI Ransomware ":["misp-galaxy:ransomware=\"AES-NI Ransomware \""],"AES_KEY_GEN_ASSIST Ransomware":["misp-galaxy:ransomware=\"AES_KEY_GEN_ASSIST Ransomware\""],"ALFA Ransomware":["misp-galaxy:ransomware=\"ALFA Ransomware\""],"AMBA":["misp-galaxy:ransomware=\"AMBA\""],"APT Ransomware v.2":["misp-galaxy:ransomware=\"APT Ransomware v.2\""],"ASN1 Encoder Ransomware":["misp-galaxy:ransomware=\"ASN1 Encoder Ransomware\""],"Acroware Cryptolocker Ransomware":["misp-galaxy:ransomware=\"Acroware Cryptolocker Ransomware\""],"Acroware Screenlocker":["misp-galaxy:ransomware=\"Acroware Cryptolocker Ransomware\""],"AdamLocker Ransomware":["misp-galaxy:ransomware=\"AdamLocker Ransomware\""],"AiraCrop Ransomware":["misp-galaxy:ransomware=\"AiraCrop Ransomware\""],"AiraCrop":["misp-galaxy:ransomware=\"AiraCrop\""],"Al-Namrood":["misp-galaxy:ransomware=\"Al-Namrood\""],"Alcatraz Locker Ransomware":["misp-galaxy:ransomware=\"Alcatraz Locker Ransomware\""],"All_Your_Documents Ransomware":["misp-galaxy:ransomware=\"All_Your_Documents Ransomware\""],"Alma Ransomware":["misp-galaxy:ransomware=\"Alma Ransomware\""],"Alpha Ransomware":["misp-galaxy:ransomware=\"Alpha Ransomware\""],"Angela Merkel Ransomware":["misp-galaxy:ransomware=\"Angela Merkel Ransomware\""],"AngleWare":["misp-galaxy:ransomware=\"AngleWare\""],"AngryDuck Ransomware":["misp-galaxy:ransomware=\"AngryDuck Ransomware\""],"Anony":["misp-galaxy:ransomware=\"Anony\""],"ngocanh":["misp-galaxy:ransomware=\"Anony\""],"Antihacker2017 Ransomware":["misp-galaxy:ransomware=\"Antihacker2017 Ransomware\""],"Antix Ransomware":["misp-galaxy:ransomware=\"Antix Ransomware\""],"Anubis Ransomware":["misp-galaxy:ransomware=\"Anubis Ransomware\""],"Fabiansomeware":["misp-galaxy:ransomware=\"Apocalypse\""],"ApocalypseVM":["misp-galaxy:ransomware=\"ApocalypseVM\""],"Aurora Ransomware":["misp-galaxy:ransomware=\"Aurora Ransomware\""],"Zorro Ransomware":["misp-galaxy:ransomware=\"Aurora Ransomware\""],"AutoLocky":["misp-galaxy:ransomware=\"AutoLocky\""],"AvastVirusinfo Ransomware":["misp-galaxy:ransomware=\"AvastVirusinfo Ransomware\""],"Aw3s0m3Sc0t7":["misp-galaxy:ransomware=\"Aw3s0m3Sc0t7\""],"B2DR Ransomware":["misp-galaxy:ransomware=\"B2DR Ransomware\""],"BTCLocker Ransomware":["misp-galaxy:ransomware=\"BTCLocker Ransomware\""],"BTC Ransomware":["misp-galaxy:ransomware=\"BTCLocker Ransomware\""],"BTCWare Related to \/ new version of CryptXXX":["misp-galaxy:ransomware=\"BTCWare Related to \/ new version of CryptXXX\""],"BTCamant Ransomware":["misp-galaxy:ransomware=\"BTCamant Ransomware\""],"Bad Rabbit":["misp-galaxy:ransomware=\"Bad Rabbit\""],"Bad-Rabbit":["misp-galaxy:ransomware=\"Bad Rabbit\""],"BadBlock":["misp-galaxy:ransomware=\"BadBlock\""],"BadEncript Ransomware":["misp-galaxy:ransomware=\"BadEncript Ransomware\""],"BaksoCrypt":["misp-galaxy:ransomware=\"BaksoCrypt\""],"Bandarchor":["misp-galaxy:ransomware=\"Bandarchor\"","misp-galaxy:ransomware=\"Rakhni\""],"BansomQare Manna Ransomware":["misp-galaxy:ransomware=\"BansomQare Manna Ransomware\""],"BarRax Ransomware":["misp-galaxy:ransomware=\"BarRax Ransomware\""],"BarRaxCrypt Ransomware":["misp-galaxy:ransomware=\"BarRax Ransomware\""],"Barack Obama's Everlasting Blue Blackmail Virus Ransomware":["misp-galaxy:ransomware=\"Barack Obama's Everlasting Blue Blackmail Virus Ransomware\""],"Barack Obama's Blackmail Virus Ransomware":["misp-galaxy:ransomware=\"Barack Obama's Everlasting Blue Blackmail Virus Ransomware\""],"BaCrypt":["misp-galaxy:ransomware=\"Bart\""],"BigBobRoss":["misp-galaxy:ransomware=\"BigBobRoss\""],"BitCryptor":["misp-galaxy:ransomware=\"BitCryptor\""],"BitStak":["misp-galaxy:ransomware=\"BitStak\""],"Black Ruby":["misp-galaxy:ransomware=\"Black Ruby\""],"BlackShades Crypter":["misp-galaxy:ransomware=\"BlackShades Crypter\""],"SilentShade":["misp-galaxy:ransomware=\"BlackShades Crypter\""],"BlackWorm":["misp-galaxy:ransomware=\"BlackWorm\""],"BleedGreen Ransomware":["misp-galaxy:ransomware=\"BleedGreen Ransomware\""],"FireCrypt Ransomware":["misp-galaxy:ransomware=\"BleedGreen Ransomware\""],"Blocatto":["misp-galaxy:ransomware=\"Blocatto\""],"Booyah":["misp-galaxy:ransomware=\"Booyah\"","misp-galaxy:ransomware=\"MM Locker\""],"Salami":["misp-galaxy:ransomware=\"Booyah\""],"BrLock":["misp-galaxy:ransomware=\"BrLock\""],"BrainCrypt Ransomware":["misp-galaxy:ransomware=\"BrainCrypt Ransomware\""],"Brazilian Globe":["misp-galaxy:ransomware=\"Brazilian Globe\""],"Brazilian":["misp-galaxy:ransomware=\"Brazilian\""],"Browlock":["misp-galaxy:ransomware=\"Browlock\""],"Bucbi":["misp-galaxy:ransomware=\"Bucbi\""],"BuyUnlockCode":["misp-galaxy:ransomware=\"BuyUnlockCode\""],"CIA Special Agent 767 Ransomware (FAKE!!!)":["misp-galaxy:ransomware=\"CIA Special Agent 767 Ransomware (FAKE!!!)\""],"CSGO Ransomware":["misp-galaxy:ransomware=\"CSGO Ransomware\""],"CTB-Faker":["misp-galaxy:ransomware=\"CTB-Faker\""],"Citroni":["misp-galaxy:ransomware=\"CTB-Faker\""],"CTB-Locker WEB":["misp-galaxy:ransomware=\"CTB-Locker WEB\""],"CYR-Locker Ransomware (FAKE)":["misp-galaxy:ransomware=\"CYR-Locker Ransomware (FAKE)\""],"Cancer Ransomware FAKE":["misp-galaxy:ransomware=\"Cancer Ransomware FAKE\""],"Cassetto Ransomware":["misp-galaxy:ransomware=\"Cassetto Ransomware\""],"Central Security Treatment Organization":["misp-galaxy:ransomware=\"Central Security Treatment Organization\"","misp-galaxy:ransomware=\"CryLocker\""],"CRBR ENCRYPTOR":["misp-galaxy:ransomware=\"Cerber\""],"CerberTear Ransomware":["misp-galaxy:ransomware=\"CerberTear Ransomware\""],"Chartwig Ransomware":["misp-galaxy:ransomware=\"Chartwig Ransomware\""],"Chimera":["misp-galaxy:ransomware=\"Chimera\""],"Chip Ransomware":["misp-galaxy:ransomware=\"Chip Ransomware\""],"ChipLocker Ransomware":["misp-galaxy:ransomware=\"Chip Ransomware\""],"Click Me Ransomware":["misp-galaxy:ransomware=\"Click Me Ransomware\""],"Clock":["misp-galaxy:ransomware=\"Clock\""],"CloudSword Ransomware":["misp-galaxy:ransomware=\"CloudSword Ransomware\""],"CockBlocker Ransomware":["misp-galaxy:ransomware=\"CockBlocker Ransomware\""],"Code Virus Ransomware ":["misp-galaxy:ransomware=\"Code Virus Ransomware \""],"CoinVault":["misp-galaxy:ransomware=\"CoinVault\""],"CommonRansom":["misp-galaxy:ransomware=\"CommonRansom\""],"Comrade Circle Ransomware":["misp-galaxy:ransomware=\"Comrade Circle Ransomware\""],"ConsoleApplication1 Ransomware":["misp-galaxy:ransomware=\"ConsoleApplication1 Ransomware\""],"Coverton":["misp-galaxy:ransomware=\"Coverton\""],"Criptt0r":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"Cr1pt0r":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"Cripttor":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"CreamPie Ransomware":["misp-galaxy:ransomware=\"CreamPie Ransomware\""],"Crptxxx Ransomware":["misp-galaxy:ransomware=\"Crptxxx Ransomware\""],"CryBrazil":["misp-galaxy:ransomware=\"CryBrazil\""],"CryFile":["misp-galaxy:ransomware=\"CryFile\""],"Cry":["misp-galaxy:ransomware=\"CryLocker\""],"CSTO":["misp-galaxy:ransomware=\"CryLocker\""],"CryPy":["misp-galaxy:ransomware=\"CryPy\""],"Cryaki":["misp-galaxy:ransomware=\"Cryaki\""],"Crybola":["misp-galaxy:ransomware=\"Crybola\""],"CrypMIC":["misp-galaxy:ransomware=\"CrypMIC\""],"Crypren":["misp-galaxy:ransomware=\"Crypren\""],"Crypt0saur":["misp-galaxy:ransomware=\"Crypt0saur\""],"Crypt38":["misp-galaxy:ransomware=\"Crypt38\""],"CryptConsole 2.0 Ransomware":["misp-galaxy:ransomware=\"CryptConsole 2.0 Ransomware\""],"CryptConsole":["misp-galaxy:ransomware=\"CryptConsole\""],"CryptFIle2":["misp-galaxy:ransomware=\"CryptFIle2\""],"CryptInfinite":["misp-galaxy:ransomware=\"CryptInfinite\""],"CryptXXX 2.0":["misp-galaxy:ransomware=\"CryptXXX 2.0\""],"CryptProjectXXX":["misp-galaxy:ransomware=\"CryptXXX 2.0\"","misp-galaxy:ransomware=\"CryptXXX\""],"CryptXXX 3.0":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"UltraDeCrypter":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"UltraCrypter":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"CryptXXX 3.1":["misp-galaxy:ransomware=\"CryptXXX 3.1\""],"CryptXXX":["misp-galaxy:ransomware=\"CryptXXX\""],"Crypter":["misp-galaxy:ransomware=\"Crypter\""],"CryptoBit":["misp-galaxy:ransomware=\"CryptoBit\"","misp-galaxy:ransomware=\"Mobef\""],"CryptoBlock Ransomware ":["misp-galaxy:ransomware=\"CryptoBlock Ransomware \""],"CryptoDefense":["misp-galaxy:ransomware=\"CryptoDefense\""],"CryptoDevil Ransomware":["misp-galaxy:ransomware=\"CryptoDevil Ransomware\""],"CryptoFinancial":["misp-galaxy:ransomware=\"CryptoFinancial\""],"CryptoGraphic Locker":["misp-galaxy:ransomware=\"CryptoGraphic Locker\""],"Manamecrypt":["misp-galaxy:ransomware=\"CryptoHost\""],"Telograph":["misp-galaxy:ransomware=\"CryptoHost\""],"ROI Locker":["misp-galaxy:ransomware=\"CryptoHost\""],"CryptoJacky Ransomware":["misp-galaxy:ransomware=\"CryptoJacky Ransomware\""],"CryptoJoker":["misp-galaxy:ransomware=\"CryptoJoker\""],"CryptoKill Ransomware":["misp-galaxy:ransomware=\"CryptoKill Ransomware\""],"CryptoLocker 1.0.0":["misp-galaxy:ransomware=\"CryptoLocker 1.0.0\""],"CryptoLocker 5.1":["misp-galaxy:ransomware=\"CryptoLocker 5.1\""],"CryptoLocker by NTK Ransomware":["misp-galaxy:ransomware=\"CryptoLocker by NTK Ransomware\""],"CryptoLocker3 Ransomware":["misp-galaxy:ransomware=\"CryptoLocker3 Ransomware\""],"Fake CryptoLocker":["misp-galaxy:ransomware=\"CryptoLocker3 Ransomware\""],"CryptoLuck Ransomware":["misp-galaxy:ransomware=\"CryptoLuck Ransomware\""],"YafunnLocker":["misp-galaxy:ransomware=\"CryptoLuck Ransomware\""],"CryptoMeister Ransomware":["misp-galaxy:ransomware=\"CryptoMeister Ransomware\""],"Zeta":["misp-galaxy:ransomware=\"CryptoMix\""],"CryptoNar":["misp-galaxy:ransomware=\"CryptoNar\""],"CryptoRoger":["misp-galaxy:ransomware=\"CryptoRoger\""],"CryptoShadow":["misp-galaxy:ransomware=\"CryptoShadow\""],"CryptoShield 1.0 Ransomware":["misp-galaxy:ransomware=\"CryptoShield 1.0 Ransomware\""],"CryptoShocker":["misp-galaxy:ransomware=\"CryptoShocker\""],"CryptoSweetTooth Ransomware":["misp-galaxy:ransomware=\"CryptoSweetTooth Ransomware\""],"CryptoTorLocker2015":["misp-galaxy:ransomware=\"CryptoTorLocker2015\""],"CryptoTrooper":["misp-galaxy:ransomware=\"CryptoTrooper\""],"CryptoWall 1":["misp-galaxy:ransomware=\"CryptoWall 1\""],"CryptoWall 2":["misp-galaxy:ransomware=\"CryptoWall 2\""],"CryptoWall 3":["misp-galaxy:ransomware=\"CryptoWall 3\""],"CryptoWall 4":["misp-galaxy:ransomware=\"CryptoWall 4\""],"CryptoWire Ransomeware":["misp-galaxy:ransomware=\"CryptoWire Ransomeware\""],"Crypton Ransomware":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"Nemesis":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"X3M":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"Cryptorium (Fake Ransomware)":["misp-galaxy:ransomware=\"Cryptorium (Fake Ransomware)\""],"Crypute Ransomware":["misp-galaxy:ransomware=\"Crypute Ransomware\""],"m0on Ransomware":["misp-galaxy:ransomware=\"Crypute Ransomware\""],"CuteRansomware":["misp-galaxy:ransomware=\"CuteRansomware\""],"my-Little-Ransomware":["misp-galaxy:ransomware=\"CuteRansomware\""],"Cyber Drill Exercise ":["misp-galaxy:ransomware=\"Cyber Drill Exercise \""],"Ransomuhahawhere":["misp-galaxy:ransomware=\"Cyber Drill Exercise \""],"Cyber SpLiTTer Vbs":["misp-galaxy:ransomware=\"Cyber SpLiTTer Vbs\""],"Cyron":["misp-galaxy:ransomware=\"Cyron\""],"DBGer Ransomware":["misp-galaxy:ransomware=\"DBGer Ransomware\""],"DEDCryptor":["misp-galaxy:ransomware=\"DEDCryptor\""],"DMALocker 3.0":["misp-galaxy:ransomware=\"DMALocker 3.0\""],"DMALocker":["misp-galaxy:ransomware=\"DMALocker\""],"DN":["misp-galaxy:ransomware=\"DN\""],"Fake":["misp-galaxy:ransomware=\"DN\""],"DNRansomware":["misp-galaxy:ransomware=\"DNRansomware\""],"DUMB Ransomware":["misp-galaxy:ransomware=\"DUMB Ransomware\""],"DXXD":["misp-galaxy:ransomware=\"DXXD\""],"Dablio Ransomware":["misp-galaxy:ransomware=\"Dablio Ransomware\""],"Dale Ransomware":["misp-galaxy:ransomware=\"Dale Ransomware\""],"DaleLocker Ransomware":["misp-galaxy:ransomware=\"Dale Ransomware\""],"Damage Ransomware":["misp-galaxy:ransomware=\"Damage Ransomware\""],"Dangerous Ransomware":["misp-galaxy:ransomware=\"Dangerous Ransomware\""],"DeCrypt Protect":["misp-galaxy:ransomware=\"DeCrypt Protect\""],"DeLpHiMoRix":["misp-galaxy:ransomware=\"DeLpHiMoRix\""],"DelphiMorix":["misp-galaxy:ransomware=\"DeLpHiMoRix\""],"Deadly Ransomware":["misp-galaxy:ransomware=\"Deadly Ransomware\""],"Deadly for a Good Purpose Ransomware":["misp-galaxy:ransomware=\"Deadly Ransomware\""],"Death Bitches":["misp-galaxy:ransomware=\"Death Bitches\""],"DecryptFox Ransomware":["misp-galaxy:ransomware=\"DecryptFox Ransomware\""],"Demo":["misp-galaxy:ransomware=\"Demo\""],"DeriaLock Ransomware":["misp-galaxy:ransomware=\"DeriaLock Ransomware\""],"DetoxCrypto":["misp-galaxy:ransomware=\"DetoxCrypto\""],"Dharma Ransomware":["misp-galaxy:ransomware=\"Dharma Ransomware\""],"Digisom":["misp-galaxy:ransomware=\"Digisom\""],"DirtyDecrypt":["misp-galaxy:ransomware=\"DirtyDecrypt\""],"DiskDoctor":["misp-galaxy:ransomware=\"DiskDoctor\""],"Scarab-DiskDoctor":["misp-galaxy:ransomware=\"DiskDoctor\""],"DoNotChange":["misp-galaxy:ransomware=\"DoNotChange\""],"Domino":["misp-galaxy:ransomware=\"Domino\""],"Donald Trump 2 Ransomware":["misp-galaxy:ransomware=\"Donald Trump 2 Ransomware\""],"Donut":["misp-galaxy:ransomware=\"Donut\""],"DotRansomware":["misp-galaxy:ransomware=\"DotRansomware\""],"DummyEncrypter Ransomware":["misp-galaxy:ransomware=\"DummyEncrypter Ransomware\""],"DummyLocker":["misp-galaxy:ransomware=\"DummyLocker\""],"DynA-Crypt Ransomware":["misp-galaxy:ransomware=\"DynA-Crypt Ransomware\""],"DynA CryptoLocker Ransomware":["misp-galaxy:ransomware=\"DynA-Crypt Ransomware\""],"EQ Ransomware":["misp-galaxy:ransomware=\"EQ Ransomware\""],"EdgeLocker":["misp-galaxy:ransomware=\"EdgeLocker\""],"EduCrypt":["misp-galaxy:ransomware=\"EduCrypt\""],"EduCrypter":["misp-galaxy:ransomware=\"EduCrypt\""],"EiTest":["misp-galaxy:ransomware=\"EiTest\""],"El-Polocker":["misp-galaxy:ransomware=\"El-Polocker\""],"Los Pollos Hermanos":["misp-galaxy:ransomware=\"El-Polocker\""],"Encoder.xxxx":["misp-galaxy:ransomware=\"Encoder.xxxx\""],"Trojan.Encoder.6491":["misp-galaxy:ransomware=\"Encoder.xxxx\"","misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"EncrypTile Ransomware":["misp-galaxy:ransomware=\"EncrypTile Ransomware\""],"Encryptss77 Ransomware":["misp-galaxy:ransomware=\"Encryptss77 Ransomware\""],"SFX Monster Ransomware":["misp-galaxy:ransomware=\"Encryptss77 Ransomware\""],"Enigma 2 Ransomware":["misp-galaxy:ransomware=\"Enigma 2 Ransomware\""],"Enigma":["misp-galaxy:ransomware=\"Enigma\""],"Enjey":["misp-galaxy:ransomware=\"Enjey\""],"EnjeyCrypter Ransomware":["misp-galaxy:ransomware=\"EnjeyCrypter Ransomware\""],"EnkripsiPC Ransomware":["misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"IDRANSOMv3":["misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"EnyBeny Nuclear Ransomware":["misp-galaxy:ransomware=\"EnyBeny Nuclear Ransomware\""],"EnyBenyHorsuke Ransomware":["misp-galaxy:ransomware=\"EnyBenyHorsuke Ransomware\""],"Erebus 2017 Ransomware":["misp-galaxy:ransomware=\"Erebus 2017 Ransomware\""],"Erebus Ransomware":["misp-galaxy:ransomware=\"Erebus Ransomware\""],"Esmeralda Ransomware":["misp-galaxy:ransomware=\"Esmeralda Ransomware\""],"Everbe Ransomware":["misp-galaxy:ransomware=\"Everbe Ransomware\""],"Evil Ransomware":["misp-galaxy:ransomware=\"Evil Ransomware\""],"File0Locked KZ Ransomware":["misp-galaxy:ransomware=\"Evil Ransomware\""],"Exotic Ransomware":["misp-galaxy:ransomware=\"Exotic Ransomware\""],"FILE FROZR":["misp-galaxy:ransomware=\"FILE FROZR\""],"FLKR Ransomware":["misp-galaxy:ransomware=\"FLKR Ransomware\""],"FSociety":["misp-galaxy:ransomware=\"FSociety\""],"FabSysCrypto Ransomware":["misp-galaxy:ransomware=\"FabSysCrypto Ransomware\""],"Fadesoft Ransomware":["misp-galaxy:ransomware=\"Fadesoft Ransomware\""],"Fairware":["misp-galaxy:ransomware=\"Fairware\""],"Fakben":["misp-galaxy:ransomware=\"Fakben\""],"Fake Globe Ransomware":["misp-galaxy:ransomware=\"Fake Globe Ransomware\""],"Globe Imposter":["misp-galaxy:ransomware=\"Fake Globe Ransomware\""],"Fake Locky Ransomware":["misp-galaxy:ransomware=\"Fake Locky Ransomware\""],"Locky Impersonator Ransomware":["misp-galaxy:ransomware=\"Fake Locky Ransomware\""],"FakeCryptoLocker":["misp-galaxy:ransomware=\"FakeCryptoLocker\""],"Fantom":["misp-galaxy:ransomware=\"Fantom\""],"Comrad Circle":["misp-galaxy:ransomware=\"Fantom\""],"FenixLocker":["misp-galaxy:ransomware=\"FenixLocker\""],"File Spider":["misp-galaxy:ransomware=\"File Spider\""],"File-Locker":["misp-galaxy:ransomware=\"File-Locker\""],"FindZip":["misp-galaxy:ransomware=\"FileCoder\""],"FileLocker":["misp-galaxy:ransomware=\"FileLocker\""],"Fileice Ransomware Survey Ransomware":["misp-galaxy:ransomware=\"Fileice Ransomware Survey Ransomware\""],"First":["misp-galaxy:ransomware=\"First\""],"FlatChestWare":["misp-galaxy:ransomware=\"FlatChestWare\""],"Flotera Ransomware":["misp-galaxy:ransomware=\"Flotera Ransomware\""],"Flyper":["misp-galaxy:ransomware=\"Flyper\""],"Fonco":["misp-galaxy:ransomware=\"Fonco\""],"Forma Ransomware":["misp-galaxy:ransomware=\"Forma Ransomware\""],"FortuneCookie ":["misp-galaxy:ransomware=\"FortuneCookie \""],"FortuneCookie":["misp-galaxy:ransomware=\"FortuneCookie\""],"Free-Freedom":["misp-galaxy:ransomware=\"Free-Freedom\""],"Roga":["misp-galaxy:ransomware=\"Free-Freedom\"","misp-galaxy:ransomware=\"Roga\""],"Fs0ciety Locker Ransomware":["misp-galaxy:ransomware=\"Fs0ciety Locker Ransomware\""],"FuckSociety Ransomware":["misp-galaxy:ransomware=\"FuckSociety Ransomware\""],"FunFact Ransomware":["misp-galaxy:ransomware=\"FunFact Ransomware\""],"Fury":["misp-galaxy:ransomware=\"Fury\""],"Fusob":["misp-galaxy:ransomware=\"Fusob\""],"GC47 Ransomware":["misp-galaxy:ransomware=\"GC47 Ransomware\""],"GG Ransomware":["misp-galaxy:ransomware=\"GG Ransomware\""],"GNL Locker":["misp-galaxy:ransomware=\"GNL Locker\"","misp-galaxy:ransomware=\"Zyklon\""],"GOG Ransomware":["misp-galaxy:ransomware=\"GOG Ransomware\""],"GandCrab":["misp-galaxy:ransomware=\"GandCrab\""],"GarryWeber Ransomware":["misp-galaxy:ransomware=\"GarryWeber Ransomware\""],"Gerber Ransomware 1.0":["misp-galaxy:ransomware=\"Gerber Ransomware 1.0\""],"Gerber Ransomware 3.0":["misp-galaxy:ransomware=\"Gerber Ransomware 3.0\""],"GetCrypt":["misp-galaxy:ransomware=\"GetCrypt\""],"GhostCrypt":["misp-galaxy:ransomware=\"GhostCrypt\""],"Gingerbread":["misp-galaxy:ransomware=\"Gingerbread\""],"Globe v1":["misp-galaxy:ransomware=\"Globe v1\""],"Purge":["misp-galaxy:ransomware=\"Globe v1\""],"Globe2 Ransomware":["misp-galaxy:ransomware=\"Globe2 Ransomware\""],"Purge Ransomware":["misp-galaxy:ransomware=\"Globe2 Ransomware\"","misp-galaxy:ransomware=\"Globe3 Ransomware\""],"Globe3 Ransomware":["misp-galaxy:ransomware=\"Globe3 Ransomware\""],"God Crypt Joke Ransomware":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"Godsomware v1.0":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"Ransomware God Crypt":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"GoldenEye Ransomware":["misp-galaxy:ransomware=\"GoldenEye Ransomware\""],"Gomasom":["misp-galaxy:ransomware=\"Gomasom\""],"Goopic":["misp-galaxy:ransomware=\"Goopic\""],"Gopher":["misp-galaxy:ransomware=\"Gopher\""],"Gremit Ransomware":["misp-galaxy:ransomware=\"Gremit Ransomware\""],"Guster Ransomware":["misp-galaxy:ransomware=\"Guster Ransomware\""],"HC6":["misp-galaxy:ransomware=\"HC6\""],"HC7":["misp-galaxy:ransomware=\"HC7\""],"HPE iLO 4 Ransomware":["misp-galaxy:ransomware=\"HPE iLO 4 Ransomware\""],"HTCryptor":["misp-galaxy:ransomware=\"HTCryptor\""],"Hacked":["misp-galaxy:ransomware=\"Hacked\""],"HackedLocker Ransomware":["misp-galaxy:ransomware=\"HackedLocker Ransomware\""],"Halloware":["misp-galaxy:ransomware=\"Halloware\""],"HappyDayzz":["misp-galaxy:ransomware=\"HappyDayzz\""],"Harasom":["misp-galaxy:ransomware=\"Harasom\""],"Havoc":["misp-galaxy:ransomware=\"Havoc\""],"HavocCrypt Ransomware":["misp-galaxy:ransomware=\"Havoc\""],"Haxerboi Ransomware":["misp-galaxy:ransomware=\"Haxerboi Ransomware\""],"Heimdall":["misp-galaxy:ransomware=\"Heimdall\""],"Help_dcfile":["misp-galaxy:ransomware=\"Help_dcfile\""],"Hi Buddy!":["misp-galaxy:ransomware=\"Hi Buddy!\""],"Cryptear":["misp-galaxy:ransomware=\"HiddenTear\""],"Hidden Tear":["misp-galaxy:ransomware=\"HiddenTear\""],"Hitler":["misp-galaxy:ransomware=\"Hitler\""],"Hollycrypt Ransomware":["misp-galaxy:ransomware=\"Hollycrypt Ransomware\""],"HolyCrypt":["misp-galaxy:ransomware=\"HolyCrypt\""],"Hucky Ransomware":["misp-galaxy:ransomware=\"Hucky Ransomware\""],"Hungarian Locky Ransomware":["misp-galaxy:ransomware=\"Hucky Ransomware\""],"HugeMe Ransomware":["misp-galaxy:ransomware=\"HugeMe Ransomware\""],"HydraCrypt":["misp-galaxy:ransomware=\"HydraCrypt\""],"IFN643 Ransomware":["misp-galaxy:ransomware=\"IFN643 Ransomware\""],"International Police Association":["misp-galaxy:ransomware=\"International Police Association\""],"Iron":["misp-galaxy:ransomware=\"Iron\""],"Ishtar Ransomware":["misp-galaxy:ransomware=\"Ishtar Ransomware\""],"JackPot Ransomware":["misp-galaxy:ransomware=\"JackPot Ransomware\""],"Jack.Pot Ransomware":["misp-galaxy:ransomware=\"JackPot Ransomware\""],"JagerDecryptor":["misp-galaxy:ransomware=\"JagerDecryptor\""],"JapanLocker Ransomware":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SHC Ransomware":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SHCLocker":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SyNcryption":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"Jeff the Ransomware":["misp-galaxy:ransomware=\"Jeff the Ransomware\""],"Jeiphoos":["misp-galaxy:ransomware=\"Jeiphoos\""],"Encryptor RaaS":["misp-galaxy:ransomware=\"Jeiphoos\""],"Sarento":["misp-galaxy:ransomware=\"Jeiphoos\""],"Jhon Woddy":["misp-galaxy:ransomware=\"Jhon Woddy\""],"CryptoHitMan":["misp-galaxy:ransomware=\"Jigsaw\""],"Job Crypter":["misp-galaxy:ransomware=\"Job Crypter\""],"JohnyCryptor":["misp-galaxy:ransomware=\"JohnyCryptor\""],"Jokeroo":["misp-galaxy:ransomware=\"Jokeroo\""],"Fake GandCrab":["misp-galaxy:ransomware=\"Jokeroo\""],"JungleSec":["misp-galaxy:ransomware=\"JungleSec\""],"KEYHolder":["misp-galaxy:ransomware=\"KEYHolder\""],"KEYPASS":["misp-galaxy:ransomware=\"KEYPASS\""],"KRider Ransomware":["misp-galaxy:ransomware=\"KRider Ransomware\""],"Kaandsona Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"RansomTroll Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"K\u00e4\u00e4nds\u00f5na Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"Kaenlupuf Ransomware":["misp-galaxy:ransomware=\"Kaenlupuf Ransomware\""],"Kangaroo Ransomware":["misp-galaxy:ransomware=\"Kangaroo Ransomware\""],"Kappa":["misp-galaxy:ransomware=\"Kappa\""],"Karma Ransomware":["misp-galaxy:ransomware=\"Karma Ransomware\""],"Karmen Ransomware":["misp-galaxy:ransomware=\"Karmen Ransomware\""],"Kasiski Ransomware":["misp-galaxy:ransomware=\"Kasiski Ransomware\""],"KawaiiLocker":["misp-galaxy:ransomware=\"KawaiiLocker\""],"KeyBTC":["misp-galaxy:ransomware=\"KeyBTC\""],"KillDisk Ransomware":["misp-galaxy:ransomware=\"KillDisk Ransomware\""],"KillerLocker":["misp-galaxy:ransomware=\"KillerLocker\""],"KimcilWare":["misp-galaxy:ransomware=\"KimcilWare\""],"Kirk Ransomware & Spock Decryptor":["misp-galaxy:ransomware=\"Kirk Ransomware & Spock Decryptor\""],"KoKoKrypt Ransomware":["misp-galaxy:ransomware=\"KoKoKrypt Ransomware\""],"KokoLocker Ransomware":["misp-galaxy:ransomware=\"KoKoKrypt Ransomware\""],"Kolobo Ransomware":["misp-galaxy:ransomware=\"Kolobo Ransomware\""],"Kolobocheg Ransomware":["misp-galaxy:ransomware=\"Kolobo Ransomware\""],"Koolova Ransomware":["misp-galaxy:ransomware=\"Koolova Ransomware\""],"Korean":["misp-galaxy:ransomware=\"Korean\""],"Kostya Ransomware":["misp-galaxy:ransomware=\"Kostya Ransomware\""],"Kozy.Jozy":["misp-galaxy:ransomware=\"Kozy.Jozy\""],"QC":["misp-galaxy:ransomware=\"Kozy.Jozy\""],"Kraken Cryptor Ransomware":["misp-galaxy:ransomware=\"Kraken Cryptor Ransomware\""],"Kraken Ransomware":["misp-galaxy:ransomware=\"Kraken Ransomware\""],"KratosCrypt":["misp-galaxy:ransomware=\"KratosCrypt\""],"KryptoLocker":["misp-galaxy:ransomware=\"KryptoLocker\""],"L33TAF Locker Ransomware":["misp-galaxy:ransomware=\"L33TAF Locker Ransomware\""],"LK Encryption":["misp-galaxy:ransomware=\"LK Encryption\""],"LLTP Locker":["misp-galaxy:ransomware=\"LLTP Locker\""],"LambdaLocker Ransomware":["misp-galaxy:ransomware=\"LambdaLocker Ransomware\""],"LanRan":["misp-galaxy:ransomware=\"LanRan\""],"LeChiffre":["misp-galaxy:ransomware=\"LeChiffre\""],"Lick":["misp-galaxy:ransomware=\"Lick\""],"Linux.Encoder":["misp-galaxy:ransomware=\"Linux.Encoder\""],"Linux.Encoder.{0,3}":["misp-galaxy:ransomware=\"Linux.Encoder\""],"Lock2017 Ransomware":["misp-galaxy:ransomware=\"Lock2017 Ransomware\""],"Lock93 Ransomware":["misp-galaxy:ransomware=\"Lock93 Ransomware\""],"LockCrypt":["misp-galaxy:ransomware=\"LockCrypt\""],"LockLock":["misp-galaxy:ransomware=\"LockLock\""],"Locked-In Ransomware or NoValid Ransomware":["misp-galaxy:ransomware=\"Locked-In Ransomware or NoValid Ransomware\""],"Locker":["misp-galaxy:ransomware=\"Locker\""],"Lomix Ransomware":["misp-galaxy:ransomware=\"Lomix Ransomware\""],"Lortok":["misp-galaxy:ransomware=\"Lortok\""],"LoveLock Ransomware or Love2Lock Ransomware":["misp-galaxy:ransomware=\"LoveLock Ransomware or Love2Lock Ransomware\""],"LoveServer Ransomware ":["misp-galaxy:ransomware=\"LoveServer Ransomware \""],"LowLevel04":["misp-galaxy:ransomware=\"LowLevel04\""],"M4N1F3STO Ransomware (FAKE!!!!!)":["misp-galaxy:ransomware=\"M4N1F3STO Ransomware (FAKE!!!!!)\""],"M4N1F3STO":["misp-galaxy:ransomware=\"M4N1F3STO\""],"M@r1a ransomware":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"M@r1a":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"BlackHeart":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"MC Ransomware":["misp-galaxy:ransomware=\"MC Ransomware\""],"MIRCOP":["misp-galaxy:ransomware=\"MIRCOP\""],"Crypt888":["misp-galaxy:ransomware=\"MIRCOP\""],"MM Locker":["misp-galaxy:ransomware=\"MM Locker\""],"MOTD Ransomware":["misp-galaxy:ransomware=\"MOTD Ransomware\""],"MSN CryptoLocker Ransomware":["misp-galaxy:ransomware=\"MSN CryptoLocker Ransomware\""],"MVP Ransomware":["misp-galaxy:ransomware=\"MVP Ransomware\""],"Mabouia":["misp-galaxy:ransomware=\"Mabouia\""],"MacAndChess":["misp-galaxy:ransomware=\"MacAndChess\""],"MafiaWare Ransomware":["misp-galaxy:ransomware=\"MafiaWare Ransomware\""],"Depsex Ransomware":["misp-galaxy:ransomware=\"MafiaWare Ransomware\""],"Magic":["misp-galaxy:ransomware=\"Magic\""],"Magniber Ransomware":["misp-galaxy:ransomware=\"Magniber Ransomware\""],"MaktubLocker":["misp-galaxy:ransomware=\"MaktubLocker\""],"Manifestus Ransomware ":["misp-galaxy:ransomware=\"Manifestus Ransomware \""],"Marlboro Ransomware":["misp-galaxy:ransomware=\"Marlboro Ransomware\""],"MarsJoke":["misp-galaxy:ransomware=\"MarsJoke\""],"MasterBuster Ransomware":["misp-galaxy:ransomware=\"MasterBuster Ransomware\""],"Matrix":["misp-galaxy:ransomware=\"Matrix\""],"Malta Ransomware":["misp-galaxy:ransomware=\"Matrix\""],"Matrix Ransomware":["misp-galaxy:ransomware=\"Matrix\""],"Meister":["misp-galaxy:ransomware=\"Meister\""],"Mercury Ransomware":["misp-galaxy:ransomware=\"Mercury Ransomware\""],"Merry Christmas":["misp-galaxy:ransomware=\"Merry Christmas\""],"Merry X-Mas":["misp-galaxy:ransomware=\"Merry Christmas\""],"MRCR":["misp-galaxy:ransomware=\"Merry Christmas\""],"Meteoritan":["misp-galaxy:ransomware=\"Meteoritan\""],"MireWare":["misp-galaxy:ransomware=\"MireWare\""],"Mischa":["misp-galaxy:ransomware=\"Mischa\""],"\"Petya's little brother\"":["misp-galaxy:ransomware=\"Mischa\""],"Mobef":["misp-galaxy:ransomware=\"Mobef\""],"Yakes":["misp-galaxy:ransomware=\"Mobef\""],"Mongo Lock":["misp-galaxy:ransomware=\"Mongo Lock\""],"Monument":["misp-galaxy:ransomware=\"Monument\""],"N-Splitter":["misp-galaxy:ransomware=\"N-Splitter\""],"NCrypt Ransomware":["misp-galaxy:ransomware=\"NCrypt Ransomware\""],"NMCRYPT Ransomware":["misp-galaxy:ransomware=\"NMCRYPT Ransomware\""],"NMoreia 2.0 Ransomware":["misp-galaxy:ransomware=\"NMoreia 2.0 Ransomware\""],"HakunaMatataRansomware":["misp-galaxy:ransomware=\"NMoreia 2.0 Ransomware\""],"NMoreira Ransomware":["misp-galaxy:ransomware=\"NMoreira Ransomware\""],"Fake Maktub Ransomware":["misp-galaxy:ransomware=\"NMoreira Ransomware\""],"NMoreira":["misp-galaxy:ransomware=\"NMoreira\""],"XRatTeam":["misp-galaxy:ransomware=\"NMoreira\""],"XPan":["misp-galaxy:ransomware=\"NMoreira\""],"Nagini Ransomware":["misp-galaxy:ransomware=\"Nagini Ransomware\""],"Voldemort Ransomware":["misp-galaxy:ransomware=\"Nagini Ransomware\""],"NemeS1S Ransomware":["misp-galaxy:ransomware=\"NemeS1S Ransomware\""],"Nemesis Ransomware":["misp-galaxy:ransomware=\"Nemesis Ransomware\""],"Nemucod":["misp-galaxy:ransomware=\"Nemucod\""],"Netflix Ransomware":["misp-galaxy:ransomware=\"Netflix Ransomware\""],"Netix":["misp-galaxy:ransomware=\"Netix\""],"RANSOM_NETIX.A":["misp-galaxy:ransomware=\"Netix\""],"Nhtnwcuf Ransomware (Fake)":["misp-galaxy:ransomware=\"Nhtnwcuf Ransomware (Fake)\""],"Nhtnwcuf":["misp-galaxy:ransomware=\"Nhtnwcuf\""],"NoobCrypt":["misp-galaxy:ransomware=\"NoobCrypt\""],"Nuke":["misp-galaxy:ransomware=\"Nuke\""],"Nullbyte":["misp-galaxy:ransomware=\"Nullbyte\""],"ODCODC":["misp-galaxy:ransomware=\"ODCODC\""],"OMG! Ransomware":["misp-galaxy:ransomware=\"OMG! Ransomware\""],"ONYX Ransomeware":["misp-galaxy:ransomware=\"ONYX Ransomeware\""],"OXAR":["misp-galaxy:ransomware=\"OXAR\""],"Ocelot Ransomware (FAKE RANSOMWARE)":["misp-galaxy:ransomware=\"Ocelot Ransomware (FAKE RANSOMWARE)\""],"Ocelot Locker Ransomware":["misp-galaxy:ransomware=\"Ocelot Ransomware (FAKE RANSOMWARE)\""],"Offline ransomware":["misp-galaxy:ransomware=\"Offline ransomware\""],"Vipasana":["misp-galaxy:ransomware=\"Offline ransomware\""],"Operation Global III":["misp-galaxy:ransomware=\"Operation Global III\""],"Outsider":["misp-galaxy:ransomware=\"Outsider\""],"Owl":["misp-galaxy:ransomware=\"Owl\""],"OzozaLocker Ransomware":["misp-galaxy:ransomware=\"OzozaLocker Ransomware\""],"PClock3 Ransomware":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"PClock SuppTeam Ransomware":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"WinPlock":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"CryptoLocker clone":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"PClock4 Ransomware":["misp-galaxy:ransomware=\"PClock4 Ransomware\""],"PClock SysGop Ransomware":["misp-galaxy:ransomware=\"PClock4 Ransomware\""],"PGPSnippet Ransomware":["misp-galaxy:ransomware=\"PGPSnippet Ransomware\""],"PICO Ransomware":["misp-galaxy:ransomware=\"PICO Ransomware\""],"Pico Ransomware":["misp-galaxy:ransomware=\"PICO Ransomware\""],"PRISM":["misp-galaxy:ransomware=\"PRISM\""],"PUBG Ransomware":["misp-galaxy:ransomware=\"PUBG Ransomware\""],"Padlock Screenlocker":["misp-galaxy:ransomware=\"Padlock Screenlocker\""],"Paradise Ransomware":["misp-galaxy:ransomware=\"Paradise Ransomware\""],"PayDOS Ransomware":["misp-galaxy:ransomware=\"PayDOS Ransomware\""],"Serpent Ransomware":["misp-galaxy:ransomware=\"PayDOS Ransomware\""],"PayDay Ransomware ":["misp-galaxy:ransomware=\"PayDay Ransomware \""],"PaySafeGen (German) Ransomware":["misp-galaxy:ransomware=\"PaySafeGen (German) Ransomware\""],"Paysafecard Generator 2016":["misp-galaxy:ransomware=\"PaySafeGen (German) Ransomware\""],"Pedcont":["misp-galaxy:ransomware=\"Pedcont\""],"PetrWrap Ransomware":["misp-galaxy:ransomware=\"PetrWrap Ransomware\""],"Goldeneye":["misp-galaxy:ransomware=\"Petya\""],"Philadelphia":["misp-galaxy:ransomware=\"Philadelphia\""],"Phobos":["misp-galaxy:ransomware=\"Phobos\""],"PicklesRansomware":["misp-galaxy:ransomware=\"PicklesRansomware\""],"PizzaCrypts":["misp-galaxy:ransomware=\"PizzaCrypts\""],"Planetary":["misp-galaxy:ransomware=\"Planetary\""],"PleaseRead Ransomware":["misp-galaxy:ransomware=\"PleaseRead Ransomware\""],"VHDLocker Ransomware":["misp-galaxy:ransomware=\"PleaseRead Ransomware\""],"PokemonGO":["misp-galaxy:ransomware=\"PokemonGO\""],"Polski Ransomware":["misp-galaxy:ransomware=\"Polski Ransomware\""],"PopCorn Time Ransomware":["misp-galaxy:ransomware=\"PopCorn Time Ransomware\""],"Potato Ransomware":["misp-galaxy:ransomware=\"Potato Ransomware\""],"PoshCoder":["misp-galaxy:ransomware=\"PowerWare\""],"PowerWorm":["misp-galaxy:ransomware=\"PowerWorm\""],"Princess Evolution":["misp-galaxy:ransomware=\"Princess Evolution\""],"Princess Locker":["misp-galaxy:ransomware=\"Princess Locker\""],"Project34 Ransomware":["misp-galaxy:ransomware=\"Project34 Ransomware\""],"ProposalCrypt Ransomware":["misp-galaxy:ransomware=\"ProposalCrypt Ransomware\""],"Ps2exe":["misp-galaxy:ransomware=\"Ps2exe\""],"PyCL Ransomware":["misp-galaxy:ransomware=\"PyCL Ransomware\""],"PyL33T Ransomware":["misp-galaxy:ransomware=\"PyL33T Ransomware\""],"Qwerty Ransomware":["misp-galaxy:ransomware=\"Qwerty Ransomware\""],"R":["misp-galaxy:ransomware=\"R\""],"R980":["misp-galaxy:ransomware=\"R980\""],"RAA encryptor":["misp-galaxy:ransomware=\"RAA encryptor\""],"RAA":["misp-galaxy:ransomware=\"RAA encryptor\""],"RASTAKHIZ":["misp-galaxy:ransomware=\"RASTAKHIZ\""],"RIP (Phoenix) Ransomware":["misp-galaxy:ransomware=\"RIP (Phoenix) Ransomware\""],"RSAUtil":["misp-galaxy:ransomware=\"RSAUtil\""],"Vagger":["misp-galaxy:ransomware=\"RSAUtil\""],"DONTSLIP":["misp-galaxy:ransomware=\"RSAUtil\""],"Rabion":["misp-galaxy:ransomware=\"Rabion\""],"Agent.iih":["misp-galaxy:ransomware=\"Rakhni\""],"Aura":["misp-galaxy:ransomware=\"Rakhni\""],"Autoit":["misp-galaxy:ransomware=\"Rakhni\""],"Pletor":["misp-galaxy:ransomware=\"Rakhni\""],"Lamer":["misp-galaxy:ransomware=\"Rakhni\""],"Isda":["misp-galaxy:ransomware=\"Rakhni\""],"Cryptokluchen":["misp-galaxy:ransomware=\"Rakhni\""],"Ramsomeer":["misp-galaxy:ransomware=\"Ramsomeer\""],"RanRan":["misp-galaxy:ransomware=\"RanRan\""],"Ranion RaasRansomware":["misp-galaxy:ransomware=\"Ranion RaasRansomware\""],"Rannoh":["misp-galaxy:ransomware=\"Rannoh\""],"Ransom32":["misp-galaxy:ransomware=\"Ransom32\""],"RansomLock":["misp-galaxy:ransomware=\"RansomLock\""],"RansomPlus":["misp-galaxy:ransomware=\"RansomPlus\""],"RarVault":["misp-galaxy:ransomware=\"RarVault\""],"Razy":["misp-galaxy:ransomware=\"Razy\""],"Rector":["misp-galaxy:ransomware=\"Rector\""],"RedAnts Ransomware":["misp-galaxy:ransomware=\"RedAnts Ransomware\""],"RedEye":["misp-galaxy:ransomware=\"RedEye\""],"RektLocker":["misp-galaxy:ransomware=\"RektLocker\""],"Rektware":["misp-galaxy:ransomware=\"Rektware\""],"RemindMe":["misp-galaxy:ransomware=\"RemindMe\""],"RenLocker Ransomware (FAKE)":["misp-galaxy:ransomware=\"RenLocker Ransomware (FAKE)\""],"Revenge Ransomware":["misp-galaxy:ransomware=\"Revenge Ransomware\""],"Reveton ransomware":["misp-galaxy:ransomware=\"Reveton ransomware\""],"RoshaLock":["misp-galaxy:ransomware=\"RoshaLock\""],"RotorCrypt(RotoCrypt, Tar) Ransomware":["misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"Tar Ransomware":["misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"RozaLocker Ransomware":["misp-galaxy:ransomware=\"RozaLocker Ransomware\""],"Runsomewere":["misp-galaxy:ransomware=\"Runsomewere\""],"Russian Globe Ransomware":["misp-galaxy:ransomware=\"Russian Globe Ransomware\""],"RussianRoulette":["misp-galaxy:ransomware=\"RussianRoulette\""],"Ryuk ransomware":["misp-galaxy:ransomware=\"Ryuk ransomware\""],"SADStory":["misp-galaxy:ransomware=\"SADStory\""],"SAVEfiles":["misp-galaxy:ransomware=\"SAVEfiles\""],"SNSLocker":["misp-galaxy:ransomware=\"SNSLocker\""],"SOREBRECT":["misp-galaxy:ransomware=\"SOREBRECT\""],"SQ_ Ransomware":["misp-galaxy:ransomware=\"SQ_ Ransomware\""],"VO_ Ransomware":["misp-galaxy:ransomware=\"SQ_ Ransomware\""],"SZFLocker":["misp-galaxy:ransomware=\"SZFLocker\""],"Sage 2.0 Ransomware":["misp-galaxy:ransomware=\"Sage 2.0 Ransomware\""],"Sage 2.2":["misp-galaxy:ransomware=\"Sage 2.2\""],"Sage Ransomware":["misp-galaxy:ransomware=\"Sage Ransomware\""],"Samas-Samsam":["misp-galaxy:ransomware=\"Samas-Samsam\""],"samsam.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"MIKOPONI.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"RikiRafael.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"showmehowto.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"SamSam Ransomware":["misp-galaxy:ransomware=\"Samas-Samsam\""],"Samsam":["misp-galaxy:ransomware=\"Samas-Samsam\""],"Sanction":["misp-galaxy:ransomware=\"Sanction\""],"Sanctions":["misp-galaxy:ransomware=\"Sanctions\""],"Sardoninir":["misp-galaxy:ransomware=\"Sardoninir\""],"Satan666 Ransomware":["misp-galaxy:ransomware=\"Satan666 Ransomware\""],"Scarab":["misp-galaxy:ransomware=\"Scarab\""],"Scraper":["misp-galaxy:ransomware=\"Scraper\""],"Seoirse Ransomware":["misp-galaxy:ransomware=\"Seoirse Ransomware\""],"SerbRansom 2017 Ransomware":["misp-galaxy:ransomware=\"SerbRansom 2017 Ransomware\""],"Serpent 2017 Ransomware":["misp-galaxy:ransomware=\"Serpent 2017 Ransomware\""],"Serpent Danish Ransomware":["misp-galaxy:ransomware=\"Serpent 2017 Ransomware\""],"Shark":["misp-galaxy:ransomware=\"Shark\"","misp-galaxy:rat=\"SharK\""],"Atom":["misp-galaxy:ransomware=\"Shark\""],"ShellLocker Ransomware":["misp-galaxy:ransomware=\"ShellLocker Ransomware\""],"ShinoLocker":["misp-galaxy:ransomware=\"ShinoLocker\""],"KinCrypt":["misp-galaxy:ransomware=\"Shujin\""],"ShurL0ckr":["misp-galaxy:ransomware=\"ShurL0ckr\""],"Sigma Ransomware":["misp-galaxy:ransomware=\"Sigma Ransomware\""],"Sigrun Ransomware":["misp-galaxy:ransomware=\"Sigrun Ransomware\""],"Simple_Encoder":["misp-galaxy:ransomware=\"Simple_Encoder\""],"SkidLocker":["misp-galaxy:ransomware=\"SkidLocker\""],"Pompous":["misp-galaxy:ransomware=\"SkidLocker\""],"SkyFile":["misp-galaxy:ransomware=\"SkyFile\""],"SkyName Ransomware":["misp-galaxy:ransomware=\"SkyName Ransomware\""],"Blablabla Ransomware":["misp-galaxy:ransomware=\"SkyName Ransomware\""],"Slimhem Ransomware":["misp-galaxy:ransomware=\"Slimhem Ransomware\""],"Smash!":["misp-galaxy:ransomware=\"Smash!\""],"Smrss32":["misp-galaxy:ransomware=\"Smrss32\""],"Sodinokibi":["misp-galaxy:ransomware=\"Sodinokibi\""],"Spartacus Ransomware":["misp-galaxy:ransomware=\"Spartacus Ransomware\""],"Spora Ransomware":["misp-galaxy:ransomware=\"Spora Ransomware\""],"Sport":["misp-galaxy:ransomware=\"Sport\"","misp-galaxy:sector=\"Sport\""],"Stampado":["misp-galaxy:ransomware=\"Stampado\""],"StorageCrypt":["misp-galaxy:ransomware=\"StorageCrypt\""],"StorageCrypter":["misp-galaxy:ransomware=\"StorageCrypter\""],"Strictor":["misp-galaxy:ransomware=\"Strictor\""],"SuchSecurity Ransomware":["misp-galaxy:ransomware=\"SuchSecurity Ransomware\""],"SureRansom Ransomeware (Fake)":["misp-galaxy:ransomware=\"SureRansom Ransomeware (Fake)\""],"Surprise":["misp-galaxy:ransomware=\"Surprise\""],"Survey":["misp-galaxy:ransomware=\"Survey\""],"Syn Ack":["misp-galaxy:ransomware=\"SynAck\""],"SynoLocker":["misp-galaxy:ransomware=\"SynoLocker\""],"TYRANT":["misp-galaxy:ransomware=\"TYRANT\""],"Crypto Tyrant":["misp-galaxy:ransomware=\"TYRANT\""],"TeamXrat":["misp-galaxy:ransomware=\"TeamXrat\""],"Telecrypt Ransomware":["misp-galaxy:ransomware=\"Telecrypt Ransomware\""],"Tellyouthepass":["misp-galaxy:ransomware=\"Tellyouthepass\""],"Termite Ransomware":["misp-galaxy:ransomware=\"Termite Ransomware\""],"TeslaCrypt 0.x - 2.2.0":["misp-galaxy:ransomware=\"TeslaCrypt 0.x - 2.2.0\""],"AlphaCrypt":["misp-galaxy:ransomware=\"TeslaCrypt 0.x - 2.2.0\""],"TeslaCrypt 3.0+":["misp-galaxy:ransomware=\"TeslaCrypt 3.0+\""],"TeslaCrypt 4.1A":["misp-galaxy:ransomware=\"TeslaCrypt 4.1A\""],"TeslaCrypt 4.2":["misp-galaxy:ransomware=\"TeslaCrypt 4.2\""],"Thanksgiving Ransomware":["misp-galaxy:ransomware=\"Thanksgiving Ransomware\""],"Threat Finder":["misp-galaxy:ransomware=\"Threat Finder\""],"Crypt0L0cker":["misp-galaxy:ransomware=\"TorrentLocker\""],"Teerac":["misp-galaxy:ransomware=\"TorrentLocker\""],"TowerWeb":["misp-galaxy:ransomware=\"TowerWeb\""],"Toxcrypt":["misp-galaxy:ransomware=\"Toxcrypt\""],"Trojan Dz":["misp-galaxy:ransomware=\"Trojan Dz\""],"Trojan":["misp-galaxy:ransomware=\"Trojan\""],"BrainCrypt":["misp-galaxy:ransomware=\"Trojan\""],"Troldesh orShade, XTBL":["misp-galaxy:ransomware=\"Troldesh orShade, XTBL\""],"Tron ransomware":["misp-galaxy:ransomware=\"Tron ransomware\""],"TrueCrypter":["misp-galaxy:ransomware=\"TrueCrypter\""],"TrumpLocker Ransomware":["misp-galaxy:ransomware=\"TrumpLocker Ransomware\""],"Turkish FileEncryptor Ransomware":["misp-galaxy:ransomware=\"Turkish FileEncryptor Ransomware\""],"Fake CTB-Locker":["misp-galaxy:ransomware=\"Turkish FileEncryptor Ransomware\""],"Turkish Ransom":["misp-galaxy:ransomware=\"Turkish Ransom\""],"Turkish":["misp-galaxy:ransomware=\"Turkish\""],"Uiwix Ransomware":["misp-galaxy:ransomware=\"Uiwix Ransomware\""],"UltraLocker Ransomware":["misp-galaxy:ransomware=\"UltraLocker Ransomware\""],"UmbreCrypt":["misp-galaxy:ransomware=\"UmbreCrypt\""],"UnblockUPC":["misp-galaxy:ransomware=\"UnblockUPC\""],"Ungluk":["misp-galaxy:ransomware=\"Ungluk\""],"Unlock26 Ransomware":["misp-galaxy:ransomware=\"Unlock26 Ransomware\""],"Unlock92 ":["misp-galaxy:ransomware=\"Unlock92 \""],"Unnamed Android Ransomware":["misp-galaxy:ransomware=\"Unnamed Android Ransomware\""],"Unnamed ramsomware 1":["misp-galaxy:ransomware=\"Unnamed ramsomware 1\""],"Unnamed ramsomware 2":["misp-galaxy:ransomware=\"Unnamed ramsomware 2\""],"UpdateHost Ransomware":["misp-galaxy:ransomware=\"UpdateHost Ransomware\""],"UserFilesLocker Ransomware":["misp-galaxy:ransomware=\"UserFilesLocker Ransomware\""],"CzechoSlovak Ransomware":["misp-galaxy:ransomware=\"UserFilesLocker Ransomware\""],"V8Locker Ransomware":["misp-galaxy:ransomware=\"V8Locker Ransomware\""],"VBRANSOM 7":["misp-galaxy:ransomware=\"VBRANSOM 7\""],"Vanguard Ransomware":["misp-galaxy:ransomware=\"Vanguard Ransomware\""],"VapeLauncher":["misp-galaxy:ransomware=\"VapeLauncher\""],"Vapor Ransomware":["misp-galaxy:ransomware=\"Vapor Ransomware\""],"VaultCrypt":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"CrypVault":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"Zlader":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"Venis Ransomware":["misp-galaxy:ransomware=\"Venis Ransomware\""],"VenusLocker":["misp-galaxy:ransomware=\"VenusLocker\""],"VindowsLocker Ransomware":["misp-galaxy:ransomware=\"VindowsLocker Ransomware\""],"Virlock":["misp-galaxy:ransomware=\"Virlock\""],"Virus-Encoder":["misp-galaxy:ransomware=\"Virus-Encoder\""],"CrySiS":["misp-galaxy:ransomware=\"Virus-Encoder\""],"Vortex Ransomware":["misp-galaxy:ransomware=\"Vortex Ransomware\""],"\u0166l\u0e4ft\u0454\u0433\u0e04 \u0433\u0e04\u0e20\u0e23\u0e4f\u0e53\u0e2c\u0e04\u0433\u0454":["misp-galaxy:ransomware=\"Vortex Ransomware\""],"Vurten":["misp-galaxy:ransomware=\"Vurten\""],"VxLock Ransomware":["misp-galaxy:ransomware=\"VxLock Ransomware\""],"WannaCrypt":["misp-galaxy:ransomware=\"WannaCry\""],"WCrypt":["misp-galaxy:ransomware=\"WannaCry\""],"WCRY":["misp-galaxy:ransomware=\"WannaCry\""],"WannaSmile":["misp-galaxy:ransomware=\"WannaSmile\""],"Wcry Ransomware":["misp-galaxy:ransomware=\"Wcry Ransomware\""],"WeChat Ransom":["misp-galaxy:ransomware=\"WeChat Ransom\""],"UNNAMED1989":["misp-galaxy:ransomware=\"WeChat Ransom\""],"WhiteRose":["misp-galaxy:ransomware=\"WhiteRose\""],"WickedLocker HT Ransomware":["misp-galaxy:ransomware=\"WickedLocker HT Ransomware\""],"WildFire Locker":["misp-galaxy:ransomware=\"WildFire Locker\""],"Hades Locker":["misp-galaxy:ransomware=\"WildFire Locker\""],"WinRarer Ransomware":["misp-galaxy:ransomware=\"WinRarer Ransomware\""],"Windows_Security Ransonware":["misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"WS Go Ransonware":["misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"Winnix Cryptor Ransomware":["misp-galaxy:ransomware=\"Winnix Cryptor Ransomware\""],"X-Files":["misp-galaxy:ransomware=\"X-Files\""],"X3M Ransomware":["misp-galaxy:ransomware=\"X3M Ransomware\""],"XCrypt Ransomware":["misp-galaxy:ransomware=\"XCrypt Ransomware\""],"XRTN ":["misp-galaxy:ransomware=\"XRTN \""],"XTPLocker 5.0 Ransomware":["misp-galaxy:ransomware=\"XTPLocker 5.0 Ransomware\""],"XYZWare Ransomware":["misp-galaxy:ransomware=\"XYZWare Ransomware\""],"XiaoBa ransomware":["misp-galaxy:ransomware=\"XiaoBa ransomware\""],"Xolzsec":["misp-galaxy:ransomware=\"Xolzsec\""],"Xorist":["misp-galaxy:ransomware=\"Xorist\""],"YYTO Ransomware":["misp-galaxy:ransomware=\"YYTO Ransomware\""],"You Have Been Hacked!!!":["misp-galaxy:ransomware=\"You Have Been Hacked!!!\""],"YouAreFucked Ransomware":["misp-galaxy:ransomware=\"YouAreFucked Ransomware\""],"YourRansom Ransomware":["misp-galaxy:ransomware=\"YourRansom Ransomware\""],"ZXZ Ramsomware":["misp-galaxy:ransomware=\"ZXZ Ramsomware\""],"Zcrypt":["misp-galaxy:ransomware=\"Zcrypt\""],"Zcryptor":["misp-galaxy:ransomware=\"Zcrypt\""],"ZekwaCrypt Ransomware":["misp-galaxy:ransomware=\"ZekwaCrypt Ransomware\""],"Zenis Ransomware":["misp-galaxy:ransomware=\"Zenis Ransomware\""],"ZeroCrypt Ransomware":["misp-galaxy:ransomware=\"ZeroCrypt Ransomware\""],"Zimbra":["misp-galaxy:ransomware=\"Zimbra\""],"ZinoCrypt Ransomware":["misp-galaxy:ransomware=\"ZinoCrypt Ransomware\""],"Russian":["misp-galaxy:ransomware=\"Zlader\""],"Zorro":["misp-galaxy:ransomware=\"Zorro\""],"Zyka Ransomware":["misp-galaxy:ransomware=\"Zyka Ransomware\""],"encryptoJJS":["misp-galaxy:ransomware=\"encryptoJJS\""],"garrantydecrypt":["misp-galaxy:ransomware=\"garrantydecrypt\""],"iLock":["misp-galaxy:ransomware=\"iLock\""],"iLockLight":["misp-galaxy:ransomware=\"iLockLight\""],"iRansom":["misp-galaxy:ransomware=\"iRansom\""],"n1n1n1":["misp-galaxy:ransomware=\"n1n1n1\""],"of Ransomware: OpenToYou (Formerly known as OpenToDecrypt)":["misp-galaxy:ransomware=\"of Ransomware: OpenToYou (Formerly known as OpenToDecrypt)\""],"qkG":["misp-galaxy:ransomware=\"qkG\""],"vxLock":["misp-galaxy:ransomware=\"vxLock\""],"zScreenLocker Ransomware":["misp-galaxy:ransomware=\"zScreenLocker Ransomware\""],"5p00f3r.N$ RAT":["misp-galaxy:rat=\"5p00f3r.N$ RAT\""],"9002":["misp-galaxy:rat=\"9002\""],"A32s RAT":["misp-galaxy:rat=\"A32s RAT\""],"A4Zeta":["misp-galaxy:rat=\"A4Zeta\""],"Adwind RAT":["misp-galaxy:rat=\"Adwind RAT\""],"UNiversal REmote COntrol Multi-Platform":["misp-galaxy:rat=\"Adwind RAT\""],"Adzok":["misp-galaxy:rat=\"Adzok\""],"AeroAdmin":["misp-galaxy:rat=\"AeroAdmin\""],"AhNyth Android":["misp-galaxy:rat=\"AhNyth Android\""],"Ahtapod":["misp-galaxy:rat=\"Ahtapod\""],"Albertino Advanced RAT":["misp-galaxy:rat=\"Albertino Advanced RAT\""],"Ammyy Admin":["misp-galaxy:rat=\"Ammyy Admin\""],"Ammyy":["misp-galaxy:rat=\"Ammyy Admin\""],"Androrat":["misp-galaxy:rat=\"Androrat\""],"AnyDesk":["misp-galaxy:rat=\"AnyDesk\""],"Arabian-Attacker RAT":["misp-galaxy:rat=\"Arabian-Attacker RAT\""],"Archelaus Beta":["misp-galaxy:rat=\"Archelaus Beta\""],"Arcom":["misp-galaxy:rat=\"Arcom\""],"Arctic R.A.T.":["misp-galaxy:rat=\"Arctic R.A.T.\""],"Artic":["misp-galaxy:rat=\"Arctic R.A.T.\""],"Assassin":["misp-galaxy:rat=\"Assassin\""],"Atelier Web Remote Commander":["misp-galaxy:rat=\"Atelier Web Remote Commander\""],"BBS RAT":["misp-galaxy:rat=\"BBS RAT\""],"BD Y3K RAT":["misp-galaxy:rat=\"BD Y3K RAT\""],"Back Door Y3K RAT":["misp-galaxy:rat=\"BD Y3K RAT\""],"Y3k":["misp-galaxy:rat=\"BD Y3K RAT\""],"BX":["misp-galaxy:rat=\"BX\""],"Babylon":["misp-galaxy:rat=\"Babylon\""],"Back Orifice 2000":["misp-galaxy:rat=\"Back Orifice 2000\""],"BO2k":["misp-galaxy:rat=\"Back Orifice 2000\""],"Back Orifice":["misp-galaxy:rat=\"Back Orifice\""],"BO":["misp-galaxy:rat=\"Back Orifice\""],"Bandook RAT":["misp-galaxy:rat=\"Bandook RAT\""],"Batch NET":["misp-galaxy:rat=\"Batch NET\""],"BeamYourScreen":["misp-galaxy:rat=\"BeamYourScreen\""],"Beast Trojan":["misp-galaxy:rat=\"Beast Trojan\""],"Bifrost":["misp-galaxy:rat=\"Bifrost\""],"Biodox":["misp-galaxy:rat=\"Biodox\""],"BlackNix":["misp-galaxy:rat=\"BlackNix\""],"Blackshades":["misp-galaxy:rat=\"Blackshades\"","misp-galaxy:tool=\"Blackshades\""],"Blizzard":["misp-galaxy:rat=\"Blizzard\""],"Blue Banana":["misp-galaxy:rat=\"Blue Banana\""],"Brat":["misp-galaxy:rat=\"Brat\""],"CIA RAT":["misp-galaxy:rat=\"CIA RAT\""],"CTOS":["misp-galaxy:rat=\"CTOS\""],"Caesar RAT":["misp-galaxy:rat=\"Caesar RAT\""],"Cardinal":["misp-galaxy:rat=\"Cardinal\""],"Casa RAT":["misp-galaxy:rat=\"Casa RAT\""],"Cerberus RAT":["misp-galaxy:rat=\"Cerberus RAT\""],"Char0n":["misp-galaxy:rat=\"Char0n\""],"Chrome Remote Desktop":["misp-galaxy:rat=\"Chrome Remote Desktop\""],"ClientMesh":["misp-galaxy:rat=\"ClientMesh\""],"Coldroot":["misp-galaxy:rat=\"Coldroot\""],"Comodo Unite":["misp-galaxy:rat=\"Comodo Unite\""],"CrossRat":["misp-galaxy:rat=\"CrossRat\""],"Cyber Eye RAT":["misp-galaxy:rat=\"Cyber Eye RAT\""],"DameWare Mini Remote Control":["misp-galaxy:rat=\"DameWare Mini Remote Control\""],"dameware":["misp-galaxy:rat=\"DameWare Mini Remote Control\""],"Dark DDoSeR":["misp-galaxy:rat=\"Dark DDoSeR\""],"Dark Comet":["misp-galaxy:rat=\"DarkComet\"","misp-galaxy:tool=\"Dark Comet\""],"DarkMoon":["misp-galaxy:rat=\"DarkMoon\""],"Dark Moon":["misp-galaxy:rat=\"DarkMoon\""],"DarkRat":["misp-galaxy:rat=\"DarkRat\""],"DarkRAT":["misp-galaxy:rat=\"DarkRat\""],"DarkTrack":["misp-galaxy:rat=\"DarkTrack\""],"Darknet RAT":["misp-galaxy:rat=\"Darknet RAT\""],"Dark NET RAT":["misp-galaxy:rat=\"Darknet RAT\""],"Deeper RAT":["misp-galaxy:rat=\"Deeper RAT\""],"DesktopNow":["misp-galaxy:rat=\"DesktopNow\""],"Erebus":["misp-galaxy:rat=\"Erebus\""],"FINSPY":["misp-galaxy:rat=\"FINSPY\"","misp-galaxy:tool=\"FINSPY\""],"Felipe":["misp-galaxy:rat=\"Felipe\""],"Felismus RAT":["misp-galaxy:rat=\"Felismus RAT\""],"FlawedAmmy":["misp-galaxy:rat=\"FlawedAmmy\""],"GOlden Phoenix":["misp-galaxy:rat=\"GOlden Phoenix\""],"Ucul":["misp-galaxy:rat=\"Ghost\""],"GraphicBooting":["misp-galaxy:rat=\"GraphicBooting\""],"Greame":["misp-galaxy:rat=\"Greame\""],"Greek Hackers RAT":["misp-galaxy:rat=\"Greek Hackers RAT\""],"H-w0rm":["misp-galaxy:rat=\"H-w0rm\""],"H-worm":["misp-galaxy:rat=\"H-worm\""],"HTTP WEB BACKDOOR":["misp-galaxy:rat=\"HTTP WEB BACKDOOR\""],"Hallaj PRO RAT":["misp-galaxy:rat=\"Hallaj PRO RAT\""],"Hav-RAT":["misp-galaxy:rat=\"Hav-RAT\""],"HawkEye":["misp-galaxy:rat=\"HawkEye\""],"Heseber":["misp-galaxy:rat=\"Heseber\""],"Imminent Monitor":["misp-galaxy:rat=\"Imminent Monitor\""],"Indetectables RAT":["misp-galaxy:rat=\"Indetectables RAT\""],"JCage":["misp-galaxy:rat=\"JCage\""],"Jfect":["misp-galaxy:rat=\"Jfect\""],"Kazybot":["misp-galaxy:rat=\"Kazybot\""],"KhRAT":["misp-galaxy:rat=\"KhRAT\""],"Kiler RAT":["misp-galaxy:rat=\"Kiler RAT\""],"Njw0rm":["misp-galaxy:rat=\"Kiler RAT\"","misp-galaxy:rat=\"NJRat\""],"Killer RAT":["misp-galaxy:rat=\"Killer RAT\""],"KjW0rm":["misp-galaxy:rat=\"KjW0rm\"","misp-galaxy:tool=\"KjW0rm\""],"Lanfiltrator":["misp-galaxy:rat=\"Lanfiltrator\""],"LeGeNd":["misp-galaxy:rat=\"LeGeNd\""],"LiteManager":["misp-galaxy:rat=\"LiteManager\""],"Loki RAT":["misp-galaxy:rat=\"Loki RAT\""],"LokiTech":["misp-galaxy:rat=\"LokiTech\""],"Lost Door":["misp-galaxy:rat=\"Lost Door\""],"LostDoor":["misp-galaxy:rat=\"Lost Door\""],"Luminosity Link":["misp-galaxy:rat=\"Luminosity Link\""],"LuxNET":["misp-galaxy:rat=\"LuxNET\""],"MINI-MO":["misp-galaxy:rat=\"MINI-MO\""],"MLRat":["misp-galaxy:rat=\"MLRat\""],"MRA RAT":["misp-galaxy:rat=\"MRA RAT\""],"MadRAT":["misp-galaxy:rat=\"MadRAT\""],"Mangit":["misp-galaxy:rat=\"Mangit\""],"Matryoshka":["misp-galaxy:rat=\"Matryoshka\"","misp-galaxy:tool=\"Matryoshka\""],"Mega":["misp-galaxy:rat=\"Mega\""],"MegaTrojan":["misp-galaxy:rat=\"MegaTrojan\""],"Minimo":["misp-galaxy:rat=\"Minimo\""],"MoSucker":["misp-galaxy:rat=\"MoSucker\""],"MofoTro":["misp-galaxy:rat=\"MofoTro\""],"NET-MONITOR PRO":["misp-galaxy:rat=\"NET-MONITOR PRO\""],"NJRat":["misp-galaxy:rat=\"NJRat\""],"Net Devil":["misp-galaxy:rat=\"Net Devil\""],"NetDevil":["misp-galaxy:rat=\"Net Devil\"","misp-galaxy:rat=\"NetDevil\""],"Netbus":["misp-galaxy:rat=\"Netbus\""],"NetBus":["misp-galaxy:rat=\"Netbus\""],"Netsupport Manager":["misp-galaxy:rat=\"Netsupport Manager\""],"Netwire":["misp-galaxy:rat=\"Netwire\""],"NewCore":["misp-galaxy:rat=\"NewCore\""],"Nova":["misp-galaxy:rat=\"Nova\""],"Nuclear RAT":["misp-galaxy:rat=\"Nuclear RAT\""],"NukeSped":["misp-galaxy:rat=\"NukeSped\""],"Nytro":["misp-galaxy:rat=\"Nytro\""],"Offence":["misp-galaxy:rat=\"Offence\""],"Optix Pro":["misp-galaxy:rat=\"Optix Pro\""],"Orcus":["misp-galaxy:rat=\"Orcus\""],"Ozone":["misp-galaxy:rat=\"Ozone\""],"P. Storrie RAT":["misp-galaxy:rat=\"P. Storrie RAT\""],"P.Storrie RAT":["misp-galaxy:rat=\"P. Storrie RAT\""],"Pain RAT":["misp-galaxy:rat=\"Pain RAT\""],"Pandora":["misp-galaxy:rat=\"Pandora\""],"Paradox":["misp-galaxy:rat=\"Paradox\""],"Parasite-HTTP-RAT":["misp-galaxy:rat=\"Parasite-HTTP-RAT\""],"PentagonRAT":["misp-galaxy:rat=\"PentagonRAT\""],"Plasma RAT":["misp-galaxy:rat=\"Plasma RAT\""],"Pocket RAT":["misp-galaxy:rat=\"Pocket RAT\""],"Backdoor.Win32.PoisonIvy":["misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"Gen:Trojan.Heur.PT":["misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"PowerRAT":["misp-galaxy:rat=\"PowerRAT\""],"PredatorPain":["misp-galaxy:rat=\"Predator Pain\""],"ProRat":["misp-galaxy:rat=\"ProRat\""],"Punisher RAT":["misp-galaxy:rat=\"Punisher RAT\""],"Qarallax":["misp-galaxy:rat=\"Qarallax\""],"qrat":["misp-galaxy:rat=\"Qarallax\"","misp-galaxy:tool=\"qrat\""],"Quaverse":["misp-galaxy:rat=\"Quaverse\""],"QRAT":["misp-galaxy:rat=\"Quaverse\""],"RATAttack":["misp-galaxy:rat=\"RATAttack\""],"RWX RAT":["misp-galaxy:rat=\"RWX RAT\""],"RaTRon":["misp-galaxy:rat=\"RaTRon\""],"RealVNC":["misp-galaxy:rat=\"RealVNC\""],"VNC Connect":["misp-galaxy:rat=\"RealVNC\""],"VNC Viewer":["misp-galaxy:rat=\"RealVNC\""],"Remote Utilities":["misp-galaxy:rat=\"Remote Utilities\""],"RemotePC":["misp-galaxy:rat=\"RemotePC\""],"RevCode":["misp-galaxy:rat=\"RevCode\""],"Revenge-RAT":["misp-galaxy:rat=\"Revenge-RAT\""],"Rottie3":["misp-galaxy:rat=\"Rottie3\""],"Sandro RAT":["misp-galaxy:rat=\"Sandro RAT\""],"Schwarze-Sonne-RAT":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"SS-RAT":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"Schwarze Sonne":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"Seecreen":["misp-galaxy:rat=\"Seecreen\""],"Firnass":["misp-galaxy:rat=\"Seecreen\""],"Seed RAT":["misp-galaxy:rat=\"Seed RAT\""],"Setro":["misp-galaxy:rat=\"Setro\""],"SharK":["misp-galaxy:rat=\"SharK\""],"SHARK":["misp-galaxy:rat=\"SharK\""],"SharpBot":["misp-galaxy:rat=\"SharpBot\""],"SharpEye":["misp-galaxy:rat=\"SharpEye\""],"ShowMyPC":["misp-galaxy:rat=\"ShowMyPC\""],"Sky Wyder":["misp-galaxy:rat=\"Sky Wyder\""],"Small-Net":["misp-galaxy:rat=\"Small-Net\""],"SmallNet":["misp-galaxy:rat=\"Small-Net\""],"Snoopy":["misp-galaxy:rat=\"Snoopy\""],"Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Blizzard":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Fxdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor:Win32\/Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Socket23":["misp-galaxy:rat=\"Socket23\""],"SocketPlayer":["misp-galaxy:rat=\"SocketPlayer\""],"Sparta RAT":["misp-galaxy:rat=\"Sparta RAT\""],"SpyCronic":["misp-galaxy:rat=\"SpyCronic\""],"SpyGate":["misp-galaxy:rat=\"SpyGate\""],"Spymaster Pro":["misp-galaxy:rat=\"Spymaster Pro\""],"Spynet":["misp-galaxy:rat=\"Spynet\""],"Sub7":["misp-galaxy:rat=\"Sub7\""],"SubSeven":["misp-galaxy:rat=\"Sub7\""],"Sub7Server":["misp-galaxy:rat=\"Sub7\""],"Syla":["misp-galaxy:rat=\"Syla\""],"Syndrome RAT":["misp-galaxy:rat=\"Syndrome RAT\""],"TINY":["misp-galaxy:rat=\"TINY\""],"TSCookieRAT":["misp-galaxy:rat=\"TSCookieRAT\""],"TeamViewer":["misp-galaxy:rat=\"TeamViewer\""],"Tequila Bandita":["misp-galaxy:rat=\"Tequila Bandita\""],"TheFat RAT":["misp-galaxy:rat=\"TheFat RAT\""],"TheOneSpy":["misp-galaxy:rat=\"TheOneSpy\""],"Theef":["misp-galaxy:rat=\"Theef\""],"Toquito Bandito":["misp-galaxy:rat=\"Toquito Bandito\""],"TorCT PHP RAT":["misp-galaxy:rat=\"TorCT PHP RAT\""],"Trochilus":["misp-galaxy:rat=\"Trochilus\"","misp-galaxy:tool=\"Trochilus\""],"Turkojan":["misp-galaxy:rat=\"Turkojan\""],"UNITEDRAKE":["misp-galaxy:rat=\"UNITEDRAKE\""],"Ultra VNC":["misp-galaxy:rat=\"Ultra VNC\""],"Vanguard":["misp-galaxy:rat=\"Vanguard\""],"Vantom":["misp-galaxy:rat=\"Vantom\""],"Venomous Ivy":["misp-galaxy:rat=\"Venomous Ivy\""],"Virus RAT":["misp-galaxy:rat=\"Virus RAT\""],"VorteX":["misp-galaxy:rat=\"VorteX\""],"Vortex":["misp-galaxy:rat=\"Vortex\""],"WiRAT":["misp-galaxy:rat=\"WiRAT\""],"Win32.HsIdir":["misp-galaxy:rat=\"Win32.HsIdir\""],"Windows Remote Desktop":["misp-galaxy:rat=\"Windows Remote Desktop\""],"Xanity":["misp-galaxy:rat=\"Xanity\""],"Xena":["misp-galaxy:rat=\"Xena\""],"Xpert":["misp-galaxy:rat=\"Xpert\""],"Xploit":["misp-galaxy:rat=\"Xploit\""],"Xsser":["misp-galaxy:rat=\"Xsser\""],"mRAT":["misp-galaxy:rat=\"Xsser\""],"XtremeRAT":["misp-galaxy:rat=\"XtremeRAT\""],"Xyligan":["misp-galaxy:rat=\"Xyligan\""],"ZOMBIE SLAYER":["misp-galaxy:rat=\"ZOMBIE SLAYER\""],"death":["misp-galaxy:rat=\"death\""],"drat":["misp-galaxy:rat=\"drat\""],"JacksBot":["misp-galaxy:rat=\"jRAT\""],"joanap":["misp-galaxy:rat=\"joanap\""],"join.me":["misp-galaxy:rat=\"join.me\""],"miniRAT":["misp-galaxy:rat=\"miniRAT\""],"rokrat":["misp-galaxy:rat=\"rokrat\""],"vjw0rm 0.1":["misp-galaxy:rat=\"vjw0rm 0.1\""],"xHacker Pro RAT":["misp-galaxy:rat=\"xHacker Pro RAT\""],"Academia - University":["misp-galaxy:sector=\"Academia - University\""],"Accounting":["misp-galaxy:sector=\"Accounting\""],"Activists":["misp-galaxy:sector=\"Activists\""],"Advertising":["misp-galaxy:sector=\"Advertising\""],"Aerospace":["misp-galaxy:sector=\"Aerospace\""],"Agriculture":["misp-galaxy:sector=\"Agriculture\""],"Arts":["misp-galaxy:sector=\"Arts\""],"Automotive":["misp-galaxy:sector=\"Automotive\""],"Bank":["misp-galaxy:sector=\"Bank\""],"Biomedical":["misp-galaxy:sector=\"Biomedical\""],"Casino":["misp-galaxy:sector=\"Casino\""],"Chemical":["misp-galaxy:sector=\"Chemical\""],"Citizens":["misp-galaxy:sector=\"Citizens\""],"Civil Aviation":["misp-galaxy:sector=\"Civil Aviation\""],"Civil society":["misp-galaxy:sector=\"Civil society\""],"Communication equipment":["misp-galaxy:sector=\"Communication equipment\""],"Construction":["misp-galaxy:sector=\"Construction\""],"Consulting":["misp-galaxy:sector=\"Consulting\""],"Country":["misp-galaxy:sector=\"Country\""],"Culture":["misp-galaxy:sector=\"Culture\""],"DNS service provider":["misp-galaxy:sector=\"DNS service provider\""],"Data Broker":["misp-galaxy:sector=\"Data Broker\""],"Defense":["misp-galaxy:sector=\"Defense\""],"Development":["misp-galaxy:sector=\"Development\""],"Digital infrastructure":["misp-galaxy:sector=\"Digital infrastructure\""],"Digital services":["misp-galaxy:sector=\"Digital services\""],"Diplomacy":["misp-galaxy:sector=\"Diplomacy\""],"Dissidents":["misp-galaxy:sector=\"Dissidents\""],"Education":["misp-galaxy:sector=\"Education\""],"Electric":["misp-galaxy:sector=\"Electric\""],"Electronic":["misp-galaxy:sector=\"Electronic\""],"Employment":["misp-galaxy:sector=\"Employment\""],"Energy":["misp-galaxy:sector=\"Energy\""],"Entertainment":["misp-galaxy:sector=\"Entertainment\""],"Environment":["misp-galaxy:sector=\"Environment\""],"Finance":["misp-galaxy:sector=\"Finance\""],"Food":["misp-galaxy:sector=\"Food\""],"Game":["misp-galaxy:sector=\"Game\""],"Gas":["misp-galaxy:sector=\"Gas\""],"Government, Administration":["misp-galaxy:sector=\"Government, Administration\""],"Health":["misp-galaxy:sector=\"Health\""],"High tech":["misp-galaxy:sector=\"High tech\""],"Higher education":["misp-galaxy:sector=\"Higher education\""],"Hospitality":["misp-galaxy:sector=\"Hospitality\""],"Hotels":["misp-galaxy:sector=\"Hotels\""],"IT - Hacker":["misp-galaxy:sector=\"IT - Hacker\""],"IT - ISP":["misp-galaxy:sector=\"IT - ISP\""],"IT - Security":["misp-galaxy:sector=\"IT - Security\""],"IT":["misp-galaxy:sector=\"IT\""],"Immigration":["misp-galaxy:sector=\"Immigration\""],"Industrial":["misp-galaxy:sector=\"Industrial\""],"Infrastructure":["misp-galaxy:sector=\"Infrastructure\""],"Insurance":["misp-galaxy:sector=\"Insurance\""],"Intelligence":["misp-galaxy:sector=\"Intelligence\""],"Investment":["misp-galaxy:sector=\"Investment\""],"Islamic forums":["misp-galaxy:sector=\"Islamic forums\""],"Islamic organisation":["misp-galaxy:sector=\"Islamic organisation\""],"Journalist":["misp-galaxy:sector=\"Journalist\""],"Justice":["misp-galaxy:sector=\"Justice\""],"Lawyers":["misp-galaxy:sector=\"Lawyers\""],"Legal":["misp-galaxy:sector=\"Legal\""],"Life science":["misp-galaxy:sector=\"Life science\""],"Logistic":["misp-galaxy:sector=\"Logistic\""],"Managed Services Provider":["misp-galaxy:sector=\"Managed Services Provider\""],"Manufacturing":["misp-galaxy:sector=\"Manufacturing\""],"Maritime":["misp-galaxy:sector=\"Maritime\""],"Marketing":["misp-galaxy:sector=\"Marketing\""],"Metal":["misp-galaxy:sector=\"Metal\""],"Military":["misp-galaxy:sector=\"Military\""],"Mining":["misp-galaxy:sector=\"Mining\""],"Multi-sector":["misp-galaxy:sector=\"Multi-sector\""],"NGO":["misp-galaxy:sector=\"NGO\""],"News - Media":["misp-galaxy:sector=\"News - Media\""],"Oil":["misp-galaxy:sector=\"Oil\""],"Online marketplace":["misp-galaxy:sector=\"Online marketplace\""],"Opposition":["misp-galaxy:sector=\"Opposition\""],"Other":["misp-galaxy:sector=\"Other\""],"Payment":["misp-galaxy:sector=\"Payment\""],"Petrochemical":["misp-galaxy:sector=\"Petrochemical\""],"Pharmacy":["misp-galaxy:sector=\"Pharmacy\""],"Police - Law enforcement":["misp-galaxy:sector=\"Police - Law enforcement\""],"Political party":["misp-galaxy:sector=\"Political party\""],"Programming":["misp-galaxy:sector=\"Programming\""],"Publishing industry":["misp-galaxy:sector=\"Publishing industry\""],"Railway":["misp-galaxy:sector=\"Railway\""],"Research - Innovation":["misp-galaxy:sector=\"Research - Innovation\""],"Restaurant":["misp-galaxy:sector=\"Restaurant\""],"Retail":["misp-galaxy:sector=\"Retail\""],"Satellite navigation":["misp-galaxy:sector=\"Satellite navigation\""],"Security Service":["misp-galaxy:sector=\"Security Service\""],"Security actors":["misp-galaxy:sector=\"Security actors\""],"Security systems":["misp-galaxy:sector=\"Security systems\""],"Semi-conductors":["misp-galaxy:sector=\"Semi-conductors\""],"Separatists":["misp-galaxy:sector=\"Separatists\""],"Shipping":["misp-galaxy:sector=\"Shipping\""],"Smart meter":["misp-galaxy:sector=\"Smart meter\""],"Social networks":["misp-galaxy:sector=\"Social networks\""],"Space":["misp-galaxy:sector=\"Space\""],"Steel":["misp-galaxy:sector=\"Steel\""],"Streaming service":["misp-galaxy:sector=\"Streaming service\""],"Tax firm":["misp-galaxy:sector=\"Tax firm\""],"Technology":["misp-galaxy:sector=\"Technology\""],"Telecoms":["misp-galaxy:sector=\"Telecoms\""],"Television broadcast":["misp-galaxy:sector=\"Television broadcast\""],"Think Tanks":["misp-galaxy:sector=\"Think Tanks\""],"Tourism":["misp-galaxy:sector=\"Tourism\""],"Trade":["misp-galaxy:sector=\"Trade\""],"Transport":["misp-galaxy:sector=\"Transport\""],"Travel":["misp-galaxy:sector=\"Travel\""],"Turbine":["misp-galaxy:sector=\"Turbine\""],"Veterinary":["misp-galaxy:sector=\"Veterinary\""],"Video Sharing":["misp-galaxy:sector=\"Video Sharing\""],"Water":["misp-galaxy:sector=\"Water\""],"eCommerce":["misp-galaxy:sector=\"eCommerce\""],"engineering":["misp-galaxy:sector=\"engineering\""],"AZORult":["misp-galaxy:stealer=\"AZORult\""],"TeleGrab":["misp-galaxy:stealer=\"TeleGrab\""],"Vidar":["misp-galaxy:stealer=\"Vidar\""],"BlackHat TDS":["misp-galaxy:tds=\"BlackHat TDS\""],"BlackTDS":["misp-galaxy:tds=\"BlackTDS\""],"BossTDS":["misp-galaxy:tds=\"BossTDS\""],"Futuristic TDS":["misp-galaxy:tds=\"Futuristic TDS\""],"Keitaro":["misp-galaxy:tds=\"Keitaro\""],"Orchid TDS":["misp-galaxy:tds=\"Orchid TDS\""],"ShadowTDS":["misp-galaxy:tds=\"ShadowTDS\""],"SimpleTDS":["misp-galaxy:tds=\"SimpleTDS\""],"Stds":["misp-galaxy:tds=\"SimpleTDS\""],"Sutra":["misp-galaxy:tds=\"Sutra\""],"zTDS":["misp-galaxy:tds=\"zTDS\""]," Stealth Mango and Tangelo ":["misp-galaxy:threat-actor=\" Stealth Mango and Tangelo \""],"ALLANITE":["misp-galaxy:threat-actor=\"ALLANITE\""],"Palmetto Fusion":["misp-galaxy:threat-actor=\"ALLANITE\""],"Allanite":["misp-galaxy:threat-actor=\"ALLANITE\""],"APT 16":["misp-galaxy:threat-actor=\"APT 16\""],"SVCMONDR":["misp-galaxy:threat-actor=\"APT 16\"","misp-galaxy:threat-actor=\"SVCMONDR\""],"APT 22":["misp-galaxy:threat-actor=\"APT 22\""],"APT22":["misp-galaxy:threat-actor=\"APT 22\""],"APT 26":["misp-galaxy:threat-actor=\"APT 26\""],"APT26":["misp-galaxy:threat-actor=\"APT 26\""],"Hippo Team":["misp-galaxy:threat-actor=\"APT 26\"","misp-galaxy:threat-actor=\"Turla Group\""],"JerseyMikes":["misp-galaxy:threat-actor=\"APT 26\""],"Turbine Panda":["misp-galaxy:threat-actor=\"APT 26\""],"APT 29":["misp-galaxy:threat-actor=\"APT 29\""],"Dukes":["misp-galaxy:threat-actor=\"APT 29\""],"Group 100":["misp-galaxy:threat-actor=\"APT 29\""],"Cozy Duke":["misp-galaxy:threat-actor=\"APT 29\""],"Office Monkeys":["misp-galaxy:threat-actor=\"APT 29\""],"OfficeMonkeys":["misp-galaxy:threat-actor=\"APT 29\""],"Minidionis":["misp-galaxy:threat-actor=\"APT 29\""],"Hammer Toss":["misp-galaxy:threat-actor=\"APT 29\""],"Iron Hemlock":["misp-galaxy:threat-actor=\"APT 29\""],"Grizzly Steppe":["misp-galaxy:threat-actor=\"APT 29\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT 30":["misp-galaxy:threat-actor=\"APT 30\"","misp-galaxy:threat-actor=\"Naikon\""],"APT 6":["misp-galaxy:threat-actor=\"APT 6\""],"1.php Group":["misp-galaxy:threat-actor=\"APT 6\""],"APT6":["misp-galaxy:threat-actor=\"APT 6\""],"APT-C-27":["misp-galaxy:threat-actor=\"APT-C-27\""],"GoldMouse":["misp-galaxy:threat-actor=\"APT-C-27\""],"APT-C-35":["misp-galaxy:threat-actor=\"APT-C-35\"","misp-galaxy:threat-actor=\"APT-C-35\""],"DoNot Team":["misp-galaxy:threat-actor=\"APT-C-35\""],"Donot Team":["misp-galaxy:threat-actor=\"APT-C-35\""],"APT-C-36":["misp-galaxy:threat-actor=\"APT-C-36\""],"Blind Eagle":["misp-galaxy:threat-actor=\"APT-C-36\""],"APT.3102":["misp-galaxy:threat-actor=\"APT.3102\""],"APT31":["misp-galaxy:threat-actor=\"APT31\"","misp-galaxy:threat-actor=\"Hurricane Panda\""],"APT 31":["misp-galaxy:threat-actor=\"APT31\"","misp-galaxy:threat-actor=\"Hurricane Panda\""],"Ocean Lotus":["misp-galaxy:threat-actor=\"APT32\""],"Cobalt Kitty":["misp-galaxy:threat-actor=\"APT32\""],"Sea Lotus":["misp-galaxy:threat-actor=\"APT32\""],"APT-32":["misp-galaxy:threat-actor=\"APT32\""],"APT 32":["misp-galaxy:threat-actor=\"APT32\""],"Ocean Buffalo":["misp-galaxy:threat-actor=\"APT32\""],"APT 33":["misp-galaxy:threat-actor=\"APT33\""],"MAGNALLIUM":["misp-galaxy:threat-actor=\"APT33\"","misp-galaxy:threat-actor=\"MAGNALLIUM\""],"Refined Kitten":["misp-galaxy:threat-actor=\"APT33\""],"APT 34":["misp-galaxy:threat-actor=\"APT34\"","misp-galaxy:threat-actor=\"OilRig\""],"APT 35":["misp-galaxy:threat-actor=\"APT35\"","misp-galaxy:threat-actor=\"Cleaver\""],"Newscaster Team":["misp-galaxy:threat-actor=\"APT35\""],"APT 37":["misp-galaxy:threat-actor=\"APT37\""],"Group 123":["misp-galaxy:threat-actor=\"APT37\""],"Starcruft":["misp-galaxy:threat-actor=\"APT37\""],"Reaper Group":["misp-galaxy:threat-actor=\"APT37\""],"Red Eyes":["misp-galaxy:threat-actor=\"APT37\""],"Ricochet Chollima":["misp-galaxy:threat-actor=\"APT37\""],"Operation Daybreak":["misp-galaxy:threat-actor=\"APT37\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Operation Erebus":["misp-galaxy:threat-actor=\"APT37\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Venus 121":["misp-galaxy:threat-actor=\"APT37\""],"APT 39":["misp-galaxy:threat-actor=\"APT39\""],"APT5":["misp-galaxy:threat-actor=\"APT5\""],"Anchor Panda":["misp-galaxy:threat-actor=\"Anchor Panda\"","misp-galaxy:tool=\"Torn RAT\""],"APT14":["misp-galaxy:threat-actor=\"Anchor Panda\""],"APT 14":["misp-galaxy:threat-actor=\"Anchor Panda\""],"QAZTeam":["misp-galaxy:threat-actor=\"Anchor Panda\""],"ALUMINUM":["misp-galaxy:threat-actor=\"Anchor Panda\""],"Andromeda Spider":["misp-galaxy:threat-actor=\"Andromeda Spider\""],"AridViper":["misp-galaxy:threat-actor=\"AridViper\""],"Desert Falcon":["misp-galaxy:threat-actor=\"AridViper\""],"Arid Viper":["misp-galaxy:threat-actor=\"AridViper\""],"APT-C-23":["misp-galaxy:threat-actor=\"AridViper\""],"Aslan Neferler Tim":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Lion Soldiers Team":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Phantom Turk":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Aurora Panda":["misp-galaxy:threat-actor=\"Aurora Panda\""],"APT 17":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Group 8":["misp-galaxy:threat-actor=\"Aurora Panda\""],"Hidden Lynx":["misp-galaxy:threat-actor=\"Aurora Panda\""],"Tailgater Team":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Dogfish":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Group72":["misp-galaxy:threat-actor=\"Axiom\""],"Tailgater":["misp-galaxy:threat-actor=\"Axiom\""],"Ragebeast":["misp-galaxy:threat-actor=\"Axiom\""],"Lead":["misp-galaxy:threat-actor=\"Axiom\""],"Wicked Spider":["misp-galaxy:threat-actor=\"Axiom\""],"Wicked Panda":["misp-galaxy:threat-actor=\"Axiom\""],"Barium":["misp-galaxy:threat-actor=\"Axiom\""],"Ayy\u0131ld\u0131z Tim":["misp-galaxy:threat-actor=\"Ayy\u0131ld\u0131z Tim\""],"Crescent and Star":["misp-galaxy:threat-actor=\"Ayy\u0131ld\u0131z Tim\""],"Bahamut":["misp-galaxy:threat-actor=\"Bahamut\""],"SIG22":["misp-galaxy:threat-actor=\"Beijing Group\""],"Big Panda":["misp-galaxy:threat-actor=\"Big Panda\""],"BlackTech":["misp-galaxy:threat-actor=\"BlackTech\""],"Blackgear":["misp-galaxy:threat-actor=\"Blackgear\""],"Topgear":["misp-galaxy:threat-actor=\"Blackgear\""],"BLACKGEAR":["misp-galaxy:threat-actor=\"Blackgear\""],"Blue Termite":["misp-galaxy:threat-actor=\"Blue Termite\""],"Cloudy Omega":["misp-galaxy:threat-actor=\"Blue Termite\""],"Boss Spider":["misp-galaxy:threat-actor=\"Boss Spider\""],"Boulder Bear":["misp-galaxy:threat-actor=\"Boulder Bear\""],"BuhTrap":["misp-galaxy:threat-actor=\"BuhTrap\""],"CHRYSENE":["misp-galaxy:threat-actor=\"CHRYSENE\""],"Greenbug":["misp-galaxy:threat-actor=\"CHRYSENE\"","misp-galaxy:threat-actor=\"Greenbug\""],"COBALT DICKENS":["misp-galaxy:threat-actor=\"COBALT DICKENS\"","misp-galaxy:threat-actor=\"Silent Librarian\""],"Cobalt Dickens":["misp-galaxy:threat-actor=\"COBALT DICKENS\""],"COVELLITE":["misp-galaxy:threat-actor=\"COVELLITE\""],"Lazarus":["misp-galaxy:threat-actor=\"COVELLITE\""],"Hidden Cobra":["misp-galaxy:threat-actor=\"COVELLITE\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"Callisto":["misp-galaxy:threat-actor=\"Callisto\""],"The Mask":["misp-galaxy:threat-actor=\"Careto\""],"Ugly Face":["misp-galaxy:threat-actor=\"Careto\""],"Parastoo":["misp-galaxy:threat-actor=\"Charming Kitten\""],"iKittens":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Group 83":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Newsbeef":["misp-galaxy:threat-actor=\"Charming Kitten\""],"NewsBeef":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Operation Cleaver":["misp-galaxy:threat-actor=\"Cleaver\""],"Tarh Andishan":["misp-galaxy:threat-actor=\"Cleaver\""],"Alibaba":["misp-galaxy:threat-actor=\"Cleaver\""],"2889":["misp-galaxy:threat-actor=\"Cleaver\""],"Rocket_Kitten":["misp-galaxy:threat-actor=\"Cleaver\""],"Cutting Kitten":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Group 41":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Clever Kitten\""],"TEMP.Beanie":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Ghambar":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Clever Kitten":["misp-galaxy:threat-actor=\"Clever Kitten\""],"Cloud Atlas":["misp-galaxy:threat-actor=\"Cloud Atlas\""],"Cobalt":["misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt group":["misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt gang":["misp-galaxy:threat-actor=\"Cobalt\""],"GOLD KINGSWOOD":["misp-galaxy:threat-actor=\"Cobalt\""],"C0d0so":["misp-galaxy:threat-actor=\"Codoso\""],"APT 19":["misp-galaxy:threat-actor=\"Codoso\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Cold River":["misp-galaxy:threat-actor=\"Cold River\""],"Nahr Elbard":["misp-galaxy:threat-actor=\"Cold River\""],"Nahr el bared":["misp-galaxy:threat-actor=\"Cold River\""],"PLA Unit 61398":["misp-galaxy:threat-actor=\"Comment Crew\""],"APT 1":["misp-galaxy:threat-actor=\"Comment Crew\""],"Advanced Persistent Threat 1":["misp-galaxy:threat-actor=\"Comment Crew\""],"Byzantine Candor":["misp-galaxy:threat-actor=\"Comment Crew\""],"Group 3":["misp-galaxy:threat-actor=\"Comment Crew\""],"TG-8223":["misp-galaxy:threat-actor=\"Comment Crew\""],"Brown Fox":["misp-galaxy:threat-actor=\"Comment Crew\""],"GIF89a":["misp-galaxy:threat-actor=\"Comment Crew\""],"ShadyRAT":["misp-galaxy:threat-actor=\"Comment Crew\""],"Shanghai Group":["misp-galaxy:threat-actor=\"Comment Crew\""],"Slayer Kitten":["misp-galaxy:threat-actor=\"CopyKittens\""],"Corsair Jackal":["misp-galaxy:threat-actor=\"Corsair Jackal\""],"TunisianCyberArmy":["misp-galaxy:threat-actor=\"Corsair Jackal\""],"ITSecTeam":["misp-galaxy:threat-actor=\"Cutting Kitten\""],"Cyber Berkut":["misp-galaxy:threat-actor=\"Cyber Berkut\""],"Cyber Caliphate Army":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"Islamic State Hacking Division":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"CCA":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"United Cyber Caliphate":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"UUC":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"CyberCaliphate":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"Cyber fighters of Izz Ad-Din Al Qassam":["misp-galaxy:threat-actor=\"Cyber fighters of Izz Ad-Din Al Qassam\""],"Fraternal Jackal":["misp-galaxy:threat-actor=\"Cyber fighters of Izz Ad-Din Al Qassam\""],"DYMALLOY":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Dragonfly2":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Berserker Bear":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Danti":["misp-galaxy:threat-actor=\"Danti\""],"Fallout Team":["misp-galaxy:threat-actor=\"DarkHotel\""],"Karba":["misp-galaxy:threat-actor=\"DarkHotel\""],"Luder":["misp-galaxy:threat-actor=\"DarkHotel\""],"Nemin":["misp-galaxy:threat-actor=\"DarkHotel\""],"Pioneer":["misp-galaxy:threat-actor=\"DarkHotel\""],"Shadow Crane":["misp-galaxy:threat-actor=\"DarkHotel\""],"APT-C-06":["misp-galaxy:threat-actor=\"DarkHotel\""],"SIG25":["misp-galaxy:threat-actor=\"DarkHotel\""],"LazyMeerkat":["misp-galaxy:threat-actor=\"DarkHydrus\""],"DarkVishnya":["misp-galaxy:threat-actor=\"DarkVishnya\""],"Deadeye Jackal":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"SyrianElectronicArmy":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"SEA":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"Dextorous Spider":["misp-galaxy:threat-actor=\"Dextorous Spider\""],"Dizzy Panda":["misp-galaxy:threat-actor=\"Dizzy Panda\""],"LadyBoyle":["misp-galaxy:threat-actor=\"Dizzy Panda\""],"Domestic Kitten":["misp-galaxy:threat-actor=\"Domestic Kitten\""],"Monsoon":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Sarit":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Quilted Tiger":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"APT-C-09":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Dungeon Spider":["misp-galaxy:threat-actor=\"Dungeon Spider\""],"ELECTRUM":["misp-galaxy:threat-actor=\"ELECTRUM\""],"Sandworm":["misp-galaxy:threat-actor=\"ELECTRUM\"","misp-galaxy:threat-actor=\"Sandworm\"","misp-galaxy:threat-actor=\"TeleBots\""],"Electric Panda":["misp-galaxy:threat-actor=\"Electric Panda\""],"Eloquent Panda":["misp-galaxy:threat-actor=\"Eloquent Panda\""],"APT 27":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"TEMP.Hippo":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Group 35":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Bronze Union":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"ZipToken":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"HIPPOTeam":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Operation Iron Tiger":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Iron Tiger APT":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Crouching Yeti":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Group 24":["misp-galaxy:threat-actor=\"Energetic Bear\""],"CrouchingYeti":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Koala Team":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Equation Group":["misp-galaxy:threat-actor=\"Equation Group\""],"Tilded Team":["misp-galaxy:threat-actor=\"Equation Group\""],"Lamberts":["misp-galaxy:threat-actor=\"Equation Group\"","misp-galaxy:threat-actor=\"Longhorn\""],"EQGRP":["misp-galaxy:threat-actor=\"Equation Group\""],"Longhorn":["misp-galaxy:threat-actor=\"Equation Group\"","misp-galaxy:threat-actor=\"Longhorn\""],"EvilPost":["misp-galaxy:threat-actor=\"EvilPost\""],"EvilTraffic":["misp-galaxy:threat-actor=\"EvilTraffic\""],"Operation EvilTraffic":["misp-galaxy:threat-actor=\"EvilTraffic\""],"FASTCash":["misp-galaxy:threat-actor=\"FASTCash\"","misp-galaxy:tool=\"FASTCash\""],"Skeleton Spider":["misp-galaxy:threat-actor=\"FIN6\"","misp-galaxy:threat-actor=\"Skeleton Spider\""],"Flash Kitten":["misp-galaxy:threat-actor=\"Flash Kitten\""],"Flying Kitten":["misp-galaxy:threat-actor=\"Flying Kitten\""],"SaffronRose":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Saffron Rose":["misp-galaxy:threat-actor=\"Flying Kitten\""],"AjaxSecurityTeam":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Group 26":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Sayad":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Foxy Panda":["misp-galaxy:threat-actor=\"Foxy Panda\""],"Fxmsp":["misp-galaxy:threat-actor=\"Fxmsp\""],"GC01":["misp-galaxy:threat-actor=\"GC01\""],"Golden Chickens":["misp-galaxy:threat-actor=\"GC01\"","misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens01":["misp-galaxy:threat-actor=\"GC01\""],"Golden Chickens 01":["misp-galaxy:threat-actor=\"GC01\""],"GC02":["misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens02":["misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens 02":["misp-galaxy:threat-actor=\"GC02\""],"GRIM SPIDER":["misp-galaxy:threat-actor=\"GRIM SPIDER\""],"Ghost Jackal":["misp-galaxy:threat-actor=\"Ghost Jackal\""],"GhostNet":["misp-galaxy:threat-actor=\"GhostNet\""],"Snooping Dragon":["misp-galaxy:threat-actor=\"GhostNet\""],"Gibberish Panda":["misp-galaxy:threat-actor=\"Gibberish Panda\""],"Gnosticplayers":["misp-galaxy:threat-actor=\"Gnosticplayers\""],"Groundbait":["misp-galaxy:threat-actor=\"Groundbait\""],"Group 27":["misp-galaxy:threat-actor=\"Group 27\""],"Guru Spider":["misp-galaxy:threat-actor=\"Guru Spider\""],"Hacking Team":["misp-galaxy:threat-actor=\"Hacking Team\""],"Hammer Panda":["misp-galaxy:threat-actor=\"Hammer Panda\""],"Zhenbao":["misp-galaxy:threat-actor=\"Hammer Panda\""],"TEMP.Zhenbao":["misp-galaxy:threat-actor=\"Hammer Panda\""],"Hellsing":["misp-galaxy:threat-actor=\"Hellsing\"","misp-galaxy:threat-actor=\"Naikon\""],"Goblin Panda":["misp-galaxy:threat-actor=\"Hellsing\""],"Cycldek":["misp-galaxy:threat-actor=\"Hellsing\""],"HookAds":["misp-galaxy:threat-actor=\"HookAds\""],"Hurricane Panda":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"TEMP.Avengers":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"Zirconium":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"INDRIK SPIDER":["misp-galaxy:threat-actor=\"INDRIK SPIDER\""],"IRIDIUM":["misp-galaxy:threat-actor=\"IRIDIUM\""],"TG-2754":["misp-galaxy:threat-actor=\"IXESHE\""],"BeeBus":["misp-galaxy:threat-actor=\"IXESHE\""],"Group 22":["misp-galaxy:threat-actor=\"IXESHE\""],"Calc Team":["misp-galaxy:threat-actor=\"IXESHE\""],"DNSCalc":["misp-galaxy:threat-actor=\"IXESHE\""],"Crimson Iron":["misp-galaxy:threat-actor=\"IXESHE\""],"APT 12":["misp-galaxy:threat-actor=\"IXESHE\""],"Ice Fog":["misp-galaxy:threat-actor=\"Ice Fog\""],"IceFog":["misp-galaxy:threat-actor=\"Ice Fog\""],"Dagger Panda":["misp-galaxy:threat-actor=\"Ice Fog\""],"Impersonating Panda":["misp-galaxy:threat-actor=\"Impersonating Panda\""],"Inception Framework":["misp-galaxy:threat-actor=\"Inception Framework\""],"Operation Mermaid":["misp-galaxy:threat-actor=\"Infy\""],"Prince of Persia":["misp-galaxy:threat-actor=\"Infy\""],"Iron Group":["misp-galaxy:threat-actor=\"Iron Group\""],"Iron Cyber Group":["misp-galaxy:threat-actor=\"Iron Group\""],"Judgment Panda":["misp-galaxy:threat-actor=\"Judgment Panda\""],"Karma Panda":["misp-galaxy:threat-actor=\"Karma Panda\""],"Keyhole Panda":["misp-galaxy:threat-actor=\"Keyhole Panda\""],"temp.bottle":["misp-galaxy:threat-actor=\"Keyhole Panda\""],"Kimsuki":["misp-galaxy:threat-actor=\"Kimsuki\""],"Kimsuky":["misp-galaxy:threat-actor=\"Kimsuki\""],"Velvet Chollima":["misp-galaxy:threat-actor=\"Kimsuki\""],"Kryptonite Panda":["misp-galaxy:threat-actor=\"Kryptonite Panda\""],"Operation DarkSeoul":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Dark Seoul":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Hastati Group":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Andariel":["misp-galaxy:threat-actor=\"Lazarus Group\"","misp-galaxy:threat-actor=\"Silent Chollima\""],"Unit 121":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Bureau 121":["misp-galaxy:threat-actor=\"Lazarus Group\""],"NewRomanic Cyber Army Team":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Bluenoroff":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Subgroup: Bluenoroff":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Group 77":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Labyrinth Chollima":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation Troy":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation GhostSecret":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation AppleJeus":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT 38":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Stardust Chollima":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Whois Hacking Team":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Zinc":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Appleworm":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Nickel Academy":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT-C-26":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT 40":["misp-galaxy:threat-actor=\"Leviathan\""],"BRONZE MOHAWK":["misp-galaxy:threat-actor=\"Leviathan\""],"Libyan Scorpions":["misp-galaxy:threat-actor=\"Libyan Scorpions\""],"the Lamberts":["misp-galaxy:threat-actor=\"Longhorn\""],"ST Group":["misp-galaxy:threat-actor=\"Lotus Blossom\""],"Esile":["misp-galaxy:threat-actor=\"Lotus Blossom\""],"Lotus Panda":["misp-galaxy:threat-actor=\"Lotus Panda\"","misp-galaxy:threat-actor=\"Naikon\""],"Lucky Cat":["misp-galaxy:threat-actor=\"Lucky Cat\""],"Threat Group 3390":["misp-galaxy:threat-actor=\"LuckyMouse\""],"Lunar Spider":["misp-galaxy:threat-actor=\"Lunar Spider\""],"MUMMY SPIDER":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"TA542":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"Mummy Spider":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"Madi":["misp-galaxy:threat-actor=\"Madi\""],"MageCart":["misp-galaxy:threat-actor=\"MageCart\""],"Magic Kitten":["misp-galaxy:threat-actor=\"Magic Kitten\""],"Group 42":["misp-galaxy:threat-actor=\"Magic Kitten\""],"Magnetic Spider":["misp-galaxy:threat-actor=\"Magnetic Spider\""],"Malware reusers":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Reuse team":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Dancing Salome":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Mana Team":["misp-galaxy:threat-actor=\"Mana Team\""],"Maverick Panda":["misp-galaxy:threat-actor=\"Maverick Panda\""],"PLA Navy":["misp-galaxy:threat-actor=\"Maverick Panda\"","misp-galaxy:threat-actor=\"Samurai Panda\"","misp-galaxy:threat-actor=\"Wekby\""],"Ke3Chang":["misp-galaxy:threat-actor=\"Mirage\""],"APT 15":["misp-galaxy:threat-actor=\"Mirage\""],"Metushy":["misp-galaxy:threat-actor=\"Mirage\""],"Social Network Team":["misp-galaxy:threat-actor=\"Mirage\""],"Royal APT":["misp-galaxy:threat-actor=\"Mirage\""],"Mofang":["misp-galaxy:threat-actor=\"Mofang\""],"Superman":["misp-galaxy:threat-actor=\"Mofang\""],"Gaza Hackers Team":["misp-galaxy:threat-actor=\"Molerats\""],"Gaza cybergang":["misp-galaxy:threat-actor=\"Molerats\""],"Extreme Jackal":["misp-galaxy:threat-actor=\"Molerats\""],"Moonlight":["misp-galaxy:threat-actor=\"Molerats\""],"MoneyTaker":["misp-galaxy:threat-actor=\"MoneyTaker\""],"Static Kitten":["misp-galaxy:threat-actor=\"MuddyWater\""],"Mustang Panda":["misp-galaxy:threat-actor=\"Mustang Panda\""],"PLA Unit 78020":["misp-galaxy:threat-actor=\"Naikon\""],"Override Panda":["misp-galaxy:threat-actor=\"Naikon\""],"Camerashy":["misp-galaxy:threat-actor=\"Naikon\""],"APT.Naikon":["misp-galaxy:threat-actor=\"Naikon\""],"APT 21":["misp-galaxy:threat-actor=\"NetTraveler\""],"APT21":["misp-galaxy:threat-actor=\"NetTraveler\""],"Nexus Zeta":["misp-galaxy:threat-actor=\"Nexus Zeta\""],"Nightshade Panda":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"APT 9":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowerlady\/Flowershow":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowerlady":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowershow":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Nitro":["misp-galaxy:threat-actor=\"Nitro\""],"Covert Grove":["misp-galaxy:threat-actor=\"Nitro\""],"Nomad Panda":["misp-galaxy:threat-actor=\"Nomad Panda\""],"Twisted Kitten":["misp-galaxy:threat-actor=\"OilRig\""],"Crambus":["misp-galaxy:threat-actor=\"OilRig\""],"Helix Kitten":["misp-galaxy:threat-actor=\"OilRig\""],"OnionDog":["misp-galaxy:threat-actor=\"OnionDog\""],"Operation BugDrop":["misp-galaxy:threat-actor=\"Operation BugDrop\""],"Operation C-Major":["misp-galaxy:threat-actor=\"Operation C-Major\""],"Mythic Leopard":["misp-galaxy:threat-actor=\"Operation C-Major\""],"ProjectM":["misp-galaxy:threat-actor=\"Operation C-Major\""],"APT36":["misp-galaxy:threat-actor=\"Operation C-Major\""],"APT 36":["misp-galaxy:threat-actor=\"Operation C-Major\""],"TMP.Lapis":["misp-galaxy:threat-actor=\"Operation C-Major\""],"Operation Comando":["misp-galaxy:threat-actor=\"Operation Comando\""],"Operation Kabar Cobra":["misp-galaxy:threat-actor=\"Operation Kabar Cobra\""],"Operation Parliament":["misp-galaxy:threat-actor=\"Operation Parliament\""],"Operation Poison Needles":["misp-galaxy:threat-actor=\"Operation Poison Needles\""],"Operation ShadowHammer":["misp-galaxy:threat-actor=\"Operation ShadowHammer\""],"Operation Sharpshooter":["misp-galaxy:threat-actor=\"Operation Sharpshooter\""],"OurMine":["misp-galaxy:threat-actor=\"OurMine\""],"TwoForOne":["misp-galaxy:threat-actor=\"PLATINUM\""],"Pacha Group":["misp-galaxy:threat-actor=\"Pacha Group\""],"Pacifier APT":["misp-galaxy:threat-actor=\"Pacifier APT\"","misp-galaxy:threat-actor=\"Turla Group\""],"Skipper":["misp-galaxy:threat-actor=\"Pacifier APT\""],"Popeye":["misp-galaxy:threat-actor=\"Pacifier APT\"","misp-galaxy:threat-actor=\"Turla Group\""],"Packrat":["misp-galaxy:threat-actor=\"Packrat\""],"Pale Panda":["misp-galaxy:threat-actor=\"Pale Panda\""],"PassCV":["misp-galaxy:threat-actor=\"PassCV\""],"Pinchy Spider":["misp-galaxy:threat-actor=\"Pinchy Spider\""],"Pirate Panda":["misp-galaxy:threat-actor=\"Pirate Panda\""],"APT23":["misp-galaxy:threat-actor=\"Pirate Panda\""],"APT 23":["misp-galaxy:threat-actor=\"Pirate Panda\""],"Pitty Panda":["misp-galaxy:threat-actor=\"Pitty Panda\""],"MANGANESE":["misp-galaxy:threat-actor=\"Pitty Panda\""],"Pizzo Spider":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"DD4BC":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"Ambiorx":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"Poisonous Panda":["misp-galaxy:threat-actor=\"Poisonous Panda\""],"Predator Panda":["misp-galaxy:threat-actor=\"Predator Panda\""],"Sauron":["misp-galaxy:threat-actor=\"ProjectSauron\""],"Project Sauron":["misp-galaxy:threat-actor=\"ProjectSauron\""],"PLA Unit 61486":["misp-galaxy:threat-actor=\"Putter Panda\""],"APT 2":["misp-galaxy:threat-actor=\"Putter Panda\""],"Group 36":["misp-galaxy:threat-actor=\"Putter Panda\""],"APT-2":["misp-galaxy:threat-actor=\"Putter Panda\""],"4HCrew":["misp-galaxy:threat-actor=\"Putter Panda\""],"SULPHUR":["misp-galaxy:threat-actor=\"Putter Panda\""],"SearchFire":["misp-galaxy:threat-actor=\"Putter Panda\""],"TG-6952":["misp-galaxy:threat-actor=\"Putter Panda\""],"RANCOR":["misp-galaxy:threat-actor=\"RANCOR\""],"Rancor group":["misp-galaxy:threat-actor=\"RANCOR\""],"Rancor Group":["misp-galaxy:threat-actor=\"RANCOR\""],"RASPITE":["misp-galaxy:threat-actor=\"RASPITE\""],"LeafMiner":["misp-galaxy:threat-actor=\"RASPITE\""],"Radio Panda":["misp-galaxy:threat-actor=\"Radio Panda\""],"Shrouded Crossbow":["misp-galaxy:threat-actor=\"Radio Panda\""],"Ratpak Spider":["misp-galaxy:threat-actor=\"Ratpak Spider\""],"Rebel Jackal":["misp-galaxy:threat-actor=\"Rebel Jackal\""],"FallagaTeam":["misp-galaxy:threat-actor=\"Rebel Jackal\""],"Red October":["misp-galaxy:threat-actor=\"Red October\""],"the Rocra":["misp-galaxy:threat-actor=\"Red October\""],"Roaming Mantis Group":["misp-galaxy:threat-actor=\"Roaming Mantis\""],"Roaming Tiger":["misp-galaxy:threat-actor=\"Roaming Tiger\""],"Rocke":["misp-galaxy:threat-actor=\"Rocke\""],"Operation Woolen Goldfish":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"Thamar Reservoir":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"Timberworm":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"SNOWGLOBE":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"Animal Farm":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"Snowglobe":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"STARDUST CHOLLIMA":["misp-galaxy:threat-actor=\"STARDUST CHOLLIMA\""],"STOLEN PENCIL":["misp-galaxy:threat-actor=\"STOLEN PENCIL\""],"Sabre Panda":["misp-galaxy:threat-actor=\"Sabre Panda\""],"Salty Spider":["misp-galaxy:threat-actor=\"Salty Spider\""],"Samurai Panda":["misp-galaxy:threat-actor=\"Samurai Panda\""],"APT4":["misp-galaxy:threat-actor=\"Samurai Panda\""],"APT 4":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Wisp Team":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Getkys":["misp-galaxy:threat-actor=\"Samurai Panda\""],"SykipotGroup":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Wkysol":["misp-galaxy:threat-actor=\"Samurai Panda\""],"SandCat":["misp-galaxy:threat-actor=\"SandCat\""],"Sands Casino":["misp-galaxy:threat-actor=\"Sands Casino\""],"Voodoo Bear":["misp-galaxy:threat-actor=\"Sandworm\""],"TEMP.Noble":["misp-galaxy:threat-actor=\"Sandworm\""],"Iron Viking":["misp-galaxy:threat-actor=\"Sandworm\""],"Sath-\u0131 M\u00fcdafaa":["misp-galaxy:threat-actor=\"Sath-\u0131 M\u00fcdafaa\""],"Sea Turtle":["misp-galaxy:threat-actor=\"Sea Turtle\""],"Shadow Network":["misp-galaxy:threat-actor=\"Shadow Network\""],"Shark Spider":["misp-galaxy:threat-actor=\"Shark Spider\""],"Group 13":["misp-galaxy:threat-actor=\"Shell Crew\""],"Sh3llCr3w":["misp-galaxy:threat-actor=\"Shell Crew\""],"Siesta":["misp-galaxy:threat-actor=\"Siesta\""],"Silence group":["misp-galaxy:threat-actor=\"Silence group\""],"Silent Chollima":["misp-galaxy:threat-actor=\"Silent Chollima\""],"OperationTroy":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Guardian of Peace":["misp-galaxy:threat-actor=\"Silent Chollima\""],"GOP":["misp-galaxy:threat-actor=\"Silent Chollima\""],"WHOis Team":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Subgroup: Andariel":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Silent Librarian":["misp-galaxy:threat-actor=\"Silent Librarian\""],"Mabna Institute":["misp-galaxy:threat-actor=\"Silent Librarian\""],"Sima":["misp-galaxy:threat-actor=\"Sima\""],"Singing Spider":["misp-galaxy:threat-actor=\"Singing Spider\""],"Snake Wine":["misp-galaxy:threat-actor=\"Snake Wine\""],"PawnStorm":["misp-galaxy:threat-actor=\"Sofacy\""],"TAG_0700":["misp-galaxy:threat-actor=\"Sofacy\""],"IRON TWILIGHT":["misp-galaxy:threat-actor=\"Sofacy\""],"SIG40":["misp-galaxy:threat-actor=\"Sofacy\""],"Spicy Panda":["misp-galaxy:threat-actor=\"Spicy Panda\""],"Stalker Panda":["misp-galaxy:threat-actor=\"Stalker Panda\""],"FruityArmor":["misp-galaxy:threat-actor=\"Stealth Falcon\""],"APT 10":["misp-galaxy:threat-actor=\"Stone Panda\""],"MenuPass":["misp-galaxy:threat-actor=\"Stone Panda\""],"Menupass Team":["misp-galaxy:threat-actor=\"Stone Panda\""],"menuPass Team":["misp-galaxy:threat-actor=\"Stone Panda\""],"happyyongzi":["misp-galaxy:threat-actor=\"Stone Panda\""],"POTASSIUM":["misp-galaxy:threat-actor=\"Stone Panda\""],"DustStorm":["misp-galaxy:threat-actor=\"Stone Panda\""],"Cloud Hopper":["misp-galaxy:threat-actor=\"Stone Panda\""],"Subaat":["misp-galaxy:threat-actor=\"Subaat\"","misp-galaxy:threat-actor=\"The Gorgon Group\""],"TA505":["misp-galaxy:threat-actor=\"TA505\""],"TA530":["misp-galaxy:threat-actor=\"TA530\""],"TEMP.Hermit":["misp-galaxy:threat-actor=\"TEMP.Hermit\""],"Xenotime":["misp-galaxy:threat-actor=\"TEMP.Veles\""],"TeamSpy Crew":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"TeamSpy":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"Team Bear":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"Anger Bear":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"TeamXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"CorporacaoXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"CorporationXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"TeleBots":["misp-galaxy:threat-actor=\"TeleBots\""],"TempTick":["misp-galaxy:threat-actor=\"TempTick\""],"Temper Panda":["misp-galaxy:threat-actor=\"Temper Panda\""],"Admin338":["misp-galaxy:threat-actor=\"Temper Panda\""],"Team338":["misp-galaxy:threat-actor=\"Temper Panda\""],"MAGNESIUM":["misp-galaxy:threat-actor=\"Temper Panda\""],"Test Panda":["misp-galaxy:threat-actor=\"Test Panda\""],"The Big Bang":["misp-galaxy:threat-actor=\"The Big Bang\""],"The Gorgon Group":["misp-galaxy:threat-actor=\"The Gorgon Group\""],"The Shadow Brokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"The ShadowBrokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"TSB":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"Shadow Brokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"ShadowBrokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"Bronze Butler":["misp-galaxy:threat-actor=\"Tick\""],"RedBaldKnight":["misp-galaxy:threat-actor=\"Tick\""],"Tiny Spider":["misp-galaxy:threat-actor=\"Tiny Spider\""],"Tonto Team":["misp-galaxy:threat-actor=\"Tonto Team\""],"Toxic Panda":["misp-galaxy:threat-actor=\"Toxic Panda\""],"Operation Tropic Trooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"Operation TropicTrooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"TropicTrooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"TurkHackTeam":["misp-galaxy:threat-actor=\"TurkHackTeam\""],"Turk Hack Team":["misp-galaxy:threat-actor=\"TurkHackTeam\""],"Turla Group":["misp-galaxy:threat-actor=\"Turla Group\""],"Venomous Bear":["misp-galaxy:threat-actor=\"Turla Group\""],"Group 88":["misp-galaxy:threat-actor=\"Turla Group\""],"WRAITH":["misp-galaxy:threat-actor=\"Turla Group\""],"Turla Team":["misp-galaxy:threat-actor=\"Turla Group\""],"Pfinet":["misp-galaxy:threat-actor=\"Turla Group\""],"TAG_0530":["misp-galaxy:threat-actor=\"Turla Group\""],"KRYPTON":["misp-galaxy:threat-actor=\"Turla Group\""],"SIG23":["misp-galaxy:threat-actor=\"Turla Group\""],"Iron Hunter":["misp-galaxy:threat-actor=\"Turla Group\""],"UPS":["misp-galaxy:threat-actor=\"UPS\""],"APT 3":["misp-galaxy:threat-actor=\"UPS\""],"Group 6":["misp-galaxy:threat-actor=\"UPS\""],"Boyusec":["misp-galaxy:threat-actor=\"UPS\""],"Union Panda":["misp-galaxy:threat-actor=\"Union Panda\""],"Union Spider":["misp-galaxy:threat-actor=\"Union Spider\""],"Unit 8200":["misp-galaxy:threat-actor=\"Unit 8200\""],"Duqu Group":["misp-galaxy:threat-actor=\"Unit 8200\""],"Unnamed Actor":["misp-galaxy:threat-actor=\"Unnamed Actor\""],"Viceroy Tiger":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"Appin":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"OperationHangover":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"Viking Jackal":["misp-galaxy:threat-actor=\"Viking Jackal\""],"Vikingdom":["misp-galaxy:threat-actor=\"Viking Jackal\""],"Violin Panda":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT20":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT 20":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT8":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT 8":["misp-galaxy:threat-actor=\"Violin Panda\""],"TH3Bug":["misp-galaxy:threat-actor=\"Violin Panda\""],"Volatile Cedar":["misp-galaxy:threat-actor=\"Volatile Cedar\""],"WIZARD SPIDER":["misp-galaxy:threat-actor=\"WIZARD SPIDER\""],"Wekby":["misp-galaxy:threat-actor=\"Wekby\""],"APT 18":["misp-galaxy:threat-actor=\"Wekby\""],"SCANDIUM":["misp-galaxy:threat-actor=\"Wekby\""],"Wet Panda":["misp-galaxy:threat-actor=\"Wet Panda\""],"White Bear":["misp-galaxy:threat-actor=\"White Bear\""],"Skipper Turla":["misp-galaxy:threat-actor=\"White Bear\""],"Whitefly":["misp-galaxy:threat-actor=\"Whitefly\""],"WildNeutron":["misp-galaxy:threat-actor=\"WildNeutron\""],"Butterfly":["misp-galaxy:threat-actor=\"WildNeutron\""],"Morpho":["misp-galaxy:threat-actor=\"WildNeutron\""],"Sphinx Moth":["misp-galaxy:threat-actor=\"WildNeutron\""],"WindShift":["misp-galaxy:threat-actor=\"WindShift\""],"Winnti Umbrella":["misp-galaxy:threat-actor=\"Winnti Umbrella\""],"Wolf Spider":["misp-galaxy:threat-actor=\"Wolf Spider\""],"Zombie Spider":["misp-galaxy:threat-actor=\"Zombie Spider\""],"[Unnamed group]":["misp-galaxy:threat-actor=\"[Unnamed group]\""],"[Vault 7\/8]":["misp-galaxy:threat-actor=\"[Vault 7\/8]\""],"ALMA Communicator":["misp-galaxy:tool=\"ALMA Communicator\""],"AURIGA":["misp-galaxy:tool=\"AURIGA\""],"Agent ORM":["misp-galaxy:tool=\"Agent ORM\""],"Tosliph":["misp-galaxy:tool=\"Agent ORM\""],"ComRat":["misp-galaxy:tool=\"Agent.BTZ\""],"Agent.dne":["misp-galaxy:tool=\"Agent.dne\""],"PinkSlipBot":["misp-galaxy:tool=\"Akbot\""],"AmmyAdmin":["misp-galaxy:tool=\"AmmyAdmin\""],"August":["misp-galaxy:tool=\"August\""],"Aumlib":["misp-galaxy:tool=\"Aumlib\""],"Yayih":["misp-galaxy:tool=\"Aumlib\""],"mswab":["misp-galaxy:tool=\"Aumlib\""],"BANGAT":["misp-galaxy:tool=\"BANGAT\""],"BASHLITE":["misp-galaxy:tool=\"BASHLITE\""],"BISKVIT":["misp-galaxy:tool=\"BISKVIT\""],"BOUNCER":["misp-galaxy:tool=\"BOUNCER\""],"BabaYaga":["misp-galaxy:tool=\"BabaYaga\""],"BabyShark":["misp-galaxy:tool=\"BabyShark\""],"Backdoor.Dripion":["misp-galaxy:tool=\"Backdoor.Dripion\""],"Dripion":["misp-galaxy:tool=\"Backdoor.Dripion\""],"Backdoor.Tinybaron":["misp-galaxy:tool=\"Backdoor.Tinybaron\""],"Backspace":["misp-galaxy:tool=\"Backspace\""],"Badnews":["misp-galaxy:tool=\"Badnews\""],"Bookworm":["misp-galaxy:tool=\"Bookworm\""],"Brushaloader":["misp-galaxy:tool=\"Brushaloader\""],"Bunny":["misp-galaxy:tool=\"Bunny\""],"Bushaloader":["misp-galaxy:tool=\"Bushaloader\""],"(.v2 fysbis)":["misp-galaxy:tool=\"CHOPSTICK\""],"CMStar":["misp-galaxy:tool=\"CMStar\""],"COMBOS":["misp-galaxy:tool=\"COMBOS\""],"COOKIEBAG":["misp-galaxy:tool=\"COOKIEBAG\""],"TROJAN.COOKIES":["misp-galaxy:tool=\"COOKIEBAG\""],"APT.InfoStealer.Win.CORALDECK":["misp-galaxy:tool=\"CORALDECK\""],"FE_APT_InfoStealer_Win_CORALDECK_1":["misp-galaxy:tool=\"CORALDECK\""],"CTRat":["misp-galaxy:tool=\"CTRat\""],"CUTLET MAKER":["misp-galaxy:tool=\"CUTLET MAKER\""],"CWoolger":["misp-galaxy:tool=\"CWoolger\""],"Cadelspy":["misp-galaxy:tool=\"Cadelspy\""],"WinSpy":["misp-galaxy:tool=\"Cadelspy\""],"Carp Downloader":["misp-galaxy:tool=\"Carp Downloader\""],"Cheshire Cat":["misp-galaxy:tool=\"Cheshire Cat\""],"Pegasus spyware":["misp-galaxy:tool=\"Chrysaor\""],"ClipboardWalletHijacker":["misp-galaxy:tool=\"ClipboardWalletHijacker\""],"Cowboy":["misp-galaxy:tool=\"Cowboy\""],"CowerSnail":["misp-galaxy:tool=\"CowerSnail\""],"Cromptui":["misp-galaxy:tool=\"Cromptui\""],"CroniX":["misp-galaxy:tool=\"CroniX\""],"DAIRY":["misp-galaxy:tool=\"DAIRY\""],"DHS2015":["misp-galaxy:tool=\"DHS2015\""],"iRAT":["misp-galaxy:tool=\"DHS2015\""],"FE_APT_RAT_DOGCALL":["misp-galaxy:tool=\"DOGCALL\""],"FE_APT_Backdoor_Win32_DOGCALL_1":["misp-galaxy:tool=\"DOGCALL\""],"APT.Backdoor.Win.DOGCALL":["misp-galaxy:tool=\"DOGCALL\""],"DOPU":["misp-galaxy:tool=\"DOPU\""],"DanderSpritz":["misp-galaxy:tool=\"DanderSpritz\""],"Dander Spritz":["misp-galaxy:tool=\"DanderSpritz\""],"Dark Pulsar":["misp-galaxy:tool=\"DarkPulsar\""],"TROJ_DLLSERV.BE":["misp-galaxy:tool=\"Derusbi\""],"Digmine":["misp-galaxy:tool=\"Digmine\""],"Disgufa":["misp-galaxy:tool=\"Disgufa\""],"DoubleFantasy":["misp-galaxy:tool=\"DoubleFantasy\""],"DownRage":["misp-galaxy:tool=\"DownRage\""],"Carberplike":["misp-galaxy:tool=\"DownRage\""],"DownRange":["misp-galaxy:tool=\"DownRange\""],"Downloader-FGO":["misp-galaxy:tool=\"Downloader-FGO\""],"Win32:Malware-gen":["misp-galaxy:tool=\"Downloader-FGO\""],"Generic30.ASYL (Trojan horse)":["misp-galaxy:tool=\"Downloader-FGO\""],"TR\/Agent.84480.85":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan.Generic.8627031":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan:Win32\/Sisproc":["misp-galaxy:tool=\"Downloader-FGO\""],"SB\/Malware":["misp-galaxy:tool=\"Downloader-FGO\""],"Trj\/CI.A":["misp-galaxy:tool=\"Downloader-FGO\""],"Mal\/Behav-112":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan.Spuler":["misp-galaxy:tool=\"Downloader-FGO\""],"TROJ_KAZY.SM1":["misp-galaxy:tool=\"Downloader-FGO\""],"Win32\/FakePPT_i":["misp-galaxy:tool=\"Downloader-FGO\""],"EAGERLEVER":["misp-galaxy:tool=\"EAGERLEVER\""],"EARLYSHOVEL":["misp-galaxy:tool=\"EARLYSHOVEL\""],"EASYBEE":["misp-galaxy:tool=\"EASYBEE\""],"EASYFUN":["misp-galaxy:tool=\"EASYFUN\""],"EASYPI":["misp-galaxy:tool=\"EASYPI\""],"EBBISLAND (EBBSHAVE)":["misp-galaxy:tool=\"EBBISLAND (EBBSHAVE)\""],"ECHOWRECKER":["misp-galaxy:tool=\"ECHOWRECKER\""],"ECLIPSEDWING":["misp-galaxy:tool=\"ECLIPSEDWING\""],"EDUCATEDSCHOLAR":["misp-galaxy:tool=\"EDUCATEDSCHOLAR\""],"ELF_IMEIJ":["misp-galaxy:tool=\"ELF_IMEIJ\""],"EMERALDTHREAD":["misp-galaxy:tool=\"EMERALDTHREAD\""],"EMPHASISMINE":["misp-galaxy:tool=\"EMPHASISMINE\""],"ENGLISHMANSDENTIST":["misp-galaxy:tool=\"ENGLISHMANSDENTIST\""],"EPICHERO":["misp-galaxy:tool=\"EPICHERO\""],"ERRATICGOPHER":["misp-galaxy:tool=\"ERRATICGOPHER\""],"ERRATICGOPHERTOUCH":["misp-galaxy:tool=\"ERRATICGOPHERTOUCH\""],"ESKIMOROLL":["misp-galaxy:tool=\"ESKIMOROLL\""],"ESSAYKEYNOTE":["misp-galaxy:tool=\"ESSAYKEYNOTE\""],"ESTEEMAUDIT":["misp-galaxy:tool=\"ESTEEMAUDIT\""],"ETCETERABLUE":["misp-galaxy:tool=\"ETCETERABLUE\""],"ETERNALBLUE":["misp-galaxy:tool=\"ETERNALBLUE\""],"ETERNALCHAMPION":["misp-galaxy:tool=\"ETERNALCHAMPION\""],"ETERNALROMANCE":["misp-galaxy:tool=\"ETERNALROMANCE\""],"ETERNALSYNERGY":["misp-galaxy:tool=\"ETERNALSYNERGY\""],"ETRE":["misp-galaxy:tool=\"ETRE\""],"EVADEFRED":["misp-galaxy:tool=\"EVADEFRED\""],"EVILNUM":["misp-galaxy:tool=\"EVILNUM\""],"EWOKFRENZY":["misp-galaxy:tool=\"EWOKFRENZY\""],"EXPIREDPAYCHECK":["misp-galaxy:tool=\"EXPIREDPAYCHECK\""],"EXPLODINGCAN":["misp-galaxy:tool=\"EXPLODINGCAN\""],"Elise Backdoor":["misp-galaxy:tool=\"Elise Backdoor\""],"Newsripper":["misp-galaxy:tool=\"Emdivi\""],"Empyre":["misp-galaxy:tool=\"Empyre\""],"Empye":["misp-galaxy:tool=\"Empyre\""],"EngineBox Malware":["misp-galaxy:tool=\"EngineBox Malware\""],"EquationLaser":["misp-galaxy:tool=\"EquationLaser\""],"Escad":["misp-galaxy:tool=\"Escad\""],"Etumbot":["misp-galaxy:tool=\"Etumbot\""],"Exploz":["misp-galaxy:tool=\"Etumbot\""],"Specfix":["misp-galaxy:tool=\"Etumbot\""],"BKDR_HGDER":["misp-galaxy:tool=\"EvilGrab\""],"BKDR_EVILOGE":["misp-galaxy:tool=\"EvilGrab\""],"BKDR_NVICM":["misp-galaxy:tool=\"EvilGrab\""],"Wmonder":["misp-galaxy:tool=\"EvilGrab\""],"Exforel":["misp-galaxy:tool=\"Exforel\""],"Explosive":["misp-galaxy:tool=\"Explosive\""],"EyePyramid Malware":["misp-galaxy:tool=\"EyePyramid Malware\""],"FUZZBUNCH":["misp-galaxy:tool=\"FUZZBUNCH\""],"FacexWorm":["misp-galaxy:tool=\"FacexWorm\""],"Fadok":["misp-galaxy:tool=\"Fadok\""],"Win32\/Fadok":["misp-galaxy:tool=\"Fadok\""],"FAKEM":["misp-galaxy:tool=\"Fakem RAT\""],"Fexel":["misp-galaxy:tool=\"Fexel\""],"Loneagent":["misp-galaxy:tool=\"Fexel\""],"FlexSpy":["misp-galaxy:tool=\"FlexSpy\""],"Flokibot":["misp-galaxy:tool=\"Flokibot\""],"Floki Bot":["misp-galaxy:tool=\"Flokibot\""],"Floki":["misp-galaxy:tool=\"Flokibot\""],"Foozer":["misp-galaxy:tool=\"Foozer\""],"FormBook":["misp-galaxy:tool=\"FormBook\""],"Fysbis":["misp-galaxy:tool=\"Fysbis\""],"GDOCUPLOAD":["misp-galaxy:tool=\"GDOCUPLOAD\""],"GELCAPSULE":["misp-galaxy:tool=\"GELCAPSULE\""],"FE_APT_Downloader_Win32_GELCAPSULE_1":["misp-galaxy:tool=\"GELCAPSULE\""],"GETMAIL":["misp-galaxy:tool=\"GETMAIL\""],"GHOLE":["misp-galaxy:tool=\"GHOLE\""],"GHOTEX":["misp-galaxy:tool=\"GHOTEX\""],"TROJAN.GTALK":["misp-galaxy:tool=\"GLOOXMAIL\""],"GOGGLES":["misp-galaxy:tool=\"GOGGLES\""],"TROJAN.FOXY":["misp-galaxy:tool=\"GOGGLES\""],"GREENCAT":["misp-galaxy:tool=\"GREENCAT\""],"Gamut Botnet":["misp-galaxy:tool=\"Gamut Botnet\""],"Gh0st Rat":["misp-galaxy:tool=\"Gh0st Rat\""],"Gh0stRat, GhostRat":["misp-galaxy:tool=\"Gh0st Rat\""],"GoScanSSH":["misp-galaxy:tool=\"GoScanSSH\""],"Gootkit":["misp-galaxy:tool=\"GootKit\""],"GrayFish":["misp-galaxy:tool=\"GrayFish\""],"HACKFASE":["misp-galaxy:tool=\"HACKFASE\""],"FE_APT_Downloader_HAPPYWORK":["misp-galaxy:tool=\"HAPPYWORK\""],"FE_APT_Exploit_HWP_Happy":["misp-galaxy:tool=\"HAPPYWORK\""],"Downloader.APT.HAPPYWORK":["misp-galaxy:tool=\"HAPPYWORK\""],"HDRoot":["misp-galaxy:tool=\"HDRoot\""],"HELAUTO":["misp-galaxy:tool=\"HELAUTO\""],"TokenControl":["misp-galaxy:tool=\"HTTPBrowser\""],"Hackshit":["misp-galaxy:tool=\"Hackshit\""],"Tordal":["misp-galaxy:tool=\"Hancitor\""],"Helminth backdoor":["misp-galaxy:tool=\"Helminth backdoor\""],"HerHer Trojan":["misp-galaxy:tool=\"HerHer Trojan\""],"Heseber BOT":["misp-galaxy:tool=\"Heseber BOT\""],"Hi-ZOR":["misp-galaxy:tool=\"Hi-ZOR\""],"Hoardy":["misp-galaxy:tool=\"Hoardy\""],"Hoarde":["misp-galaxy:tool=\"Hoardy\""],"Phindolp":["misp-galaxy:tool=\"Hoardy\""],"Htran":["misp-galaxy:tool=\"Htran\""],"HUC Packet Transmitter":["misp-galaxy:tool=\"Htran\""],"Huigezi malware":["misp-galaxy:tool=\"Huigezi malware\""],"Houdini":["misp-galaxy:tool=\"Hworm\""],"Hyena":["misp-galaxy:tool=\"Hyena\""],"IISTOUCH":["misp-galaxy:tool=\"IISTOUCH\""],"IRONGATE":["misp-galaxy:tool=\"IRONGATE\""],"Incognito RAT":["misp-galaxy:tool=\"Incognito RAT\""],"IntrudingDivisor":["misp-galaxy:tool=\"IntrudingDivisor\""],"IoT_reaper":["misp-galaxy:tool=\"IoT_reaper\""],"Iron Backdoor":["misp-galaxy:tool=\"Iron Backdoor\""],"JS Flash":["misp-galaxy:tool=\"JS Flash\""],"JavaScript variant of HALFBAKED":["misp-galaxy:tool=\"JS Flash\""],"JS_POWMET":["misp-galaxy:tool=\"JS_POWMET\""],"JasperLoader":["misp-galaxy:tool=\"JasperLoader\""],"JexBoss":["misp-galaxy:tool=\"JexBoss\""],"Jripbot":["misp-galaxy:tool=\"Jripbot\""],"Jiripbot":["misp-galaxy:tool=\"Jripbot\""],"FE_APT_Backdoor_Karae_enc":["misp-galaxy:tool=\"KARAE\""],"FE_APT_Backdoor_Karae":["misp-galaxy:tool=\"KARAE\""],"Backdoor.APT.Karae":["misp-galaxy:tool=\"KARAE\""],"KURTON":["misp-galaxy:tool=\"KURTON\""],"KillDisk Wiper":["misp-galaxy:tool=\"KillDisk Wiper\""],"KimJongRAT":["misp-galaxy:tool=\"KimJongRAT\""],"KingMiner":["misp-galaxy:tool=\"KingMiner\""],"LATENTBOT":["misp-galaxy:tool=\"LATENTBOT\""],"LIGHTBOLT":["misp-galaxy:tool=\"LIGHTBOLT\""],"LIGHTDART":["misp-galaxy:tool=\"LIGHTDART\""],"LONGRUN":["misp-galaxy:tool=\"LONGRUN\""],"LURK":["misp-galaxy:tool=\"LURK\""],"LamePyre":["misp-galaxy:tool=\"LamePyre\""],"OSX.LamePyre":["misp-galaxy:tool=\"LamePyre\""],"Lazagne":["misp-galaxy:tool=\"Lazagne\""],"LockPoS":["misp-galaxy:tool=\"LockPoS\""],"Loki Bot":["misp-galaxy:tool=\"Loki Bot\""],"Lost Door RAT":["misp-galaxy:tool=\"Lost Door RAT\""],"LostDoor RAT":["misp-galaxy:tool=\"Lost Door RAT\""],"BKDR_LODORAT":["misp-galaxy:tool=\"Lost Door RAT\""],"LuminosityLink":["misp-galaxy:tool=\"LuminosityLink\""],"MANITSME":["misp-galaxy:tool=\"MANITSME\""],"MAPIGET":["misp-galaxy:tool=\"MAPIGET\""],"MFC Huner":["misp-galaxy:tool=\"MFC Huner\""],"Hupigon":["misp-galaxy:tool=\"MFC Huner\""],"BKDR_HUPIGON":["misp-galaxy:tool=\"MFC Huner\""],"MILKDROP":["misp-galaxy:tool=\"MILKDROP\""],"FE_Trojan_Win32_MILKDROP_1":["misp-galaxy:tool=\"MILKDROP\""],"MINIASP":["misp-galaxy:tool=\"MINIASP\""],"MM Core backdoor":["misp-galaxy:tool=\"MM Core\""],"BigBoss":["misp-galaxy:tool=\"MM Core\""],"SillyGoose":["misp-galaxy:tool=\"MM Core\""],"BaneChant":["misp-galaxy:tool=\"MM Core\""],"StrangeLove":["misp-galaxy:tool=\"MM Core\""],"MagentoCore Malware":["misp-galaxy:tool=\"MagentoCore Malware\""],"Maikspy":["misp-galaxy:tool=\"Maikspy\""],"Mikatz":["misp-galaxy:tool=\"Mimikatz\""],"Linux\/Mirai":["misp-galaxy:tool=\"Mirai\""],"MoneyTaker 5.0":["misp-galaxy:tool=\"MoneyTaker 5.0\""],"Moneygram Adwind":["misp-galaxy:tool=\"Moneygram Adwind\""],"Mongall":["misp-galaxy:tool=\"Mongall\""],"Moudoor":["misp-galaxy:tool=\"Moudoor\""],"SCAR":["misp-galaxy:tool=\"Moudoor\""],"KillProc.14145":["misp-galaxy:tool=\"Moudoor\""],"NAMEDPIPETOUCH":["misp-galaxy:tool=\"NAMEDPIPETOUCH\""],"NBot":["misp-galaxy:tool=\"NBot\""],"NEWSREELS":["misp-galaxy:tool=\"NEWSREELS\""],"NLBrute":["misp-galaxy:tool=\"NLBrute\""],"NanoCoreRAT":["misp-galaxy:tool=\"NanoCoreRAT\""],"Nancrat":["misp-galaxy:tool=\"NanoCoreRAT\""],"Zurten":["misp-galaxy:tool=\"NanoCoreRAT\""],"Atros2.CKPN":["misp-galaxy:tool=\"NanoCoreRAT\""],"Netfile":["misp-galaxy:tool=\"NetTraveler\""],"Neteagle":["misp-galaxy:tool=\"Neteagle\""],"scout":["misp-galaxy:tool=\"Neteagle\""],"norton":["misp-galaxy:tool=\"Neteagle\""],"Nflog":["misp-galaxy:tool=\"Nflog\""],"Not Petya":["misp-galaxy:tool=\"NotPetya\""],"ODDJOB":["misp-galaxy:tool=\"ODDJOB\""],"BackDoor-FDU":["misp-galaxy:tool=\"OLDBAIT\""],"IEChecker":["misp-galaxy:tool=\"OLDBAIT\""],"OSX.BadWord":["misp-galaxy:tool=\"OSX.BadWord\""],"OSX.Pirrit":["misp-galaxy:tool=\"OSX.Pirrit\""],"OSX\/Pirrit":["misp-galaxy:tool=\"OSX.Pirrit\""],"OSX\/Shlayer":["misp-galaxy:tool=\"OSX\/Shlayer\""],"Oldrea":["misp-galaxy:tool=\"Oldrea\""],"HSDFSDCrypt":["misp-galaxy:tool=\"Ordinypt\""],"OzoneRAT":["misp-galaxy:tool=\"OzoneRAT\""],"Ozone RAT":["misp-galaxy:tool=\"OzoneRAT\""],"ozonercp":["misp-galaxy:tool=\"OzoneRAT\""],"PAExec":["misp-galaxy:tool=\"PAExec\""],"PASSFREELY":["misp-galaxy:tool=\"PASSFREELY\""],"PCClient RAT":["misp-galaxy:tool=\"PCClient RAT\""],"PLEAD Downloader":["misp-galaxy:tool=\"PLEAD Downloader\""],"PNG Dropper":["misp-galaxy:tool=\"PNG Dropper\""],"PNG_Dropper":["misp-galaxy:tool=\"PNG Dropper\""],"PNGDropper":["misp-galaxy:tool=\"PNG Dropper\""],"Backdoor.APT.POORAIM":["misp-galaxy:tool=\"POORAIM\""],"PRILEX":["misp-galaxy:tool=\"PRILEX\""],"PWOBot":["misp-galaxy:tool=\"PWOBot\""],"PWOLauncher":["misp-galaxy:tool=\"PWOBot\""],"PWOHTTPD":["misp-galaxy:tool=\"PWOBot\""],"PWOKeyLogger":["misp-galaxy:tool=\"PWOBot\""],"PWOMiner":["misp-galaxy:tool=\"PWOBot\""],"PWOPyExec":["misp-galaxy:tool=\"PWOBot\""],"PWOQuery":["misp-galaxy:tool=\"PWOBot\""],"Palevo":["misp-galaxy:tool=\"Palevo\""],"Badey":["misp-galaxy:tool=\"Pirpi\""],"EXL":["misp-galaxy:tool=\"Pirpi\""],"Backdoor.FSZO-5117":["misp-galaxy:tool=\"PlugX\""],"Trojan.Heur.JP.juW@ayZZvMb":["misp-galaxy:tool=\"PlugX\""],"Trojan.Inject1.6386":["misp-galaxy:tool=\"PlugX\""],"Agent.dhwf":["misp-galaxy:tool=\"PlugX\""],"Preshin":["misp-galaxy:tool=\"Preshin\""],"PupyRAT":["misp-galaxy:tool=\"PupyRAT\""],"QUASARRAT":["misp-galaxy:tool=\"QUASARRAT\""],"RCS Galileo":["misp-galaxy:tool=\"RCS Galileo\""],"RDPWrap":["misp-galaxy:tool=\"RDPWrap\""],"REDLEAVES":["misp-galaxy:tool=\"REDLEAVES\""],"RICECURRY":["misp-galaxy:tool=\"RICECURRY\""],"Exploit.APT.RICECURRY":["misp-galaxy:tool=\"RICECURRY\""],"RPCOUTCH":["misp-galaxy:tool=\"RPCOUTCH\""],"RUHAPPY":["misp-galaxy:tool=\"RUHAPPY\""],"FE_APT_Trojan_Win32_RUHAPPY_1":["misp-galaxy:tool=\"RUHAPPY\""],"Ratankba":["misp-galaxy:tool=\"Ratankba\""],"Prax":["misp-galaxy:tool=\"Regin\""],"WarriorPride":["misp-galaxy:tool=\"Regin\""],"Rekaf":["misp-galaxy:tool=\"Rekaf\""],"Rotexy":["misp-galaxy:tool=\"Rotexy\""],"SMSThief":["misp-galaxy:tool=\"Rotexy\""],"Rotinom":["misp-galaxy:tool=\"Rotinom\""],"ROVNIX":["misp-galaxy:tool=\"Rovnix\""],"RoyalDNS":["misp-galaxy:tool=\"RoyalDNS\""],"Rubella Macro Builder":["misp-galaxy:tool=\"Rubella Macro Builder\""],"SEASALT":["misp-galaxy:tool=\"SEASALT\""],"FE_APT_Backdoor_SHUTTERSPEED":["misp-galaxy:tool=\"SHUTTERSPEED\""],"APT.Backdoor.SHUTTERSPEED":["misp-galaxy:tool=\"SHUTTERSPEED\""],"FE_APT_Downloader_Win_SLOWDRIFT_1":["misp-galaxy:tool=\"SLOWDRIFT\""],"FE_APT_Downloader_Win_SLOWDRIFT_2":["misp-galaxy:tool=\"SLOWDRIFT\""],"APT.Downloader.SLOWDRIFT":["misp-galaxy:tool=\"SLOWDRIFT\""],"SLUB Backdoor":["misp-galaxy:tool=\"SLUB Backdoor\""],"SMBTOUCH":["misp-galaxy:tool=\"SMBTOUCH\""],"SOUNDWAVE":["misp-galaxy:tool=\"SOUNDWAVE\""],"FE_APT_HackTool_Win32_SOUNDWAVE_1":["misp-galaxy:tool=\"SOUNDWAVE\""],"SPIVY":["misp-galaxy:tool=\"SPIVY\""],"STARSYPOUND":["misp-galaxy:tool=\"STARSYPOUND\""],"SURTR":["misp-galaxy:tool=\"SURTR\""],"SWORD":["misp-galaxy:tool=\"SWORD\""],"Scieron":["misp-galaxy:tool=\"Scieron\""],"Scranos":["misp-galaxy:tool=\"Scranos\""],"Sekur":["misp-galaxy:tool=\"Sekur\""],"ShimRAT":["misp-galaxy:tool=\"ShimRAT\""],"Shipup":["misp-galaxy:tool=\"Shipup\""],"Shiz":["misp-galaxy:tool=\"Shiz\""],"Win32\/Sirefef":["misp-galaxy:tool=\"Sirefef\""],"SkeletonKey":["misp-galaxy:tool=\"SkeletonKey\""],"Skyipot":["misp-galaxy:tool=\"Skyipot\""],"GM-Bot":["misp-galaxy:tool=\"Slempo\""],"Spindest":["misp-galaxy:tool=\"Spindest\""],"StalinLocker":["misp-galaxy:tool=\"StalinLocker\""],"StalinScreamer":["misp-galaxy:tool=\"StalinLocker\""],"StealthWorker":["misp-galaxy:tool=\"StealthWorker\""],"StrongPity2":["misp-galaxy:tool=\"StrongPity2\""],"Win32\/StrongPity2":["misp-galaxy:tool=\"StrongPity2\""],"trojan-banker.androidos.svpeng.ae":["misp-galaxy:tool=\"Svpeng\""],"Swisyn":["misp-galaxy:tool=\"Swisyn\""],"T5000":["misp-galaxy:tool=\"T5000\""],"Plat1":["misp-galaxy:tool=\"T5000\""],"TABMSGSQL":["misp-galaxy:tool=\"TABMSGSQL\""],"TROJAN LETSGO":["misp-galaxy:tool=\"TABMSGSQL\""],"TARSIP-ECLIPSE":["misp-galaxy:tool=\"TARSIP-ECLIPSE\""],"TARSIP-MOON":["misp-galaxy:tool=\"TARSIP-MOON\""],"TRISIS":["misp-galaxy:tool=\"TRISIS\""],"TRITON":["misp-galaxy:tool=\"TRISIS\""],"Tafacalou":["misp-galaxy:tool=\"Tafacalou\""],"Tartine":["misp-galaxy:tool=\"Tartine\""],"Taurus":["misp-galaxy:tool=\"Taurus\""],"Tdrop":["misp-galaxy:tool=\"Tdrop\""],"Tdrop2":["misp-galaxy:tool=\"Tdrop2\""],"Terra Loader":["misp-galaxy:tool=\"Terra Loader\""],"Torn RAT":["misp-galaxy:tool=\"Torn RAT\""],"Travle":["misp-galaxy:tool=\"Travle\""],"PYLOT":["misp-galaxy:tool=\"Travle\""],"Trick Bot":["misp-galaxy:tool=\"Trick Bot\""],"TripleFantasy":["misp-galaxy:tool=\"TripleFantasy\""],"Trojan.Laziok":["misp-galaxy:tool=\"Trojan.Laziok\""],"Trojan.Naid":["misp-galaxy:tool=\"Trojan.Naid\""],"Mdmbot.E":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.GUNZ":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.AQUP.DROPPER":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.BMZA":["misp-galaxy:tool=\"Trojan.Naid\""],"MCRAT.A":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.ABQMR":["misp-galaxy:tool=\"Trojan.Naid\""],"Trojan.Seaduke":["misp-galaxy:tool=\"Trojan.Seaduke\""],"Seaduke":["misp-galaxy:tool=\"Trojan.Seaduke\""],"Troy":["misp-galaxy:tool=\"Troy\""],"Urouros":["misp-galaxy:tool=\"Turla\""],"UselessDisk":["misp-galaxy:tool=\"UselessDisk\""],"DiskWriter":["misp-galaxy:tool=\"UselessDisk\""],"VB Flash":["misp-galaxy:tool=\"VB Flash\""],"VPNFilter":["misp-galaxy:tool=\"VPNFilter\""],"WARP":["misp-galaxy:tool=\"WARP\""],"WEBC2-ADSPACE":["misp-galaxy:tool=\"WEBC2-ADSPACE\""],"WEBC2-AUSOV":["misp-galaxy:tool=\"WEBC2-AUSOV\""],"WEBC2-BOLID":["misp-galaxy:tool=\"WEBC2-BOLID\""],"WEBC2-CLOVER":["misp-galaxy:tool=\"WEBC2-CLOVER\""],"WEBC2-CSON":["misp-galaxy:tool=\"WEBC2-CSON\""],"WEBC2-DIV":["misp-galaxy:tool=\"WEBC2-DIV\""],"WEBC2-GREENCAT":["misp-galaxy:tool=\"WEBC2-GREENCAT\""],"WEBC2-HEAD":["misp-galaxy:tool=\"WEBC2-HEAD\""],"WEBC2-KT3":["misp-galaxy:tool=\"WEBC2-KT3\""],"WEBC2-QBP":["misp-galaxy:tool=\"WEBC2-QBP\""],"WEBC2-RAVE":["misp-galaxy:tool=\"WEBC2-RAVE\""],"WEBC2-TABLE":["misp-galaxy:tool=\"WEBC2-TABLE\""],"WEBC2-TOCK":["misp-galaxy:tool=\"WEBC2-TOCK\""],"WEBC2-UGX":["misp-galaxy:tool=\"WEBC2-UGX\""],"WEBC2-Y21K":["misp-galaxy:tool=\"WEBC2-Y21K\""],"WEBC2-YAHOO":["misp-galaxy:tool=\"WEBC2-YAHOO\""],"FE_APT_Backdoor_WINERACK":["misp-galaxy:tool=\"WINERACK\""],"Backdoor.APT.WINERACK":["misp-galaxy:tool=\"WINERACK\""],"WinIDS":["misp-galaxy:tool=\"WinIDS\""],"Etso":["misp-galaxy:tool=\"Winnti\""],"SUQ":["misp-galaxy:tool=\"Winnti\""],"Agent.ALQHI":["misp-galaxy:tool=\"Winnti\""],"Epic Turla":["misp-galaxy:tool=\"Wipbot\""],"Wmiexec":["misp-galaxy:tool=\"Wmiexec\""],"XAgent":["misp-galaxy:tool=\"X-Agent\""],"XSControl":["misp-galaxy:tool=\"XSControl\""],"W32\/Seeav":["misp-galaxy:tool=\"Yahoyah\""],"ZUMKONG":["misp-galaxy:tool=\"ZUMKONG\""],"FE_APT_Trojan_Zumkong":["misp-galaxy:tool=\"ZUMKONG\""],"Trojan.APT.Zumkong":["misp-galaxy:tool=\"ZUMKONG\""],"Sensode":["misp-galaxy:tool=\"ZXShell\""],"ZeGhost":["misp-galaxy:tool=\"ZeGhost\""],"BackDoor-FBZT!52D84425CDF2":["misp-galaxy:tool=\"ZeGhost\""],"Trojan.Win32.Staser.ytq":["misp-galaxy:tool=\"ZeGhost\""],"Win32\/Zegost.BW":["misp-galaxy:tool=\"ZeGhost\""],"Trojan.Zbot":["misp-galaxy:tool=\"Zeus\""],"adzok":["misp-galaxy:tool=\"adzok\""],"albertino":["misp-galaxy:tool=\"albertino\""],"arcom":["misp-galaxy:tool=\"arcom\""],"blacknix":["misp-galaxy:tool=\"blacknix\""],"bluebanana":["misp-galaxy:tool=\"bluebanana\""],"bozok":["misp-galaxy:tool=\"bozok\""],"clientmesh":["misp-galaxy:tool=\"clientmesh\""],"csvde.exe":["misp-galaxy:tool=\"csvde.exe\""],"cybergate":["misp-galaxy:tool=\"cybergate\""],"da Vinci RCS":["misp-galaxy:tool=\"da Vinci RCS\""],"DaVinci":["misp-galaxy:tool=\"da Vinci RCS\""],"Morcut":["misp-galaxy:tool=\"da Vinci RCS\""],"darkcomet":["misp-galaxy:tool=\"darkcomet\""],"darkddoser":["misp-galaxy:tool=\"darkddoser\""],"darkrat":["misp-galaxy:tool=\"darkrat\""],"feodo":["misp-galaxy:tool=\"feodo\""],"greame":["misp-galaxy:tool=\"greame\""],"hawkeye":["misp-galaxy:tool=\"hawkeye\""],"javadropper":["misp-galaxy:tool=\"javadropper\""],"jspy":["misp-galaxy:tool=\"jspy\""],"kitty Malware":["misp-galaxy:tool=\"kitty Malware\""],"lostdoor":["misp-galaxy:tool=\"lostdoor\""],"luxnet":["misp-galaxy:tool=\"luxnet\""],"miniFlame":["misp-galaxy:tool=\"miniFlame\""],"njRAT":["misp-galaxy:tool=\"njRAT\""],"Jorik":["misp-galaxy:tool=\"njRAT\""],"pandora":["misp-galaxy:tool=\"pandora\""],"predatorpain":["misp-galaxy:tool=\"predatorpain\""],"punisher":["misp-galaxy:tool=\"punisher\""],"shadowtech":["misp-galaxy:tool=\"shadowtech\""],"smallnet":["misp-galaxy:tool=\"smallnet\""],"spygate":["misp-galaxy:tool=\"spygate\""],"tapaoux":["misp-galaxy:tool=\"tapaoux\""],"template":["misp-galaxy:tool=\"template\""],"vantom":["misp-galaxy:tool=\"vantom\""],"virusrat":["misp-galaxy:tool=\"virusrat\""],"wp-vcd":["misp-galaxy:tool=\"wp-vcd\""],"xDedic RDP Patch":["misp-galaxy:tool=\"xDedic RDP Patch\""],"xDedic SysScan":["misp-galaxy:tool=\"xDedic SysScan\""],"xena":["misp-galaxy:tool=\"xena\""],"xrat":["misp-galaxy:tool=\"xrat\""],"xtreme":["misp-galaxy:tool=\"xtreme\""]} \ No newline at end of file diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index 71ae7fa..a7d220d 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -15,4 +15,5 @@ __all__ = [ 'csvimport', 'cof2misp', 'joe_import', + 'taxii21' ] diff --git a/misp_modules/modules/import_mod/taxii21.py b/misp_modules/modules/import_mod/taxii21.py new file mode 100644 index 0000000..4993dbf --- /dev/null +++ b/misp_modules/modules/import_mod/taxii21.py @@ -0,0 +1,354 @@ +""" +Import content from a TAXII 2.1 server. +""" +import collections +import itertools +import json +import misp_modules.lib.stix2misp +from pathlib import Path +import re +import stix2.v20 +import taxii2client +import taxii2client.exceptions +import requests + + +class ConfigError(Exception): + """ + Represents an error in the config settings for one invocation of this + module. + """ + pass + + +misperrors = {'error': 'Error'} + +moduleinfo = {'version': '0.1', 'author': 'Abc', + 'description': 'Import content from a TAXII 2.1 server', + 'module-type': ['import']} + +mispattributes = { + 'inputSource': [], + 'output': ['MISP objects'], + 'format': 'misp_standard', +} + + +userConfig = { + "url": { + "type": "String", + "message": "A TAXII 2.1 collection URL", + }, + "added_after": { + "type": "String", + "message": "Lower bound on time the object was uploaded to the TAXII server" + }, + "stix_id": { + "type": "String", + "message": "STIX ID(s) of objects" + }, + "spec_version": { # TAXII 2.1 specific + "type": "String", + "message": "STIX version(s) of objects" + }, + "type": { + "type": "String", + "message": "STIX type(s) of objects" + }, + "version": { + "type": "String", + "message": 'Version timestamp(s), or "first"/"last"/"all"' + }, + # Should we give some user control over this? It will not be allowed to + # exceed the admin setting. + "STIX object limit": { + "type": "Integer", + "message": "Maximum number of STIX objects to process" + }, + "username": { + "type": "String", + "message": "Username for TAXII server authentication, if necessary" + }, + "password": { + "type": "String", + "message": "Password for TAXII server authentication, if necessary" + } +} + +# Paging will be handled transparently by this module, so user-defined +# paging-related filtering parameters will not be supported. + + +# This module will not process more than this number of STIX objects in total +# from a TAXII server in one module invocation (across all pages), to limit +# resource consumption. +moduleconfig = [ + "stix_object_limit" +] + + +# In case there is neither an admin nor user setting given. +_DEFAULT_STIX_OBJECT_LIMIT = 1000 + + +# Page size to use when paging TAXII results. Trades off the amount of +# hammering on TAXII servers and overhead of repeated requests, with the +# resource consumption of a single page. (Should be an admin setting too?) +_PAGE_SIZE = 100 + + +_synonymsToTagNames_path = Path(__file__).parent / "../../lib/synonymsToTagNames.json" + + +# Collects module config information necessary to perform the TAXII query. +Config = collections.namedtuple("Config", [ + "url", + "added_after", + "id", + "spec_version", + "type", + "version", + "stix_object_limit", + "username", + "password" +]) + + +def _normalize_multi_values(value): + """ + Some TAXII filters may contain multiple values separated by commas, + without spaces around the commas. Maybe give MISP users a little more + flexibility? This function normalizes a possible multi-valued value + (e.g. multiple values delimited by commas or spaces, all in the same + string) to TAXII-required format. + + :param value: A MISP config value + :return: A normalized value + """ + + if "," in value: + value = re.sub(r"\s*,\s*", ",", value) + else: + # Assume space delimiting; replace spaces with commas. + # I don't think we need to worry about spaces embedded in values. + value = re.sub(r"\s+", ",", value) + + value = value.strip(",") + + return value + + +def _get_config(config): + """ + Combine user, admin, and default config settings to produce a config + object with all settings together. + + :param config: The misp-modules request's "config" value. + :return: A Config object + :raises ConfigError: if any config errors are detected + """ + + # Strip whitespace from all config settings... except for password? + for key, val in config.items(): + if isinstance(val, str) and key != "password": + config[key] = val.strip() + + url = config.get("url") + added_after = config.get("added_after") + id_ = config.get("stix_id") + spec_version = config.get("spec_version") + type_ = config.get("type") + version_ = config.get("version") + username = config.get("username") + password = config.get("password") + admin_stix_object_limit = config.get("stix_object_limit") + user_stix_object_limit = config.get("STIX object limit") + + if admin_stix_object_limit: + admin_stix_object_limit = int(admin_stix_object_limit) + else: + admin_stix_object_limit = _DEFAULT_STIX_OBJECT_LIMIT + + if user_stix_object_limit: + user_stix_object_limit = int(user_stix_object_limit) + stix_object_limit = min(user_stix_object_limit, admin_stix_object_limit) + else: + stix_object_limit = admin_stix_object_limit + + # How much of this should we sanity-check here before passing it off to the + # TAXII client (and thence, to the TAXII server)? + + if not url: + raise ConfigError("A TAXII 2.1 collection URL is required.") + + if admin_stix_object_limit < 1: + raise ConfigError( + "Invalid admin object limit: must be positive: " + + str(admin_stix_object_limit) + ) + + if stix_object_limit < 1: + raise ConfigError( + "Invalid object limit: must be positive: " + + str(stix_object_limit) + ) + + if id_: + id_ = _normalize_multi_values(id_) + if spec_version: + spec_version = _normalize_multi_values(spec_version) + if type_: + type_ = _normalize_multi_values(type_) + if version_: + version_ = _normalize_multi_values(version_) + + # STIX->MISP converter currently only supports STIX 2.0, so let's force + # spec_version="2.0". + if not spec_version: + spec_version = "2.0" + elif spec_version != "2.0": + raise ConfigError('Only spec_version="2.0" is supported for now.') + + if (username and not password) or (not username and password): + raise ConfigError( + 'Both or neither of "username" and "password" are required.' + ) + + config_obj = Config( + url, added_after, id_, spec_version, type_, version_, stix_object_limit, + username, password + ) + + return config_obj + + +def _query_taxii(config): + """ + Query the TAXII server according to the given config, convert the STIX + results to MISP, and return a standard misp-modules response. + + :param config: Module config information as a Config object + :return: A dict containing a misp-modules response + """ + + collection = taxii2client.Collection( + config.url, user=config.username, password=config.password + ) + + # No point in asking for more than our overall limit. + page_size = min(_PAGE_SIZE, config.stix_object_limit) + + kwargs = { + "per_request": page_size + } + + if config.spec_version: + kwargs["spec_version"] = config.spec_version + if config.version: + kwargs["version"] = config.version + if config.id: + kwargs["id"] = config.id + if config.type: + kwargs["type"] = config.type + if config.added_after: + kwargs["added_after"] = config.added_after + + pages = taxii2client.as_pages( + collection.get_objects, + **kwargs + ) + + # Chain all the objects from all pages together... + all_stix_objects = itertools.chain.from_iterable( + taxii_envelope.get("objects", []) + for taxii_envelope in pages + ) + + # And only take the first N objects from that. + limited_stix_objects = itertools.islice( + all_stix_objects, 0, config.stix_object_limit + ) + + # Collect into a list. This is... unfortunate, but I don't think the + # converter will work incrementally (will it?). It expects all objects to + # be given at once. + # + # It may also be desirable to have all objects available at once so that + # cross-references can be made where possible, but it results in increased + # memory usage. + stix_objects = list(limited_stix_objects) + + # The STIX 2.0 converter wants a 2.0 bundle. (Hope the TAXII server isn't + # returning 2.1 objects!) + bundle20 = stix2.v20.Bundle(stix_objects, allow_custom=True) + + converter = misp_modules.lib.stix2misp.ExternalStixParser() + converter.handler( + bundle20, None, [0, "event", str(_synonymsToTagNames_path)] + ) + + attributes = [ + attr.to_dict(json_format=True) + for attr in converter.misp_event.attributes + ] + + objects = [ + obj.to_dict(json_format=True) + for obj in converter.misp_event.objects + ] + + tags = [ + tag.to_dict(json_format=True) + for tag in converter.misp_event.tags + ] + + result = { + "results": { + "Attribute": attributes, + "Object": objects, + "Tag": tags + } + } + + return result + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + result = None + config = None + + try: + config = _get_config(request["config"]) + except ConfigError as e: + result = misperrors + result["error"] = e.args[0] + + if not result: + try: + result = _query_taxii(config) + except taxii2client.exceptions.TAXIIServiceException as e: + result = misperrors + result["error"] = str(e) + except requests.HTTPError as e: + # Let's give a better error message for auth issues. + if e.response.status_code in (401, 403): + result = misperrors + result["error"] = "Access was denied." + else: + raise + + return result + + +def introspection(): + mispattributes["userConfig"] = userConfig + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 24070bfab7d7f0d8be51f452f4d2241eaf6e6b07 Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Tue, 14 Dec 2021 01:02:35 -0500 Subject: [PATCH 374/476] Add workaround for PyMISP bug regarding conversion of objects to JSON-serializable values. --- misp_modules/modules/import_mod/taxii21.py | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/import_mod/taxii21.py b/misp_modules/modules/import_mod/taxii21.py index 4993dbf..d03b85c 100644 --- a/misp_modules/modules/import_mod/taxii21.py +++ b/misp_modules/modules/import_mod/taxii21.py @@ -114,6 +114,25 @@ Config = collections.namedtuple("Config", [ ]) +def _pymisp_to_json_serializable(obj): + """ + Work around a possible bug with PyMISP's + AbstractMisp.to_dict(json_format=True) method, which doesn't always produce + a JSON-serializable value (i.e. a value which is serializable with the + default JSON encoder). + + :param obj: A PyMISP object + :return: A JSON-serializable version of the object + """ + + # The workaround creates a JSON string and then parses it back to a + # JSON-serializable value. + json_ = obj.to_json() + json_serializable = json.loads(json_) + + return json_serializable + + def _normalize_multi_values(value): """ Some TAXII filters may contain multiple values separated by commas, @@ -288,17 +307,17 @@ def _query_taxii(config): ) attributes = [ - attr.to_dict(json_format=True) + _pymisp_to_json_serializable(attr) for attr in converter.misp_event.attributes ] objects = [ - obj.to_dict(json_format=True) + _pymisp_to_json_serializable(obj) for obj in converter.misp_event.objects ] tags = [ - tag.to_dict(json_format=True) + _pymisp_to_json_serializable(tag) for tag in converter.misp_event.tags ] From 2874c41f7f34d1233c6f266af83f0d291100fee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Fri, 14 Jan 2022 10:23:08 +0100 Subject: [PATCH 375/476] fix: required parameters for Recorded Future object --- misp_modules/modules/expansion/recordedfuture.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index 9894968..8056bfa 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -242,6 +242,10 @@ class RFEnricher: def __init__(self, attribute_props: dict): self.event = MISPEvent() self.enrichment_object = MISPObject("Recorded Future Enrichment") + self.enrichment_object.template_uuid = "cbe0ffda-75e5-4c49-833f-093f057652ba" + self.enrichment_object.template_id = "1" + self.enrichment_object.description = "Recorded Future Enrichment" + setattr(self.enrichment_object, 'meta-category', 'network') description = ( "An object containing the enriched attribute and " "related entities from Recorded Future." From 549f937b1e03276b14101c6e5b8a38ea379343aa Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Fri, 14 Jan 2022 11:48:49 -0500 Subject: [PATCH 376/476] Added some library requirements for the taxii21 import module. --- REQUIREMENTS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index c0b5326..4c76aba 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -128,9 +128,11 @@ socialscan==1.4.2 socketio-client==0.5.7.4 soupsieve==2.2.1; python_version >= '3' sparqlwrapper==1.8.5 +stix2==3.0.1 stix2-patterns==1.3.2 tabulate==0.8.9 tau-clients==0.1.3 +taxii2-client==2.3.0 tldextract==3.1.0; python_version >= '3.5' tornado==6.1; python_version >= '3.5' tqdm==4.62.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' From ed2d14c956c9e08e96dc7a20b2c00447865fbfab Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Thu, 3 Feb 2022 10:44:13 +0100 Subject: [PATCH 377/476] Add hashlookup to expansion init.py --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 7591d7d..d20fe34 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb'] + 'qintel_qsentry', 'mwdb', 'hashlookup'] minimum_required_fields = ('type', 'uuid', 'value') From 323ca67a6c5689319e4b7da195ae148877f2bf2d Mon Sep 17 00:00:00 2001 From: Daniel Pascual Date: Thu, 3 Feb 2022 13:25:29 +0100 Subject: [PATCH 378/476] MISP exportmodule to create a VT Collection form an event --- misp_modules/modules/export_mod/__init__.py | 3 +- .../export_mod/virustotal_collections.py | 134 ++++++++++++++++++ 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 misp_modules/modules/export_mod/virustotal_collections.py diff --git a/misp_modules/modules/export_mod/__init__.py b/misp_modules/modules/export_mod/__init__.py index 5b69d02..ea90d19 100644 --- a/misp_modules/modules/export_mod/__init__.py +++ b/misp_modules/modules/export_mod/__init__.py @@ -1,2 +1,3 @@ __all__ = ['cef_export', 'mass_eql_export', 'liteexport', 'goamlexport', 'threat_connect_export', 'pdfexport', - 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint_export'] + 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint_export', + 'virustotal_collections'] diff --git a/misp_modules/modules/export_mod/virustotal_collections.py b/misp_modules/modules/export_mod/virustotal_collections.py new file mode 100644 index 0000000..fa2929c --- /dev/null +++ b/misp_modules/modules/export_mod/virustotal_collections.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +# Copyright 2022 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# 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. + +"""Creates a VT Collection with indicators present in a given event.""" + +import base64 +import json +import requests + +misperrors = { + 'error': 'Error' +} + +mispattributes = { + 'input': [ + 'hostname', + 'domain', + 'ip-src', + 'ip-dst', + 'md5', + 'sha1', + 'sha256', + 'url' + ], + 'format': 'misp_standard', + 'responseType': 'application/txt', + 'outputFileExtension': 'txt', +} + +moduleinfo = { + 'version': '1.0', + 'author': 'VirusTotal', + 'description': 'Creates a VT Collection from an event iocs.', + 'module-type': ['export'] +} + +moduleconfig = [ + 'vt_api_key', + 'proxy_host', + 'proxy_port', + 'proxy_username', + 'proxy_password' +] + + +class VTError(Exception): + "Exception class to map vt api response errors." + pass + + +def create_collection(api_key, event_data): + headers = { + 'x-apikey': api_key, + 'content-type': 'application/json', + 'x-tool': 'MISPModuleVirusTotalCollectionExport', + } + + response = requests.post('https://www.virustotal.com/api/v3/integrations/misp/collections', + headers=headers, + json=event_data) + + uuid = event_data['Event']['uuid'] + response_data = response.json() + + if response.status_code == 200: + link = response_data['data']['links']['self'] + return f'{uuid}: {link}' + + error = response_data['error']['message'] + if response.status_code == 400: + return f'{uuid}: {error}' + else: + misperrors['error'] = error + raise VTError(error) + + +def normalize_misp_data(data): + normalized_data = {'Event': data.pop('Event', {})} + for attr_key in data: + if isinstance(data[attr_key], list) or isinstance(data[attr_key], dict): + if attr_key == 'EventTag': + normalized_data['Event']['Tag'] = [tag['Tag'] for tag in data[attr_key]] + else: + normalized_data['Event'][attr_key] = data[attr_key] + + return normalized_data + + +def handler(q=False): + request = json.loads(q) + + if not request.get('config') or not request['config'].get('vt_api_key'): + misperrors['error'] = 'A VirusTotal api key is required for this module.' + return misperrors + + config = request['config'] + data = request['data'] + responses = [] + + try: + for event_data in data: + normalized_event = normalize_misp_data(event_data) + responses.append(create_collection(config.get('vt_api_key'), + normalized_event)) + + output = '\n'.join(responses) + return { + "response": [], + "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8'), + } + except VTError: + return misperrors + + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From c20c4072831e3251baf3ed0f5ba61637ff7f9ef3 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 3 Feb 2022 19:38:42 +0100 Subject: [PATCH 379/476] fix: [test] cache url test --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index b8764f7..23ddad2 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -494,7 +494,7 @@ class TestExpansions(unittest.TestCase): query = {"module": "sourcecache", "link": input_value} response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), input_value) - self.assertTrue(self.get_data(response).startswith('PCFET0NUWVBFIEhUTUw+CjwhLS0KCUFyY2FuYSBieSBIVE1MN')) + self.assertTrue(self.get_data(response)) def test_stix2_pattern_validator(self): query = {"module": "stix2_pattern_syntax_validator", "stix2-pattern": "[ipv4-addr:value = '8.8.8.8']"} From 01d09355b4bd383dd743c3152b01f63d11230806 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 4 Feb 2022 12:00:05 +0100 Subject: [PATCH 380/476] new: [doc] virustotal_collections modules added --- .../website/export_mod/virustotal_collections.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 documentation/website/export_mod/virustotal_collections.json diff --git a/documentation/website/export_mod/virustotal_collections.json b/documentation/website/export_mod/virustotal_collections.json new file mode 100644 index 0000000..1ecdbe9 --- /dev/null +++ b/documentation/website/export_mod/virustotal_collections.json @@ -0,0 +1,14 @@ +{ + "description": "Creates a VT Collection from an event iocs.", + "logo": "virustotal.png", + "requirements": [ + "An access to the VirusTotal API (apikey)." + ], + "input": "A domain, hash (md5, sha1, sha256 or sha512), hostname, url or IP address attribute.", + "output": "A VirusTotal collection in VT.", + "references": [ + "https://www.virustotal.com/", + "https://blog.virustotal.com/2021/11/introducing-virustotal-collections.html" + ], + "features": "This export module which takes advantage of a new endpoint in VT APIv3 to create VT Collections from IOCs contained in a MISP event. With this module users will be able to create a collection just using the Download as... button." +} From 27d7e19c15297cb4e77bb2454f8e5f7c66cdb830 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 4 Feb 2022 12:00:49 +0100 Subject: [PATCH 381/476] chg: [doc] updated --- documentation/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index c9fd62e..88670b0 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -2045,6 +2045,25 @@ Module to export a structured CSV file for uploading to ThreatConnect. ----- +#### [virustotal_collections](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/virustotal_collections.py) + + + +Creates a VT Collection from an event iocs. +- **features**: +>This export module which takes advantage of a new endpoint in VT APIv3 to create VT Collections from IOCs contained in a MISP event. With this module users will be able to create a collection just using the Download as... button. +- **input**: +>A domain, hash (md5, sha1, sha256 or sha512), hostname, url or IP address attribute. +- **output**: +>A VirusTotal collection in VT. +- **references**: +> - https://www.virustotal.com/ +> - https://blog.virustotal.com/2021/11/introducing-virustotal-collections.html +- **requirements**: +>An access to the VirusTotal API (apikey). + +----- + #### [vt_graph](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/vt_graph.py) From 91235b8cef714be42b4e2d9ba210141038579223 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 4 Feb 2022 12:43:11 +0100 Subject: [PATCH 382/476] Update dependencies, require Python 3.7 --- .github/workflows/python-package.yml | 2 + Pipfile | 24 ++-- REQUIREMENTS | 181 ++++++++++++++------------- 3 files changed, 113 insertions(+), 94 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index a444958..510a469 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -46,5 +46,7 @@ jobs: # Run server in background misp-modules -l 127.0.0.1 -s & sleep 5 + # Check if modules are running + curl -sS localhost:6666/modules # Run tests pytest tests diff --git a/Pipfile b/Pipfile index 85226be..bdf2c98 100644 --- a/Pipfile +++ b/Pipfile @@ -17,9 +17,9 @@ passivetotal = "*" pypdns = "*" pypssl = "*" pyeupi = "*" -pymisp = { extras = ["fileobjects,openioc,pdfexport,email"], version = "*" } -pyonyphe = { editable = true, git = "https://github.com/sebdraven/pyonyphe" } -pydnstrails = { editable = true, git = "https://github.com/sebdraven/pydnstrails" } +pymisp = { extras = ["fileobjects,openioc,pdfexport,email,url"], version = "*" } +pyonyphe = { git = "https://github.com/sebdraven/pyonyphe" } +pydnstrails = { git = "https://github.com/sebdraven/pydnstrails" } pytesseract = "*" pygeoip = "*" beautifulsoup4 = "*" @@ -31,20 +31,20 @@ maclookup = "*" vulners = "*" blockchain = "*" reportlab = "*" -pyintel471 = { editable = true, git = "https://github.com/MISP/PyIntel471.git" } +pyintel471 = { git = "https://github.com/MISP/PyIntel471.git" } shodan = "*" Pillow = ">=8.2.0" Wand = "*" SPARQLWrapper = "*" domaintools_api = "*" -misp-modules = { editable = true, path = "." } -pybgpranking = { editable = true, git = "https://github.com/D4-project/BGP-Ranking.git/", subdirectory = "client" } -pyipasnhistory = { editable = true, git = "https://github.com/D4-project/IPASN-History.git/", subdirectory = "client" } +misp-modules = { path = "." } +pybgpranking = { git = "https://github.com/D4-project/BGP-Ranking.git/", subdirectory = "client", ref = "68de39f6c5196f796055c1ac34504054d688aa59" } +pyipasnhistory = { git = "https://github.com/D4-project/IPASN-History.git/", subdirectory = "client", ref = "a2853c39265cecdd0c0d16850bd34621c0551b87" } backscatter = "*" pyzbar = "*" opencv-python = "*" np = "*" -ODTReader = { editable = true, git = "https://github.com/cartertemm/ODTReader.git/" } +ODTReader = { git = "https://github.com/cartertemm/ODTReader.git/" } python-pptx = "*" python-docx = "*" ezodf = "*" @@ -59,7 +59,7 @@ geoip2 = "*" apiosintDS = "*" assemblyline_client = "*" vt-graph-api = "*" -trustar = { editable = true, git = "https://github.com/SteveClement/trustar-python.git" } +trustar = { git = "https://github.com/SteveClement/trustar-python.git" } markdownify = "==0.5.3" socialscan = "*" dnsdb2 = "*" @@ -67,6 +67,10 @@ clamd = "*" aiohttp = ">=3.7.4" tau-clients = "*" vt-py = ">=0.7.1" +crowdstrike-falconpy = "0.9.0" +censys = "2.0.9" +mwdblib = "3.4.1" +ndjson = "0.3.1" [requires] -python_version = "3.6" +python_version = "3.7" diff --git a/REQUIREMENTS b/REQUIREMENTS index c0b5326..3953daa 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -6,150 +6,163 @@ # -i https://pypi.org/simple --e . --e git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client --e git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client --e git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 --e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader --e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails --e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -git+https://github.com/SteveClement/trustar-python.git -aiohttp==3.7.4 +. +aiohttp==3.8.1 +aiosignal==1.2.0; python_version >= '3.6' antlr4-python3-runtime==4.8; python_version >= '3' apiosintds==1.8.3 +appdirs==1.4.4 argparse==1.4.0 -assemblyline-client==4.1.0 -async-timeout==3.0.1; python_full_version >= '3.5.3' -attrs==21.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +assemblyline-client==4.2.2 +async-timeout==4.0.2; python_version >= '3.6' +asynctest==0.13.0; python_version < '3.8' +attrs==21.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +backoff==1.11.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' backports.zoneinfo==0.2.1; python_version < '3.9' backscatter==0.2.4 -beautifulsoup4==4.9.3 -bidict==0.21.2; python_version >= '3.6' +beautifulsoup4==4.10.0 +bidict==0.21.4; python_version >= '3.6' blockchain==1.4.4 -certifi==2021.5.30 -censys==2.0.9 -cffi==1.14.6 -#chardet==4.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -chardet -charset-normalizer==2.0.4; python_version >= '3' +censys==2.1.2 +certifi==2021.10.8 +cffi==1.15.0 +chardet==4.0.0 +charset-normalizer==2.0.11; python_version >= '3' clamd==1.0.2 click-plugins==1.1.1 -click==8.0.1; python_version >= '3.6' +click==8.0.3; python_version >= '3.6' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -colorclass==2.2.0 +colorclass==2.2.2; python_version >= '2.6' +commonmark==0.9.1 compressed-rtf==1.0.6 -configparser==5.0.2; python_version >= '3.6' -crowdstrike-falconpy==0.9.0 -cryptography==3.4.7; python_version >= '3.6' -decorator==5.0.9; python_version >= '3.5' -deprecated==1.2.12; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +configparser==5.2.0; python_version >= '3.6' +crowdstrike-falconpy==1.0.0 +cryptography==36.0.1; python_version >= '3.6' +decorator==5.1.1; python_version >= '3.5' +deprecated==1.2.13; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.3 -dnspython==2.1.0 -domaintools-api==0.5.4 +dnspython==2.2.0 +domaintools-api==0.6.1 easygui==0.98.2 ebcdic==1.1.1 enum-compat==0.0.3 extract-msg==0.28.7 -ez-setup==0.9 ezodf==0.3.2 -filelock==3.0.12 +filelock==3.4.2; python_version >= '3.7' +frozenlist==1.3.0; python_version >= '3.7' future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -futures==3.1.1 -geoip2==4.2.0 -httplib2==0.19.1 +geoip2==4.5.0 +git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client +git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client +git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 +git+https://github.com/SteveClement/trustar-python.git@6954eae38e0c77eaeef26084b6c5fd033925c1c7#egg=trustar +git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader +git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails +git+https://github.com/sebdraven/pyonyphe@aed008ee5a27e3a5e4afbb3e5cbfc47170108452#egg=pyonyphe +httplib2==0.20.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' idna-ssl==1.1.0; python_version < '3.7' -idna==3.2; python_version >= '3' +idna==3.3; python_version >= '3' imapclient==2.1.0 -isodate==0.6.0 +importlib-metadata==4.10.1; python_version < '3.8' +isodate==0.6.1 itsdangerous==2.0.1; python_version >= '3.6' jbxapi==3.17.2 -json-log-formatter==0.4.0 +jeepney==0.7.1; sys_platform == 'linux' +json-log-formatter==0.5.1 jsonschema==3.2.0 -lark-parser==0.11.3 +keyring==23.5.0; python_version >= '3.7' +lark-parser==0.12.0 lief==0.11.5 lxml==4.7.1 maclookup==1.0.3 markdownify==0.5.3 -maxminddb==2.0.3; python_version >= '3.6' -more-itertools==8.8.0; python_version >= '3.5' -msoffcrypto-tool==4.12.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') -multidict==5.1.0; python_version >= '3.6' +maxminddb==2.2.0; python_version >= '3.6' +more-itertools==8.12.0; python_version >= '3.5' +msoffcrypto-tool==5.0.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') +multidict==6.0.2; python_version >= '3.7' +mwdblib==4.0.0 +ndjson==0.3.1 np==1.0.2 -numpy==1.21.2; python_version < '3.11' and python_version >= '3.7' +numpy==1.21.5; python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64' oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -oletools==0.56.2 -opencv-python==4.5.3.56 +oletools==0.60 +opencv-python==4.5.5.62 +packaging==21.3; python_version >= '3.6' pandas-ods-reader==0.1.2 pandas==1.3.5 -passivetotal==2.5.4 +passivetotal==2.5.8 pcodedmp==1.2.6 -pdftotext==2.2.0 -pillow==8.3.2 -progressbar2==3.53.1 -psutil==5.8.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodome==3.10.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -pycryptodomex==3.10.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pdftotext==2.2.2 +pillow==9.0.1 +progressbar2==4.0.0; python_version >= '3.7' +psutil==5.9.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pycparser==2.21 +pycryptodome==3.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodomex==3.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' pydeep==0.4 pyeupi==1.1 +pyfaup==1.2 pygeoip==0.3.2 -pymisp[email,fileobjects,openioc,pdfexport]==2.4.148 +pygments==2.11.2; python_version >= '3.5' +pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.152 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.2 pypssl==2.2 -pyrsistent==0.18.0; python_version >= '3.6' +pyrsistent==0.18.1; python_version >= '3.7' pytesseract==0.3.8 python-baseconv==1.2.2 python-dateutil==2.8.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.11 -python-engineio==4.2.1; python_version >= '3.6' -python-magic==0.4.24 -python-pptx==0.6.19 -python-socketio[client]==5.4.0; python_version >= '3.6' -python-utils==2.5.6 +python-engineio==4.3.1; python_version >= '3.6' +python-magic==0.4.25 +python-pptx==0.6.21 +python-socketio[client]==5.5.1; python_version >= '3.6' +python-utils==3.1.0; python_version >= '3.7' +pytz-deprecation-shim==0.1.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pytz==2019.3 -pyyaml==5.4.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +pyyaml==6.0; python_version >= '3.6' pyzbar==0.1.8 pyzipper==0.3.5; python_version >= '3.5' -rdflib==6.0.0; python_version >= '3.7' -redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.6.1 +rdflib==6.1.1; python_version >= '3.7' +redis==4.1.2; python_version >= '3.6' +reportlab==3.6.6 requests-cache==0.6.4; python_version >= '3.6' requests-file==1.5.1 -requests[security]==2.26.0 +requests[security]==2.27.1 +rich==11.1.0; python_full_version >= '3.6.2' and python_full_version < '4.0.0' rtfde==0.0.2 -ruamel.yaml.clib==0.2.6; python_version < '3.10' and platform_python_implementation == 'CPython' -ruamel.yaml==0.17.13; python_version >= '3' -shodan==1.25.0 +secretstorage==3.3.1; sys_platform == 'linux' +setuptools==60.7.1; python_version >= '3.7' +shodan==1.26.1 sigmatools==0.19.1 six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' socialscan==1.4.2 socketio-client==0.5.7.4 -soupsieve==2.2.1; python_version >= '3' +soupsieve==2.3.1; python_version >= '3.6' sparqlwrapper==1.8.5 stix2-patterns==1.3.2 tabulate==0.8.9 -tau-clients==0.1.3 -tldextract==3.1.0; python_version >= '3.5' +tau-clients==0.1.9 +tldextract==3.1.2; python_version >= '3.6' tornado==6.1; python_version >= '3.5' -tqdm==4.62.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -typing-extensions==3.10.0.0 -tzlocal==3.0; python_version >= '3.6' +tqdm==4.62.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +typing-extensions==4.0.1; python_version < '3.8' +tzdata==2021.5; python_version >= '3.6' +tzlocal==4.1; python_version >= '3.6' unicodecsv==0.14.1 url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.6; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' +urllib3==1.26.8; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_full_version < '4.0.0' validators==0.14.0 -vt-graph-api==1.1.2 -vt-py==0.7.2 -vulners==1.5.12 +vt-graph-api==1.1.3 +vt-py==0.13.1 +vulners==2.0.0 wand==0.6.7 -websocket-client==1.2.1 -wrapt==1.12.1 +websocket-client==1.2.3; python_version >= '3.6' +wrapt==1.13.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' xlrd==2.0.1 -xlsxwriter==3.0.1; python_version >= '3.4' +xlsxwriter==3.0.2; python_version >= '3.4' yara-python==3.8.1 -yarl==1.6.3; python_version >= '3.6' -ndjson==0.3.1 -mwdblib==3.4.1 +yarl==1.7.2; python_version >= '3.6' +zipp==3.7.0; python_version >= '3.7' From cf7b8318a46d4a31c627a7ecec77824ba7c5b94c Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 5 Feb 2022 11:32:46 +0530 Subject: [PATCH 383/476] Initial Commit for IPQualityScore Expansion Module --- .../modules/expansion/ipqualityscore.py | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 misp_modules/modules/expansion/ipqualityscore.py diff --git a/misp_modules/modules/expansion/ipqualityscore.py b/misp_modules/modules/expansion/ipqualityscore.py new file mode 100644 index 0000000..ebdb395 --- /dev/null +++ b/misp_modules/modules/expansion/ipqualityscore.py @@ -0,0 +1,128 @@ +import json +import logging +import requests +import urllib.parse +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject, Distribution + +logger = logging.getLogger('ipqualityscore') +logger.setLevel(logging.DEBUG) + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['hostname', 'domain', 'url', 'uri', 'ip-src', 'ip-dst', 'email', 'email-src', 'email-dst', 'target-email', 'whois-registrant-email', 'phone-number','whois-registrant-phone'], 'output': ['text'], 'format': 'misp_standard'} +moduleinfo = {'version': '0.1', 'author': 'David Mackler', 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation and Malicious Domain/URL Scanner.', + 'module-type': ['hover', 'expansion']} +moduleconfig = ['apikey'] + +BASE_URL = 'https://ipqualityscore.com/api/json' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value + +IP_API_ATTRIBUTE_TYPES = ['ip-src', 'ip-dst'] +URL_API_ATTRIBUTE_TYPES = ['hostname', 'domain', 'url', 'uri'] +EMAIL_API_ATTRIBUTE_TYPES = ['email', 'email-src', 'email-dst', 'target-email', 'whois-registrant-email'] +PHONE_API_ATTRIBUTE_TYPES = ['phone-number','whois-registrant-phone'] + +def _format_result(attribute, result, enrichment_type): + + event = MISPEvent() + + orig_attr = MISPAttribute() + orig_attr.from_dict(**attribute) + + event = _make_enriched_attr(event, result, orig_attr) + + return event + +def _make_enriched_attr(event, result, orig_attr): + + enriched_object = MISPObject('IPQualityScore Enrichment') + enriched_object.add_reference(orig_attr.uuid, 'related-to') + + enriched_attr = MISPAttribute() + enriched_attr.from_dict(**{ + 'value': orig_attr.value, + 'type': orig_attr.type, + 'distribution': 0, + 'object_relation': 'enriched-attr', + 'to_ids': orig_attr.to_ids + }) + + # enriched_attr = _make_tags(enriched_attr, result) + # enriched_object.add_attribute(**enriched_attr) + + + fraud_score_attr = MISPAttribute() + fraud_score_attr.from_dict(**{ + 'value': result.get('fraud_score'), + 'type': 'text', + 'object_relation': 'fraud_score', + 'distribution': 0 + }) + enriched_object.add_attribute(**fraud_score_attr) + + latitude = MISPAttribute() + latitude.from_dict(**{ + 'value': result.get('latitude'), + 'type': 'text', + 'object_relation': 'latitude', + 'distribution': 0 + }) + enriched_object.add_attribute(**latitude) + + event.add_attribute(**orig_attr) + event.add_object(**enriched_object) + + longitude = MISPAttribute() + longitude.from_dict(**{ + 'value': result.get('longitude'), + 'type': 'text', + 'object_relation': 'longitude', + 'distribution': 0 + }) + enriched_object.add_attribute(**longitude) + + return event + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + # check if the apikey is pprovided + if not request.get('config') or not request['config'].get('apikey'): + misperrors['error'] = 'IPQualityScore apikey is missing' + return misperrors + apikey = request['config'].get('apikey') + # check attribute is added to the event + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + + input_attribute = request['attribute'] + input_attribute_type = input_attribute['type'] + input_attribute_value = attribute['value'] + # check if the attribute type is supported by IPQualityScore + if input_attribute_type not in mispattributes['input']: + return {'error': 'Unsupported attributes type for IPqualityScore Enrichment'} + + if input_attribute_type in IP_API_ATTRIBUTE_TYPES: + url = f"{BASE_URL}/ip/{input_attribute_value}" + headers = {"IPQS-KEY": apikey} + response = self.get(url, headers) + data = response.data + if str(data.get('success')) == "True": + event = _format_result(input_attribute, data, "ip") + event = json.loads(event.to_json()) + ret_result = {key: event[key] for key in ('Attribute', 'Object') if key + in event} + return {'results': ret_result} + else: + return {'error', str(data.get('message')) + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo + \ No newline at end of file From 17541e29386938cd8a7ba1a61aabef809a9e6630 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 5 Feb 2022 11:33:43 +0530 Subject: [PATCH 384/476] Added ipqualityscore to All list --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 7591d7d..23f3d32 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb'] + 'qintel_qsentry', 'mwdb', 'ipqualityscore'] minimum_required_fields = ('type', 'uuid', 'value') From 267824a6df04c8da29e99cb0ffdfcffe4d4b1e74 Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Sat, 5 Feb 2022 20:23:28 +0100 Subject: [PATCH 385/476] new: Add mmdb lookup expansion module --- README.md | 1 + misp_modules/modules/expansion/__init__.py | 2 +- misp_modules/modules/expansion/mmdb_lookup.py | 112 ++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 misp_modules/modules/expansion/mmdb_lookup.py diff --git a/README.md b/README.md index 6b96be2..e1e5a0f 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [macvendors](misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. * [MALWAREbazaar](misp_modules/modules/expansion/malwarebazaar.py) - an expansion module to query MALWAREbazaar with some payload. * [McAfee MVISION Insights](misp_modules/modules/expansion/mcafee_insights_enrich.py) - an expansion module enrich IOCs with McAfee MVISION Insights. +* [Mmdb server lookup](misp_modules/modules/expansion/mmdb_lookup.py) - an expansion module to enrich an ip with geolocation information from an mmdb server such as ip.circl.lu. * [ocr-enrich](misp_modules/modules/expansion/ocr_enrich.py) - an enrichment module to get OCRized data from images into MISP. * [ods-enrich](misp_modules/modules/expansion/ods_enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). * [odt-enrich](misp_modules/modules/expansion/odt_enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index d20fe34..63ae8e3 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/mmdb_lookup.py b/misp_modules/modules/expansion/mmdb_lookup.py new file mode 100644 index 0000000..731acd4 --- /dev/null +++ b/misp_modules/modules/expansion/mmdb_lookup.py @@ -0,0 +1,112 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['ip-src', 'ip-src|port', 'ip-dst', 'ip-dst|port'], 'format': 'misp_standard'} +moduleinfo = {'version': '1', 'author': 'Jeroen Pinoy', + 'description': "An expansion module to enrich an ip with geolocation information from an mmdb server " + "such as ip.circl.lu", + 'module-type': ['expansion', 'hover']} +moduleconfig = ["custom_API"] +mmdblookup_url = 'https://ip.circl.lu/' + + +class MmdbLookupParser(): + def __init__(self, attribute, mmdblookupresult, api_url): + self.attribute = attribute + self.mmdblookupresult = mmdblookupresult + self.api_url = api_url + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_mmdblookup_information(self): + # There is a chance some db's have a hit while others don't so we have to check if entry is empty each time + for result_entry in self.mmdblookupresult: + if result_entry['country_info']: + mmdblookup_object = MISPObject('geolocation') + mmdblookup_object.add_attribute('country', + **{'type': 'text', 'value': result_entry['country_info']['Country']}) + mmdblookup_object.add_attribute('countrycode', + **{'type': 'text', 'value': result_entry['country']['iso_code']}) + mmdblookup_object.add_attribute('latitude', + **{'type': 'float', + 'value': result_entry['country_info']['Latitude (average)']}) + mmdblookup_object.add_attribute('longitude', + **{'type': 'float', + 'value': result_entry['country_info']['Longitude (average)']}) + mmdblookup_object.add_attribute('text', + **{'type': 'text', + 'value': 'db_source: {}. build_db: {}. Latitude and longitude are country average.'.format( + result_entry['meta']['db_source'], + result_entry['meta']['build_db'])}) + mmdblookup_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(mmdblookup_object) + + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'ip-src': + toquery = attribute['value'] + pass + elif attribute.get('type') == 'ip-src|port': + toquery = attribute['value'].split('|')[0] + pass + elif attribute.get('type') == 'ip-dst': + toquery = attribute['value'] + pass + elif attribute.get('type') == 'ip-dst|port': + toquery = attribute['value'].split('|')[0] + pass + else: + misperrors['error'] = 'There is no attribute of type ip-src or ip-dst provided as input' + return misperrors + api_url = check_url(request['config']['custom_API']) if 'config' in request and request['config'].get( + 'custom_API') else mmdblookup_url + r = requests.get("{}/geolookup/{}".format(api_url, toquery)) + if r.status_code == 200: + mmdblookupresult = r.json() + if not mmdblookupresult or len(mmdblookupresult) == 0: + misperrors['error'] = 'Empty result returned by server' + return misperrors + # Server might return one or multiple entries which could all be empty, we check if there is at least one + # non-empty result below + empty_result = True + for lookup_result_entry in mmdblookupresult: + if lookup_result_entry['country_info']: + empty_result = False + break + if empty_result: + misperrors['error'] = 'Empty result returned by server' + return misperrors + else: + misperrors['error'] = 'API not accessible - http status code {} was returned'.format(r.status_code) + return misperrors + parser = MmdbLookupParser(attribute, mmdblookupresult, api_url) + parser.parse_mmdblookup_information() + result = parser.get_result() + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 4408f24714ba5d1743e77a55b1b82b94537647f5 Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Sun, 6 Feb 2022 15:51:54 +0100 Subject: [PATCH 386/476] chg: [mmdb_lookup] Add handling of ASN details. --- misp_modules/modules/expansion/mmdb_lookup.py | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/misp_modules/modules/expansion/mmdb_lookup.py b/misp_modules/modules/expansion/mmdb_lookup.py index 731acd4..0c54ba8 100644 --- a/misp_modules/modules/expansion/mmdb_lookup.py +++ b/misp_modules/modules/expansion/mmdb_lookup.py @@ -7,9 +7,9 @@ misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-src|port', 'ip-dst', 'ip-dst|port'], 'format': 'misp_standard'} moduleinfo = {'version': '1', 'author': 'Jeroen Pinoy', 'description': "An expansion module to enrich an ip with geolocation information from an mmdb server " - "such as ip.circl.lu", + "such as ip.circl.lu.", 'module-type': ['expansion', 'hover']} -moduleconfig = ["custom_API"] +moduleconfig = ["custom_API", "db_source_filter"] mmdblookup_url = 'https://ip.circl.lu/' @@ -48,6 +48,21 @@ class MmdbLookupParser(): result_entry['meta']['build_db'])}) mmdblookup_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(mmdblookup_object) + if 'AutonomousSystemNumber' in result_entry['country']: + mmdblookup_object_asn = MISPObject('asn') + mmdblookup_object_asn.add_attribute('asn', + **{'type': 'text', + 'value': result_entry['country'][ + 'AutonomousSystemNumber']}) + mmdblookup_object_asn.add_attribute('description', + **{'type': 'text', + 'value': 'ASNOrganization: {}. db_source: {}. build_db: {}.'.format( + result_entry['country'][ + 'AutonomousSystemOrganization'], + result_entry['meta']['db_source'], + result_entry['meta']['build_db'])}) + mmdblookup_object_asn.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(mmdblookup_object_asn) def check_url(url): @@ -63,16 +78,12 @@ def handler(q=False): attribute = request['attribute'] if attribute.get('type') == 'ip-src': toquery = attribute['value'] - pass elif attribute.get('type') == 'ip-src|port': toquery = attribute['value'].split('|')[0] - pass elif attribute.get('type') == 'ip-dst': toquery = attribute['value'] - pass elif attribute.get('type') == 'ip-dst|port': toquery = attribute['value'].split('|')[0] - pass else: misperrors['error'] = 'There is no attribute of type ip-src or ip-dst provided as input' return misperrors @@ -84,6 +95,12 @@ def handler(q=False): if not mmdblookupresult or len(mmdblookupresult) == 0: misperrors['error'] = 'Empty result returned by server' return misperrors + if 'config' in request and request['config'].get('db_source_filter'): + db_source_filter = request['config'].get('db_source_filter') + mmdblookupresult = [entry for entry in mmdblookupresult if entry['meta']['db_source'] == db_source_filter] + if not mmdblookupresult or len(mmdblookupresult) == 0: + misperrors['error'] = 'There was no result with the selected db_source' + return misperrors # Server might return one or multiple entries which could all be empty, we check if there is at least one # non-empty result below empty_result = True From 0072a45aabf11c4b67e3e8a70bcecf89e476f3f9 Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Mon, 7 Feb 2022 17:41:15 +0100 Subject: [PATCH 387/476] chg:[apivoid] Add handling with email verify API --- misp_modules/modules/expansion/apivoid.py | 34 +++++++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/apivoid.py b/misp_modules/modules/expansion/apivoid.py index a71b5e6..3b0ce72 100755 --- a/misp_modules/modules/expansion/apivoid.py +++ b/misp_modules/modules/expansion/apivoid.py @@ -4,8 +4,8 @@ from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['domain', 'hostname'], 'format': 'misp_standard'} -moduleinfo = {'version': '0.1', 'author': 'Christian Studer', +mispattributes = {'input': ['domain', 'hostname', 'email'], 'format': 'misp_standard'} +moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'On demand query API for APIVoid.', 'module-type': ['expansion', 'hover']} moduleconfig = ['apikey'] @@ -43,6 +43,31 @@ class APIVoidParser(): ssl = requests.get(f'{self.url.format("sslinfo", apikey)}host={self.attribute.value}').json() self._parse_ssl_certificate(ssl['data']['certificate']) + def handle_email(self, apikey): + feature = 'emailverify' + if requests.get(f'{self.url.format(feature, apikey)}stats').json()['credits_remained'] < 0.06: + self.result = {'error': 'You do not have enough APIVoid credits to proceed your request.'} + return + emaillookup = requests.get(f'{self.url.format(feature, apikey)}email={self.attribute.value}').json() + email_verification = MISPObject('apivoid-email-verification') + boolean_attributes = ['valid_format', 'suspicious_username', 'suspicious_email', 'dirty_words_username', + 'suspicious_email', 'valid_tld', 'disposable', 'has_a_records', 'has_mx_records', + 'has_spf_records', 'is_spoofable', 'dmarc_configured', 'dmarc_enforced', 'free_email', + 'russian_free_email', 'china_free_email', 'suspicious_domain', 'dirty_words_domain', + 'domain_popular', 'risky_tld', 'police_domain', 'government_domain', 'educational_domain', + 'should_block'] + for boolean_attribute in boolean_attributes: + email_verification.add_attribute(boolean_attribute, + **{'type': 'boolean', 'value': emaillookup['data'][boolean_attribute]}) + email_verification.add_attribute('email', **{'type': 'email', 'value': emaillookup['data']['email']}) + email_verification.add_attribute('username', **{'type': 'text', 'value': emaillookup['data']['username']}) + email_verification.add_attribute('role_address', + **{'type': 'boolean', 'value': emaillookup['data']['role_address']}) + email_verification.add_attribute('domain', **{'type': 'domain', 'value': emaillookup['data']['domain']}) + email_verification.add_attribute('score', **{'type': 'float', 'value': emaillookup['data']['score']}) + email_verification.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(email_verification) + def _handle_dns_record(self, item, record_type, relationship): dns_record = MISPObject('dns-record') dns_record.add_attribute('queried-domain', type='domain', value=item['host']) @@ -82,7 +107,10 @@ def handler(q=False): return {'error': 'Unsupported attribute type.'} apikey = request['config']['apikey'] apivoid_parser = APIVoidParser(attribute) - apivoid_parser.parse_domain(apikey) + if attribute['type'] in ['domain', 'hostname']: + apivoid_parser.parse_domain(apikey) + else: + apivoid_parser.handle_email(apikey) return apivoid_parser.get_results() From 47dde7943b95e6dc796d9fee2765b80e610b192f Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 9 Feb 2022 10:20:42 +0530 Subject: [PATCH 388/476] delete --- .../modules/expansion/ipqualityscore.py | 128 ------------------ 1 file changed, 128 deletions(-) delete mode 100644 misp_modules/modules/expansion/ipqualityscore.py diff --git a/misp_modules/modules/expansion/ipqualityscore.py b/misp_modules/modules/expansion/ipqualityscore.py deleted file mode 100644 index ebdb395..0000000 --- a/misp_modules/modules/expansion/ipqualityscore.py +++ /dev/null @@ -1,128 +0,0 @@ -import json -import logging -import requests -import urllib.parse -from . import check_input_attribute, standard_error_message -from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject, Distribution - -logger = logging.getLogger('ipqualityscore') -logger.setLevel(logging.DEBUG) - -misperrors = {'error': 'Error'} -mispattributes = {'input': ['hostname', 'domain', 'url', 'uri', 'ip-src', 'ip-dst', 'email', 'email-src', 'email-dst', 'target-email', 'whois-registrant-email', 'phone-number','whois-registrant-phone'], 'output': ['text'], 'format': 'misp_standard'} -moduleinfo = {'version': '0.1', 'author': 'David Mackler', 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation and Malicious Domain/URL Scanner.', - 'module-type': ['hover', 'expansion']} -moduleconfig = ['apikey'] - -BASE_URL = 'https://ipqualityscore.com/api/json' -DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value - -IP_API_ATTRIBUTE_TYPES = ['ip-src', 'ip-dst'] -URL_API_ATTRIBUTE_TYPES = ['hostname', 'domain', 'url', 'uri'] -EMAIL_API_ATTRIBUTE_TYPES = ['email', 'email-src', 'email-dst', 'target-email', 'whois-registrant-email'] -PHONE_API_ATTRIBUTE_TYPES = ['phone-number','whois-registrant-phone'] - -def _format_result(attribute, result, enrichment_type): - - event = MISPEvent() - - orig_attr = MISPAttribute() - orig_attr.from_dict(**attribute) - - event = _make_enriched_attr(event, result, orig_attr) - - return event - -def _make_enriched_attr(event, result, orig_attr): - - enriched_object = MISPObject('IPQualityScore Enrichment') - enriched_object.add_reference(orig_attr.uuid, 'related-to') - - enriched_attr = MISPAttribute() - enriched_attr.from_dict(**{ - 'value': orig_attr.value, - 'type': orig_attr.type, - 'distribution': 0, - 'object_relation': 'enriched-attr', - 'to_ids': orig_attr.to_ids - }) - - # enriched_attr = _make_tags(enriched_attr, result) - # enriched_object.add_attribute(**enriched_attr) - - - fraud_score_attr = MISPAttribute() - fraud_score_attr.from_dict(**{ - 'value': result.get('fraud_score'), - 'type': 'text', - 'object_relation': 'fraud_score', - 'distribution': 0 - }) - enriched_object.add_attribute(**fraud_score_attr) - - latitude = MISPAttribute() - latitude.from_dict(**{ - 'value': result.get('latitude'), - 'type': 'text', - 'object_relation': 'latitude', - 'distribution': 0 - }) - enriched_object.add_attribute(**latitude) - - event.add_attribute(**orig_attr) - event.add_object(**enriched_object) - - longitude = MISPAttribute() - longitude.from_dict(**{ - 'value': result.get('longitude'), - 'type': 'text', - 'object_relation': 'longitude', - 'distribution': 0 - }) - enriched_object.add_attribute(**longitude) - - return event - -def handler(q=False): - if q is False: - return False - request = json.loads(q) - - # check if the apikey is pprovided - if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = 'IPQualityScore apikey is missing' - return misperrors - apikey = request['config'].get('apikey') - # check attribute is added to the event - if not request.get('attribute') or not check_input_attribute(request['attribute']): - return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} - - input_attribute = request['attribute'] - input_attribute_type = input_attribute['type'] - input_attribute_value = attribute['value'] - # check if the attribute type is supported by IPQualityScore - if input_attribute_type not in mispattributes['input']: - return {'error': 'Unsupported attributes type for IPqualityScore Enrichment'} - - if input_attribute_type in IP_API_ATTRIBUTE_TYPES: - url = f"{BASE_URL}/ip/{input_attribute_value}" - headers = {"IPQS-KEY": apikey} - response = self.get(url, headers) - data = response.data - if str(data.get('success')) == "True": - event = _format_result(input_attribute, data, "ip") - event = json.loads(event.to_json()) - ret_result = {key: event[key] for key in ('Attribute', 'Object') if key - in event} - return {'results': ret_result} - else: - return {'error', str(data.get('message')) - -def introspection(): - return mispattributes - - -def version(): - moduleinfo['config'] = moduleconfig - return moduleinfo - \ No newline at end of file From 85bd1b69ad791ada6ebaed73fe7462e0ff5c0be3 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 9 Feb 2022 10:21:40 +0530 Subject: [PATCH 389/476] Initial Commit for IPQualityScore Expansion Module --- .../expansion/ipqs_fraud_and_risk_scoring.py | 635 ++++++++++++++++++ 1 file changed, 635 insertions(+) create mode 100644 misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py diff --git a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py new file mode 100644 index 0000000..f3b2afb --- /dev/null +++ b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py @@ -0,0 +1,635 @@ +import json +import logging +import requests +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout +) +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPAttribute, MISPObject, MISPTag, Distribution + +ip_query_input_type = [ + 'ip-src', + 'ip-dst' +] +url_query_input_type = [ + 'hostname', + 'domain', + 'url', + 'uri' +] +email_query_input_type = [ + 'email', + 'email-src', + 'email-dst', + 'target-email', + 'whois-registrant-email' +] +phone_query_input_type = [ + 'phone-number', + 'whois-registrant-phone' +] + +misperrors = { + 'error': 'Error' +} +mispattributes = { + 'input': ip_query_input_type + url_query_input_type + email_query_input_type + phone_query_input_type, + 'format': 'misp_standard' +} +moduleinfo = { + 'version': '0.1', + 'author': 'David Mackler', + 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation and Malicious ' + 'Domain/URL Scanner.', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ['apikey'] + +logger = logging.getLogger('ipqualityscore') +logger.setLevel(logging.DEBUG) +BASE_URL = 'https://ipqualityscore.com/api/json' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value +IP_ENRICH = 'ip' +URL_ENRICH = 'url' +EMAIL_ENRICH = 'email' +PHONE_ENRICH = 'phone' + + +class RequestHandler: + """A class for handling any outbound requests from this module.""" + + def __init__(self, apikey): + self.session = requests.Session() + self.api_key = apikey + + def get(self, url: str, headers: dict = None, params: dict = None) -> requests.Response: + """General get method to fetch the response from IPQualityScore.""" + try: + response = self.session.get( + url, headers=headers, params=params + ).json() + if str(response["success"]) != "True": + msg = response["message"] + logger.error(f"Error: {msg}") + misperrors["error"] = msg + else: + return response + except (ConnectTimeout, ProxyError, InvalidURL) as error: + msg = "Error connecting with the IPQualityScore." + logger.error(f"{msg} Error: {error}") + misperrors["error"] = msg + + def ipqs_lookup(self, reputation_type: str, ioc: str) -> requests.Response: + """Do a lookup call.""" + url = f"{BASE_URL}/{reputation_type}" + payload = {reputation_type: ioc} + headers = {"IPQS-KEY": self.api_key} + try: + response = self.get(url, headers, payload) + except HTTPError as error: + msg = f"Error when requesting data from IPQualityScore. {error.response}: {error.response.reason}" + logger.error(msg) + misperrors["error"] = msg + raise + return response + + +def parse_attribute(comment, feature, value): + """Generic Method for parsing the attributes in the object""" + attribute = { + 'type': 'text', + 'value': value, + 'comment': comment, + 'distribution': DEFAULT_DISTRIBUTION_SETTING, + 'object_relation': feature + } + return attribute + + +class IPQualityScoreParser: + """A class for handling the enrichment objects""" + + def __init__(self, attribute): + self.rf_white = "#CCCCCC" + self.rf_grey = " #CDCDCD" + self.rf_yellow = "#FFCF00" + self.rf_red = "#D10028" + self.clean = "CLEAN" + self.low = "LOW RISK" + self.medium = "MODERATE RISK" + self.high = "HIGH RISK" + self.critical = "CRITICAL" + self.invalid = "INVALID" + self.suspicious = "SUSPICIOUS" + self.malware = "MALWARE" + self.phishing = "PHISHING" + self.disposable = "DISPOSABLE" + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.ipqs_object = MISPObject('IPQS Fraud ans Risk Scoring Object') + self.ipqs_object.template_uuid = "57d066e6-6d66-42a7-a1ad-e075e39b2b5e" + self.ipqs_object.template_id = "1" + self.ipqs_object.description = "IPQS Fraud ans Risk Scoring Data" + setattr(self.ipqs_object, 'meta-category', 'network') + description = ( + "An object containing the enriched attribute and " + "related entities from IPQualityScore." + ) + self.ipqs_object.from_dict( + **{"meta-category": "misc", "description": description, "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + + temp_attr = MISPAttribute() + temp_attr.from_dict(**attribute) + self.enriched_attribute = MISPAttribute() + self.enriched_attribute.from_dict( + **{"value": temp_attr.value, "type": temp_attr.type, "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + self.ipqs_object.distribution = DEFAULT_DISTRIBUTION_SETTING + self.ip_data_items = [ + 'fraud_score', + 'country_code', + 'region', + 'city', + 'zip_code', + 'ISP', + 'ASN', + 'organization', + 'is_crawler', + 'timezone', + 'mobile', + 'host', + 'proxy', + 'vpn', + 'tor', + 'active_vpn', + 'active_tor', + 'recent_abuse', + 'bot_status', + 'connection_type', + 'abuse_velocity', + 'latitude', + 'longitude' + ] + self.ip_data_items_friendly_names = { + 'fraud_score': 'IPQS: Fraud Score', + 'country_code': 'IPQS: Country Code', + 'region': 'IPQS: Region', + 'city': 'IPQS: City', + 'zip_code': 'IPQS: Zip Code', + 'ISP': 'IPQS: ISP', + 'ASN': 'IPQS: ASN', + 'organization': 'IPQS: Organization', + 'is_crawler': 'IPQS: Is Crawler', + 'timezone': 'IPQS: Timezone', + 'mobile': 'IPQS: Mobile', + 'host': 'IPQS: Host', + 'proxy': 'IPQS: Proxy', + 'vpn': 'IPQS: VPN', + 'tor': 'IPQS: TOR', + 'active_vpn': 'IPQS: Active VPN', + 'active_tor': 'IPQS: Active TOR', + 'recent_abuse': 'IPQS: Recent Abuse', + 'bot_status': 'IPQS: Bot Status', + 'connection_type': 'IPQS: Connection Type', + 'abuse_velocity': 'IPQS: Abuse Velocity', + 'latitude': 'IPQS: Latitude', + 'longitude': 'IPQS: Longitude' + } + self.url_data_items = [ + 'unsafe', + 'domain', + 'ip_address', + 'server', + 'domain_rank', + 'dns_valid', + 'parking', + 'spamming', + 'malware', + 'phishing', + 'suspicious', + 'adult', + 'risk_score', + 'category', + 'domain_age' + ] + self.url_data_items_friendly_names = { + 'unsafe': 'IPQS: Unsafe', + 'domain': 'IPQS: Domain', + 'ip_address': 'IPQS: IP Address', + 'server': 'IPQS: Server', + 'domain_rank': 'IPQS: Domain Rank', + 'dns_valid': 'IPQS: DNS Valid', + 'parking': 'IPQS: Parking', + 'spamming': 'IPQS: Spamming', + 'malware': 'IPQS: Malware', + 'phishing': 'IPQS: Phishing', + 'suspicious': 'IPQS: Suspicious', + 'adult': 'IPQS: Adult', + 'risk_score': 'IPQS: Risk Score', + 'category': 'IPQS: Category', + 'domain_age': 'IPQS: Domain Age' + } + self.email_data_items = [ + 'valid', + 'disposable', + 'smtp_score', + 'overall_score', + 'first_name', + 'generic', + 'common', + 'dns_valid', + 'honeypot', + 'deliverability', + 'frequent_complainer', + 'spam_trap_score', + 'catch_all', + 'timed_out', + 'suspect', + 'recent_abuse', + 'fraud_score', + 'suggested_domain', + 'leaked', + 'sanitized_email', + 'domain_age', + 'first_seen' + ] + self.email_data_items_friendly_names = { + 'valid': 'IPQS: Valid', + 'disposable': 'IPQS: Disposable', + 'smtp_score': 'IPQS: SMTP Score', + 'overall_score': 'IPQS: Overall Score', + 'first_name': 'IPQS: First Name', + 'generic': 'IPQS: Generic', + 'common': 'IPQS: Common', + 'dns_valid': 'IPQS: DNS Valid', + 'honeypot': 'IPQS: Honeypot', + 'deliverability': 'IPQS: Deliverability', + 'frequent_complainer': 'IPQS: Frequent Complainer', + 'spam_trap_score': 'IPQS: Spam Trap Score', + 'catch_all': 'IPQS: Catch All', + 'timed_out': 'IPQS: Timed Out', + 'suspect': 'IPQS: Suspect', + 'recent_abuse': 'IPQS: Recent Abuse', + 'fraud_score': 'IPQS: Fraud Score', + 'suggested_domain': 'IPQS: Suggested Domain', + 'leaked': 'IPQS: Leaked', + 'sanitized_email': 'IPQS: Sanitized Email', + 'domain_age': 'IPQS: Domain Age', + 'first_seen': 'IPQS: First Seen' + } + self.phone_data_items = [ + 'formatted', + 'local_format', + 'valid', + 'fraud_score', + 'recent_abuse', + 'VOIP', + 'prepaid', + 'risky', + 'active', + 'carrier', + 'line_type', + 'country', + 'city', + 'zip_code', + 'region', + 'dialing_code', + 'active_status', + 'leaked', + 'name', + 'timezone', + 'do_not_call', + ] + self.phone_data_items_friendly_names = { + 'formatted': 'IPQS: Formatted', + 'local_format': 'IPQS: Local Format', + 'valid': 'IPQS: Valid', + 'fraud_score': 'IPQS: Fraud Score', + 'recent_abuse': 'IPQS: Recent Abuse', + 'VOIP': 'IPQS: VOIP', + 'prepaid': 'IPQS: Prepaid', + 'risky': 'IPQS: Risky', + 'active': 'IPQS: Active', + 'carrier': 'IPQS: Carrier', + 'line_type': 'IPQS: Line Type', + 'country': 'IPQS: Country', + 'city': 'IPQS: City', + 'zip_code': 'IPQS: Zip Code', + 'region': 'IPQS: Region', + 'dialing_code': 'IPQS: Dialing Code', + 'active_status': 'IPQS: Active Status', + 'leaked': 'IPQS: Leaked', + 'name': 'IPQS: Name', + 'timezone': 'IPQS: Timezone', + 'do_not_call': 'IPQS: Do Not Call', + } + self.timestamp_items_friendly_name = { + 'human': ' Human', + 'timestamp': ' Timestamp', + 'iso': ' ISO' + } + self.timestamp_items = [ + 'human', + 'timestamp', + 'iso' + ] + + def criticality_color(self, criticality) -> str: + """method which maps the color to the criticality level""" + mapper = { + self.clean: self.rf_grey, + self.low: self.rf_grey, + self.medium: self.rf_yellow, + self.suspicious: self.rf_yellow, + self.high: self.rf_red, + self.critical: self.rf_red, + self.invalid: self.rf_red, + self.disposable: self.rf_red, + self.malware: self.rf_red, + self.phishing: self.rf_red + } + return mapper.get(criticality, self.rf_white) + + def add_tag(self, tag_name: str, hex_color: str = None) -> None: + """Helper method for adding a tag to the enriched attribute.""" + tag = MISPTag() + tag_properties = {"name": tag_name} + if hex_color: + tag_properties["colour"] = hex_color + tag.from_dict(**tag_properties) + self.enriched_attribute.add_tag(tag) + + def ipqs_parser(self, query_response, enrich_type): + """ helper method to call the enrichment function according to the type""" + if enrich_type == IP_ENRICH: + self.ip_reputation_data(query_response) + elif enrich_type == URL_ENRICH: + self.url_reputation_data(query_response) + elif enrich_type == EMAIL_ENRICH: + self.email_reputation_data(query_response) + elif enrich_type == PHONE_ENRICH: + self.phone_reputation_data(query_response) + + def ip_reputation_data(self, query_response): + """method to create object for IP address""" + comment = "Results from IPQualityScore IP Reputation API" + for ip_data_item in self.ip_data_items: + if ip_data_item in query_response: + data_item = self.ip_data_items_friendly_names[ip_data_item] + data_item_value = str(query_response[ip_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + if ip_data_item == "fraud_score": + fraud_score = int(data_item_value) + tag_name = f'IPQS:Fraud Score="{fraud_score}"' + self.add_tag(tag_name) + self.ip_address_risk_scoring(fraud_score) + + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def ip_address_risk_scoring(self, score): + """method to create calculate verdict for IP Address""" + risk_criticality = "" + if score == 100: + risk_criticality = self.critical + elif 85 <= score <= 99: + risk_criticality = self.high + elif 75 <= score <= 84: + risk_criticality = self.medium + elif 60 <= score <= 74: + risk_criticality = self.suspicious + elif score <= 59: + risk_criticality = self.clean + + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def url_reputation_data(self, query_response): + """method to create object for URL/Domain""" + malware = False + phishing = False + risk_score = 0 + comment = "Results from IPQualityScore Malicious URL Scanner API" + for url_data_item in self.url_data_items: + if url_data_item in query_response: + data_item_value = "" + if url_data_item == "domain_age": + for timestamp_item in self.timestamp_items: + data_item = self.url_data_items_friendly_names[url_data_item] + \ + self.timestamp_items_friendly_name[timestamp_item] + data_item_value = str(query_response[url_data_item][timestamp_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + else: + data_item = self.url_data_items_friendly_names[url_data_item] + data_item_value = str(query_response[url_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + + if url_data_item == "malware": + malware = data_item_value + if url_data_item == "phishing": + phishing = data_item_value + if url_data_item == "risk_score": + risk_score = int(data_item_value) + tag_name = f'IPQS:Risk Score="{risk_score}"' + self.add_tag(tag_name) + + self.url_risk_scoring(risk_score, malware, phishing) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def url_risk_scoring(self, score, malware, phishing): + """method to create calculate verdict for URL/Domain""" + risk_criticality = "" + if malware == 'True': + risk_criticality = self.malware + elif phishing == 'True': + risk_criticality = self.phishing + elif score >= 90: + risk_criticality = self.high + elif 80 <= score <= 89: + risk_criticality = self.medium + elif 70 <= score <= 79: + risk_criticality = self.low + elif 55 <= score <= 69: + risk_criticality = self.suspicious + elif score <= 54: + risk_criticality = self.clean + + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def email_reputation_data(self, query_response): + """method to create object for Email Address""" + comment = "Results from IPQualityScore Email Verification API" + disposable = False + valid = False + fraud_score = 0 + for email_data_item in self.email_data_items: + if email_data_item in query_response: + data_item_value = "" + if email_data_item not in ("domain_age", "first_seen"): + data_item = self.email_data_items_friendly_names[email_data_item] + data_item_value = str(query_response[email_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + else: + for timestamp_item in self.timestamp_items: + data_item = self.email_data_items_friendly_names[email_data_item] + \ + self.timestamp_items_friendly_name[timestamp_item] + data_item_value = str(query_response[email_data_item][timestamp_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + + if email_data_item == "disposable": + disposable = data_item_value + if email_data_item == "valid": + valid = data_item_value + if email_data_item == "fraud_score": + fraud_score = int(data_item_value) + tag_name = f'IPQS:Fraud Score="{fraud_score}"' + self.add_tag(tag_name) + + self.email_address_risk_scoring(fraud_score, disposable, valid) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def email_address_risk_scoring(self, score, disposable, valid): + """method to create calculate verdict for Email Address""" + risk_criticality = "" + if valid == "False": + risk_criticality = self.invalid + elif disposable == "True": + risk_criticality = self.disposable + elif score == 100: + risk_criticality = self.high + elif 88 <= score <= 99: + risk_criticality = self.medium + elif 80 <= score <= 87: + risk_criticality = self.low + elif score <= 79: + risk_criticality = self.clean + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + + self.add_tag(tag_name, hex_color) + + def phone_reputation_data(self, query_response): + """method to create object for Phone Number""" + fraud_score = 0 + valid = False + active = False + comment = "Results from IPQualityScore Phone Number Validation API" + for phone_data_item in self.phone_data_items: + if phone_data_item in query_response: + data_item = self.phone_data_items_friendly_names[phone_data_item] + data_item_value = str(query_response[phone_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + if phone_data_item == "active": + active = data_item_value + if phone_data_item == "valid": + valid = data_item_value + if phone_data_item == "fraud_score": + fraud_score = int(data_item_value) + tag_name = f'IPQS:Fraud Score="{fraud_score}"' + self.add_tag(tag_name) + + self.phone_address_risk_scoring(fraud_score, valid, active) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def phone_address_risk_scoring(self, score, valid, active): + """method to create calculate verdict for Phone Number""" + risk_criticality = "" + if valid == "False": + risk_criticality = self.medium + elif active == "False": + risk_criticality = self.medium + elif 90 <= score <= 100: + risk_criticality = self.high + elif 80 <= score <= 89: + risk_criticality = self.low + elif 50 <= score <= 79: + risk_criticality = self.suspicious + elif score <= 49: + risk_criticality = self.clean + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def get_results(self): + """returns the dictionary object to MISP Instance""" + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} + + +def handler(q=False): + """The function which accepts a JSON document to expand the values and return a dictionary of the expanded + values. """ + if q is False: + return False + request = json.loads(q) + # check if the apikey is provided + if not request.get('config') or not request['config'].get('apikey'): + misperrors['error'] = 'IPQualityScore apikey is missing' + return misperrors + apikey = request['config'].get('apikey') + # check attribute is added to the event + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + + attribute = request['attribute'] + attribute_type = attribute['type'] + attribute_value = attribute['value'] + + # check if the attribute type is supported by IPQualityScore + if attribute_type not in mispattributes['input']: + return {'error': 'Unsupported attributes type for IPqualityScore Enrichment'} + request_handler = RequestHandler(apikey) + enrich_type = "" + if attribute_type in ip_query_input_type: + enrich_type = IP_ENRICH + json_response = request_handler.ipqs_lookup(IP_ENRICH, attribute_value) + elif attribute_type in url_query_input_type: + enrich_type = URL_ENRICH + json_response = request_handler.ipqs_lookup(URL_ENRICH, attribute_value) + elif attribute_type in email_query_input_type: + enrich_type = EMAIL_ENRICH + json_response = request_handler.ipqs_lookup(EMAIL_ENRICH, attribute_value) + elif attribute_type in phone_query_input_type: + enrich_type = PHONE_ENRICH + json_response = request_handler.ipqs_lookup(PHONE_ENRICH, attribute_value) + + parser = IPQualityScoreParser(attribute) + parser.ipqs_parser(json_response, enrich_type) + return parser.get_results() + + +def introspection(): + """The function that returns a dict of the supported attributes (input and output) by your expansion module.""" + return mispattributes + + +def version(): + """The function that returns a dict with the version and the associated meta-data including potential + configurations required of the module. """ + moduleinfo['config'] = moduleconfig + return moduleinfo + From fedf731e074d2f34c58a3ed6578b4a631841b324 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 9 Feb 2022 10:22:16 +0530 Subject: [PATCH 390/476] added ipqs_fraud_and_risk_scoring to modules list --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 23f3d32..15eb8d6 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'ipqualityscore'] + 'qintel_qsentry', 'mwdb', 'ipqs_fraud_and_risk_scoring'] minimum_required_fields = ('type', 'uuid', 'value') From 430a838332aaa3e95d682ec6784669e7cf524307 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 10:20:48 +0530 Subject: [PATCH 391/476] Update ipqs_fraud_and_risk_scoring.py --- .../expansion/ipqs_fraud_and_risk_scoring.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py index f3b2afb..754f94a 100644 --- a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py +++ b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py @@ -130,10 +130,10 @@ class IPQualityScoreParser: self.attribute = attribute self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) - self.ipqs_object = MISPObject('IPQS Fraud ans Risk Scoring Object') + self.ipqs_object = MISPObject('IPQS Fraud and Risk Scoring Object') self.ipqs_object.template_uuid = "57d066e6-6d66-42a7-a1ad-e075e39b2b5e" self.ipqs_object.template_id = "1" - self.ipqs_object.description = "IPQS Fraud ans Risk Scoring Data" + self.ipqs_object.description = "IPQS Fraud and Risk Scoring Data" setattr(self.ipqs_object, 'meta-category', 'network') description = ( "An object containing the enriched attribute and " @@ -385,8 +385,8 @@ class IPQualityScoreParser: self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) if ip_data_item == "fraud_score": fraud_score = int(data_item_value) - tag_name = f'IPQS:Fraud Score="{fraud_score}"' - self.add_tag(tag_name) + # tag_name = f'IPQS:Fraud Score="{fraud_score}"' + # self.add_tag(tag_name) self.ip_address_risk_scoring(fraud_score) self.ipqs_object.add_attribute( @@ -439,8 +439,8 @@ class IPQualityScoreParser: phishing = data_item_value if url_data_item == "risk_score": risk_score = int(data_item_value) - tag_name = f'IPQS:Risk Score="{risk_score}"' - self.add_tag(tag_name) + #tag_name = f'IPQS:Risk Score="{risk_score}"' + #self.add_tag(tag_name) self.url_risk_scoring(risk_score, malware, phishing) self.ipqs_object.add_attribute( @@ -497,8 +497,8 @@ class IPQualityScoreParser: valid = data_item_value if email_data_item == "fraud_score": fraud_score = int(data_item_value) - tag_name = f'IPQS:Fraud Score="{fraud_score}"' - self.add_tag(tag_name) + #tag_name = f'IPQS:Fraud Score="{fraud_score}"' + #self.add_tag(tag_name) self.email_address_risk_scoring(fraud_score, disposable, valid) self.ipqs_object.add_attribute( @@ -544,8 +544,8 @@ class IPQualityScoreParser: valid = data_item_value if phone_data_item == "fraud_score": fraud_score = int(data_item_value) - tag_name = f'IPQS:Fraud Score="{fraud_score}"' - self.add_tag(tag_name) + #tag_name = f'IPQS:Fraud Score="{fraud_score}"' + #self.add_tag(tag_name) self.phone_address_risk_scoring(fraud_score, valid, active) self.ipqs_object.add_attribute( @@ -632,4 +632,3 @@ def version(): configurations required of the module. """ moduleinfo['config'] = moduleconfig return moduleinfo - From 9e0849b7935a7d6c9ebf91a862fe9438080a624d Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 10:21:36 +0530 Subject: [PATCH 392/476] added IPQS logo --- documentation/logos/ipqualityscore.png | Bin 0 -> 6769 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/logos/ipqualityscore.png diff --git a/documentation/logos/ipqualityscore.png b/documentation/logos/ipqualityscore.png new file mode 100644 index 0000000000000000000000000000000000000000..da52d96680f76ed4c92b0b6aaab0ecc0121bfa68 GIT binary patch literal 6769 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 literal 0 HcmV?d00001 From cfc70ec1768181ea1f85f5e41db916709b6ff126 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 10:22:19 +0530 Subject: [PATCH 393/476] added documentation --- .../expansion/ipqs_fraud_and_risk_scoring.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 documentation/website/expansion/ipqs_fraud_and_risk_scoring.json diff --git a/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json new file mode 100644 index 0000000..8a1c097 --- /dev/null +++ b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json @@ -0,0 +1,13 @@ +{ + "description": "IPQualityScore MISP Expansion Module.", + "logo": "ipqualityscore.png", + "requirements": [ + "A IPQualityScore API Key." + ], + "input": "A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), URL(url, uri), Email Address(email, email-src, email-dst, target-email, whois-registrant-email) and Phone Number(phone-number, whois-registrant-phone).", + "output": "IPQualityScore object, resulting from the query on the IPQualityScore API.", + "references": [ + "https://www.ipqualityscore.com/" + ], + "features": "This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API.\n The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. \n The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore." +} \ No newline at end of file From 023f6653b9d378a2b6fed12f5235e2f9ceeeba37 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 10:36:03 +0530 Subject: [PATCH 394/476] Update ipqs_fraud_and_risk_scoring.json --- .../website/expansion/ipqs_fraud_and_risk_scoring.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json index 8a1c097..d0d4665 100644 --- a/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json +++ b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json @@ -1,5 +1,5 @@ { - "description": "IPQualityScore MISP Expansion Module.", + "description": "IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner.", "logo": "ipqualityscore.png", "requirements": [ "A IPQualityScore API Key." @@ -10,4 +10,4 @@ "https://www.ipqualityscore.com/" ], "features": "This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API.\n The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. \n The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore." -} \ No newline at end of file +} From 3856f9fe1d1160673b5c5f94d352e5216f0c30b6 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 10:38:48 +0530 Subject: [PATCH 395/476] Update ipqs_fraud_and_risk_scoring.py --- misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py index 754f94a..9cb50a3 100644 --- a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py +++ b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py @@ -42,8 +42,8 @@ mispattributes = { moduleinfo = { 'version': '0.1', 'author': 'David Mackler', - 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation and Malicious ' - 'Domain/URL Scanner.', + 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation,' + 'Malicious Domain and Malicious URL Scanner.', 'module-type': ['expansion', 'hover'] } moduleconfig = ['apikey'] From e7645a195aa18c98bbc50eca45f2873c4aa80fb1 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 11:01:54 +0530 Subject: [PATCH 396/476] Update test_expansions.py --- tests/test_expansions.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index b8764f7..7459e99 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -293,6 +293,29 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_object(response), 'asn') + def test_ipqs_fraud_and_risk_scoring(self): + module_name = "ipqs_fraud_and_risk_scoring" + query = {"module": module_name, + "attribute": {"type": "domain", + "value": "noreply@ipqualityscore.com", + "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d"}, + "config": {}} + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + try: + self.assertEqual(self.get_object(response), 'IPQS:) + except Exception: + self.assertIn( + self.get_errors(response), + ( + "Invalid or unauthorized key. Please check the API key and try again." + ) + ) + else: + response = self.misp_modules_post(query) + self.assertEqual(self.get_errors(response), 'An API key for IPQualityScore is required.') + def test_macaddess_io(self): module_name = 'macaddress_io' query = {"module": module_name, "mac-address": "44:38:39:ff:ef:57"} From 8c1db02a655dcc27da3a87e3e5dcfe3d723b5c8d Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 11:06:38 +0530 Subject: [PATCH 397/476] Update test_expansions.py --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 7459e99..649c05a 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -304,7 +304,7 @@ class TestExpansions(unittest.TestCase): query['config'] = self.configs[module_name] response = self.misp_modules_post(query) try: - self.assertEqual(self.get_object(response), 'IPQS:) + self.assertEqual(self.get_object(response), 'IPQS:') except Exception: self.assertIn( self.get_errors(response), From 0d63c5e0a2a197221ca77d63cf17d5434f2c5ac7 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 11:14:57 +0530 Subject: [PATCH 398/476] Update test_expansions.py --- tests/test_expansions.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 649c05a..db5d160 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -296,22 +296,14 @@ class TestExpansions(unittest.TestCase): def test_ipqs_fraud_and_risk_scoring(self): module_name = "ipqs_fraud_and_risk_scoring" query = {"module": module_name, - "attribute": {"type": "domain", + "attribute": {"type": "email", "value": "noreply@ipqualityscore.com", "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d"}, "config": {}} if module_name in self.configs: query['config'] = self.configs[module_name] response = self.misp_modules_post(query) - try: - self.assertEqual(self.get_object(response), 'IPQS:') - except Exception: - self.assertIn( - self.get_errors(response), - ( - "Invalid or unauthorized key. Please check the API key and try again." - ) - ) + self.assertEqual(self.get_values(response), 'noreply@ipqualityscore.com') else: response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'An API key for IPQualityScore is required.') From 59a6ca2fb43067afb89b1e678d522758cceff197 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 11:34:42 +0530 Subject: [PATCH 399/476] Update test_expansions.py --- tests/test_expansions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index db5d160..35e384d 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -303,10 +303,10 @@ class TestExpansions(unittest.TestCase): if module_name in self.configs: query['config'] = self.configs[module_name] response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), 'noreply@ipqualityscore.com') + self.assertEqual(self.get_values(response)['message'], 'Success.') else: response = self.misp_modules_post(query) - self.assertEqual(self.get_errors(response), 'An API key for IPQualityScore is required.') + self.assertEqual(self.get_errors(response), 'Invalid or unauthorized key. Please check the API key and try again.') def test_macaddess_io(self): module_name = 'macaddress_io' From f5577aac78e25df5f19b86566534b7537ff917d3 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Sat, 12 Feb 2022 11:45:45 +0530 Subject: [PATCH 400/476] Update test_expansions.py --- tests/test_expansions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 35e384d..d75756f 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -306,7 +306,7 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_values(response)['message'], 'Success.') else: response = self.misp_modules_post(query) - self.assertEqual(self.get_errors(response), 'Invalid or unauthorized key. Please check the API key and try again.') + self.assertEqual(self.get_errors(response), 'IPQualityScore apikey is missing') def test_macaddess_io(self): module_name = 'macaddress_io' From 30287e3b03198800d8e8f3e0fe7548e3de04fce2 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 14 Feb 2022 09:35:40 +0100 Subject: [PATCH 401/476] chg: [lib] latest stix2misp.py updated --- misp_modules/lib/stix2misp.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/misp_modules/lib/stix2misp.py b/misp_modules/lib/stix2misp.py index ed875b5..0e92aed 100644 --- a/misp_modules/lib/stix2misp.py +++ b/misp_modules/lib/stix2misp.py @@ -22,15 +22,19 @@ import os import time import io import pymisp -import stix2 -import misp_modules.lib.stix2misp_mapping as stix2misp_mapping +import stix2misp_mapping from collections import defaultdict from copy import deepcopy from pathlib import Path -_misp_objects_path = Path(__file__).parent / 'misp-objects' / 'objects' +_misp_dir = Path(os.path.realpath(__file__)).parents[4] +_misp_objects_path = _misp_dir / 'app' / 'files' / 'misp-objects' / 'objects' _misp_types = pymisp.AbstractMISP().describe_types.get('types') from pymisp import MISPEvent, MISPObject, MISPAttribute +_scripts_path = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(_scripts_path / 'cti-python-stix2')) +import stix2 + class StixParser(): _galaxy_types = ('intrusion-set', 'malware', 'threat-actor', 'tool') @@ -471,7 +475,7 @@ class StixFromMISPParser(StixParser): if hasattr(galaxy, 'labels'): return [label for label in galaxy.labels if label.startswith('misp-galaxy:')] try: - return self._synonyms_to_tag_names[name] + return self._synonyms_to_tag_names[galaxy.name] except KeyError: print(f'Unknown {galaxy._type} name: {galaxy.name}', file=sys.stderr) return [f'misp-galaxy:{galaxy._type}="{galaxy.name}"'] @@ -1097,6 +1101,8 @@ class StixFromMISPParser(StixParser): if tags: attribute['Tag'] = tags attribute.update(self.parse_timeline(stix_object)) + if hasattr(stix_object, 'description') and stix_object.description: + attribute['comment'] = stix_object.description if hasattr(stix_object, 'object_marking_refs'): self.update_marking_refs(attribute_uuid, stix_object.object_marking_refs) return attribute @@ -1107,6 +1113,8 @@ class StixFromMISPParser(StixParser): misp_object = MISPObject('file' if object_type == 'WindowsPEBinaryFile' else object_type, misp_objects_path_custom=_misp_objects_path) misp_object.uuid = stix_object.id.split('--')[1] + if hasattr(stix_object, 'description') and stix_object.description: + misp_object.comment = stix_object.description misp_object.update(self.parse_timeline(stix_object)) return misp_object, object_type @@ -1984,6 +1992,8 @@ class ExternalStixParser(StixParser): misp_object = MISPObject(name if name is not None else stix_object.type, misp_objects_path_custom=_misp_objects_path) misp_object.uuid = stix_object.id.split('--')[1] + if hasattr(stix_object, 'description') and stix_object.description: + misp_object.comment = stix_object.description misp_object.update(self.parse_timeline(stix_object)) return misp_object @@ -2057,7 +2067,7 @@ def from_misp(stix_objects): def main(args): - filename = Path(os.path.dirname(args[0]), args[1]) + filename = args[1] if args[1][0] == '/' else Path(os.path.dirname(args[0]), args[1]) with open(filename, 'rt', encoding='utf-8') as f: event = stix2.parse(f.read(), allow_custom=True, interoperability=True) stix_parser = StixFromMISPParser() if from_misp(event.objects) else ExternalStixParser() From 2f1d35774d6a3a90f6a76e0b48fdf5609c37286d Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 15 Feb 2022 18:52:14 +0530 Subject: [PATCH 402/476] Update ipqs_fraud_and_risk_scoring.py --- .../expansion/ipqs_fraud_and_risk_scoring.py | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py index 9cb50a3..bb58284 100644 --- a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py +++ b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py @@ -42,7 +42,7 @@ mispattributes = { moduleinfo = { 'version': '0.1', 'author': 'David Mackler', - 'description': 'Query IPQualityScore for IP reputation, Email Validation, Phone Number Validation,' + 'description': 'IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation,' 'Malicious Domain and Malicious URL Scanner.', 'module-type': ['expansion', 'hover'] } @@ -124,9 +124,9 @@ class IPQualityScoreParser: self.critical = "CRITICAL" self.invalid = "INVALID" self.suspicious = "SUSPICIOUS" - self.malware = "MALWARE" - self.phishing = "PHISHING" - self.disposable = "DISPOSABLE" + self.malware = "CRITICAL" + self.phishing = "CRITICAL" + self.disposable = "CRITICAL" self.attribute = attribute self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) @@ -385,8 +385,6 @@ class IPQualityScoreParser: self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) if ip_data_item == "fraud_score": fraud_score = int(data_item_value) - # tag_name = f'IPQS:Fraud Score="{fraud_score}"' - # self.add_tag(tag_name) self.ip_address_risk_scoring(fraud_score) self.ipqs_object.add_attribute( @@ -439,8 +437,6 @@ class IPQualityScoreParser: phishing = data_item_value if url_data_item == "risk_score": risk_score = int(data_item_value) - #tag_name = f'IPQS:Risk Score="{risk_score}"' - #self.add_tag(tag_name) self.url_risk_scoring(risk_score, malware, phishing) self.ipqs_object.add_attribute( @@ -497,8 +493,6 @@ class IPQualityScoreParser: valid = data_item_value if email_data_item == "fraud_score": fraud_score = int(data_item_value) - #tag_name = f'IPQS:Fraud Score="{fraud_score}"' - #self.add_tag(tag_name) self.email_address_risk_scoring(fraud_score, disposable, valid) self.ipqs_object.add_attribute( @@ -510,10 +504,10 @@ class IPQualityScoreParser: def email_address_risk_scoring(self, score, disposable, valid): """method to create calculate verdict for Email Address""" risk_criticality = "" - if valid == "False": - risk_criticality = self.invalid - elif disposable == "True": + if disposable == "True": risk_criticality = self.disposable + elif valid == "False": + risk_criticality = self.invalid elif score == 100: risk_criticality = self.high elif 88 <= score <= 99: @@ -544,8 +538,7 @@ class IPQualityScoreParser: valid = data_item_value if phone_data_item == "fraud_score": fraud_score = int(data_item_value) - #tag_name = f'IPQS:Fraud Score="{fraud_score}"' - #self.add_tag(tag_name) + self.phone_address_risk_scoring(fraud_score, valid, active) self.ipqs_object.add_attribute( From 9b4b1a1c4f06d59d4a167b4838e7bb1e9d4fea76 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 15 Feb 2022 19:01:13 +0530 Subject: [PATCH 403/476] Update __init__.py --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 15eb8d6..1142252 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'ipqs_fraud_and_risk_scoring'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring'] minimum_required_fields = ('type', 'uuid', 'value') From 82eee0074b2a408ef8eeefc9816422b0dd9c34ab Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 15 Feb 2022 19:11:36 +0530 Subject: [PATCH 404/476] Update __init__.py --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1142252..15eb8d6 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring'] + 'qintel_qsentry', 'mwdb', 'ipqs_fraud_and_risk_scoring'] minimum_required_fields = ('type', 'uuid', 'value') From 4a19d35da028719e707641fe4de481517384dace Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 15 Feb 2022 19:19:51 +0530 Subject: [PATCH 405/476] updated to add the latest modules --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 15eb8d6..1142252 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'ipqs_fraud_and_risk_scoring'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring'] minimum_required_fields = ('type', 'uuid', 'value') From 077576971452a00fa08af542471b220340f54cef Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 15 Feb 2022 15:27:36 +0100 Subject: [PATCH 406/476] chg: [doc] updated --- documentation/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index 88670b0..9d2d7cc 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -754,6 +754,26 @@ Module to query an IP ASN history service (https://github.com/D4-project/IPASN-H ----- +#### [ipqs_fraud_and_risk_scoring](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py) + + + +IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner. +- **features**: +>This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API. +> The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. +> The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore. +- **input**: +>A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), URL(url, uri), Email Address(email, email-src, email-dst, target-email, whois-registrant-email) and Phone Number(phone-number, whois-registrant-phone). +- **output**: +>IPQualityScore object, resulting from the query on the IPQualityScore API. +- **references**: +>https://www.ipqualityscore.com/ +- **requirements**: +>A IPQualityScore API Key. + +----- + #### [iprep](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/iprep.py) Module to query IPRep data for IP addresses. From a1e468f7bf22f46de7ec0d41e37d75299cc205a7 Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Tue, 22 Feb 2022 23:33:55 +0100 Subject: [PATCH 407/476] fix: Allow email-src and email-dst as input for apivoid module --- misp_modules/modules/expansion/apivoid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/apivoid.py b/misp_modules/modules/expansion/apivoid.py index 3b0ce72..3d29d85 100755 --- a/misp_modules/modules/expansion/apivoid.py +++ b/misp_modules/modules/expansion/apivoid.py @@ -4,7 +4,7 @@ from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['domain', 'hostname', 'email'], 'format': 'misp_standard'} +mispattributes = {'input': ['domain', 'hostname', 'email', 'email-src', 'email-dst'], 'format': 'misp_standard'} moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'On demand query API for APIVoid.', 'module-type': ['expansion', 'hover']} From c5a9a973549f1e62326e7f410ad09a646b67bc9c Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Wed, 23 Feb 2022 00:54:13 +0100 Subject: [PATCH 408/476] chg:[doc] update mmdb_lookup documentation --- documentation/website/expansion/mmdb_lookup.json | 11 +++++++++++ misp_modules/modules/expansion/mmdb_lookup.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 documentation/website/expansion/mmdb_lookup.json diff --git a/documentation/website/expansion/mmdb_lookup.json b/documentation/website/expansion/mmdb_lookup.json new file mode 100644 index 0000000..ebfbf49 --- /dev/null +++ b/documentation/website/expansion/mmdb_lookup.json @@ -0,0 +1,11 @@ +{ + "description": "A hover and expansion module to enrich an ip with geolocation and ASN information from an mmdb server instance, such as CIRCL's ip.circl.lu.", + "logo": "circl.png", + "input": "An IP address attribute (for example ip-src or ip-src|port).", + "output": "Geolocation and asn objects.", + "references": [ + "https://data.public.lu/fr/datasets/geo-open-ip-address-geolocation-per-country-in-mmdb-format/", + "https://github.com/adulau/mmdb-server" + ], + "features": "The module takes an IP address related attribute as input.\n It queries the public CIRCL.lu mmdb-server instance, available at ip.circl.lu, by default. The module can be configured with a custom mmdb server url if required.\n It is also possible to filter results on 1 db_source by configuring db_source_filter." +} \ No newline at end of file diff --git a/misp_modules/modules/expansion/mmdb_lookup.py b/misp_modules/modules/expansion/mmdb_lookup.py index 0c54ba8..e3a0eff 100644 --- a/misp_modules/modules/expansion/mmdb_lookup.py +++ b/misp_modules/modules/expansion/mmdb_lookup.py @@ -6,7 +6,7 @@ from pymisp import MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-src|port', 'ip-dst', 'ip-dst|port'], 'format': 'misp_standard'} moduleinfo = {'version': '1', 'author': 'Jeroen Pinoy', - 'description': "An expansion module to enrich an ip with geolocation information from an mmdb server " + 'description': "An expansion module to enrich an ip with geolocation and asn information from an mmdb server " "such as ip.circl.lu.", 'module-type': ['expansion', 'hover']} moduleconfig = ["custom_API", "db_source_filter"] From c1b46bb2c45e2f9d603f22b9c33a5e32ea67633e Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Wed, 23 Feb 2022 07:37:57 +0100 Subject: [PATCH 409/476] chg: [doc] mmdb documention updated --- documentation/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index 9d2d7cc..a455c79 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -936,6 +936,25 @@ Query the MALWAREbazaar API to get additional information about the input hash a ----- +#### [mmdb_lookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mmdb_lookup.py) + + + +A hover and expansion module to enrich an ip with geolocation and ASN information from an mmdb server instance, such as CIRCL's ip.circl.lu. +- **features**: +>The module takes an IP address related attribute as input. +> It queries the public CIRCL.lu mmdb-server instance, available at ip.circl.lu, by default. The module can be configured with a custom mmdb server url if required. +> It is also possible to filter results on 1 db_source by configuring db_source_filter. +- **input**: +>An IP address attribute (for example ip-src or ip-src|port). +- **output**: +>Geolocation and asn objects. +- **references**: +> - https://data.public.lu/fr/datasets/geo-open-ip-address-geolocation-per-country-in-mmdb-format/ +> - https://github.com/adulau/mmdb-server + +----- + #### [mwdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mwdb.py) Module to push malware samples to a MWDB instance From 799541e9de6bcdbbe8a259b9946390986abbb9be Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Thu, 3 Mar 2022 17:49:19 +0100 Subject: [PATCH 410/476] chg: [internal] Update deps --- .github/workflows/python-package.yml | 2 +- Pipfile | 2 + REQUIREMENTS | 69 +++++++++++++++------------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 510a469..6e65048 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -17,7 +17,7 @@ jobs: steps: - run: | - sudo apt-get install libfuzzy-dev libpoppler-cpp-dev libzbar0 tesseract-ocr + sudo apt-get install libpoppler-cpp-dev libzbar0 tesseract-ocr - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 diff --git a/Pipfile b/Pipfile index bdf2c98..b7ec209 100644 --- a/Pipfile +++ b/Pipfile @@ -26,7 +26,9 @@ beautifulsoup4 = "*" oauth2 = "*" yara-python = "==3.8.1" sigmatools = "*" +stix2 = "*" stix2-patterns = "*" +taxii2-client = "*" maclookup = "*" vulners = "*" blockchain = "*" diff --git a/REQUIREMENTS b/REQUIREMENTS index 5d4e50e..4a22e45 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -27,28 +27,28 @@ censys==2.1.2 certifi==2021.10.8 cffi==1.15.0 chardet==4.0.0 -charset-normalizer==2.0.11; python_version >= '3' +charset-normalizer==2.0.12; python_version >= '3' clamd==1.0.2 click-plugins==1.1.1 -click==8.0.3; python_version >= '3.6' +click==8.0.4; python_version >= '3.6' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' colorclass==2.2.2; python_version >= '2.6' commonmark==0.9.1 compressed-rtf==1.0.6 configparser==5.2.0; python_version >= '3.6' -crowdstrike-falconpy==1.0.0 +crowdstrike-falconpy==1.0.5 cryptography==36.0.1; python_version >= '3.6' decorator==5.1.1; python_version >= '3.5' deprecated==1.2.13; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -dnsdb2==1.1.3 +dnsdb2==1.1.4 dnspython==2.2.0 domaintools-api==0.6.1 easygui==0.98.2 ebcdic==1.1.1 enum-compat==0.0.3 -extract-msg==0.28.7 +extract-msg==0.30.8 ezodf==0.3.2 -filelock==3.4.2; python_version >= '3.7' +filelock==3.6.0; python_version >= '3.7' frozenlist==1.3.0; python_version >= '3.7' future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' geoip2==4.5.0 @@ -62,25 +62,26 @@ git+https://github.com/sebdraven/pyonyphe@aed008ee5a27e3a5e4afbb3e5cbfc471701084 httplib2==0.20.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' idna-ssl==1.1.0; python_version < '3.7' idna==3.3; python_version >= '3' -imapclient==2.1.0 -importlib-metadata==4.10.1; python_version < '3.8' +imapclient==2.2.0 +importlib-metadata==4.11.2; python_version < '3.8' +importlib-resources==5.4.0; python_version < '3.9' isodate==0.6.1 -itsdangerous==2.0.1; python_version >= '3.6' +itsdangerous==2.1.0; python_version >= '3.7' jbxapi==3.17.2 jeepney==0.7.1; sys_platform == 'linux' json-log-formatter==0.5.1 -jsonschema==3.2.0 +jsonschema==4.4.0; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 lief==0.11.5 -lxml==4.7.1 +lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 maxminddb==2.2.0; python_version >= '3.6' more-itertools==8.12.0; python_version >= '3.5' msoffcrypto-tool==5.0.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') multidict==6.0.2; python_version >= '3.7' -mwdblib==4.0.0 +mwdblib==4.1.0 ndjson==0.3.1 np==1.0.2 numpy==1.21.5; python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64' @@ -98,26 +99,26 @@ pillow==9.0.1 progressbar2==4.0.0; python_version >= '3.7' psutil==5.9.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.21 -pycryptodome==3.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -pycryptodomex==3.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -pydeep==0.4 +pycryptodome==3.14.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodomex==3.14.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pydeep2==0.5.1 pyeupi==1.1 pyfaup==1.2 pygeoip==0.3.2 pygments==2.11.2; python_version >= '3.5' -pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.152 +pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.155.1 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.2 pypssl==2.2 pyrsistent==0.18.1; python_version >= '3.7' -pytesseract==0.3.8 +pytesseract==0.3.9 python-baseconv==1.2.2 python-dateutil==2.8.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.11 python-engineio==4.3.1; python_version >= '3.6' python-magic==0.4.25 python-pptx==0.6.21 -python-socketio[client]==5.5.1; python_version >= '3.6' +python-socketio[client]==5.5.2; python_version >= '3.6' python-utils==3.1.0; python_version >= '3.7' pytz-deprecation-shim==0.1.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pytz==2019.3 @@ -125,46 +126,48 @@ pyyaml==6.0; python_version >= '3.6' pyzbar==0.1.8 pyzipper==0.3.5; python_version >= '3.5' rdflib==6.1.1; python_version >= '3.7' -redis==4.1.2; python_version >= '3.6' -reportlab==3.6.6 +redis==4.1.4; python_version >= '3.6' +reportlab==3.6.8 requests-cache==0.6.4; python_version >= '3.6' requests-file==1.5.1 -requests[security]==2.27.1 -rich==11.1.0; python_full_version >= '3.6.2' and python_full_version < '4.0.0' +requests==2.27.1 +rich==11.2.0; python_version < '4.0' and python_full_version >= '3.6.2' rtfde==0.0.2 secretstorage==3.3.1; sys_platform == 'linux' -setuptools==60.7.1; python_version >= '3.7' -shodan==1.26.1 +setuptools==60.9.3; python_version >= '3.7' +shodan==1.27.0 sigmatools==0.19.1 +simplejson==3.17.6; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' socialscan==1.4.2 socketio-client==0.5.7.4 soupsieve==2.3.1; python_version >= '3.6' sparqlwrapper==1.8.5 -stix2==3.0.1 stix2-patterns==1.3.2 +stix2==3.0.1 tabulate==0.8.9 -tau-clients==0.1.9 +tau-clients==0.2.1 taxii2-client==2.3.0 -tldextract==3.1.2; python_version >= '3.6' +tldextract==3.2.0; python_version >= '3.7' tornado==6.1; python_version >= '3.5' -tqdm==4.62.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -typing-extensions==4.0.1; python_version < '3.8' +tqdm==4.63.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +typing-extensions==4.1.1; python_version < '3.8' tzdata==2021.5; python_version >= '3.6' tzlocal==4.1; python_version >= '3.6' unicodecsv==0.14.1 url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.8; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_full_version < '4.0.0' +urllib3==1.26.8; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' validators==0.14.0 vt-graph-api==1.1.3 vt-py==0.13.1 -vulners==2.0.0 +vulners==2.0.2 wand==0.6.7 -websocket-client==1.2.3; python_version >= '3.6' +websocket-client==1.3.1; python_version >= '3.6' wrapt==1.13.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' xlrd==2.0.1 -xlsxwriter==3.0.2; python_version >= '3.4' +xlsxwriter==3.0.3; python_version >= '3.4' yara-python==3.8.1 yarl==1.7.2; python_version >= '3.6' zipp==3.7.0; python_version >= '3.7' + From 79de89657ca57138b8ce3c77cd548668985e482c Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Fri, 4 Mar 2022 10:07:53 +0100 Subject: [PATCH 411/476] fix: [wiki] Change User-Agent to avoid 403 error --- misp_modules/modules/expansion/wiki.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/wiki.py b/misp_modules/modules/expansion/wiki.py index 90dd547..110e8f8 100755 --- a/misp_modules/modules/expansion/wiki.py +++ b/misp_modules/modules/expansion/wiki.py @@ -17,7 +17,7 @@ def handler(q=False): misperrors['error'] = 'Query text missing' return misperrors - sparql = SPARQLWrapper(wiki_api_url) + sparql = SPARQLWrapper(wiki_api_url, agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36') query_string = \ "SELECT ?item \n" \ "WHERE { \n" \ @@ -26,7 +26,6 @@ def handler(q=False): sparql.setQuery(query_string) sparql.setReturnFormat(JSON) results = sparql.query().convert() - summary = '' try: result = results["results"]["bindings"] summary = result[0]["item"]["value"] if result else 'No additional data found on Wikidata' From 0295268c43033ef921cb0085bb1acf73badde415 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 5 Mar 2022 15:12:25 +0100 Subject: [PATCH 412/476] chg: [requirements] dnspython3 is required --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 4a22e45..d0294e9 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -42,6 +42,7 @@ decorator==5.1.1; python_version >= '3.5' deprecated==1.2.13; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.4 dnspython==2.2.0 +dnspython3 domaintools-api==0.6.1 easygui==0.98.2 ebcdic==1.1.1 From db902275b314b8d3c7cf1be9a22407cee7cbf744 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 5 Mar 2022 15:24:29 +0100 Subject: [PATCH 413/476] chg: [joe] skip not existing system in behavior --- misp_modules/lib/joe_parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misp_modules/lib/joe_parser.py b/misp_modules/lib/joe_parser.py index 22a4918..8b400fe 100644 --- a/misp_modules/lib/joe_parser.py +++ b/misp_modules/lib/joe_parser.py @@ -167,6 +167,8 @@ class JoeParser(): self.misp_event.add_attribute(**attribute) def parse_system_behavior(self): + if not 'system' in self.data['behavior']: + return system = self.data['behavior']['system'] if system.get('processes'): process_activities = {'fileactivities': self.parse_fileactivities, From cba06ab3722fdb03658bbaca1b9765c68568a2e1 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 7 Mar 2022 17:53:43 +0100 Subject: [PATCH 414/476] fix: [joe parser] Some clean-up on the Joe parser --- misp_modules/lib/__init__.py | 1 + misp_modules/lib/joe_mapping.py | 114 +++++++++ misp_modules/lib/joe_parser.py | 405 +++++++++++++++++++++----------- 3 files changed, 386 insertions(+), 134 deletions(-) create mode 100644 misp_modules/lib/joe_mapping.py diff --git a/misp_modules/lib/__init__.py b/misp_modules/lib/__init__.py index 2939e75..dffa255 100644 --- a/misp_modules/lib/__init__.py +++ b/misp_modules/lib/__init__.py @@ -1,3 +1,4 @@ +import joe_mapping from .vt_graph_parser import * # noqa all = ['joe_parser', 'lastline_api', 'cof2misp', 'qintel_helper'] diff --git a/misp_modules/lib/joe_mapping.py b/misp_modules/lib/joe_mapping.py new file mode 100644 index 0000000..eda961e --- /dev/null +++ b/misp_modules/lib/joe_mapping.py @@ -0,0 +1,114 @@ +arch_type_mapping = { + 'ANDROID': 'parse_apk', + 'LINUX': 'parse_elf', + 'WINDOWS': 'parse_pe' +} +domain_object_mapping = { + '@ip': {'type': 'ip-dst', 'object_relation': 'ip'}, + '@name': {'type': 'domain', 'object_relation': 'domain'} +} +dropped_file_mapping = { + '@entropy': {'type': 'float', 'object_relation': 'entropy'}, + '@file': {'type': 'filename', 'object_relation': 'filename'}, + '@size': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + '@type': {'type': 'mime-type', 'object_relation': 'mimetype'} +} +dropped_hash_mapping = { + 'MD5': 'md5', + 'SHA': 'sha1', + 'SHA-256': 'sha256', + 'SHA-512': 'sha512' +} +elf_object_mapping = { + 'epaddr': 'entrypoint-address', + 'machine': 'arch', + 'osabi': 'os_abi' +} +elf_section_flags_mapping = { + 'A': 'ALLOC', + 'I': 'INFO_LINK', + 'M': 'MERGE', + 'S': 'STRINGS', + 'T': 'TLS', + 'W': 'WRITE', + 'X': 'EXECINSTR' +} +file_object_fields = ( + 'filename', + 'md5', + 'sha1', + 'sha256', + 'sha512', + 'ssdeep' +) +file_object_mapping = { + 'entropy': {'type': 'float', 'object_relation': 'entropy'}, + 'filesize': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + 'filetype': {'type': 'mime-type', 'object_relation': 'mimetype'} +} +file_references_mapping = { + 'fileCreated': 'creates', + 'fileDeleted': 'deletes', + 'fileMoved': 'moves', + 'fileRead': 'reads', + 'fileWritten': 'writes' +} +network_behavior_fields = ('srcip', 'dstip', 'srcport', 'dstport') +network_connection_object_mapping = { + 'srcip': {'type': 'ip-src', 'object_relation': 'ip-src'}, + 'dstip': {'type': 'ip-dst', 'object_relation': 'ip-dst'}, + 'srcport': {'type': 'port', 'object_relation': 'src-port'}, + 'dstport': {'type': 'port', 'object_relation': 'dst-port'} +} +pe_object_fields = { + 'entrypoint': {'type': 'text', 'object_relation': 'entrypoint-address'}, + 'imphash': {'type': 'imphash', 'object_relation': 'imphash'} +} +pe_object_mapping = { + 'CompanyName': 'company-name', + 'FileDescription': 'file-description', + 'FileVersion': 'file-version', + 'InternalName': 'internal-filename', + 'LegalCopyright': 'legal-copyright', + 'OriginalFilename': 'original-filename', + 'ProductName': 'product-filename', + 'ProductVersion': 'product-version', + 'Translation': 'lang-id' +} +pe_section_object_mapping = { + 'characteristics': {'type': 'text', 'object_relation': 'characteristic'}, + 'entropy': {'type': 'float', 'object_relation': 'entropy'}, + 'name': {'type': 'text', 'object_relation': 'name'}, + 'rawaddr': {'type': 'hex', 'object_relation': 'offset'}, + 'rawsize': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + 'virtaddr': {'type': 'hex', 'object_relation': 'virtual_address'}, + 'virtsize': {'type': 'size-in-bytes', 'object_relation': 'virtual_size'} +} +process_object_fields = { + 'cmdline': 'command-line', + 'name': 'name', + 'parentpid': 'parent-pid', + 'pid': 'pid', + 'path': 'current-directory' +} +protocols = { + 'tcp': 4, + 'udp': 4, + 'icmp': 3, + 'http': 7, + 'https': 7, + 'ftp': 7 +} +registry_references_mapping = { + 'keyValueCreated': 'creates', + 'keyValueModified': 'modifies' +} +regkey_object_mapping = { + 'name': {'type': 'text', 'object_relation': 'name'}, + 'newdata': {'type': 'text', 'object_relation': 'data'}, + 'path': {'type': 'regkey', 'object_relation': 'key'} +} +signerinfo_object_mapping = { + 'sigissuer': {'type': 'text', 'object_relation': 'issuer'}, + 'version': {'type': 'text', 'object_relation': 'version'} +} diff --git a/misp_modules/lib/joe_parser.py b/misp_modules/lib/joe_parser.py index 8b400fe..8ae57a9 100644 --- a/misp_modules/lib/joe_parser.py +++ b/misp_modules/lib/joe_parser.py @@ -1,53 +1,15 @@ # -*- coding: utf-8 -*- +import json from collections import defaultdict from datetime import datetime from pymisp import MISPAttribute, MISPEvent, MISPObject -import json - - -arch_type_mapping = {'ANDROID': 'parse_apk', 'LINUX': 'parse_elf', 'WINDOWS': 'parse_pe'} -domain_object_mapping = {'@ip': ('ip-dst', 'ip'), '@name': ('domain', 'domain')} -dropped_file_mapping = {'@entropy': ('float', 'entropy'), - '@file': ('filename', 'filename'), - '@size': ('size-in-bytes', 'size-in-bytes'), - '@type': ('mime-type', 'mimetype')} -dropped_hash_mapping = {'MD5': 'md5', 'SHA': 'sha1', 'SHA-256': 'sha256', 'SHA-512': 'sha512'} -elf_object_mapping = {'epaddr': 'entrypoint-address', 'machine': 'arch', 'osabi': 'os_abi'} -elf_section_flags_mapping = {'A': 'ALLOC', 'I': 'INFO_LINK', 'M': 'MERGE', - 'S': 'STRINGS', 'T': 'TLS', 'W': 'WRITE', - 'X': 'EXECINSTR'} -file_object_fields = ['filename', 'md5', 'sha1', 'sha256', 'sha512', 'ssdeep'] -file_object_mapping = {'entropy': ('float', 'entropy'), - 'filesize': ('size-in-bytes', 'size-in-bytes'), - 'filetype': ('mime-type', 'mimetype')} -file_references_mapping = {'fileCreated': 'creates', 'fileDeleted': 'deletes', - 'fileMoved': 'moves', 'fileRead': 'reads', 'fileWritten': 'writes'} -network_behavior_fields = ('srcip', 'dstip', 'srcport', 'dstport') -network_connection_object_mapping = {'srcip': ('ip-src', 'ip-src'), 'dstip': ('ip-dst', 'ip-dst'), - 'srcport': ('port', 'src-port'), 'dstport': ('port', 'dst-port')} -pe_object_fields = {'entrypoint': ('text', 'entrypoint-address'), - 'imphash': ('imphash', 'imphash')} -pe_object_mapping = {'CompanyName': 'company-name', 'FileDescription': 'file-description', - 'FileVersion': 'file-version', 'InternalName': 'internal-filename', - 'LegalCopyright': 'legal-copyright', 'OriginalFilename': 'original-filename', - 'ProductName': 'product-filename', 'ProductVersion': 'product-version', - 'Translation': 'lang-id'} -pe_section_object_mapping = {'characteristics': ('text', 'characteristic'), - 'entropy': ('float', 'entropy'), - 'name': ('text', 'name'), 'rawaddr': ('hex', 'offset'), - 'rawsize': ('size-in-bytes', 'size-in-bytes'), - 'virtaddr': ('hex', 'virtual_address'), - 'virtsize': ('size-in-bytes', 'virtual_size')} -process_object_fields = {'cmdline': 'command-line', 'name': 'name', - 'parentpid': 'parent-pid', 'pid': 'pid', - 'path': 'current-directory'} -protocols = {'tcp': 4, 'udp': 4, 'icmp': 3, - 'http': 7, 'https': 7, 'ftp': 7} -registry_references_mapping = {'keyValueCreated': 'creates', 'keyValueModified': 'modifies'} -regkey_object_mapping = {'name': ('text', 'name'), 'newdata': ('text', 'data'), - 'path': ('regkey', 'key')} -signerinfo_object_mapping = {'sigissuer': ('text', 'issuer'), - 'version': ('text', 'version')} +from joe_mapping import (arch_type_mapping, domain_object_mapping, + dropped_file_mapping, dropped_hash_mapping, elf_object_mapping, + elf_section_flags_mapping, file_object_fields, file_object_mapping, + file_references_mapping, network_behavior_fields, + network_connection_object_mapping, pe_object_fields, pe_object_mapping, + pe_section_object_mapping, process_object_fields, protocols, + registry_references_mapping, regkey_object_mapping, signerinfo_object_mapping) class JoeParser(): @@ -57,7 +19,7 @@ class JoeParser(): self.attributes = defaultdict(lambda: defaultdict(set)) self.process_references = {} - self.import_pe = config["import_pe"] + self.import_executable = config["import_executable"] self.create_mitre_attack = config["mitre_attack"] def parse_data(self, data): @@ -101,26 +63,46 @@ class JoeParser(): for droppedfile in droppedinfo['hash']: file_object = MISPObject('file') for key, mapping in dropped_file_mapping.items(): - attribute_type, object_relation = mapping - file_object.add_attribute(object_relation, **{'type': attribute_type, 'value': droppedfile[key], 'to_ids': False}) + if droppedfile.get(key) is not None: + attribute = {'value': droppedfile[key], 'to_ids': False} + attribute.update(mapping) + file_object.add_attribute(**attribute) if droppedfile['@malicious'] == 'true': - file_object.add_attribute('state', **{'type': 'text', 'value': 'Malicious', 'to_ids': False}) + file_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'state', + 'value': 'Malicious', + 'to_ids': False + } + ) for h in droppedfile['value']: hash_type = dropped_hash_mapping[h['@algo']] - file_object.add_attribute(hash_type, **{'type': hash_type, 'value': h['$'], 'to_ids': False}) - self.misp_event.add_object(**file_object) - self.references[self.process_references[(int(droppedfile['@targetid']), droppedfile['@process'])]].append({ - 'referenced_uuid': file_object.uuid, - 'relationship_type': 'drops' - }) + file_object.add_attribute( + **{ + 'type': hash_type, + 'object_relation': hash_type, + 'value': h['$'], + 'to_ids': False + } + ) + self.misp_event.add_object(file_object) + reference_key = (int(droppedfile['@targetid']), droppedfile['@process']) + if reference_key in self.process_references: + self.references[self.process_references[reference_key]].append( + { + 'referenced_uuid': file_object.uuid, + 'relationship_type': 'drops' + } + ) def parse_mitre_attack(self): - mitreattack = self.data['mitreattack'] + mitreattack = self.data.get('mitreattack', {}) if mitreattack: for tactic in mitreattack['tactic']: if tactic.get('technique'): for technique in tactic['technique']: - self.misp_event.add_tag('misp-galaxy:mitre-attack-pattern="{} - {}"'.format(technique['name'], technique['id'])) + self.misp_event.add_tag(f'misp-galaxy:mitre-attack-pattern="{technique["name"]} - {technique["id"]}"') def parse_network_behavior(self): network = self.data['behavior']['network'] @@ -134,37 +116,65 @@ class JoeParser(): attributes = self.prefetch_attributes_data(connection) if len(data.keys()) == len(set(protocols[protocol] for protocol in data.keys())): network_connection_object = MISPObject('network-connection') - for object_relation, attribute in attributes.items(): - network_connection_object.add_attribute(object_relation, **attribute) - network_connection_object.add_attribute('first-packet-seen', - **{'type': 'datetime', - 'value': min(tuple(min(timestamp) for timestamp in data.values())), - 'to_ids': False}) + for attribute in attributes: + network_connection_object.add_attribute(**attribute) + network_connection_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'first-packet-seen', + 'value': min(tuple(min(timestamp) for timestamp in data.values())), + 'to_ids': False + } + ) for protocol in data.keys(): - network_connection_object.add_attribute('layer{}-protocol'.format(protocols[protocol]), - **{'type': 'text', 'value': protocol, 'to_ids': False}) - self.misp_event.add_object(**network_connection_object) + network_connection_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': f'layer{protocols[protocol]}-protocol', + 'value': protocol, + 'to_ids': False + } + ) + self.misp_event.add_object(network_connection_object) self.references[self.analysisinfo_uuid].append(dict(referenced_uuid=network_connection_object.uuid, relationship_type='initiates')) else: for protocol, timestamps in data.items(): network_connection_object = MISPObject('network-connection') - for object_relation, attribute in attributes.items(): - network_connection_object.add_attribute(object_relation, **attribute) - network_connection_object.add_attribute('first-packet-seen', **{'type': 'datetime', 'value': min(timestamps), 'to_ids': False}) - network_connection_object.add_attribute('layer{}-protocol'.format(protocols[protocol]), **{'type': 'text', 'value': protocol, 'to_ids': False}) - self.misp_event.add_object(**network_connection_object) + for attribute in attributes: + network_connection_object.add_attribute(**attribute) + network_connection_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'first-packet-seen', + 'value': min(timestamps), + 'to_ids': False + } + ) + network_connection_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': f'layer{protocols[protocol]}-protocol', + 'value': protocol, + 'to_ids': False + } + ) + self.misp_event.add_object(network_connection_object) self.references[self.analysisinfo_uuid].append(dict(referenced_uuid=network_connection_object.uuid, relationship_type='initiates')) def parse_screenshot(self): - screenshotdata = self.data['behavior']['screenshotdata'] - if screenshotdata: - screenshotdata = screenshotdata['interesting']['$'] - attribute = {'type': 'attachment', 'value': 'screenshot.jpg', - 'data': screenshotdata, 'disable_correlation': True, - 'to_ids': False} - self.misp_event.add_attribute(**attribute) + if self.data['behavior'].get('screenshotdata', {}).get('interesting') is not None: + screenshotdata = self.data['behavior']['screenshotdata']['interesting']['$'] + self.misp_event.add_attribute( + **{ + 'type': 'attachment', + 'value': 'screenshot.jpg', + 'data': screenshotdata, + 'disable_correlation': True, + 'to_ids': False + } + ) def parse_system_behavior(self): if not 'system' in self.data['behavior']: @@ -177,10 +187,24 @@ class JoeParser(): general = process['general'] process_object = MISPObject('process') for feature, relation in process_object_fields.items(): - process_object.add_attribute(relation, **{'type': 'text', 'value': general[feature], 'to_ids': False}) - start_time = datetime.strptime('{} {}'.format(general['date'], general['time']), '%d/%m/%Y %H:%M:%S') - process_object.add_attribute('start-time', **{'type': 'datetime', 'value': start_time, 'to_ids': False}) - self.misp_event.add_object(**process_object) + process_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': relation, + 'value': general[feature], + 'to_ids': False + } + ) + start_time = datetime.strptime(f"{general['date']} {general['time']}", '%d/%m/%Y %H:%M:%S') + process_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'start-time', + 'value': start_time, + 'to_ids': False + } + ) + self.misp_event.add_object(process_object) for field, to_call in process_activities.items(): if process.get(field): to_call(process_object.uuid, process[field]) @@ -213,9 +237,15 @@ class JoeParser(): url_object = MISPObject("url") self.analysisinfo_uuid = url_object.uuid - - url_object.add_attribute("url", generalinfo["target"]["url"], to_ids=False) - self.misp_event.add_object(**url_object) + url_object.add_attribute( + **{ + 'type': 'url', + 'object_relation': 'url', + 'value': generalinfo["target"]["url"], + 'to_ids': False + } + ) + self.misp_event.add_object(url_object) def parse_fileinfo(self): fileinfo = self.data['fileinfo'] @@ -224,20 +254,29 @@ class JoeParser(): self.analysisinfo_uuid = file_object.uuid for field in file_object_fields: - file_object.add_attribute(field, **{'type': field, 'value': fileinfo[field], 'to_ids': False}) + file_object.add_attribute( + **{ + 'type': field, + 'object_relation': field, + 'value': fileinfo[field], + 'to_ids': False + } + ) for field, mapping in file_object_mapping.items(): - attribute_type, object_relation = mapping - file_object.add_attribute(object_relation, **{'type': attribute_type, 'value': fileinfo[field], 'to_ids': False}) + if fileinfo.get(field) is not None: + attribute = {'value': fileinfo[field], 'to_ids': False} + attribute.update(mapping) + file_object.add_attribute(**attribute) arch = self.data['generalinfo']['arch'] - if arch in arch_type_mapping: + if self.import_executable and arch in arch_type_mapping: to_call = arch_type_mapping[arch] getattr(self, to_call)(fileinfo, file_object) else: - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) def parse_apk(self, fileinfo, file_object): apkinfo = fileinfo['apk'] - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) permission_lists = defaultdict(list) for permission in apkinfo['requiredpermissions']['permission']: permission = permission['@name'].split('.') @@ -245,16 +284,30 @@ class JoeParser(): attribute_type = 'text' for comment, permissions in permission_lists.items(): permission_object = MISPObject('android-permission') - permission_object.add_attribute('comment', **dict(type=attribute_type, value=comment, to_ids=False)) + permission_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'comment', + 'value': comment, + 'to_ids': False + } + ) for permission in permissions: - permission_object.add_attribute('permission', **dict(type=attribute_type, value=permission, to_ids=False)) - self.misp_event.add_object(**permission_object) + permission_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'permission', + 'value': permission, + 'to_ids': False + } + ) + self.misp_event.add_object(permission_object) self.references[file_object.uuid].append(dict(referenced_uuid=permission_object.uuid, relationship_type='grants')) def parse_elf(self, fileinfo, file_object): elfinfo = fileinfo['elf'] - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) attribute_type = 'text' relationship = 'includes' size = 'size-in-bytes' @@ -266,47 +319,96 @@ class JoeParser(): if elf.get('type'): # Haven't seen anything but EXEC yet in the files I tested attribute_value = "EXECUTABLE" if elf['type'] == "EXEC (Executable file)" else elf['type'] - elf_object.add_attribute('type', **dict(type=attribute_type, value=attribute_value, to_ids=False)) + elf_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'type', + 'value': attribute_value, + 'to_ids': False + } + ) for feature, relation in elf_object_mapping.items(): if elf.get(feature): - elf_object.add_attribute(relation, **dict(type=attribute_type, value=elf[feature], to_ids=False)) + elf_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': relation, + 'value': elf[feature], + 'to_ids': False + } + ) sections_number = len(fileinfo['sections']['section']) - elf_object.add_attribute('number-sections', **{'type': 'counter', 'value': sections_number, 'to_ids': False}) - self.misp_event.add_object(**elf_object) + elf_object.add_attribute( + **{ + 'type': 'counter', + 'object_relation': 'number-sections', + 'value': sections_number, + 'to_ids': False + } + ) + self.misp_event.add_object(elf_object) for section in fileinfo['sections']['section']: section_object = MISPObject('elf-section') for feature in ('name', 'type'): if section.get(feature): - section_object.add_attribute(feature, **dict(type=attribute_type, value=section[feature], to_ids=False)) + section_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': feature, + 'value': section[feature], + 'to_ids': False + } + ) if section.get('size'): - section_object.add_attribute(size, **dict(type=size, value=int(section['size'], 16), to_ids=False)) + section_object.add_attribute( + **{ + 'type': size, + 'object_relation': size, + 'value': int(section['size'], 16), + 'to_ids': False + } + ) for flag in section['flagsdesc']: try: attribute_value = elf_section_flags_mapping[flag] - section_object.add_attribute('flag', **dict(type=attribute_type, value=attribute_value, to_ids=False)) + section_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'flag', + 'value': attribute_value, + 'to_ids': False + } + ) except KeyError: print(f'Unknown elf section flag: {flag}') continue - self.misp_event.add_object(**section_object) + self.misp_event.add_object(section_object) self.references[elf_object.uuid].append(dict(referenced_uuid=section_object.uuid, relationship_type=relationship)) def parse_pe(self, fileinfo, file_object): - if not self.import_pe: - return try: peinfo = fileinfo['pe'] except KeyError: - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) return pe_object = MISPObject('pe') relationship = 'includes' file_object.add_reference(pe_object.uuid, relationship) - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) for field, mapping in pe_object_fields.items(): - attribute_type, object_relation = mapping - pe_object.add_attribute(object_relation, **{'type': attribute_type, 'value': peinfo[field], 'to_ids': False}) - pe_object.add_attribute('compilation-timestamp', **{'type': 'datetime', 'value': int(peinfo['timestamp'].split()[0], 16), 'to_ids': False}) + if peinfo.get(field) is not None: + attribute = {'value': peinfo[field], 'to_ids': False} + attribute.update(mapping) + pe_object.add_attribute(**attribute) + pe_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'compilation-timestamp', + 'value': int(peinfo['timestamp'].split()[0], 16), + 'to_ids': False + } + ) program_name = fileinfo['filename'] if peinfo['versions']: for feature in peinfo['versions']['version']: @@ -314,33 +416,57 @@ class JoeParser(): if name == 'InternalName': program_name = feature['value'] if name in pe_object_mapping: - pe_object.add_attribute(pe_object_mapping[name], **{'type': 'text', 'value': feature['value'], 'to_ids': False}) + pe_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': pe_object_mapping[name], + 'value': feature['value'], + 'to_ids': False + } + ) sections_number = len(peinfo['sections']['section']) - pe_object.add_attribute('number-sections', **{'type': 'counter', 'value': sections_number, 'to_ids': False}) + pe_object.add_attribute( + **{ + 'type': 'counter', + 'object_relation': 'number-sections', + 'value': sections_number, + 'to_ids': False + } + ) signatureinfo = peinfo['signature'] if signatureinfo['signed']: signerinfo_object = MISPObject('authenticode-signerinfo') pe_object.add_reference(signerinfo_object.uuid, 'signed-by') - self.misp_event.add_object(**pe_object) - signerinfo_object.add_attribute('program-name', **{'type': 'text', 'value': program_name, 'to_ids': False}) + self.misp_event.add_object(pe_object) + signerinfo_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'program-name', + 'value': program_name, + 'to_ids': False + } + ) for feature, mapping in signerinfo_object_mapping.items(): - attribute_type, object_relation = mapping - signerinfo_object.add_attribute(object_relation, **{'type': attribute_type, 'value': signatureinfo[feature], 'to_ids': False}) - self.misp_event.add_object(**signerinfo_object) + if signatureinfo.get(feature) is not None: + attribute = {'value': signatureinfo[feature], 'to_ids': False} + attribute.update(mapping) + signerinfo_object.add_attribute(**attribute) + self.misp_event.add_object(signerinfo_object) else: - self.misp_event.add_object(**pe_object) + self.misp_event.add_object(pe_object) for section in peinfo['sections']['section']: section_object = self.parse_pe_section(section) self.references[pe_object.uuid].append(dict(referenced_uuid=section_object.uuid, relationship_type=relationship)) - self.misp_event.add_object(**section_object) + self.misp_event.add_object(section_object) def parse_pe_section(self, section): section_object = MISPObject('pe-section') for feature, mapping in pe_section_object_mapping.items(): - if section.get(feature): - attribute_type, object_relation = mapping - section_object.add_attribute(object_relation, **{'type': attribute_type, 'value': section[feature], 'to_ids': False}) + if section.get(feature) is not None: + attribute = {'value': section[feature], 'to_ids': False} + attribute.update(mapping) + section_object.add_attribute(**attribute) return section_object def parse_network_interactions(self): @@ -350,10 +476,11 @@ class JoeParser(): if domain['@ip'] != 'unknown': domain_object = MISPObject('domain-ip') for key, mapping in domain_object_mapping.items(): - attribute_type, object_relation = mapping - domain_object.add_attribute(object_relation, - **{'type': attribute_type, 'value': domain[key], 'to_ids': False}) - self.misp_event.add_object(**domain_object) + if domain.get(key) is not None: + attribute = {'value': domain[key], 'to_ids': False} + attribute.update(mapping) + domain_object.add_attribute(**attribute) + self.misp_event.add_object(domain_object) reference = dict(referenced_uuid=domain_object.uuid, relationship_type='contacts') self.add_process_reference(domain['@targetid'], domain['@currentpath'], reference) else: @@ -396,10 +523,19 @@ class JoeParser(): for call in registryactivities[feature]['call']: registry_key = MISPObject('registry-key') for field, mapping in regkey_object_mapping.items(): - attribute_type, object_relation = mapping - registry_key.add_attribute(object_relation, **{'type': attribute_type, 'value': call[field], 'to_ids': False}) - registry_key.add_attribute('data-type', **{'type': 'text', 'value': 'REG_{}'.format(call['type'].upper()), 'to_ids': False}) - self.misp_event.add_object(**registry_key) + if call.get(field) is not None: + attribute = {'value': call[field], 'to_ids': False} + attribute.update(mapping) + registry_key.add_attribute(**attribute) + registry_key.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'data-type', + 'value': f"REG_{call['type'].upper()}", + 'to_ids': False + } + ) + self.misp_event.add_object(registry_key) self.references[process_uuid].append(dict(referenced_uuid=registry_key.uuid, relationship_type=relationship)) @@ -429,8 +565,9 @@ class JoeParser(): @staticmethod def prefetch_attributes_data(connection): - attributes = {} + attributes = [] for field, value in zip(network_behavior_fields, connection): - attribute_type, object_relation = network_connection_object_mapping[field] - attributes[object_relation] = {'type': attribute_type, 'value': value, 'to_ids': False} + attribute = {'value': value, 'to_ids': False} + attribute.update(network_connection_object_mapping[field]) + attributes.append(attribute) return attributes From c5b6d218bb9300ba1bfe349bb98b77b6de032966 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 7 Mar 2022 23:01:49 +0100 Subject: [PATCH 415/476] chg: [joesandbox_query] Changed the `import_pe` param to `import_executable` --- misp_modules/modules/expansion/joesandbox_query.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/joesandbox_query.py b/misp_modules/modules/expansion/joesandbox_query.py index b9c4987..f90d5db 100644 --- a/misp_modules/modules/expansion/joesandbox_query.py +++ b/misp_modules/modules/expansion/joesandbox_query.py @@ -11,7 +11,7 @@ inputSource = ['link'] moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'Query Joe Sandbox API with a report URL to get the parsed data.', 'module-type': ['expansion']} -moduleconfig = ['apiurl', 'apikey', 'import_pe', 'import_mitre_attack'] +moduleconfig = ['apiurl', 'apikey', 'import_executable', 'import_mitre_attack'] def handler(q=False): @@ -21,7 +21,7 @@ def handler(q=False): apiurl = request['config'].get('apiurl') or 'https://jbxcloud.joesecurity.org/api' apikey = request['config'].get('apikey') parser_config = { - "import_pe": request["config"].get('import_pe', "false") == "true", + "import_pe": request["config"].get('import_executable', "false") == "true", "mitre_attack": request["config"].get('import_mitre_attack', "false") == "true", } From 38047f27187b9ab219ca6c2563a306a74b36ca11 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 7 Mar 2022 23:04:37 +0100 Subject: [PATCH 416/476] chg: [joe_import] Changed the user configuration param `Import PE` into `Import Executable` --- misp_modules/modules/import_mod/joe_import.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/import_mod/joe_import.py b/misp_modules/modules/import_mod/joe_import.py index 0753167..ce56698 100644 --- a/misp_modules/modules/import_mod/joe_import.py +++ b/misp_modules/modules/import_mod/joe_import.py @@ -5,9 +5,9 @@ from joe_parser import JoeParser misperrors = {'error': 'Error'} userConfig = { - "Import PE": { + "Import Executable": { "type": "Boolean", - "message": "Import PE Information", + "message": "Import Executable Information (PE, elf or apk for instance)", }, "Mitre Att&ck": { "type": "Boolean", @@ -29,7 +29,7 @@ def handler(q=False): return False q = json.loads(q) config = { - "import_pe": bool(int(q["config"]["Import PE"])), + "import_executable": bool(int(q["config"]["Import Executable"])), "mitre_attack": bool(int(q["config"]["Mitre Att&ck"])), } From ac704c8c9943a2c288812dc6851204f9ee5bace6 Mon Sep 17 00:00:00 2001 From: Daniel Pascual Date: Wed, 16 Mar 2022 18:05:13 +0100 Subject: [PATCH 417/476] VirusTotal modules migration to API v3 --- misp_modules/modules/expansion/virustotal.py | 370 +++++++++--------- .../modules/expansion/virustotal_public.py | 363 ++++++++--------- 2 files changed, 368 insertions(+), 365 deletions(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index 2c82787..7f18b54 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -1,6 +1,6 @@ import json -import requests from urllib.parse import urlparse +import vt from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -9,20 +9,23 @@ mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sh 'format': 'misp_standard'} # possible module-types: 'expansion', 'hover' or both -moduleinfo = {'version': '4', 'author': 'Hannah Ward', - 'description': 'Get information from VirusTotal', +moduleinfo = {'version': '5', 'author': 'Hannah Ward', + 'description': 'Enrich observables with the VirusTotal v3 API', 'module-type': ['expansion']} # config fields that your code expects from the site admin moduleconfig = ["apikey", "event_limit", 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] -class VirusTotalParser(object): - def __init__(self, apikey, limit): - self.apikey = apikey - self.limit = limit - self.base_url = "https://www.virustotal.com/vtapi/v2/{}/report" +DEFAULT_RESULTS_LIMIT = 10 + + +class VirusTotalParser: + def __init__(self, client: vt.Client, limit: int) -> None: + self.client = client + self.limit = limit or DEFAULT_RESULTS_LIMIT self.misp_event = MISPEvent() + self.attribute = MISPAttribute() self.parsed_objects = {} self.input_types_mapping = {'ip-src': self.parse_ip, 'ip-dst': self.parse_ip, 'domain': self.parse_domain, 'hostname': self.parse_domain, @@ -30,196 +33,187 @@ class VirusTotalParser(object): 'sha256': self.parse_hash, 'url': self.parse_url} self.proxies = None - def query_api(self, attribute): - self.attribute = MISPAttribute() - self.attribute.from_dict(**attribute) - return self.input_types_mapping[self.attribute.type](self.attribute.value, recurse=True) + @staticmethod + def get_total_analysis(analysis: dict, known_distributors: dict = None) -> int: + if not analysis: + return 0 + count = sum([analysis['undetected'], analysis['suspicious'], analysis['harmless']]) + return count if known_distributors else count + analysis['malicious'] - def get_result(self): + def query_api(self, attribute: dict) -> None: + self.attribute.from_dict(**attribute) + self.input_types_mapping[self.attribute.type](self.attribute.value) + + def get_result(self) -> dict: event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} + def add_vt_report(self, report: vt.Object) -> str: + analysis = report.get('last_analysis_stats') + total = self.get_total_analysis(analysis, report.get('known_distributors')) + permalink = f'https://www.virustotal.com/gui/{report.type}/{report.id}' + + vt_object = MISPObject('virustotal-report') + vt_object.add_attribute('permalink', type='link', value=permalink) + detection_ratio = f"{analysis['malicious']}/{total}" if analysis else '-/-' + vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) + self.misp_event.add_object(**vt_object) + return vt_object.uuid + + def create_misp_object(self, report: vt.Object) -> MISPObject: + misp_object = None + vt_uuid = self.add_vt_report(report) + if report.type == 'file': + misp_object = MISPObject('file') + for hash_type in ('md5', 'sha1', 'sha256'): + misp_object.add_attribute(**{'type': hash_type, + 'object_relation': hash_type, + 'value': report.get(hash_type)}) + elif report.type == 'domain': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('domain', type='domain', value=report.id) + elif report.type == 'ip_address': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('ip', type='ip-dst', value=report.id) + elif report.type == 'url': + misp_object = MISPObject('url') + misp_object.add_attribute('url', type='url', value=report.url) + misp_object.add_reference(vt_uuid, 'analyzed-with') + return misp_object + ################################################################################ #### Main parsing functions #### # noqa ################################################################################ - def parse_domain(self, domain, recurse=False): - req = requests.get(self.base_url.format('domain'), params={'apikey': self.apikey, 'domain': domain}, proxies=self.proxies) - if req.status_code != 200: - return req.status_code - req = req.json() - hash_type = 'sha256' - whois = 'whois' - feature_types = {'communicating': 'communicates-with', - 'downloaded': 'downloaded-from', - 'referrer': 'referring'} - siblings = (self.parse_siblings(domain) for domain in req['domain_siblings']) - uuid = self.parse_resolutions(req['resolutions'], req['subdomains'] if 'subdomains' in req else None, siblings) - for feature_type, relationship in feature_types.items(): - for feature in ('undetected_{}_samples', 'detected_{}_samples'): - for sample in req.get(feature.format(feature_type), [])[:self.limit]: - status_code = self.parse_hash(sample[hash_type], False, uuid, relationship) - if status_code != 200: - return status_code - if req.get(whois): - whois_object = MISPObject(whois) - whois_object.add_attribute('text', type='text', value=req[whois]) + def parse_domain(self, domain: str) -> str: + domain_report = self.client.get_object(f'/domains/{domain}') + + # DOMAIN + domain_object = self.create_misp_object(domain_report) + + # WHOIS + if domain_report.whois: + whois_object = MISPObject('whois') + whois_object.add_attribute('text', type='text', value=domain_report.whois) self.misp_event.add_object(**whois_object) - return self.parse_related_urls(req, recurse, uuid) - def parse_hash(self, sample, recurse=False, uuid=None, relationship=None): - req = requests.get(self.base_url.format('file'), params={'apikey': self.apikey, 'resource': sample}, proxies=self.proxies) - status_code = req.status_code - if req.status_code == 200: - req = req.json() - vt_uuid = self.parse_vt_object(req) - file_attributes = [] - for hash_type in ('md5', 'sha1', 'sha256'): - if req.get(hash_type): - file_attributes.append({'type': hash_type, 'object_relation': hash_type, - 'value': req[hash_type]}) - if file_attributes: - file_object = MISPObject('file') - for attribute in file_attributes: - file_object.add_attribute(**attribute) - file_object.add_reference(vt_uuid, 'analyzed-with') - if uuid and relationship: - file_object.add_reference(uuid, relationship) + # SIBLINGS AND SUBDOMAINS + for relationship_name, misp_name in [('siblings', 'sibling-of'), ('subdomains', 'subdomain')]: + rel_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for item in rel_iterator: + attr = MISPAttribute() + attr.from_dict(**dict(type='domain', value=item.id)) + self.misp_event.add_attribute(**attr) + domain_object.add_reference(attr.uuid, misp_name) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/domains/{domain_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + domain_object.add_attribute('ip', type='ip-dst', value=resolution.ip_address) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('downloaded_files', 'downloaded-from'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(domain_object.uuid, misp_name) self.misp_event.add_object(**file_object) - return status_code - def parse_ip(self, ip, recurse=False): - req = requests.get(self.base_url.format('ip-address'), params={'apikey': self.apikey, 'ip': ip}, proxies=self.proxies) - if req.status_code != 200: - return req.status_code - req = req.json() - if req.get('asn'): - asn_mapping = {'network': ('ip-src', 'subnet-announced'), - 'country': ('text', 'country')} - asn_object = MISPObject('asn') - asn_object.add_attribute('asn', type='AS', value=req['asn']) - for key, value in asn_mapping.items(): - if req.get(key): - attribute_type, relation = value - asn_object.add_attribute(relation, type=attribute_type, value=req[key]) - self.misp_event.add_object(**asn_object) - uuid = self.parse_resolutions(req['resolutions']) if req.get('resolutions') else None - return self.parse_related_urls(req, recurse, uuid) + # URLS + urls_iterator = self.client.iterator(f'/domains/{domain_report.id}/urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(domain_object.uuid, 'hosted-in') + self.misp_event.add_object(**url_object) - def parse_url(self, url, recurse=False, uuid=None): - req = requests.get(self.base_url.format('url'), params={'apikey': self.apikey, 'resource': url}, proxies=self.proxies) - status_code = req.status_code - if req.status_code == 200: - req = req.json() - vt_uuid = self.parse_vt_object(req) - if not recurse: - feature = 'url' - url_object = MISPObject(feature) - url_object.add_attribute(feature, type=feature, value=url) - url_object.add_reference(vt_uuid, 'analyzed-with') - if uuid: - url_object.add_reference(uuid, 'hosted-in') - self.misp_event.add_object(**url_object) - return status_code + self.misp_event.add_object(**domain_object) + return domain_object.uuid - ################################################################################ - #### Additional parsing functions #### # noqa - ################################################################################ + def parse_hash(self, file_hash: str) -> str: + file_report = self.client.get_object(f'files/{file_hash}') + file_object = self.create_misp_object(file_report) + self.misp_event.add_object(**file_object) + return file_object.uuid - def parse_related_urls(self, query_result, recurse, uuid=None): - if recurse: - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - status_code = self.parse_url(value, False, uuid) - if status_code != 200: - return status_code + def parse_ip(self, ip: str) -> str: + ip_report = self.client.get_object(f'/ip_addresses/{ip}') + + # IP + ip_object = self.create_misp_object(ip_report) + + # ASN + asn_object = MISPObject('asn') + asn_object.add_attribute('asn', type='AS', value=ip_report.asn) + asn_object.add_attribute('subnet-announced', type='ip-src', value=ip_report.network) + asn_object.add_attribute('country', type='text', value=ip_report.country) + self.misp_event.add_object(**asn_object) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + ip_object.add_attribute('domain', type='domain', value=resolution.host_name) + + # URLS + urls_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(ip_object.uuid, 'hosted-in') + self.misp_event.add_object(**url_object) + + self.misp_event.add_object(**ip_object) + return ip_object.uuid + + def parse_url(self, url: str) -> str: + url_id = vt.url_id(url) + url_report = self.client.get_object(f'/urls/{url_id}') + url_object = self.create_misp_object(url_report) + self.misp_event.add_object(**url_object) + return url_object.uuid + + +def get_proxy_settings(config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') + + if host: + if not port: + misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ + 'please also set the virustotal_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' else: - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - self.misp_event.add_attribute('url', value) - return 200 + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' - def parse_resolutions(self, resolutions, subdomains=None, uuids=None): - domain_ip_object = MISPObject('domain-ip') - if self.attribute.type in ('domain', 'hostname'): - domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) - attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') - else: - domain_ip_object.add_attribute('ip', type='ip-dst', value=self.attribute.value) - attribute_type, relation, key = ('domain', 'domain', 'hostname') - for resolution in resolutions: - domain_ip_object.add_attribute(relation, type=attribute_type, value=resolution[key]) - if subdomains: - for subdomain in subdomains: - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=subdomain)) - self.misp_event.add_attribute(**attribute) - domain_ip_object.add_reference(attribute.uuid, 'subdomain') - if uuids: - for uuid in uuids: - domain_ip_object.add_reference(uuid, 'sibling-of') - self.misp_event.add_object(**domain_ip_object) - return domain_ip_object.uuid - - def parse_siblings(self, domain): - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=domain)) - self.misp_event.add_attribute(**attribute) - return attribute.uuid - - def parse_vt_object(self, query_result): - if query_result['response_code'] == 1: - vt_object = MISPObject('virustotal-report') - vt_object.add_attribute('permalink', type='link', value=query_result['permalink']) - detection_ratio = '{}/{}'.format(query_result['positives'], query_result['total']) - vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) - self.misp_event.add_object(**vt_object) - return vt_object.uuid - - def set_proxy_settings(self, config: dict) -> dict: - """Returns proxy settings in the requests format. - If no proxy settings are set, return None.""" - proxies = None - host = config.get('proxy_host') - port = config.get('proxy_port') - username = config.get('proxy_username') - password = config.get('proxy_password') - - if host: - if not port: - misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ - 'please also set the virustotal_proxy_port.' + if username: + if not password: + misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ + 'please also set the virustotal_proxy_password.' raise KeyError - parsed = urlparse(host) - if 'http' in parsed.scheme: - scheme = 'http' - else: - scheme = parsed.scheme - netloc = parsed.netloc - host = f'{netloc}:{port}' + auth = f'{username}:{password}' + host = auth + '@' + host - if username: - if not password: - misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ - 'please also set the virustotal_proxy_password.' - raise KeyError - auth = f'{username}:{password}' - host = auth + '@' + host - - proxies = { - 'http': f'{scheme}://{host}', - 'https': f'{scheme}://{host}' - } - self.proxies = proxies - return True + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + return proxies -def parse_error(status_code): +def parse_error(status_code: int) -> str: status_mapping = {204: 'VirusTotal request rate limit exceeded.', 400: 'Incorrect request, please check the arguments.', 403: 'You don\'t have enough privileges to make the request.'} @@ -233,7 +227,7 @@ def handler(q=False): return False request = json.loads(q) if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = "A VirusTotal api key is required for this module." + misperrors['error'] = 'A VirusTotal api key is required for this module.' return misperrors if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} @@ -241,15 +235,21 @@ def handler(q=False): return {'error': 'Unsupported attribute type.'} event_limit = request['config'].get('event_limit') - if not isinstance(event_limit, int): - event_limit = 5 - parser = VirusTotalParser(request['config']['apikey'], event_limit) - parser.set_proxy_settings(request.get('config')) attribute = request['attribute'] - status = parser.query_api(attribute) - if status != 200: - misperrors['error'] = parse_error(status) + proxy_settings = get_proxy_settings(request.get('config')) + + try: + client = vt.Client(request['config']['apikey'], + headers={ + 'x-tool': 'MISPModuleVirusTotalExpansion', + }, + proxy=proxy_settings['http'] if proxy_settings else None) + parser = VirusTotalParser(client, int(event_limit) if event_limit else None) + parser.query_api(attribute) + except vt.APIError as ex: + misperrors['error'] = ex.message return misperrors + return parser.get_result() @@ -259,4 +259,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo + return moduleinfo \ No newline at end of file diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index c10f4d2..f72bda4 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -1,6 +1,6 @@ import json import logging -import requests +import vt from . import check_input_attribute, standard_error_message from urllib.parse import urlparse from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -8,8 +8,8 @@ from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sha1", "sha256", "url"], 'format': 'misp_standard'} -moduleinfo = {'version': '1', 'author': 'Christian Studer', - 'description': 'Get information from VirusTotal public API v2.', +moduleinfo = {'version': '2', 'author': 'Christian Studer', + 'description': 'Enrich observables with the VirusTotal v3 public API', 'module-type': ['expansion', 'hover']} moduleconfig = ['apikey', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] @@ -18,191 +18,188 @@ LOGGER = logging.getLogger('virus_total_public') LOGGER.setLevel(logging.INFO) -class VirusTotalParser(): - def __init__(self): - super(VirusTotalParser, self).__init__() +DEFAULT_RESULTS_LIMIT = 10 + + +class VirusTotalParser: + def __init__(self, client: vt.Client, limit: int) -> None: + self.client = client + self.limit = limit or DEFAULT_RESULTS_LIMIT self.misp_event = MISPEvent() + self.attribute = MISPAttribute() + self.parsed_objects = {} + self.input_types_mapping = {'ip-src': self.parse_ip, 'ip-dst': self.parse_ip, + 'domain': self.parse_domain, 'hostname': self.parse_domain, + 'md5': self.parse_hash, 'sha1': self.parse_hash, + 'sha256': self.parse_hash, 'url': self.parse_url} self.proxies = None - def declare_variables(self, apikey, attribute): - self.attribute = MISPAttribute() - self.attribute.from_dict(**attribute) - self.apikey = apikey + @staticmethod + def get_total_analysis(analysis: dict, known_distributors: dict = None) -> int: + if not analysis: + return 0 + count = sum([analysis['undetected'], analysis['suspicious'], analysis['harmless']]) + return count if known_distributors else count + analysis['malicious'] - def get_result(self): + def query_api(self, attribute: dict) -> None: + self.attribute.from_dict(**attribute) + self.input_types_mapping[self.attribute.type](self.attribute.value) + + def get_result(self) -> dict: event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} - def parse_urls(self, query_result): - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - self.misp_event.add_attribute('url', value) + def add_vt_report(self, report: vt.Object) -> str: + analysis = report.get('last_analysis_stats') + total = self.get_total_analysis(analysis, report.get('known_distributors')) + permalink = f'https://www.virustotal.com/gui/{report.type}/{report.id}' - def parse_resolutions(self, resolutions, subdomains=None, uuids=None): - domain_ip_object = MISPObject('domain-ip') - if self.attribute.type in ('domain', 'hostname'): - domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) - attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') - else: - domain_ip_object.add_attribute('ip', type='ip-dst', value=self.attribute.value) - attribute_type, relation, key = ('domain', 'domain', 'hostname') - for resolution in resolutions: - domain_ip_object.add_attribute(relation, type=attribute_type, value=resolution[key]) - if subdomains: - for subdomain in subdomains: - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=subdomain)) - self.misp_event.add_attribute(**attribute) - domain_ip_object.add_reference(attribute.uuid, 'subdomain') - if uuids: - for uuid in uuids: - domain_ip_object.add_reference(uuid, 'sibling-of') - self.misp_event.add_object(**domain_ip_object) + vt_object = MISPObject('virustotal-report') + vt_object.add_attribute('permalink', type='link', value=permalink) + detection_ratio = f"{analysis['malicious']}/{total}" if analysis else '-/-' + vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) + self.misp_event.add_object(**vt_object) + return vt_object.uuid - def parse_vt_object(self, query_result): - if query_result['response_code'] == 1: - vt_object = MISPObject('virustotal-report') - vt_object.add_attribute('permalink', type='link', value=query_result['permalink']) - detection_ratio = '{}/{}'.format(query_result['positives'], query_result['total']) - vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio) - self.misp_event.add_object(**vt_object) + def create_misp_object(self, report: vt.Object) -> MISPObject: + misp_object = None + vt_uuid = self.add_vt_report(report) + if report.type == 'file': + misp_object = MISPObject('file') + for hash_type in ('md5', 'sha1', 'sha256'): + misp_object.add_attribute(**{'type': hash_type, + 'object_relation': hash_type, + 'value': report.get(hash_type)}) + elif report.type == 'domain': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('domain', type='domain', value=report.id) + elif report.type == 'ip_address': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('ip', type='ip-dst', value=report.id) + elif report.type == 'url': + misp_object = MISPObject('url') + misp_object.add_attribute('url', type='url', value=report.url) + misp_object.add_reference(vt_uuid, 'analyzed-with') + return misp_object - def get_query_result(self, query_type): - params = {query_type: self.attribute.value, 'apikey': self.apikey} - return requests.get(self.base_url, params=params, proxies=self.proxies) + ################################################################################ + #### Main parsing functions #### # noqa + ################################################################################ - def set_proxy_settings(self, config: dict) -> dict: - """Returns proxy settings in the requests format. - If no proxy settings are set, return None.""" - proxies = None - host = config.get('proxy_host') - port = config.get('proxy_port') - username = config.get('proxy_username') - password = config.get('proxy_password') + def parse_domain(self, domain: str) -> str: + domain_report = self.client.get_object(f'/domains/{domain}') - if host: - if not port: - misperrors['error'] = 'The virustotal_public_proxy_host config is set, ' \ - 'please also set the virustotal_public_proxy_port.' - raise KeyError - parsed = urlparse(host) - if 'http' in parsed.scheme: - scheme = 'http' - else: - scheme = parsed.scheme - netloc = parsed.netloc - host = f'{netloc}:{port}' + # DOMAIN + domain_object = self.create_misp_object(domain_report) - if username: - if not password: - misperrors['error'] = 'The virustotal_public_proxy_username config is set, ' \ - 'please also set the virustotal_public_proxy_password.' - raise KeyError - auth = f'{username}:{password}' - host = auth + '@' + host - - proxies = { - 'http': f'{scheme}://{host}', - 'https': f'{scheme}://{host}' - } - self.proxies = proxies - return True - - -class DomainQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(DomainQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/domain/report" - self.declare_variables(apikey, attribute) - - def parse_report(self, query_result): - hash_type = 'sha256' - whois = 'whois' - for feature_type in ('referrer', 'downloaded', 'communicating'): - for feature in ('undetected_{}_samples', 'detected_{}_samples'): - for sample in query_result.get(feature.format(feature_type), []): - self.misp_event.add_attribute(hash_type, sample[hash_type]) - if query_result.get(whois): - whois_object = MISPObject(whois) - whois_object.add_attribute('text', type='text', value=query_result[whois]) + # WHOIS + if domain_report.whois: + whois_object = MISPObject('whois') + whois_object.add_attribute('text', type='text', value=domain_report.whois) self.misp_event.add_object(**whois_object) - if 'domain_siblings' in query_result: - siblings = (self.parse_siblings(domain) for domain in query_result['domain_siblings']) - if 'subdomains' in query_result: - self.parse_resolutions(query_result['resolutions'], query_result['subdomains'], siblings) - self.parse_urls(query_result) - def parse_siblings(self, domain): - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=domain)) - self.misp_event.add_attribute(**attribute) - return attribute.uuid + # SIBLINGS AND SUBDOMAINS + for relationship_name, misp_name in [('siblings', 'sibling-of'), ('subdomains', 'subdomain')]: + rel_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for item in rel_iterator: + attr = MISPAttribute() + attr.from_dict(**dict(type='domain', value=item.id)) + self.misp_event.add_attribute(**attr) + domain_object.add_reference(attr.uuid, misp_name) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/domains/{domain_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + domain_object.add_attribute('ip', type='ip-dst', value=resolution.ip_address) + + # COMMUNICATING AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(domain_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + + self.misp_event.add_object(**domain_object) + return domain_object.uuid + + def parse_hash(self, file_hash: str) -> str: + file_report = self.client.get_object(f'files/{file_hash}') + file_object = self.create_misp_object(file_report) + self.misp_event.add_object(**file_object) + return file_object.uuid + + def parse_ip(self, ip: str) -> str: + ip_report = self.client.get_object(f'/ip_addresses/{ip}') + + # IP + ip_object = self.create_misp_object(ip_report) + + # ASN + asn_object = MISPObject('asn') + asn_object.add_attribute('asn', type='AS', value=ip_report.asn) + asn_object.add_attribute('subnet-announced', type='ip-src', value=ip_report.network) + asn_object.add_attribute('country', type='text', value=ip_report.country) + self.misp_event.add_object(**asn_object) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + ip_object.add_attribute('domain', type='domain', value=resolution.host_name) + + self.misp_event.add_object(**ip_object) + return ip_object.uuid + + def parse_url(self, url: str) -> str: + url_id = vt.url_id(url) + url_report = self.client.get_object(f'/urls/{url_id}') + url_object = self.create_misp_object(url_report) + self.misp_event.add_object(**url_object) + return url_object.uuid -class HashQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(HashQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/file/report" - self.declare_variables(apikey, attribute) +def get_proxy_settings(config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') - def parse_report(self, query_result): - file_attributes = [] - for hash_type in ('md5', 'sha1', 'sha256'): - if query_result.get(hash_type): - file_attributes.append({'type': hash_type, 'object_relation': hash_type, - 'value': query_result[hash_type]}) - if file_attributes: - file_object = MISPObject('file') - for attribute in file_attributes: - file_object.add_attribute(**attribute) - self.misp_event.add_object(**file_object) - self.parse_vt_object(query_result) + if host: + if not port: + misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ + 'please also set the virustotal_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' + else: + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' + + if username: + if not password: + misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ + 'please also set the virustotal_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host + + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + return proxies -class IpQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(IpQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/ip-address/report" - self.declare_variables(apikey, attribute) - - def parse_report(self, query_result): - if query_result.get('asn'): - asn_mapping = {'network': ('ip-src', 'subnet-announced'), - 'country': ('text', 'country')} - asn_object = MISPObject('asn') - asn_object.add_attribute('asn', type='AS', value=query_result['asn']) - for key, value in asn_mapping.items(): - if query_result.get(key): - attribute_type, relation = value - asn_object.add_attribute(relation, type=attribute_type, value=query_result[key]) - self.misp_event.add_object(**asn_object) - self.parse_urls(query_result) - if query_result.get('resolutions'): - self.parse_resolutions(query_result['resolutions']) - - -class UrlQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(UrlQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/url/report" - self.declare_variables(apikey, attribute) - - def parse_report(self, query_result): - self.parse_vt_object(query_result) - - -domain = ('domain', DomainQuery) -ip = ('ip', IpQuery) -file = ('resource', HashQuery) -misp_type_mapping = {'domain': domain, 'hostname': domain, 'ip-src': ip, - 'ip-dst': ip, 'md5': file, 'sha1': file, 'sha256': file, - 'url': ('resource', UrlQuery)} - - -def parse_error(status_code): +def parse_error(status_code: int) -> str: status_mapping = {204: 'VirusTotal request rate limit exceeded.', 400: 'Incorrect request, please check the arguments.', 403: 'You don\'t have enough privileges to make the request.'} @@ -216,23 +213,29 @@ def handler(q=False): return False request = json.loads(q) if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = "A VirusTotal api key is required for this module." + misperrors['error'] = 'A VirusTotal api key is required for this module.' return misperrors if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} - attribute = request['attribute'] - if attribute['type'] not in mispattributes['input']: + if request['attribute']['type'] not in mispattributes['input']: return {'error': 'Unsupported attribute type.'} - query_type, to_call = misp_type_mapping[attribute['type']] - parser = to_call(request['config']['apikey'], attribute) - parser.set_proxy_settings(request.get('config')) - query_result = parser.get_query_result(query_type) - status_code = query_result.status_code - if status_code == 200: - parser.parse_report(query_result.json()) - else: - misperrors['error'] = parse_error(status_code) + + event_limit = request['config'].get('event_limit') + attribute = request['attribute'] + proxy_settings = get_proxy_settings(request.get('config')) + + try: + client = vt.Client(request['config']['apikey'], + headers={ + 'x-tool': 'MISPModuleVirusTotalPublicExpansion', + }, + proxy=proxy_settings['http'] if proxy_settings else None) + parser = VirusTotalParser(client, int(event_limit) if event_limit else None) + parser.query_api(attribute) + except vt.APIError as ex: + misperrors['error'] = ex.message return misperrors + return parser.get_result() @@ -242,4 +245,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo + return moduleinfo \ No newline at end of file From a7a9a36ca9064171ce2e594a23c01d100d59142c Mon Sep 17 00:00:00 2001 From: Sebastien Larinier Date: Wed, 23 Mar 2022 17:47:39 +0100 Subject: [PATCH 418/476] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1e5a0f..13c5219 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ sudo -u www-data /var/www/MISP/venv/bin/pip install . sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now misp-modules -/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s & #to start the modules +/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 & #to start the modules ~~~~ ## How to install and start MISP modules on RHEL-based distributions ? From 1b1067a15ee5338ed78cc33ba3c67157b0a11357 Mon Sep 17 00:00:00 2001 From: Sebastien Larinier Date: Wed, 23 Mar 2022 17:48:59 +0100 Subject: [PATCH 419/476] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13c5219..bf27c5e 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ After=misp-workers.service Type=simple User=apache Group=apache -ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s' +ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1' Restart=always RestartSec=10 From f73b961330f96b65b85bb7de7ff6af80724a12b6 Mon Sep 17 00:00:00 2001 From: "Dermott, Scott" Date: Thu, 7 Apr 2022 14:44:22 +0100 Subject: [PATCH 420/476] * Fix for @chrisr3d - [joesandbox_query] Changed the import_pe param to `import_executable` --- misp_modules/modules/expansion/joesandbox_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/joesandbox_query.py b/misp_modules/modules/expansion/joesandbox_query.py index f90d5db..e303512 100644 --- a/misp_modules/modules/expansion/joesandbox_query.py +++ b/misp_modules/modules/expansion/joesandbox_query.py @@ -21,7 +21,7 @@ def handler(q=False): apiurl = request['config'].get('apiurl') or 'https://jbxcloud.joesecurity.org/api' apikey = request['config'].get('apikey') parser_config = { - "import_pe": request["config"].get('import_executable', "false") == "true", + "import_executable": request["config"].get('import_executable', "false") == "true", "mitre_attack": request["config"].get('import_mitre_attack', "false") == "true", } From 7f5174efd5ba74aea4560b8260cdd7d0a64fae57 Mon Sep 17 00:00:00 2001 From: "Dermott, Scott" Date: Thu, 7 Apr 2022 15:10:15 +0100 Subject: [PATCH 421/476] * Fix if network_behavior_field doesn't exist in packet --- misp_modules/lib/joe_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/lib/joe_parser.py b/misp_modules/lib/joe_parser.py index 8ae57a9..e701ff3 100644 --- a/misp_modules/lib/joe_parser.py +++ b/misp_modules/lib/joe_parser.py @@ -111,7 +111,7 @@ class JoeParser(): if network.get(protocol): for packet in network[protocol]['packet']: timestamp = datetime.strptime(self.parse_timestamp(packet['timestamp']), '%b %d, %Y %H:%M:%S.%f') - connections[tuple(packet[field] for field in network_behavior_fields)][protocol].add(timestamp) + connections[tuple(packet.get(field) for field in network_behavior_fields)][protocol].add(timestamp) for connection, data in connections.items(): attributes = self.prefetch_attributes_data(connection) if len(data.keys()) == len(set(protocols[protocol] for protocol in data.keys())): From ef74371ec49521514e7bc94b5d555f5705c12fff Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Mon, 11 Apr 2022 17:14:55 +0200 Subject: [PATCH 422/476] chg: Update REQUIREMENTS --- REQUIREMENTS | 82 +++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index d0294e9..2a7dbdf 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -9,45 +9,44 @@ . aiohttp==3.8.1 aiosignal==1.2.0; python_version >= '3.6' -antlr4-python3-runtime==4.8; python_version >= '3' +antlr4-python3-runtime==4.9.3; python_version >= '3' apiosintds==1.8.3 appdirs==1.4.4 argparse==1.4.0 -assemblyline-client==4.2.2 +assemblyline-client==4.3.5 async-timeout==4.0.2; python_version >= '3.6' asynctest==0.13.0; python_version < '3.8' attrs==21.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' backoff==1.11.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' backports.zoneinfo==0.2.1; python_version < '3.9' backscatter==0.2.4 -beautifulsoup4==4.10.0 -bidict==0.21.4; python_version >= '3.6' +beautifulsoup4==4.11.1 +bidict==0.22.0; python_version >= '3.7' blockchain==1.4.4 -censys==2.1.2 +censys==2.1.3 certifi==2021.10.8 cffi==1.15.0 chardet==4.0.0 charset-normalizer==2.0.12; python_version >= '3' clamd==1.0.2 click-plugins==1.1.1 -click==8.0.4; python_version >= '3.6' +click==8.1.2; python_version >= '3.7' colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' colorclass==2.2.2; python_version >= '2.6' commonmark==0.9.1 compressed-rtf==1.0.6 configparser==5.2.0; python_version >= '3.6' -crowdstrike-falconpy==1.0.5 -cryptography==36.0.1; python_version >= '3.6' +crowdstrike-falconpy==1.0.8 +cryptography==36.0.2; python_version >= '3.6' decorator==5.1.1; python_version >= '3.5' deprecated==1.2.13; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.4 -dnspython==2.2.0 -dnspython3 -domaintools-api==0.6.1 -easygui==0.98.2 +dnspython==2.2.1 +domaintools-api==0.6.2 +easygui==0.98.3 ebcdic==1.1.1 enum-compat==0.0.3 -extract-msg==0.30.8 +extract-msg==0.30.10 ezodf==0.3.2 filelock==3.6.0; python_version >= '3.7' frozenlist==1.3.0; python_version >= '3.7' @@ -59,17 +58,17 @@ git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256 git+https://github.com/SteveClement/trustar-python.git@6954eae38e0c77eaeef26084b6c5fd033925c1c7#egg=trustar git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -git+https://github.com/sebdraven/pyonyphe@aed008ee5a27e3a5e4afbb3e5cbfc47170108452#egg=pyonyphe +git+https://github.com/sebdraven/pyonyphe@49381beb41c61c90d8997ad2d04868977411bbcc#egg=pyonyphe httplib2==0.20.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' idna-ssl==1.1.0; python_version < '3.7' idna==3.3; python_version >= '3' imapclient==2.2.0 -importlib-metadata==4.11.2; python_version < '3.8' -importlib-resources==5.4.0; python_version < '3.9' +importlib-metadata==4.11.3; python_version < '3.8' +importlib-resources==5.6.0; python_version < '3.9' isodate==0.6.1 -itsdangerous==2.1.0; python_version >= '3.7' +itsdangerous==2.1.2; python_version >= '3.7' jbxapi==3.17.2 -jeepney==0.7.1; sys_platform == 'linux' +jeepney==0.8.0; sys_platform == 'linux' json-log-formatter==0.5.1 jsonschema==4.4.0; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' @@ -89,14 +88,14 @@ numpy==1.21.5; python_version < '3.10' and platform_machine != 'aarch64' and pla oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' oletools==0.60 -opencv-python==4.5.5.62 +opencv-python==4.5.5.64 packaging==21.3; python_version >= '3.6' pandas-ods-reader==0.1.2 pandas==1.3.5 -passivetotal==2.5.8 +passivetotal==2.5.9 pcodedmp==1.2.6 pdftotext==2.2.2 -pillow==9.0.1 +pillow==9.1.0 progressbar2==4.0.0; python_version >= '3.7' psutil==5.9.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pycparser==2.21 @@ -107,7 +106,7 @@ pyeupi==1.1 pyfaup==1.2 pygeoip==0.3.2 pygments==2.11.2; python_version >= '3.5' -pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.155.1 +pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.157 pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.2 pypssl==2.2 @@ -124,51 +123,50 @@ python-utils==3.1.0; python_version >= '3.7' pytz-deprecation-shim==0.1.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pytz==2019.3 pyyaml==6.0; python_version >= '3.6' -pyzbar==0.1.8 +pyzbar==0.1.9 pyzipper==0.3.5; python_version >= '3.5' rdflib==6.1.1; python_version >= '3.7' -redis==4.1.4; python_version >= '3.6' -reportlab==3.6.8 +redis==4.2.2; python_version >= '3.6' +reportlab==3.6.9 requests-cache==0.6.4; python_version >= '3.6' requests-file==1.5.1 -requests==2.27.1 -rich==11.2.0; python_version < '4.0' and python_full_version >= '3.6.2' +requests[security]==2.27.1 +rich==12.2.0; python_version < '4.0' and python_full_version >= '3.6.3' rtfde==0.0.2 secretstorage==3.3.1; sys_platform == 'linux' -setuptools==60.9.3; python_version >= '3.7' +setuptools==62.1.0; python_version >= '3.7' shodan==1.27.0 sigmatools==0.19.1 simplejson==3.17.6; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' socialscan==1.4.2 socketio-client==0.5.7.4 -soupsieve==2.3.1; python_version >= '3.6' -sparqlwrapper==1.8.5 -stix2-patterns==1.3.2 +soupsieve==2.3.2; python_version >= '3.6' +sparqlwrapper==2.0.0 +stix2-patterns==2.0.0 stix2==3.0.1 tabulate==0.8.9 -tau-clients==0.2.1 +tau-clients==0.2.5 taxii2-client==2.3.0 tldextract==3.2.0; python_version >= '3.7' tornado==6.1; python_version >= '3.5' -tqdm==4.63.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +tqdm==4.64.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' typing-extensions==4.1.1; python_version < '3.8' -tzdata==2021.5; python_version >= '3.6' -tzlocal==4.1; python_version >= '3.6' +tzdata==2022.1; python_version >= '3.6' +tzlocal==4.2; python_version >= '3.6' unicodecsv==0.14.1 url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.8; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' +urllib3==1.26.9; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' validators==0.14.0 -vt-graph-api==1.1.3 -vt-py==0.13.1 +vt-graph-api==2.0.0 +vt-py==0.14.0 vulners==2.0.2 wand==0.6.7 -websocket-client==1.3.1; python_version >= '3.6' -wrapt==1.13.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +websocket-client==1.3.2; python_version >= '3.7' +wrapt==1.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' xlrd==2.0.1 xlsxwriter==3.0.3; python_version >= '3.4' yara-python==3.8.1 yarl==1.7.2; python_version >= '3.6' -zipp==3.7.0; python_version >= '3.7' - +zipp==3.8.0; python_version >= '3.7' From a1322be2f25dcecf93ec0cd7b143bd3b8e044401 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Mon, 11 Apr 2022 17:18:42 +0200 Subject: [PATCH 423/476] chg: [test] Try to test with Python 3.10 --- .github/workflows/python-package.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 6e65048..cf717e5 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -13,10 +13,11 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7", "3.8", "3.9"] + python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - - run: | + - name: Install packages + run: | sudo apt-get install libpoppler-cpp-dev libzbar0 tesseract-ocr - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From c384c3a2a576cd78a80bb5b86ba8faf8722cd977 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 15 Apr 2022 08:27:19 +0200 Subject: [PATCH 424/476] fix: [expansion] clamav module was missing from the __init__ --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 1142252..c30aad5 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav'] minimum_required_fields = ('type', 'uuid', 'value') From d08bb5c3652ba8cf0b926fc82ae1f692bb458996 Mon Sep 17 00:00:00 2001 From: Daniel Pascual Date: Mon, 18 Apr 2022 10:20:33 +0200 Subject: [PATCH 425/476] Add more relations and attributes to VT modules --- misp_modules/modules/expansion/virustotal.py | 45 ++++++++++++++++--- .../modules/expansion/virustotal_public.py | 20 +++++++-- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index 7f18b54..2d9e714 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -64,11 +64,13 @@ class VirusTotalParser: def create_misp_object(self, report: vt.Object) -> MISPObject: misp_object = None vt_uuid = self.add_vt_report(report) + if report.type == 'file': misp_object = MISPObject('file') - for hash_type in ('md5', 'sha1', 'sha256'): - misp_object.add_attribute(**{'type': hash_type, - 'object_relation': hash_type, + for hash_type in ('md5', 'sha1', 'sha256', 'tlsh', + 'vhash', 'ssdeep', 'imphash'): + misp_object.add_attribute(hash_type, + **{'type': hash_type, 'value': report.get(hash_type)}) elif report.type == 'domain': misp_object = MISPObject('domain-ip') @@ -135,8 +137,28 @@ class VirusTotalParser: return domain_object.uuid def parse_hash(self, file_hash: str) -> str: - file_report = self.client.get_object(f'files/{file_hash}') + file_report = self.client.get_object(f'/files/{file_hash}') file_object = self.create_misp_object(file_report) + + # ITW URLS + urls_iterator = self.client.iterator(f'/files/{file_report.id}/itw_urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(file_object.uuid, 'downloaded') + self.misp_event.add_object(**url_object) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('contacted_urls', 'communicates-with'), + ('contacted_domains', 'communicates-with'), + ('contacted_ips', 'communicates-with') + ]: + files_iterator = self.client.iterator(f'/files/{file_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(file_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + self.misp_event.add_object(**file_object) return file_object.uuid @@ -172,6 +194,19 @@ class VirusTotalParser: url_id = vt.url_id(url) url_report = self.client.get_object(f'/urls/{url_id}') url_object = self.create_misp_object(url_report) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('downloaded_files', 'downloaded-from'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/urls/{url_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(url_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + self.misp_event.add_object(**url_object) return url_object.uuid @@ -259,4 +294,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo \ No newline at end of file + return moduleinfo diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index f72bda4..f5bb76b 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -67,7 +67,8 @@ class VirusTotalParser: vt_uuid = self.add_vt_report(report) if report.type == 'file': misp_object = MISPObject('file') - for hash_type in ('md5', 'sha1', 'sha256'): + for hash_type in ('md5', 'sha1', 'sha256', 'tlsh', + 'vhash', 'ssdeep', 'imphash'): misp_object.add_attribute(**{'type': hash_type, 'object_relation': hash_type, 'value': report.get(hash_type)}) @@ -128,8 +129,21 @@ class VirusTotalParser: return domain_object.uuid def parse_hash(self, file_hash: str) -> str: - file_report = self.client.get_object(f'files/{file_hash}') + file_report = self.client.get_object(f'/files/{file_hash}') file_object = self.create_misp_object(file_report) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('contacted_urls', 'communicates-with'), + ('contacted_domains', 'communicates-with'), + ('contacted_ips', 'communicates-with') + ]: + files_iterator = self.client.iterator(f'/files/{file_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(file_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + self.misp_event.add_object(**file_object) return file_object.uuid @@ -245,4 +259,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo \ No newline at end of file + return moduleinfo From 0c0b40e26ffcc639ff0b7b8069924adbfa6de2be Mon Sep 17 00:00:00 2001 From: iglocska Date: Tue, 3 May 2022 16:10:07 +0200 Subject: [PATCH 426/476] new: [action] module wip --- misp_modules/modules/__init__.py | 1 + misp_modules/modules/action_mod/__init__.py | 1 + misp_modules/modules/action_mod/testaction.py | 74 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 misp_modules/modules/action_mod/__init__.py create mode 100644 misp_modules/modules/action_mod/testaction.py diff --git a/misp_modules/modules/__init__.py b/misp_modules/modules/__init__.py index 47ddcbf..97fdc13 100644 --- a/misp_modules/modules/__init__.py +++ b/misp_modules/modules/__init__.py @@ -1,3 +1,4 @@ from .expansion import * # noqa from .import_mod import * # noqa from .export_mod import * # noqa +from .action_mod import * # noqa diff --git a/misp_modules/modules/action_mod/__init__.py b/misp_modules/modules/action_mod/__init__.py new file mode 100644 index 0000000..42fa40e --- /dev/null +++ b/misp_modules/modules/action_mod/__init__.py @@ -0,0 +1 @@ +__all__ = ['testaction'] diff --git a/misp_modules/modules/action_mod/testaction.py b/misp_modules/modules/action_mod/testaction.py new file mode 100644 index 0000000..4e901ac --- /dev/null +++ b/misp_modules/modules/action_mod/testaction.py @@ -0,0 +1,74 @@ +import json +import base64 + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + 'foo': { + 'type': 'string', + 'description': 'blablabla', + 'value': 'xyz' + }, + 'bar': { + 'type': 'string', + 'value': 'meh' + } +}; + +# blocking modules break the exection of the chain of actions (such as publishing) +blocking = False + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + + +# the list of hook-points that it can hook +hooks = ['publish'] + + +moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', + 'description': 'This module is merely a test, always returning true. Triggers on event publishing.', + 'module-type': ['action']} + + +def handler(q=False): + if q is False: + return False + r = True + result = json.loads(q) # noqa + output = '' # Insert your magic here! + r = {"data": r} + return r + + +def introspection(): + modulesetup = {} + try: + responseType + modulesetup['responseType'] = responseType + except NameError: + pass + try: + inputSource + modulesetup['resultType'] = resultType + except NameError: + pass + try: + hooks + modulesetup['hooks'] = hooks + except NameError: + pass + try: + hooks + modulesetup['blocking'] = blocking + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From cac0c19eed5ee8af23c41d064bf67a36e49bc774 Mon Sep 17 00:00:00 2001 From: iglocska Date: Wed, 4 May 2022 01:26:56 +0200 Subject: [PATCH 427/476] new: [action module] samples added for testing --- misp_modules/modules/action_mod/__init__.py | 2 +- .../modules/action_mod/blockaction.py | 63 +++++++++++++++++ .../modules/action_mod/writeaction.py | 68 +++++++++++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 misp_modules/modules/action_mod/blockaction.py create mode 100644 misp_modules/modules/action_mod/writeaction.py diff --git a/misp_modules/modules/action_mod/__init__.py b/misp_modules/modules/action_mod/__init__.py index 42fa40e..8427a03 100644 --- a/misp_modules/modules/action_mod/__init__.py +++ b/misp_modules/modules/action_mod/__init__.py @@ -1 +1 @@ -__all__ = ['testaction'] +__all__ = ['testaction', 'blockaction', 'writeaction'] diff --git a/misp_modules/modules/action_mod/blockaction.py b/misp_modules/modules/action_mod/blockaction.py new file mode 100644 index 0000000..facdeab --- /dev/null +++ b/misp_modules/modules/action_mod/blockaction.py @@ -0,0 +1,63 @@ +import json +import base64 + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + +}; + +# blocking modules break the exection of the chain of actions (such as publishing) +blocking = True + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + + +# the list of hook-points that it can hook +hooks = ['publish'] + + +moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', + 'description': 'This module is merely a test, always returning true. Triggers on event publishing.', + 'module-type': ['action']} + + +def handler(q=False): + if q is False: + return False + r = {"data": False, "error": "Barf."} + return r + + +def introspection(): + modulesetup = {} + try: + responseType + modulesetup['responseType'] = responseType + except NameError: + pass + try: + inputSource + modulesetup['resultType'] = resultType + except NameError: + pass + try: + hooks + modulesetup['hooks'] = hooks + except NameError: + pass + try: + hooks + modulesetup['blocking'] = blocking + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/action_mod/writeaction.py b/misp_modules/modules/action_mod/writeaction.py new file mode 100644 index 0000000..7efab95 --- /dev/null +++ b/misp_modules/modules/action_mod/writeaction.py @@ -0,0 +1,68 @@ +import json +import base64 + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + +}; + +# blocking modules break the exection of the chain of actions (such as publishing) +blocking = False + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + + +# the list of hook-points that it can hook +hooks = ['publish'] + + +moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', + 'description': 'This module is merely a test, writing a tmp file with the event info.', + 'module-type': ['action']} + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + data = request["data"] + f = open("/var/www/MISP7/app/tmp/output.txt","w+") + f.write(data["Event"]["info"]) + f.close() + r = {"data": True} + return r + + +def introspection(): + modulesetup = {} + try: + responseType + modulesetup['responseType'] = responseType + except NameError: + pass + try: + inputSource + modulesetup['resultType'] = resultType + except NameError: + pass + try: + hooks + modulesetup['hooks'] = hooks + except NameError: + pass + try: + hooks + modulesetup['blocking'] = blocking + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 3b58915c41fdea25b2f012d18c4231fcada3e350 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 24 May 2022 17:05:21 +0200 Subject: [PATCH 428/476] fix: [setup] Fixed potential conflicts with libraries in python 3.10 install --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 55ed8b7..ea55174 100644 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ setup( install_requires=[ 'tornado', 'psutil', - 'redis>=3' + 'redis>=3', + 'pyparsing==2.4.7' ], ) From a114bf7bbb48eeb9f891dc43983488eeaf0be9bd Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 25 May 2022 11:46:50 +0200 Subject: [PATCH 429/476] fix: [requirements] Updated python requirements --- REQUIREMENTS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 2a7dbdf..e5ca61c 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -70,10 +70,10 @@ itsdangerous==2.1.2; python_version >= '3.7' jbxapi==3.17.2 jeepney==0.8.0; sys_platform == 'linux' json-log-formatter==0.5.1 -jsonschema==4.4.0; python_version >= '3.7' +jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 -lief==0.11.5 +lief>=0.12.1 lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 @@ -87,7 +87,7 @@ np==1.0.2 numpy==1.21.5; python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64' oauth2==1.9.0.post1 olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -oletools==0.60 +oletools>=0.60 opencv-python==4.5.5.64 packaging==21.3; python_version >= '3.6' pandas-ods-reader==0.1.2 From e3b259e5ba97b8b997ce3176ec4f576b3fd3a275 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 25 May 2022 11:50:02 +0200 Subject: [PATCH 430/476] fix; [requirements] Fixed lief requirements to align them with PyMISP --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index e5ca61c..4fd390b 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -73,7 +73,7 @@ json-log-formatter==0.5.1 jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 -lief>=0.12.1 +lief>=0.12.0 lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 From 6beb23d870ddb7bb48e86cb2f64bdda9b6095b67 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 25 May 2022 13:35:05 +0200 Subject: [PATCH 431/476] fix: [requirements] Aligning lief requirements with PyMISP --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 4fd390b..0ecbad7 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -73,7 +73,7 @@ json-log-formatter==0.5.1 jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 -lief>=0.12.0 +lieflief<0.12.0, >=0.11.5 lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 From aabe01e6885689a1b468559a5c7e3b69adfd42a2 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 25 May 2022 13:40:46 +0200 Subject: [PATCH 432/476] fix: [requirements] Monkey copy paste issue --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 0ecbad7..d5a1fec 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -73,7 +73,7 @@ json-log-formatter==0.5.1 jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 -lieflief<0.12.0, >=0.11.5 +lief<0.12.0, >=0.11.5 lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 From 02a5a5c5d3a529173b501b24d798a9b09a7f8c0f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 31 May 2022 15:53:14 +0200 Subject: [PATCH 433/476] ***Be sure to run the latest version of `pip`*** --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bf27c5e..178e07f 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,8 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj ## How to install and start MISP modules in a Python virtualenv? (recommended) +***Be sure to run the latest version of `pip`***. To install the latest version of pip, `pip install --upgrade pip` will do the job. + ~~~~bash sudo apt-get install python3-dev python3-pip libpq5 libjpeg-dev tesseract-ocr libpoppler-cpp-dev imagemagick virtualenv libopencv-dev zbar-tools libzbar0 libzbar-dev libfuzzy-dev build-essential -y sudo -u www-data virtualenv -p python3 /var/www/MISP/venv From 5c0a480896b34fc4790ce069162ca637159d6f23 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 17 Jun 2022 15:50:52 +0200 Subject: [PATCH 434/476] new: [logos] misp-modules logo --- docs/logos/misp-modules-full-small.png | Bin 0 -> 10835 bytes docs/logos/misp-modules-full.png | Bin 0 -> 151790 bytes docs/logos/misp-modules-full.svg | 125 +++++++++++++++++++++++++ docs/logos/misp-modules-small.png | Bin 0 -> 8015 bytes docs/logos/misp-modules.svg | 114 ++++++++++++++++++++++ 5 files changed, 239 insertions(+) create mode 100644 docs/logos/misp-modules-full-small.png create mode 100644 docs/logos/misp-modules-full.png create mode 100644 docs/logos/misp-modules-full.svg create mode 100644 docs/logos/misp-modules-small.png create mode 100644 docs/logos/misp-modules.svg diff --git a/docs/logos/misp-modules-full-small.png b/docs/logos/misp-modules-full-small.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbc084c73089f2da3e8ded28b1e31c443565f70 GIT binary patch literal 10835 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 literal 0 HcmV?d00001 diff --git a/docs/logos/misp-modules-full.png b/docs/logos/misp-modules-full.png new file mode 100644 index 0000000000000000000000000000000000000000..2b432e323a642e76f1296635fc0fc6c45425ac46 GIT binary patch literal 151790 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 z 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 + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + misp-modules + + diff --git a/docs/logos/misp-modules-small.png b/docs/logos/misp-modules-small.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe9d1950b260a507ad2da8edaee39c9e122c49c GIT binary patch literal 8015 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 + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + From 81ec6fe415cef7e6d55c6e03c37551c37f696753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 28 Jul 2022 14:41:32 +0200 Subject: [PATCH 435/476] fix: fix vulnerable_configuration object ref, rely on template. Related #853 --- .../modules/expansion/cve_advanced.py | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index a5e807e..4be69c6 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -23,11 +23,11 @@ class VulnerabilityParser(): self.references = defaultdict(list) self.capec_features = ('id', 'name', 'summary', 'prerequisites', 'solutions') self.vulnerability_mapping = { - 'id': ('vulnerability', 'id'), 'summary': ('text', 'summary'), - 'vulnerable_configuration': ('cpe', 'vulnerable_configuration'), - 'vulnerable_configuration_cpe_2_2': ('cpe', 'vulnerable_configuration'), - 'Modified': ('datetime', 'modified'), 'Published': ('datetime', 'published'), - 'references': ('link', 'references'), 'cvss': ('float', 'cvss-score')} + 'id': 'id', 'summary': 'summary', + 'vulnerable_configuration': 'vulnerable-configuration', + 'vulnerable_configuration_cpe_2_2': 'vulnerable-configuration', + 'Modified': 'modified', 'Published': 'published', + 'references': 'references', 'cvss': 'cvss-score'} self.weakness_mapping = {'name': 'name', 'description_summary': 'description', 'status': 'status', 'weaknessabs': 'weakness-abs'} @@ -43,18 +43,17 @@ class VulnerabilityParser(): for feature in ('id', 'summary', 'Modified', 'cvss'): value = self.vulnerability.get(feature) if value: - attribute_type, relation = self.vulnerability_mapping[feature] - vulnerability_object.add_attribute(relation, **{'type': attribute_type, 'value': value}) + vulnerability_object.add_attribute(self.vulnerability_mapping[feature], value) if 'Published' in self.vulnerability: - vulnerability_object.add_attribute('published', **{'type': 'datetime', 'value': self.vulnerability['Published']}) - vulnerability_object.add_attribute('state', **{'type': 'text', 'value': 'Published'}) + vulnerability_object.add_attribute('published', self.vulnerability['Published']) + vulnerability_object.add_attribute('state', 'Published') for feature in ('references', 'vulnerable_configuration', 'vulnerable_configuration_cpe_2_2'): if feature in self.vulnerability: - attribute_type, relation = self.vulnerability_mapping[feature] + relation = self.vulnerability_mapping[feature] for value in self.vulnerability[feature]: if isinstance(value, dict): value = value['title'] - vulnerability_object.add_attribute(relation, **{'type': attribute_type, 'value': value}) + vulnerability_object.add_attribute(relation, value) vulnerability_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(vulnerability_object) if 'cwe' in self.vulnerability and self.vulnerability['cwe'] not in ('Unknown', 'NVD-CWE-noinfo'): @@ -74,10 +73,9 @@ class VulnerabilityParser(): for capec in self.vulnerability['capec']: capec_object = MISPObject('attack-pattern') for feature in self.capec_features: - capec_object.add_attribute(feature, **{'type': 'text', 'value': capec[feature]}) + capec_object.add_attribute(feature, capec[feature]) for related_weakness in capec['related_weakness']: - attribute = {'type': 'weakness', 'value': f"CWE-{related_weakness}"} - capec_object.add_attribute('related-weakness', **attribute) + capec_object.add_attribute('related-weakness', f"CWE-{related_weakness}") self.misp_event.add_object(capec_object) self.references[vulnerability_uuid].append( { @@ -93,10 +91,10 @@ class VulnerabilityParser(): for cwe in cwes.json(): if cwe['id'] == cwe_id: weakness_object = MISPObject('weakness') - weakness_object.add_attribute('id', {'type': 'weakness', 'value': f'{cwe_string}-{cwe_id}'}) + weakness_object.add_attribute('id', f'{cwe_string}-{cwe_id}') for feature, relation in self.weakness_mapping.items(): if cwe.get(feature): - weakness_object.add_attribute(relation, **{'type': 'text', 'value': cwe[feature]}) + weakness_object.add_attribute(relation, cwe[feature]) self.misp_event.add_object(weakness_object) self.references[vulnerability_uuid].append( { From 89bc8bf19c3a393f89db3657d61b616e8663fe97 Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Fri, 5 Aug 2022 15:39:12 +0200 Subject: [PATCH 436/476] new: [action_mod] Added MatterMost module and deleted test modules --- misp_modules/modules/action_mod/__init__.py | 2 +- .../modules/action_mod/_utils/utils.py | 70 +++++++++++++ .../modules/action_mod/blockaction.py | 63 ------------ misp_modules/modules/action_mod/mattermost.py | 97 +++++++++++++++++++ misp_modules/modules/action_mod/testaction.py | 63 +++++------- .../modules/action_mod/writeaction.py | 68 ------------- 6 files changed, 192 insertions(+), 171 deletions(-) create mode 100644 misp_modules/modules/action_mod/_utils/utils.py delete mode 100644 misp_modules/modules/action_mod/blockaction.py create mode 100644 misp_modules/modules/action_mod/mattermost.py delete mode 100644 misp_modules/modules/action_mod/writeaction.py diff --git a/misp_modules/modules/action_mod/__init__.py b/misp_modules/modules/action_mod/__init__.py index 8427a03..d706e5c 100644 --- a/misp_modules/modules/action_mod/__init__.py +++ b/misp_modules/modules/action_mod/__init__.py @@ -1 +1 @@ -__all__ = ['testaction', 'blockaction', 'writeaction'] +__all__ = ['testaction', 'mattermost'] diff --git a/misp_modules/modules/action_mod/_utils/utils.py b/misp_modules/modules/action_mod/_utils/utils.py new file mode 100644 index 0000000..3afdc17 --- /dev/null +++ b/misp_modules/modules/action_mod/_utils/utils.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +from jinja2.sandbox import SandboxedEnvironment + +default_template = """ +# Tutorial: How to use jinja2 templating + +:warning: For these examples, we consider the module received data under the MISP core format + +1. You can use the dot `.` notation or the subscript syntax `[]` to access attributes of a variable + - `{% raw %}{{ Event.info }}{% endraw %}` -> {{ Event.info }} + - `{% raw %}{{ Event['info'] }}{% endraw %}` -> {{ Event['info'] }} + +2. Jinja2 allows you to easily create list: +```{% raw %} +{% for attribute in Event.Attribute %} +- {{ attribute.value }} +{% endfor %} +{% endraw %}``` + +Gives: +{% for attribute in Event.Attribute %} +- {{ attribute.value }} +{% endfor %} + +3. Jinja2 allows you to add logic +```{% raw %} +{% if "tlp:white" in Event.Tag %} +- This Event has the TLP:WHITE tag +{% else %} +- This Event doesn't have the TLP:WHITE tag +{% endif %} +{% endraw %}``` + +Gives: +{% if "tlp:white" in Event.Tag %} +- This Event has the TLP:WHITE tag +{% else %} +- This Event doesn't have the TLP:WHITE tag +{% endif %} + +## Jinja2 allows you to modify variables by using filters + +3. The `reverse` filter +- `{% raw %}{{ Event.info | reverse }}{% endraw %}` -> {{ Event.info | reverse }} + +4. The `format` filter +- `{% raw %}{{ "%s :: %s" | format(Event.Attribute[0].type, Event.Attribute[0].value) }}{% endraw %}` -> {{ "%s :: %s" | format(Event.Attribute[0].type, Event.Attribute[0].value) }} + +5.The `groupby` filter +```{% raw %} +{% for type, attributes in Event.Attribute|groupby("type") %} +- {{ type }}{% for attribute in attributes %} + - {{ attribute.value }} + {% endfor %} +{% endfor %} +{% endraw %}``` + +Gives: +{% for type, attributes in Event.Attribute|groupby("type") %} +- {{ type }}{% for attribute in attributes %} + - {{ attribute.value }} + {% endfor %} +{% endfor %} +""" + + +def renderTemplate(data, template=default_template): + env = SandboxedEnvironment() + return env.from_string(template).render(data) \ No newline at end of file diff --git a/misp_modules/modules/action_mod/blockaction.py b/misp_modules/modules/action_mod/blockaction.py deleted file mode 100644 index facdeab..0000000 --- a/misp_modules/modules/action_mod/blockaction.py +++ /dev/null @@ -1,63 +0,0 @@ -import json -import base64 - -misperrors = {'error': 'Error'} - -# config fields that your code expects from the site admin -moduleconfig = { - -}; - -# blocking modules break the exection of the chain of actions (such as publishing) -blocking = True - -# returns either "boolean" or "data" -# Boolean is used to simply signal that the execution has finished. -# For blocking modules the actual boolean value determines whether we break execution -returns = 'boolean' - - -# the list of hook-points that it can hook -hooks = ['publish'] - - -moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', - 'description': 'This module is merely a test, always returning true. Triggers on event publishing.', - 'module-type': ['action']} - - -def handler(q=False): - if q is False: - return False - r = {"data": False, "error": "Barf."} - return r - - -def introspection(): - modulesetup = {} - try: - responseType - modulesetup['responseType'] = responseType - except NameError: - pass - try: - inputSource - modulesetup['resultType'] = resultType - except NameError: - pass - try: - hooks - modulesetup['hooks'] = hooks - except NameError: - pass - try: - hooks - modulesetup['blocking'] = blocking - except NameError: - pass - return modulesetup - - -def version(): - moduleinfo['config'] = moduleconfig - return moduleinfo diff --git a/misp_modules/modules/action_mod/mattermost.py b/misp_modules/modules/action_mod/mattermost.py new file mode 100644 index 0000000..dbcd336 --- /dev/null +++ b/misp_modules/modules/action_mod/mattermost.py @@ -0,0 +1,97 @@ +import json +from mattermostdriver import Driver +from ._utils import utils + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + 'params': { + 'mattermost_hostname': { + 'type': 'string', + 'description': 'The Mattermost domain', + 'value': 'example.mattermost.com', + }, + 'bot_access_token': { + 'type': 'string', + 'description': 'Access token generated when you created the bot account', + }, + 'channel_id': { + 'type': 'string', + 'description': 'The channel you added the bot to', + }, + 'message_template': { + 'type': 'large_string', + 'description': 'The template to be used to generate the message to be posted', + 'value': 'The **template** will be rendered using *Jinja2*!', + }, + }, + # Blocking modules break the exection of the current of action + 'blocking': False, + # Indicates whether parts of the data passed to this module should be filtered. Filtered data can be found under the `filteredItems` key + 'support_filters': True, + # Indicates whether the data passed to this module should be compliant with the MISP core format + 'expect_misp_core_format': False, +} + + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + +moduleinfo = {'version': '0.1', 'author': 'Sami Mokaddem', + 'description': 'Simplistic module to send message to a Mattermost channel.', + 'module-type': ['action']} + + +def createPost(request): + params = request['params'] + mm = Driver({ + 'url': params['mattermost_hostname'], + 'token': params['bot_access_token'], + 'scheme': 'https', + 'basepath': '/api/v4', + 'port': 443, + }) + mm.login() + + data = {} + if 'matchingData' in request: + data = request['matchingData'] + else: + data = request['data'] + + if params['message_template']: + message = utils.renderTemplate(data, params['message_template']) + else: + message = '```\n{}\n```'.format(json.dumps(data)) + + mm.posts.create_post(options={ + 'channel_id': params['channel_id'], + 'message': message + }) + return True + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + createPost(request) + r = {"data": True} + return r + + +def introspection(): + modulesetup = {} + try: + modulesetup['config'] = moduleconfig + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/action_mod/testaction.py b/misp_modules/modules/action_mod/testaction.py index 4e901ac..d773c4e 100644 --- a/misp_modules/modules/action_mod/testaction.py +++ b/misp_modules/modules/action_mod/testaction.py @@ -1,34 +1,36 @@ import json -import base64 +from ._utils import utils misperrors = {'error': 'Error'} # config fields that your code expects from the site admin moduleconfig = { - 'foo': { - 'type': 'string', - 'description': 'blablabla', - 'value': 'xyz' + 'params': { + 'foo': { + 'type': 'string', + 'description': 'blablabla', + 'value': 'xyz' + }, + 'Data extraction path': { + # Extracted data can be found under the `matchingData` key + 'type': 'hash_path', + 'description': 'Only post content extracted from this path', + 'value': 'Attribute.{n}.AttributeTag.{n}.Tag.name', + }, }, - 'bar': { - 'type': 'string', - 'value': 'meh' - } -}; - -# blocking modules break the exection of the chain of actions (such as publishing) -blocking = False + # Blocking modules break the exection of the current of action + 'blocking': False, + # Indicates whether parts of the data passed to this module should be extracted. Extracted data can be found under the `filteredItems` key + 'support_filters': False, + # Indicates whether the data passed to this module should be compliant with the MISP core format + 'expect_misp_core_format': False, +} # returns either "boolean" or "data" # Boolean is used to simply signal that the execution has finished. # For blocking modules the actual boolean value determines whether we break execution returns = 'boolean' - -# the list of hook-points that it can hook -hooks = ['publish'] - - moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', 'description': 'This module is merely a test, always returning true. Triggers on event publishing.', 'module-type': ['action']} @@ -37,33 +39,16 @@ moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', def handler(q=False): if q is False: return False - r = True - result = json.loads(q) # noqa - output = '' # Insert your magic here! - r = {"data": r} + request = json.loads(q) # noqa + success = True + r = {"data": success} return r def introspection(): modulesetup = {} try: - responseType - modulesetup['responseType'] = responseType - except NameError: - pass - try: - inputSource - modulesetup['resultType'] = resultType - except NameError: - pass - try: - hooks - modulesetup['hooks'] = hooks - except NameError: - pass - try: - hooks - modulesetup['blocking'] = blocking + modulesetup['config'] = moduleconfig except NameError: pass return modulesetup diff --git a/misp_modules/modules/action_mod/writeaction.py b/misp_modules/modules/action_mod/writeaction.py deleted file mode 100644 index 7efab95..0000000 --- a/misp_modules/modules/action_mod/writeaction.py +++ /dev/null @@ -1,68 +0,0 @@ -import json -import base64 - -misperrors = {'error': 'Error'} - -# config fields that your code expects from the site admin -moduleconfig = { - -}; - -# blocking modules break the exection of the chain of actions (such as publishing) -blocking = False - -# returns either "boolean" or "data" -# Boolean is used to simply signal that the execution has finished. -# For blocking modules the actual boolean value determines whether we break execution -returns = 'boolean' - - -# the list of hook-points that it can hook -hooks = ['publish'] - - -moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', - 'description': 'This module is merely a test, writing a tmp file with the event info.', - 'module-type': ['action']} - - -def handler(q=False): - if q is False: - return False - request = json.loads(q) - data = request["data"] - f = open("/var/www/MISP7/app/tmp/output.txt","w+") - f.write(data["Event"]["info"]) - f.close() - r = {"data": True} - return r - - -def introspection(): - modulesetup = {} - try: - responseType - modulesetup['responseType'] = responseType - except NameError: - pass - try: - inputSource - modulesetup['resultType'] = resultType - except NameError: - pass - try: - hooks - modulesetup['hooks'] = hooks - except NameError: - pass - try: - hooks - modulesetup['blocking'] = blocking - except NameError: - pass - return modulesetup - - -def version(): - moduleinfo['config'] = moduleconfig - return moduleinfo From a4426727f4585c0c7cbf7f90d8bbbd9fc3cff7b2 Mon Sep 17 00:00:00 2001 From: Robert Nixon Date: Sun, 7 Aug 2022 18:26:41 +0200 Subject: [PATCH 437/476] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 178e07f..a260d20 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ sudo -u www-data /var/www/MISP/venv/bin/pip install . sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now misp-modules +sudo service misp-modules start #or /var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 & #to start the modules ~~~~ From a86ac9d715ae245572271e55dd807b8fab95b654 Mon Sep 17 00:00:00 2001 From: Robert Nixon Date: Sun, 7 Aug 2022 18:27:38 +0200 Subject: [PATCH 438/476] Update misp-modules.service Service doesn't like or need the -s option to execute the modules. --- etc/systemd/system/misp-modules.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/systemd/system/misp-modules.service b/etc/systemd/system/misp-modules.service index 99cd102..078ebec 100644 --- a/etc/systemd/system/misp-modules.service +++ b/etc/systemd/system/misp-modules.service @@ -7,7 +7,7 @@ User=www-data Group=www-data WorkingDirectory=/usr/local/src/misp-modules Environment="PATH=/var/www/MISP/venv/bin" -ExecStart=/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s +ExecStart=/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 [Install] WantedBy=multi-user.target From 90a1644c8cbea8439e1e95a75fcc51ef3a8841ff Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Wed, 10 Aug 2022 14:07:00 +0200 Subject: [PATCH 439/476] fix: [shodan] Fixed wrong asset used to add attribute to - This caused the input `ip-src` or `ip-dst` input attribute to be added to the `ip-api-addres` which does not have these attributes in their template, where they should be added to the Event instead --- misp_modules/modules/expansion/shodan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/shodan.py b/misp_modules/modules/expansion/shodan.py index f295deb..356abc5 100755 --- a/misp_modules/modules/expansion/shodan.py +++ b/misp_modules/modules/expansion/shodan.py @@ -73,7 +73,7 @@ class ShodanParser(): ip_address_object = MISPObject('ip-api-address') for attribute in ip_address_attributes: ip_address_object.add_attribute(**attribute) - ip_address_object.add_attribute(**self._get_source_attribute()) + self.misp_event.add_attribute(**self._get_source_attribute()) ip_address_object.add_reference(self.attribute.uuid, 'describes') self.misp_event.add_object(ip_address_object) From 71d8745b9137fa7e2cfacc8ac140613123f25581 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Wed, 10 Aug 2022 16:17:08 +0200 Subject: [PATCH 440/476] fix: [shodan] The input attribute is actually already added to the event at the beginning --- misp_modules/modules/expansion/shodan.py | 1 - 1 file changed, 1 deletion(-) diff --git a/misp_modules/modules/expansion/shodan.py b/misp_modules/modules/expansion/shodan.py index 356abc5..2ea9749 100755 --- a/misp_modules/modules/expansion/shodan.py +++ b/misp_modules/modules/expansion/shodan.py @@ -73,7 +73,6 @@ class ShodanParser(): ip_address_object = MISPObject('ip-api-address') for attribute in ip_address_attributes: ip_address_object.add_attribute(**attribute) - self.misp_event.add_attribute(**self._get_source_attribute()) ip_address_object.add_reference(self.attribute.uuid, 'describes') self.misp_event.add_object(ip_address_object) From de1687c11a56ec2222ae129a5084dd793c3b2d37 Mon Sep 17 00:00:00 2001 From: Benni0 Date: Fri, 19 Aug 2022 09:19:38 +0200 Subject: [PATCH 441/476] Add __init__.py to action_mod/_utils As _utils is currently not a package, this folder is missing in a built wheel from this package. --- misp_modules/modules/action_mod/_utils/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 misp_modules/modules/action_mod/_utils/__init__.py diff --git a/misp_modules/modules/action_mod/_utils/__init__.py b/misp_modules/modules/action_mod/_utils/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/misp_modules/modules/action_mod/_utils/__init__.py @@ -0,0 +1 @@ + From b620446d3769fbc612baa22bf5386eac994f63fc Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Wed, 24 Aug 2022 14:18:58 +0200 Subject: [PATCH 442/476] chg: [requirements] Added mattermostdriver entry --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index d5a1fec..362c504 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -78,6 +78,7 @@ lxml==4.8.0 maclookup==1.0.3 markdownify==0.5.3 maxminddb==2.2.0; python_version >= '3.6' +mattermostdriver==7.3.2 more-itertools==8.12.0; python_version >= '3.5' msoffcrypto-tool==5.0.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') multidict==6.0.2; python_version >= '3.7' From 1c184040e66a9fd5b9045f24f07e516a3e3774cb Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Wed, 24 Aug 2022 14:27:31 +0200 Subject: [PATCH 443/476] chg: [requirements] Added jinja2 entry --- REQUIREMENTS | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIREMENTS b/REQUIREMENTS index 362c504..6ad1540 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -71,6 +71,7 @@ jbxapi==3.17.2 jeepney==0.8.0; sys_platform == 'linux' json-log-formatter==0.5.1 jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' +Jinja2==3.1.2 keyring==23.5.0; python_version >= '3.7' lark-parser==0.12.0 lief<0.12.0, >=0.11.5 From a6930be86248f91182ce0220df3a50cbb5d84f5d Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Thu, 25 Aug 2022 10:57:17 +0200 Subject: [PATCH 444/476] new: [expansion:jinja_template_rendering] Added new module to rendre a jinja template based on the provided data --- misp_modules/modules/expansion/__init__.py | 2 +- .../expansion/jinja_template_rendering.py | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100755 misp_modules/modules/expansion/jinja_template_rendering.py diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index c30aad5..8e3b243 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav', 'jinja_template_rendering'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/jinja_template_rendering.py b/misp_modules/modules/expansion/jinja_template_rendering.py new file mode 100755 index 0000000..5749aba --- /dev/null +++ b/misp_modules/modules/expansion/jinja_template_rendering.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python\ + +import json +from jinja2.sandbox import SandboxedEnvironment + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['text'], 'output': ['text']} +moduleinfo = {'version': '0.1', 'author': 'Sami Mokaddem', + 'description': 'Render the template with the data passed', + 'module-type': ['expansion']} + +default_template = '- Default template -' + +def renderTemplate(data, template=default_template): + env = SandboxedEnvironment() + return env.from_string(template).render(data) + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if request.get('text'): + data = request['text'] + else: + return False + data = json.loads(data) + template = data.get('template', default_template) + templateData = data.get('data', {}) + try: + rendered = renderTemplate(templateData, template) + except TypeError: + rendered = '' + + r = {'results': [{'types': mispattributes['output'], + 'values':[rendered]}]} + return r + + +def introspection(): + return mispattributes + + +def version(): + return moduleinfo From 3afcd825b9acd5cccbe7a0c0fe60456a34f4e089 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:54:35 +0530 Subject: [PATCH 445/476] Added Hyas Insight Module --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 8e3b243..2506265 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,7 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav', 'jinja_template_rendering'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav', 'jinja_template_rendering','hyasinsight'] minimum_required_fields = ('type', 'uuid', 'value') From 3f2ac6d78a22c4ad410a1fa1057d6f721d0641b5 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:56:46 +0530 Subject: [PATCH 446/476] Added HYAS logo --- documentation/logos/hyas.png | Bin 0 -> 3219 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/logos/hyas.png diff --git a/documentation/logos/hyas.png b/documentation/logos/hyas.png new file mode 100644 index 0000000000000000000000000000000000000000..42acf22f590ec113c0fb09e7691780a20e3f1544 GIT binary patch literal 3219 zcmbtXc{r4N8y;D+rYRwf!6DQv#_ZY0E|NVmjG1@LoXpY~Ym1`Lt|%c1EhkHo>{G;MP;s7WMIB)|gr6lf$XgdIwZG}ZpDOBBslw-MUV?-2ezQ|-S@ z`8c~mNgN&k#ln#=DiVo;;s|gfEEdyT!P-I1!-+tGWGQ72q+$0h%q3!-9TK4w3l}1AjFK zjYAcg;QrJiQgLVuo)Q!UGsaM9Fggv5f#ET9EQ}Upgu-BvM#d-%Mf-=Ei2ExQ|A!hv zWEinp{eN`B&n;1ltxkXSwrKI|b^vVAmEehb-=ob74+6;yIaphIM0QVRtn~m#Kpq=| zdF#${6Lc&RyTT7tY>Pc*7m#0=!zc}VeJj8EhG%NwzK$yYSK&3qQ)SiNIaaI>-EuJB z`!c_K=Jk==rsuf(SRWp4v~Xr6~Wi# zW$;}mWm&O-g9BWMm{Pj*GaLl1)ZG!Q=bUt=?IW&TOmPII7Lw987Eb1hIjqmr>k6$V zzpFrdz8$QRJhilmKl#Ra&`HHTyt=xss?2cvsxRGL<^pFZ)~P@hvVA&aLvbD`qF5 z`WHS6Q9~&k!TX;@T zhF-TL+s&?r=tp~|)?HP>Qg~)+(P48|R<;3O<|@wvTdKG%R~&qsxjcimxB$DW*sX&j?c9f5v@GB*ZJqKlTJ}q}wC z-Z0HHceCA^cl&N&{=s_u?off+%F?mVqLu4^oNtP_zn~E%!NtIfk znb~{igJ1j7M(KD$D(sSG3@T=U;K(-^wbRXYR~~J;7)3rGf7!Y>spP?8eo+D>iTCY~ zk+P0==*-94GR>7TF~-yLYcgzeqxfl~37Y=TW&QBx^h34y-Fr+~^tQ$rrB7Uw*CEqWdbU(WFr&(E!)iDiJ;2lbBJ@&bR)uo^YVzFB6P-SLNX;t^Kc#k`j)V;p-Z>yEUz8;vE0$euYg!dx{}{&D%5Q|JOXQpLo53Irn{%{ zTwnW1kd4Vz@CA&*A=MdScYW5mqb|;K8dz@5SG*7!U(?9Hl4iaO_4|e%Py6H(WpyVV zb4nHHsehKvalA50?=1U{(GpDx7nLG&1I1cy87>%P-CjfbXj7}Q^*0$3NsELpLlP#9 z&UZcAGbPZ()E-zzJW*8Fz3Gz<6+1$b4oO32q&=$)+y?s=FraiG@h$_nt{n8vnRkbo`kI+5ej@Dr?3LIrpvtQ26Z>r5bO@73< zG*<5^@w_O^!k*&u=e(h>cO~mhclQ{qXXt8=V#SBldxjD+kFu4X-Fy}`Os~S*dsyio z>1|(nR=!TPA*ST|Xk{HTN<-2`d~?m+$?a8(Yy_ng~b#w>Am1hYyRvzsp%p7E0 z^eVh$r0ItJz;zKUO~_6?p_i22jGt1y{-SDt-NHgwxeIohEBv z>t&X6`nL+jgElhAQ#f{{Jh5`5FiGv@dE+-UAU9Ge44Fm6te?26TxdclZNDS8*?v|`@`k1o#aJ%sM0X2j)`i%5|oZrW7e+2BcAQ@c$I%9nA z(}ew@>Xwx`#mj`HY3(+PICX`z^T$If>CxDo>hOzAf`iKXUmP@L_b2#jypnI69mmA6 zUj}M;k_$!8lo!!hUjn8h!2Tz$LdZVR+Dw@cGz6{ z+WqE?)CbRYE3J+WOLuth#^nz-XrORg)F6zBay>xt-95a+Fn;sio=NmO)Uu= zos%7|d4^w9;$gn_Bo3?k@PIg*uQX5*7jGp~V-XAD9r_d9H2To*iNOV$-$%gx(Q-Z! z>gBO3LyVB*guGy{llA1rH6mB})o%t*?Z+*Z+}^!bqFb_t<^zR{%hspKp7Oz48Z?u& zfYO|tT>6{6@D$VkjK^Htq5^Z$lwM3P*uy5@t>#P#E~d9-YCb>zri!>C$s!)IUEyg3 zxA1AWvW6x(dAjD<%EWSvSM1Cg>1T0co0S$;t}odg5d#_5zBa-~mOHNgCOFu*Sl_V< GjQuY#UXp$Q literal 0 HcmV?d00001 From 7d26d11378b54c4f5b281546c1f9cae72721a34c Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:01:47 +0530 Subject: [PATCH 447/476] Added HYAS Insight --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a260d20..a9184b5 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [hashdd](misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. * [hibp](misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? * [html_to_markdown](misp_modules/modules/expansion/html_to_markdown.py) - Simple HTML to markdown converter +* [HYAS Insight](misp_modules/modules/expansion/hyasinsight.py) - a hover and expansion module to get information from [HYAS Insight](https://www.hyas.com/hyas-insight). * [intel471](misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). * [IPASN](misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. * [iprep](misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. From f3b2ea7c41cfb0bd0c4cdbc39efeeb67871cc57f Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:07:52 +0530 Subject: [PATCH 448/476] Added HYAS Insight Module --- misp_modules/modules/expansion/hyasinsight.py | 812 ++++++++++++++++++ 1 file changed, 812 insertions(+) create mode 100644 misp_modules/modules/expansion/hyasinsight.py diff --git a/misp_modules/modules/expansion/hyasinsight.py b/misp_modules/modules/expansion/hyasinsight.py new file mode 100644 index 0000000..fd13751 --- /dev/null +++ b/misp_modules/modules/expansion/hyasinsight.py @@ -0,0 +1,812 @@ +import json +import logging +from typing import Dict, List, Any + +import requests +import re +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout +) +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPAttribute, MISPObject, MISPTag, Distribution + +ip_query_input_type = [ + 'ip-src', + 'ip-dst' +] +domain_query_input_type = [ + 'hostname', + 'domain' +] +email_query_input_type = [ + 'email', + 'email-src', + 'email-dst', + 'target-email', + 'whois-registrant-email' +] +phone_query_input_type = [ + 'phone-number', + 'whois-registrant-phone' +] + +md5_query_input_type = [ + 'md5', + 'x509-fingerprint-md5', + 'ja3-fingerprint-md5', + 'hassh-md5', + 'hasshserver-md5' +] + +sha1_query_input_type = [ + 'sha1', + 'x509-fingerprint-sha1' +] + +sha256_query_input_type = [ + 'sha256', + 'x509-fingerprint-sha256' +] + +sha512_query_input_type = [ + 'sha512' +] + +misperrors = { + 'error': 'Error' +} +mispattributes = { + 'input': ip_query_input_type + domain_query_input_type + email_query_input_type + phone_query_input_type + + md5_query_input_type + sha1_query_input_type + sha256_query_input_type + sha512_query_input_type, + 'format': 'misp_standard' +} + +moduleinfo = { + 'version': '0.1', + 'author': 'Mike Champ', + 'description': '', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ['apikey'] +TIMEOUT = 60 +logger = logging.getLogger('hyasinsight') +logger.setLevel(logging.DEBUG) +HYAS_API_BASE_URL = 'https://insight.hyas.com/api/ext/' +WHOIS_CURRENT_BASE_URL = 'https://api.hyas.com/' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value +IPV4_REGEX = r'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b([^\/]|$)' +IPV6_REGEX = r'\b(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:(?:(:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\b' # noqa: E501 +# Enrichment Types +# HYAS API endpoints +PASSIVE_DNS_ENDPOINT = 'passivedns' +DYNAMIC_DNS_ENDPOINT = 'dynamicdns' +PASSIVE_HASH_ENDPOINT = 'passivehash' +SINKHOLE_ENDPOINT = 'sinkhole' +SSL_CERTIFICATE_ENDPOINT = 'ssl_certificate' +DEVICE_GEO_ENDPOINT = 'device_geo' +WHOIS_HISTORIC_ENDPOINT = 'whois' +WHOIS_CURRENT_ENDPOINT = 'whois/v1' +MALWARE_RECORDS_ENDPOINT = 'sample' +MALWARE_INFORMATION_ENDPOINT = 'sample/information' +C2ATTRIBUTION_ENDPOINT = 'c2attribution' +OPEN_SOURCE_INDICATORS_ENDPOINT = 'os_indicators' + +# HYAS API endpoint params +DOMAIN_PARAM = 'domain' +IP_PARAM = 'ip' +IPV4_PARAM = 'ipv4' +IPV6_PARAM = 'ipv6' +EMAIL_PARAM = 'email' +PHONE_PARAM = 'phone' +MD5_PARAM = 'md5' +SHA256_PARAM = 'sha256' +SHA512_PARAM = 'sha512' +HASH_PARAM = 'hash' +SHA1_PARAM = 'sha1' + +HYAS_IP_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, PASSIVE_HASH_ENDPOINT, SINKHOLE_ENDPOINT, + SSL_CERTIFICATE_ENDPOINT, DEVICE_GEO_ENDPOINT, C2ATTRIBUTION_ENDPOINT] +HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST = [PASSIVE_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, WHOIS_CURRENT_ENDPOINT, + C2ATTRIBUTION_ENDPOINT] +HYAS_EMAIL_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, C2ATTRIBUTION_ENDPOINT] +HYAS_PHONE_ENRICHMENT_ENDPOINTS_LIST = [WHOIS_HISTORIC_ENDPOINT] +HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST = [SSL_CERTIFICATE_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_SHA256_ENRICHMENT_ENDPOINTS_LIST = [C2ATTRIBUTION_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_SHA512_ENRICHMENT_ENDPOINTS_LIST = [MALWARE_INFORMATION_ENDPOINT] +HYAS_MD5_ENRICHMENT_ENDPOINTS_LIST = [MALWARE_RECORDS_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] + +HYAS_OBJECT_NAMES = { + DYNAMIC_DNS_ENDPOINT: "Dynamic DNS Information", + PASSIVE_HASH_ENDPOINT: "Passive Hash Information", + SINKHOLE_ENDPOINT: "Sinkhole Information", + SSL_CERTIFICATE_ENDPOINT: "SSL Certificate Information", + DEVICE_GEO_ENDPOINT: "Mobile Geolocation Information", + C2ATTRIBUTION_ENDPOINT: "C2 Attribution Information", + PASSIVE_DNS_ENDPOINT: "Passive DNS Information", + WHOIS_HISTORIC_ENDPOINT: "Whois Related Information", + WHOIS_CURRENT_ENDPOINT: "Whois Current Related Information", + MALWARE_INFORMATION_ENDPOINT: "Malware Sample Information", + OPEN_SOURCE_INDICATORS_ENDPOINT: "Open Source Intel for malware, ssl certificates and other indicators Information", + MALWARE_RECORDS_ENDPOINT: "Malware Sample Records Information" +} + + +def parse_attribute(comment, feature, value): + """Generic Method for parsing the attributes in the object""" + attribute = { + 'type': 'text', + 'value': value, + 'comment': comment, + 'distribution': DEFAULT_DISTRIBUTION_SETTING, + 'object_relation': feature + } + return attribute + + +def misp_object(endpoint, attribute_value): + object_name = HYAS_OBJECT_NAMES[endpoint] + hyas_object = MISPObject(object_name) + hyas_object.distribution = DEFAULT_DISTRIBUTION_SETTING + hyas_object.template_uuid = "d69d3d15-7b4d-49b1-9e0a-bb29f3d421d9" + hyas_object.template_id = "1" + hyas_object.description = "HYAS INSIGHT " + object_name + hyas_object.comment = "HYAS INSIGHT " + object_name + " for " + attribute_value + setattr(hyas_object, 'meta-category', 'network') + description = ( + "An object containing the enriched attribute and " + "related entities from HYAS Insight." + ) + hyas_object.from_dict( + **{"meta-category": "misc", "description": description, + "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + return hyas_object + + +def flatten_json(y: Dict) -> Dict[str, Any]: + """ + :param y: raw_response from HYAS api + :return: Flatten json response + """ + out = {} + + def flatten(x, name=''): + # If the Nested key-value + # pair is of dict type + if type(x) is dict: + for a in x: + flatten(x[a], name + a + '_') + else: + out[name[:-1]] = x + + flatten(y) + return out + + +def get_flatten_json_response(raw_api_response: List[Dict]) -> List[Dict]: + """ + :param raw_api_response: raw_api response from the API + :return: Flatten Json response + """ + flatten_json_response = [] + if raw_api_response: + for obj in raw_api_response: + flatten_json_response.append(flatten_json(obj)) + + return flatten_json_response + + +def request_body(query_input, query_param, current): + """ + This Method returns the request body for specific endpoint. + """ + + if current: + return { + "applied_filters": { + query_input: query_param, + "current": True + } + } + else: + return { + "applied_filters": { + query_input: query_param + } + } + + +class RequestHandler: + """A class for handling any outbound requests from this module.""" + + def __init__(self, apikey): + self.session = requests.Session() + self.api_key = apikey + + def get(self, url: str, headers: dict = None, req_body=None) -> requests.Response: + """General post method to fetch the response from HYAS Insight.""" + response = [] + try: + response = self.session.post( + url, headers=headers, json=req_body + ) + if response: + response = response.json() + except (ConnectTimeout, ProxyError, InvalidURL) as error: + msg = "Error connecting with the HYAS Insight." + logger.error(f"{msg} Error: {error}") + misperrors["error"] = msg + return response + + def hyas_lookup(self, end_point: str, query_input, query_param, current=False) -> requests.Response: + """Do a lookup call.""" + # Building the request + if current: + url = f'{WHOIS_CURRENT_BASE_URL}{WHOIS_CURRENT_ENDPOINT}' + else: + url = f'{HYAS_API_BASE_URL}{end_point}' + headers = { + 'Content-type': 'application/json', + 'X-API-Key': self.api_key, + } + req_body = request_body(query_input, query_param, current) + try: + response = self.get(url, headers, req_body) + except HTTPError as error: + msg = f"Error when requesting data from HYAS Insight. {error.response}: {error.response.reason}" + logger.error(msg) + misperrors["error"] = msg + raise + return response + + +class HyasInsightParser: + """A class for handling the enrichment objects""" + + def __init__(self, attribute): + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + self.c2_attribution_data_items = [ + 'actor_ipv4', + 'c2_domain', + 'c2_ipv4', + 'c2_url', + 'datetime', + 'email', + 'email_domain', + 'referrer_domain', + 'referrer_ipv4', + 'referrer_url', + 'sha256' + ] + self.c2_attribution_data_items_friendly_names = { + 'actor_ipv4': 'Actor IPv4', + 'c2_domain': 'C2 Domain', + 'c2_ipv4': 'C2 IPv4', + 'c2_url': 'C2 URL', + 'datetime': 'DateTime', + 'email': 'Email', + 'email_domain': 'Email Domain', + 'referrer_domain': 'Referrer Domain', + 'referrer_ipv4': 'Referrer IPv4', + 'referrer_url': 'Referrer URL', + 'sha256': 'SHA256' + } + + self.device_geo_data_items = [ + 'datetime', + 'device_user_agent', + 'geo_country_alpha_2', + 'geo_horizontal_accuracy', + 'ipv4', + 'ipv6', + 'latitude', + 'longitude', + 'wifi_bssid' + ] + + self.device_geo_data_items_friendly_names = { + 'datetime': 'DateTime', + 'device_user_agent': 'Device User Agent', + 'geo_country_alpha_2': 'Alpha-2 Code', + 'geo_horizontal_accuracy': 'GPS Horizontal Accuracy', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'latitude': 'Latitude', + 'longitude': 'Longitude', + 'wifi_bssid': 'WIFI BSSID' + } + + self.dynamic_dns_data_items = [ + 'a_record', + 'account', + 'created', + 'created_ip', + 'domain', + 'domain_creator_ip', + 'email', + ] + + self.dynamic_dns_data_items_friendly_names = { + 'a_record': 'A Record', + 'account': 'Account Holder', + 'created': 'Created Date', + 'created_ip': 'Account Holder IP Address', + 'domain': 'Domain', + 'domain_creator_ip': 'Domain Creator IP Address', + 'email': 'Email Address', + } + + self.os_indicators_data_items = [ + 'context', + 'datetime', + 'domain', + 'domain_2tld', + 'first_seen', + 'ipv4', + 'ipv6', + 'last_seen', + 'md5', + 'sha1', + 'sha256', + 'source_name', + 'source_url', + 'url' + ] + + self.os_indicators_data_items_friendly_names = { + 'context': 'Context', + 'datetime': 'DateTime', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2TLD', + 'first_seen': 'First Seen', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'last_seen': 'Last Seen', + 'md5': 'MD5', + 'sha1': 'SHA1', + 'sha256': 'SHA256', + 'source_name': 'Source Name', + 'source_url': 'Source URL', + 'url': 'URL' + } + + self.passive_dns_data_items = [ + 'cert_name', + 'count', + 'domain', + 'first_seen', + 'ip_geo_city_name', + 'ip_geo_country_iso_code', + 'ip_geo_country_name', + 'ip_geo_location_latitude', + 'ip_geo_location_longitude', + 'ip_geo_postal_code', + 'ip_ip', + 'ip_isp_autonomous_system_number', + 'ip_isp_autonomous_system_organization', + 'ip_isp_ip_address' + 'ip_isp_isp', + 'ip_isp_organization', + 'ipv4', + 'ipv6', + 'last_seen' + ] + + self.passive_dns_data_items_friendly_names = { + 'cert_name': 'Certificate Provider Name', + 'count': 'Passive DNS Count', + 'domain': 'Domain', + 'first_seen': 'First Seen', + 'ip_geo_city_name': 'IP Organization City', + 'ip_geo_country_iso_code': 'IP Organization Country ISO Code', + 'ip_geo_country_name': 'IP Organization Country Name', + 'ip_geo_location_latitude': 'IP Organization Latitude', + 'ip_geo_location_longitude': 'IP Organization Longitude', + 'ip_geo_postal_code': 'IP Organization Postal Code', + 'ip_ip': 'IP Address', + 'ip_isp_autonomous_system_number': 'ASN IP', + 'ip_isp_autonomous_system_organization': 'ASO IP', + 'ip_isp_ip_address': 'IP Address', + 'ip_isp_isp': 'ISP', + 'ip_isp_organization': 'ISP Organization', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'last_seen': 'Last Seen' + } + + self.passive_hash_data_items = [ + 'domain', + 'md5_count' + ] + + self.passive_hash_data_items_friendly_names = { + 'domain': 'Domain', + 'md5_count': 'Passive DNS Count' + } + + self.malware_records_data_items = [ + 'datetime', + 'domain', + 'ipv4', + 'ipv6', + 'md5', + 'sha1', + 'sha256' + ] + + self.malware_records_data_items_friendly_names = { + 'datetime': 'DateTime', + 'domain': 'Domain', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'md5': 'MD5', + 'sha1': 'SHA1', + 'sha256': 'SHA256' + } + + self.malware_information_data_items = [ + 'avscan_score', + 'md5', + 'av_name', + 'def_time', + 'threat_found', + 'scan_time', + 'sha1', + 'sha256', + 'sha512' + ] + + self.malware_information_data_items_friendly_names = { + 'avscan_score': 'AV Scan Score', + 'md5': 'MD5', + 'av_name': 'AV Name', + 'def_time': 'AV DateTime', + 'threat_found': 'Source', + 'scan_time': 'Scan DateTime', + 'sha1': 'SHA1', + 'sha256': 'SHA256', + 'sha512': 'SHA512' + } + + self.sinkhole_data_items = [ + 'count', + 'country_name', + 'data_port', + 'datetime', + 'ipv4', + 'last_seen', + 'organization_name', + 'sink_source' + ] + + self.sinkhole_data_items_friendly_names = { + 'count': 'Sinkhole Count', + 'country_name': 'IP Address Country', + 'data_port': 'Data Port', + 'datetime': 'First Seen', + 'ipv4': 'IP Address', + 'last_seen': 'Last Seen', + 'organization_name': 'ISP Organization', + 'sink_source': 'Sink Source IP' + } + + self.ssl_certificate_data_items = [ + 'ip', + 'ssl_cert_cert_key', + 'ssl_cert_expire_date', + 'ssl_cert_issue_date', + 'ssl_cert_issuer_commonName', + 'ssl_cert_issuer_countryName', + 'ssl_cert_issuer_localityName', + 'ssl_cert_issuer_organizationName', + 'ssl_cert_issuer_organizationalUnitName', + 'ssl_cert_issuer_stateOrProvinceName', + 'ssl_cert_md5', + 'ssl_cert_serial_number', + 'ssl_cert_sha1', + 'ssl_cert_sha_256', + 'ssl_cert_sig_algo', + 'ssl_cert_ssl_version', + 'ssl_cert_subject_commonName', + 'ssl_cert_subject_countryName', + 'ssl_cert_subject_localityName', + 'ssl_cert_subject_organizationName', + 'ssl_cert_subject_organizationalUnitName', + 'ssl_cert_timestamp' + ] + + self.ssl_certificate_data_items_friendly_names = { + 'ip': 'IP Address', + 'ssl_cert_cert_key': 'Certificate Key', + 'ssl_cert_expire_date': 'Certificate Expiration Date', + 'ssl_cert_issue_date': 'Certificate Issue Date', + 'ssl_cert_issuer_commonName': 'Issuer Common Name', + 'ssl_cert_issuer_countryName': 'Issuer Country Name', + 'ssl_cert_issuer_localityName': 'Issuer City Name', + 'ssl_cert_issuer_organizationName': 'Issuer Organization Name', + 'ssl_cert_issuer_organizationalUnitName': 'Issuer Organization Unit Name', + 'ssl_cert_issuer_stateOrProvinceName': 'Issuer State or Province Name', + 'ssl_cert_md5': 'Certificate MD5', + 'ssl_cert_serial_number': 'Certificate Serial Number', + 'ssl_cert_sha1': 'Certificate SHA1', + 'ssl_cert_sha_256': 'Certificate SHA256', + 'ssl_cert_sig_algo': 'Certificate Signature Algorith', + 'ssl_cert_ssl_version': 'SSL Version', + 'ssl_cert_subject_commonName': 'Reciever Subject Name', + 'ssl_cert_subject_countryName': 'Receiver Country Name', + 'ssl_cert_subject_localityName': 'Receiver City Name', + 'ssl_cert_subject_organizationName': 'Receiver Organization Name', + 'ssl_cert_subject_organizationalUnitName': 'Receiver Organization Unit Name', + 'ssl_cert_timestamp': 'Certificate DateTime' + } + + self.whois_historic_data_items = [ + 'address', + 'city', + 'country', + 'domain', + 'domain_2tld', + 'domain_created_datetime', + 'domain_expires_datetime', + 'domain_updated_datetime', + 'email', + 'idn_name', + 'nameserver', + 'phone', + 'privacy_punch', + 'registrar' + ] + + self.whois_historic_data_items_friendly_names = { + 'address': 'Address', + 'city': 'City', + 'country': 'Country', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2tld', + 'domain_created_datetime': 'Domain Created Time', + 'domain_expires_datetime': 'Domain Expires Time', + 'domain_updated_datetime': 'Domain Updated Time', + 'email': 'Email Address', + 'idn_name': 'IDN Name', + 'nameserver': 'Nameserver', + 'phone': 'Phone Info', + 'privacy_punch': 'Privacy Punch', + 'registrar': 'Registrar' + } + + self.whois_current_data_items = [ + 'abuse_emails', + 'address', + 'city', + 'country', + 'domain', + 'domain_2tld', + 'domain_created_datetime', + 'domain_expires_datetime', + 'domain_updated_datetime', + 'email', + 'idn_name', + 'nameserver', + 'organization', + 'phone', + 'registrar', + 'state' + ] + + self.whois_current_data_items_friendly_names = { + 'abuse_emails': 'Abuse Emails', + 'address': 'Address', + 'city': 'City', + 'country': 'Country', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2tld', + 'domain_created_datetime': 'Domain Created Time', + 'domain_expires_datetime': 'Domain Expires Time', + 'domain_updated_datetime': 'Domain Updated Time', + 'email': 'Email Address', + 'idn_name': 'IDN Name', + 'nameserver': 'Nameserver', + 'organization': 'Organization', + 'phone': 'Phone Info', + 'registrar': 'Registrar', + 'state': 'State' + } + + def create_misp_attributes_and_objects(self, response, endpoint, attribute_value): + flatten_json_response = get_flatten_json_response(response) + data_items: List[str] = [] + data_items_friendly_names: Dict[str, str] = {} + if endpoint == DEVICE_GEO_ENDPOINT: + data_items: List[str] = self.device_geo_data_items + data_items_friendly_names: Dict[str, str] = self.device_geo_data_items_friendly_names + elif endpoint == DYNAMIC_DNS_ENDPOINT: + data_items: List[str] = self.dynamic_dns_data_items + data_items_friendly_names: Dict[str, str] = self.dynamic_dns_data_items_friendly_names + elif endpoint == PASSIVE_DNS_ENDPOINT: + data_items: List[str] = self.passive_dns_data_items + data_items_friendly_names: Dict[str, str] = self.passive_dns_data_items_friendly_names + elif endpoint == PASSIVE_HASH_ENDPOINT: + data_items: List[str] = self.passive_hash_data_items + data_items_friendly_names: Dict[str, str] = self.passive_hash_data_items_friendly_names + elif endpoint == SINKHOLE_ENDPOINT: + data_items: List[str] = self.sinkhole_data_items + data_items_friendly_names: Dict[str, str] = self.sinkhole_data_items_friendly_names + elif endpoint == WHOIS_HISTORIC_ENDPOINT: + data_items = self.whois_historic_data_items + data_items_friendly_names = self.whois_historic_data_items_friendly_names + elif endpoint == WHOIS_CURRENT_ENDPOINT: + data_items: List[str] = self.whois_current_data_items + data_items_friendly_names: Dict[str, str] = self.whois_current_data_items_friendly_names + elif endpoint == SSL_CERTIFICATE_ENDPOINT: + data_items: List[str] = self.ssl_certificate_data_items + data_items_friendly_names: Dict[str, str] = self.ssl_certificate_data_items_friendly_names + elif endpoint == MALWARE_INFORMATION_ENDPOINT: + data_items: List[str] = self.malware_information_data_items + data_items_friendly_names = self.malware_information_data_items_friendly_names + elif endpoint == MALWARE_RECORDS_ENDPOINT: + data_items: List[str] = self.malware_records_data_items + data_items_friendly_names = self.malware_records_data_items_friendly_names + elif endpoint == OPEN_SOURCE_INDICATORS_ENDPOINT: + data_items: List[str] = self.os_indicators_data_items + data_items_friendly_names = self.os_indicators_data_items_friendly_names + elif endpoint == C2ATTRIBUTION_ENDPOINT: + data_items: List[str] = self.c2_attribution_data_items + data_items_friendly_names = self.c2_attribution_data_items_friendly_names + for result in flatten_json_response: + hyas_object = misp_object(endpoint, attribute_value) + for data_item in result.keys(): + if data_item in data_items: + data_item_text = data_items_friendly_names[data_item] + data_item_value = str(result[data_item]) + hyas_object.add_attribute( + **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) + hyas_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hyas_object) + + def get_results(self): + """returns the dictionary object to MISP Instance""" + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} + + +def handler(q=False): + """The function which accepts a JSON document to expand the values and return a dictionary of the expanded + values. """ + if q is False: + return False + request = json.loads(q) + # check if the apikey is provided + if not request.get('config') or not request['config'].get('apikey'): + misperrors['error'] = 'HYAS Insight apikey is missing' + return misperrors + apikey = request['config'].get('apikey') + # check attribute is added to the event + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + + attribute = request['attribute'] + attribute_type = attribute['type'] + attribute_value = attribute['value'] + + # check if the attribute type is supported by IPQualityScore + if attribute_type not in mispattributes['input']: + return {'error': 'Unsupported attributes type for HYAS Insight Enrichment'} + request_handler = RequestHandler(apikey) + parser = HyasInsightParser(attribute) + has_results = False + if attribute_type in ip_query_input_type: + ip_param = '' + for endpoint in HYAS_IP_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == DEVICE_GEO_ENDPOINT: + if re.match(IPV4_REGEX, attribute_value): + ip_param = IPV4_PARAM + elif re.match(IPV6_REGEX, attribute_value): + ip_param = IPV6_PARAM + elif endpoint == PASSIVE_HASH_ENDPOINT: + ip_param = IPV4_PARAM + elif endpoint == SINKHOLE_ENDPOINT: + ip_param = IPV4_PARAM + else: + ip_param = IP_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, ip_param, attribute_value) + if endpoint == SSL_CERTIFICATE_ENDPOINT: + enrich_response = enrich_response.get('ssl_certs') + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in domain_query_input_type: + for endpoint in HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST: + if not endpoint == WHOIS_CURRENT_ENDPOINT: + enrich_response = request_handler.hyas_lookup(endpoint, DOMAIN_PARAM, attribute_value) + else: + enrich_response = request_handler.hyas_lookup(endpoint, DOMAIN_PARAM, attribute_value, + endpoint == WHOIS_CURRENT_ENDPOINT) + enrich_response = enrich_response.get('items') + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in email_query_input_type: + for endpoint in HYAS_EMAIL_ENRICHMENT_ENDPOINTS_LIST: + enrich_response = request_handler.hyas_lookup(endpoint, EMAIL_PARAM, attribute_value) + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in phone_query_input_type: + for endpoint in HYAS_PHONE_ENRICHMENT_ENDPOINTS_LIST: + enrich_response = request_handler.hyas_lookup(endpoint, PHONE_PARAM, attribute_value) + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in md5_query_input_type: + for endpoint in HYAS_MD5_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + md5_param = HASH_PARAM + else: + md5_param = MD5_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, md5_param, attribute_value) + if endpoint == MALWARE_INFORMATION_ENDPOINT: + if not enrich_response.get("Message"): + enrich_response = enrich_response.get("scan_results") + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha1_query_input_type: + for endpoint in HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST: + enrich_response = request_handler.hyas_lookup(endpoint, SHA1_PARAM, attribute_value) + if endpoint == MALWARE_INFORMATION_ENDPOINT: + if not enrich_response.get("Message"): + enrich_response = enrich_response.get("scan_results") + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha256_query_input_type: + for endpoint in HYAS_SHA256_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + sha256_param = HASH_PARAM + else: + sha256_param = SHA256_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha256_param, attribute_value) + if endpoint == MALWARE_INFORMATION_ENDPOINT: + if not enrich_response.get("Message"): + enrich_response = enrich_response.get("scan_results") + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha512_query_input_type: + for endpoint in HYAS_SHA512_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + sha512_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha512_param, attribute_value) + if endpoint == MALWARE_INFORMATION_ENDPOINT: + if not enrich_response.get("Message"): + enrich_response = enrich_response.get("scan_results") + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + + if has_results: + return parser.get_results() + else: + return {'error': 'No records found in HYAS Insight for the provided attribute.'} + + +def introspection(): + """The function that returns a dict of the supported attributes (input and output) by your expansion module.""" + return mispattributes + + +def version(): + """The function that returns a dict with the version and the associated meta-data including potential + configurations required of the module. """ + moduleinfo['config'] = moduleconfig + return moduleinfo \ No newline at end of file From fcfdd36fd4cfdc1e5c7b4b5d0565828ec0bdb2f2 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:27:38 +0530 Subject: [PATCH 449/476] Added HYAS Insight documentation --- documentation/website/expansion/hyasinsight.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 documentation/website/expansion/hyasinsight.json diff --git a/documentation/website/expansion/hyasinsight.json b/documentation/website/expansion/hyasinsight.json new file mode 100644 index 0000000..9647047 --- /dev/null +++ b/documentation/website/expansion/hyasinsight.json @@ -0,0 +1,12 @@ +{ + "description": "HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure.", + "logo": "hyasinsight.png", + "requirements": [ + "A HYAS Insight API Key." + ], + "input": "A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), Email Address(email, email-src, email-dst, target-email, whois-registrant-email), Phone Number(phone-number, whois-registrant-phone), MDS(md5, x509-fingerprint-md5, ja3-fingerprint-md5, hassh-md5, hasshserver-md5), SHA1(sha1, x509-fingerprint-sha1), SHA256(sha256, x509-fingerprint-sha256), SHA512(sha512)", + "output": "Hyas Insight objects, resulting from the query on the HYAS Insight API.", + "references": [ + "https://www.hyas.com/hyas-insight/" + ], + "features": "This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API.\n The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. \n\nAn API key is required to submit queries to the HYAS Insight API.\n" \ No newline at end of file From 543a8c0aadff7431c3213588f591b531e8efafff Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:47:51 +0530 Subject: [PATCH 450/476] added hyas test case --- tests/test_expansions.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 9f11f8c..0a7bcf7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -263,6 +263,21 @@ class TestExpansions(unittest.TestCase): self.assertEqual(to_check, 'OK (Not Found)', response) else: self.assertEqual(self.get_errors(response), 'Have I Been Pwned authentication is incomplete (no API key)') + + def test_hyasinsight(self): + module_name = "hyasinsight" + query = {"module": module_name, + "attribute": {"type": "phone-number", + "value": "+84853620279", + "uuid": "b698dc2b-94c1-487d-8b65-3114bad5a40c"}, + "config": {}} + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + self.assertEqual(self.get_values(response)['domain'], 'tienichphongnet.com') + else: + response = self.misp_modules_post(query) + self.assertEqual(self.get_errors(response), 'HYAS Insight apikey is missing') def test_greynoise(self): module_name = 'greynoise' @@ -308,6 +323,7 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'IPQualityScore apikey is missing') + def test_macaddess_io(self): module_name = 'macaddress_io' query = {"module": module_name, "mac-address": "44:38:39:ff:ef:57"} From 03af649d06779c6a9bf555ec446ed7e9bcc932c6 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:05:22 +0530 Subject: [PATCH 451/476] fixed lgtm issues --- misp_modules/modules/expansion/hyasinsight.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/hyasinsight.py b/misp_modules/modules/expansion/hyasinsight.py index fd13751..cfd1e20 100644 --- a/misp_modules/modules/expansion/hyasinsight.py +++ b/misp_modules/modules/expansion/hyasinsight.py @@ -11,7 +11,7 @@ from requests.exceptions import ( ConnectTimeout ) from . import check_input_attribute, standard_error_message -from pymisp import MISPEvent, MISPAttribute, MISPObject, MISPTag, Distribution +from pymisp import MISPEvent, MISPObject, Distribution ip_query_input_type = [ 'ip-src', @@ -393,7 +393,7 @@ class HyasInsightParser: 'ip_ip', 'ip_isp_autonomous_system_number', 'ip_isp_autonomous_system_organization', - 'ip_isp_ip_address' + 'ip_isp_ip_address', 'ip_isp_isp', 'ip_isp_organization', 'ipv4', @@ -809,4 +809,4 @@ def version(): """The function that returns a dict with the version and the associated meta-data including potential configurations required of the module. """ moduleinfo['config'] = moduleconfig - return moduleinfo \ No newline at end of file + return moduleinfo From e5c1d75b2fcb6be54d978885c37081b60f9fc5cc Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 6 Sep 2022 14:31:47 +0200 Subject: [PATCH 452/476] chg: [documentation] fix JSON --- documentation/website/expansion/hyasinsight.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/website/expansion/hyasinsight.json b/documentation/website/expansion/hyasinsight.json index 9647047..59e0c8e 100644 --- a/documentation/website/expansion/hyasinsight.json +++ b/documentation/website/expansion/hyasinsight.json @@ -9,4 +9,5 @@ "references": [ "https://www.hyas.com/hyas-insight/" ], - "features": "This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API.\n The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. \n\nAn API key is required to submit queries to the HYAS Insight API.\n" \ No newline at end of file + "features": "This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API.\n The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. \n\nAn API key is required to submit queries to the HYAS Insight API.\n" +} From c3ca851ed6030df73bb7871d7acb41610a11cdb8 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 6 Sep 2022 14:32:06 +0200 Subject: [PATCH 453/476] chg: [tools] add logging for doc generation --- documentation/generate_documentation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/generate_documentation.py b/documentation/generate_documentation.py index 4081e50..8d9116e 100644 --- a/documentation/generate_documentation.py +++ b/documentation/generate_documentation.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os import json +import sys module_types = ['expansion', 'export_mod', 'import_mod'] titles = ['Expansion Modules', 'Export Modules', 'Import Modules'] @@ -17,6 +18,7 @@ def generate_doc(module_type, root_path, logo_path='logos'): githubref = f'{githubpath}/{modulename}.py' markdown.append(f'\n#### [{modulename}]({githubref})\n') filename = os.path.join(current_path, filename) + print(f'Processing {filename}') with open(filename, 'rt') as f: definition = json.loads(f.read()) if 'logo' in definition: From de69ae347456572c515ca38e169f5856372fb154 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 6 Sep 2022 14:35:10 +0200 Subject: [PATCH 454/476] fix: [doc] logo fixed --- documentation/website/expansion/hyasinsight.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/website/expansion/hyasinsight.json b/documentation/website/expansion/hyasinsight.json index 59e0c8e..2762a08 100644 --- a/documentation/website/expansion/hyasinsight.json +++ b/documentation/website/expansion/hyasinsight.json @@ -1,6 +1,6 @@ { "description": "HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure.", - "logo": "hyasinsight.png", + "logo": "hyas.png", "requirements": [ "A HYAS Insight API Key." ], From e10826aafc5e2cc9f52aec0366030f8ce8f88c6b Mon Sep 17 00:00:00 2001 From: szopin Date: Thu, 15 Sep 2022 10:09:21 +0200 Subject: [PATCH 455/476] Fix for hashdd Endpoint has changed, now only accepts md5 and the format of the reply is also different --- misp_modules/modules/expansion/hashdd.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/hashdd.py b/misp_modules/modules/expansion/hashdd.py index 42fc854..17e1029 100755 --- a/misp_modules/modules/expansion/hashdd.py +++ b/misp_modules/modules/expansion/hashdd.py @@ -2,10 +2,10 @@ import json import requests misperrors = {'error': 'Error'} -mispattributes = {'input': ['md5', 'sha1', 'sha256'], 'output': ['text']} +mispattributes = {'input': ['md5'], 'output': ['text']} moduleinfo = {'version': '0.2', 'author': 'Alexandre Dulaunoy', 'description': 'An expansion module to check hashes against hashdd.com including NSLR dataset.', 'module-type': ['hover']} moduleconfig = [] -hashddapi_url = 'https://api.hashdd.com/' +hashddapi_url = 'https://api.hashdd.com/v1/knownlevel/nsrl/' def handler(q=False): @@ -20,10 +20,10 @@ def handler(q=False): if v is None: misperrors['error'] = 'Hash value is missing.' return misperrors - r = requests.post(hashddapi_url, data={'hash': v}) + r = requests.get(hashddapi_url + v) if r.status_code == 200: state = json.loads(r.text) - summary = state[v]['known_level'] if state and state.get(v) else 'Unknown hash' + summary = state['knownlevel'] if state and state['result'] == "SUCCESS" else state['message'] else: misperrors['error'] = '{} API not accessible'.format(hashddapi_url) return misperrors['error'] From 79e067188ec0fe7f6cccb7069ca2d2ba21199ad8 Mon Sep 17 00:00:00 2001 From: szopin Date: Fri, 16 Sep 2022 10:12:46 +0200 Subject: [PATCH 456/476] Fix for ocr import Currently works only for .pdf files, with this .png and .jpg should also work (fixes #512) --- misp_modules/modules/import_mod/ocr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/ocr.py b/misp_modules/modules/import_mod/ocr.py index fef0fd1..2e82cd2 100755 --- a/misp_modules/modules/import_mod/ocr.py +++ b/misp_modules/modules/import_mod/ocr.py @@ -67,7 +67,7 @@ def handler(q=False): image = img.make_blob('png') log.debug("Final image size is {}x{}".format(pdf.width, pdf.height * (p + 1))) else: - image = document + image = base64.b64decode(request["data"]) image_file = BytesIO(image) image_file.seek(0) From 340b9c095446c888065df80fa87b7d503a8c26c8 Mon Sep 17 00:00:00 2001 From: Jeroen Pinoy Date: Tue, 20 Sep 2022 06:05:06 -0700 Subject: [PATCH 457/476] fix: [expansion:apivoid] add missing email attribute input types --- misp_modules/modules/expansion/apivoid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/apivoid.py b/misp_modules/modules/expansion/apivoid.py index 3d29d85..fc0d43e 100755 --- a/misp_modules/modules/expansion/apivoid.py +++ b/misp_modules/modules/expansion/apivoid.py @@ -4,7 +4,7 @@ from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['domain', 'hostname', 'email', 'email-src', 'email-dst'], 'format': 'misp_standard'} +mispattributes = {'input': ['domain', 'hostname', 'email', 'email-src', 'email-dst', 'email-reply-to', 'dns-soa-email', 'target-email', 'whois-registrant-email'], 'format': 'misp_standard'} moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'On demand query API for APIVoid.', 'module-type': ['expansion', 'hover']} From 90c64c68b39d7eac2ac1e5f93f897ab2d0fdcba1 Mon Sep 17 00:00:00 2001 From: Jakub Onderka Date: Wed, 28 Sep 2022 21:33:44 +0200 Subject: [PATCH 458/476] Update REQUIREMENTS --- Pipfile | 4 +- REQUIREMENTS | 245 ++++++++++++++++++++++++++------------------------- 2 files changed, 129 insertions(+), 120 deletions(-) diff --git a/Pipfile b/Pipfile index b7ec209..ddc0201 100644 --- a/Pipfile +++ b/Pipfile @@ -55,7 +55,6 @@ pandas_ods_reader = "==0.1.2" pdftotext = "*" lxml = "*" xlrd = "*" -idna-ssl = { markers = "python_version < '3.7'" } jbxapi = "*" geoip2 = "*" apiosintDS = "*" @@ -73,6 +72,9 @@ crowdstrike-falconpy = "0.9.0" censys = "2.0.9" mwdblib = "3.4.1" ndjson = "0.3.1" +Jinja2 = "3.1.2" +mattermostdriver = "7.3.2" +openpyxl = "*" [requires] python_version = "3.7" diff --git a/REQUIREMENTS b/REQUIREMENTS index 6ad1540..5e17fe3 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -1,174 +1,181 @@ -# -# These requirements were autogenerated by pipenv -# To regenerate from the project's Pipfile, run: -# -# pipenv lock --requirements -# - -i https://pypi.org/simple -. -aiohttp==3.8.1 -aiosignal==1.2.0; python_version >= '3.6' -antlr4-python3-runtime==4.9.3; python_version >= '3' +aiohttp==3.8.3 +aiosignal==1.2.0 ; python_version >= '3.6' +antlr4-python3-runtime==4.9.3 +anyio==3.6.1 ; python_full_version >= '3.6.2' apiosintds==1.8.3 appdirs==1.4.4 argparse==1.4.0 -assemblyline-client==4.3.5 -async-timeout==4.0.2; python_version >= '3.6' -asynctest==0.13.0; python_version < '3.8' -attrs==21.4.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -backoff==1.11.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -backports.zoneinfo==0.2.1; python_version < '3.9' +assemblyline-client==4.5.0 +async-timeout==4.0.2 ; python_version >= '3.6' +asynctest==0.13.0 ; python_version < '3.8' +attrs==22.1.0 ; python_version >= '3.5' +backoff==2.1.2 ; python_version >= '3.7' and python_version < '4.0' +backports.zoneinfo==0.2.1 ; python_version < '3.9' backscatter==0.2.4 beautifulsoup4==4.11.1 -bidict==0.22.0; python_version >= '3.7' +bidict==0.22.0 ; python_version >= '3.7' blockchain==1.4.4 -censys==2.1.3 -certifi==2021.10.8 -cffi==1.15.0 -chardet==4.0.0 -charset-normalizer==2.0.12; python_version >= '3' +censys==2.1.8 +certifi==2022.9.24 ; python_version >= '3.6' +cffi==1.15.1 +chardet==5.0.0 +charset-normalizer==2.1.1 ; python_full_version >= '3.6.0' clamd==1.0.2 +click==8.1.3 ; python_version >= '3.7' click-plugins==1.1.1 -click==8.1.2; python_version >= '3.7' -colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -colorclass==2.2.2; python_version >= '2.6' +colorama==0.4.5 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +colorclass==2.2.2 ; python_version >= '2.6' commonmark==0.9.1 compressed-rtf==1.0.6 -configparser==5.2.0; python_version >= '3.6' -crowdstrike-falconpy==1.0.8 -cryptography==36.0.2; python_version >= '3.6' -decorator==5.1.1; python_version >= '3.5' -deprecated==1.2.13; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +configparser==5.3.0 ; python_version >= '3.7' +crowdstrike-falconpy==1.2.2 +cryptography==38.0.1 ; python_version >= '3.6' +dateparser==1.1.1 ; python_version >= '3.5' +decorator==5.1.1 ; python_version >= '3.5' +deprecated==1.2.13 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' dnsdb2==1.1.4 dnspython==2.2.1 -domaintools-api==0.6.2 +domaintools-api==1.0.1 easygui==0.98.3 ebcdic==1.1.1 enum-compat==0.0.3 -extract-msg==0.30.10 +et-xmlfile==1.1.0 ; python_version >= '3.6' +extract-msg==0.36.3 ezodf==0.3.2 -filelock==3.6.0; python_version >= '3.7' -frozenlist==1.3.0; python_version >= '3.7' -future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -geoip2==4.5.0 -git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client -git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client -git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 -git+https://github.com/SteveClement/trustar-python.git@6954eae38e0c77eaeef26084b6c5fd033925c1c7#egg=trustar -git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader -git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails -git+https://github.com/sebdraven/pyonyphe@49381beb41c61c90d8997ad2d04868977411bbcc#egg=pyonyphe -httplib2==0.20.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -idna-ssl==1.1.0; python_version < '3.7' -idna==3.3; python_version >= '3' -imapclient==2.2.0 -importlib-metadata==4.11.3; python_version < '3.8' -importlib-resources==5.6.0; python_version < '3.9' +filelock==3.8.0 ; python_version >= '3.7' +frozenlist==1.3.1 ; python_version >= '3.7' +future==0.18.2 ; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +geoip2==4.6.0 +h11==0.12.0 ; python_version >= '3.6' +httpcore==0.15.0 ; python_version >= '3.7' +httplib2==0.20.4 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +httpx==0.23.0 ; python_version >= '3.7' +idna==3.4 ; python_version >= '3.5' +imapclient==2.3.1 +importlib-metadata==4.12.0 ; python_version < '3.8' +importlib-resources==5.9.0 ; python_version < '3.9' isodate==0.6.1 -itsdangerous==2.1.2; python_version >= '3.7' -jbxapi==3.17.2 -jeepney==0.8.0; sys_platform == 'linux' +itsdangerous==2.1.2 ; python_version >= '3.7' +jaraco.classes==3.2.3 ; python_version >= '3.7' +jbxapi==3.18.0 +jeepney==0.8.0 ; sys_platform == 'linux' +jinja2==3.1.2 json-log-formatter==0.5.1 -jsonschema<5.0.0, >=4.5.1; python_version >= '3.7' -Jinja2==3.1.2 -keyring==23.5.0; python_version >= '3.7' +jsonschema==4.16.0 ; python_version >= '3.7' +keyring==23.9.3 ; python_version >= '3.7' lark-parser==0.12.0 -lief<0.12.0, >=0.11.5 -lxml==4.8.0 +lief==0.12.1 +lxml==4.9.1 maclookup==1.0.3 markdownify==0.5.3 -maxminddb==2.2.0; python_version >= '3.6' +markupsafe==2.1.1 ; python_version >= '3.7' mattermostdriver==7.3.2 -more-itertools==8.12.0; python_version >= '3.5' -msoffcrypto-tool==5.0.0; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') -multidict==6.0.2; python_version >= '3.7' -mwdblib==4.1.0 +maxminddb==2.2.0 ; python_version >= '3.6' +. +more-itertools==8.14.0 ; python_version >= '3.5' +msoffcrypto-tool==5.0.0 ; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') +multidict==6.0.2 ; python_version >= '3.7' +mwdblib==4.3.1 ndjson==0.3.1 np==1.0.2 -numpy==1.21.5; python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64' +numpy==1.21.6 ; python_version < '3.10' and platform_machine == 'aarch64' oauth2==1.9.0.post1 -olefile==0.46; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -oletools>=0.60 -opencv-python==4.5.5.64 -packaging==21.3; python_version >= '3.6' -pandas-ods-reader==0.1.2 +git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader +olefile==0.46 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +oletools==0.60.1 +opencv-python==4.6.0.66 +openpyxl==3.0.10 +packaging==21.3 ; python_version >= '3.6' pandas==1.3.5 +pandas-ods-reader==0.1.2 passivetotal==2.5.9 pcodedmp==1.2.6 pdftotext==2.2.2 -pillow==9.1.0 -progressbar2==4.0.0; python_version >= '3.7' -psutil==5.9.0; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pillow==9.2.0 +pkgutil-resolve-name==1.3.10 ; python_version < '3.9' +progressbar2==4.0.0 ; python_full_version >= '3.7.0' +psutil==5.9.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +publicsuffixlist==0.8.0 ; python_version >= '2.6' +git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client pycparser==2.21 -pycryptodome==3.14.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -pycryptodomex==3.14.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodome==3.15.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodomex==3.15.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' pydeep2==0.5.1 +git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails pyeupi==1.1 pyfaup==1.2 pygeoip==0.3.2 -pygments==2.11.2; python_version >= '3.5' -pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.157 -pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pygments==2.13.0 ; python_version >= '3.6' +git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 +git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client +pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.162 +git+https://github.com/sebdraven/pyonyphe@d1d6741f8ea4475f3bb77ff20c876f08839cabd1#egg=pyonyphe +pyparsing==2.4.7 ; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' pypdns==1.5.2 pypssl==2.2 -pyrsistent==0.18.1; python_version >= '3.7' -pytesseract==0.3.9 +pyrsistent==0.18.1 ; python_version >= '3.7' +pytesseract==0.3.10 python-baseconv==1.2.2 -python-dateutil==2.8.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +python-dateutil==2.8.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-docx==0.8.11 -python-engineio==4.3.1; python_version >= '3.6' -python-magic==0.4.25 +python-engineio==4.3.4 ; python_version >= '3.6' +python-magic==0.4.27 python-pptx==0.6.21 -python-socketio[client]==5.5.2; python_version >= '3.6' -python-utils==3.1.0; python_version >= '3.7' -pytz-deprecation-shim==0.1.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +python-socketio[client]==5.7.1 ; python_version >= '3.6' +python-utils==3.3.3 ; python_version >= '3.7' pytz==2019.3 -pyyaml==6.0; python_version >= '3.6' +pytz-deprecation-shim==0.1.0.post0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +pyyaml==6.0 ; python_version >= '3.6' pyzbar==0.1.9 -pyzipper==0.3.5; python_version >= '3.5' -rdflib==6.1.1; python_version >= '3.7' -redis==4.2.2; python_version >= '3.6' -reportlab==3.6.9 -requests-cache==0.6.4; python_version >= '3.6' +pyzipper==0.3.6 ; python_version >= '3.5' +rdflib==6.2.0 ; python_version >= '3.7' +redis==4.3.4 ; python_version >= '3.6' +regex==2022.3.2 ; python_version >= '3.6' +reportlab==3.6.11 +requests==2.28.1 +requests-cache==0.6.4 ; python_version >= '3.6' requests-file==1.5.1 -requests[security]==2.27.1 -rich==12.2.0; python_version < '4.0' and python_full_version >= '3.6.3' +rfc3986[idna2008]==1.5.0 +rich==12.5.1 ; python_full_version >= '3.6.3' and python_full_version < '4.0.0' rtfde==0.0.2 -secretstorage==3.3.1; sys_platform == 'linux' -setuptools==62.1.0; python_version >= '3.7' -shodan==1.27.0 +secretstorage==3.3.3 ; sys_platform == 'linux' +setuptools==65.4.0 ; python_version >= '3.7' +shodan==1.28.0 sigmatools==0.19.1 -simplejson==3.17.6; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' -six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +simplejson==3.17.6 ; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' +six==1.16.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +sniffio==1.3.0 ; python_version >= '3.7' socialscan==1.4.2 socketio-client==0.5.7.4 -soupsieve==2.3.2; python_version >= '3.6' +soupsieve==2.3.2.post1 ; python_version >= '3.6' sparqlwrapper==2.0.0 -stix2-patterns==2.0.0 stix2==3.0.1 -tabulate==0.8.9 -tau-clients==0.2.5 +stix2-patterns==2.0.0 +tabulate==0.8.10 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +tau-clients==0.2.9 taxii2-client==2.3.0 -tldextract==3.2.0; python_version >= '3.7' -tornado==6.1; python_version >= '3.5' -tqdm==4.64.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -typing-extensions==4.1.1; python_version < '3.8' -tzdata==2022.1; python_version >= '3.6' -tzlocal==4.2; python_version >= '3.6' +tldextract==3.3.1 ; python_version >= '3.7' +tornado==6.2 ; python_version >= '3.7' +tqdm==4.64.1 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +git+https://github.com/SteveClement/trustar-python.git@6954eae38e0c77eaeef26084b6c5fd033925c1c7#egg=trustar +typing-extensions==4.3.0 ; python_version < '3.8' +tzdata==2022.4 ; python_version >= '3.6' +tzlocal==4.2 ; python_version >= '3.6' unicodecsv==0.14.1 -url-normalize==1.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +url-normalize==1.4.3 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.26.9; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0' +urllib3==1.26.12 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4' validators==0.14.0 -vt-graph-api==2.0.0 -vt-py==0.14.0 -vulners==2.0.2 -wand==0.6.7 -websocket-client==1.3.2; python_version >= '3.7' -wrapt==1.14.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +vt-graph-api==2.2.0 +vt-py==0.17.0 +vulners==2.0.4 +wand==0.6.10 +websocket-client==1.4.1 ; python_version >= '3.7' +websockets==10.3 ; python_version >= '3.7' +wrapt==1.14.1 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' xlrd==2.0.1 -xlsxwriter==3.0.3; python_version >= '3.4' +xlsxwriter==3.0.3 ; python_version >= '3.4' yara-python==3.8.1 -yarl==1.7.2; python_version >= '3.6' -zipp==3.8.0; python_version >= '3.7' +yarl==1.8.1 ; python_version >= '3.7' +zipp==3.8.1 ; python_version >= '3.7' From ce3918ddba2240309ae63feb50a68d98dabc4884 Mon Sep 17 00:00:00 2001 From: Nik Mohamad Aizuddin Date: Tue, 4 Oct 2022 13:03:41 +0800 Subject: [PATCH 459/476] fix(REQUIREMENTS): bump `vt-py` to `0.17.1` due to `0.17.0` is no longer exists --- REQUIREMENTS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 5e17fe3..fcdb0a5 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -168,7 +168,7 @@ urlarchiver==0.2 urllib3==1.26.12 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4' validators==0.14.0 vt-graph-api==2.2.0 -vt-py==0.17.0 +vt-py==0.17.1 vulners==2.0.4 wand==0.6.10 websocket-client==1.4.1 ; python_version >= '3.7' From 66eb82cf1a6d5dc886c759761b501663f8c75550 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 11 Oct 2022 08:24:53 +0530 Subject: [PATCH 460/476] Added few more endpoints --- misp_modules/modules/expansion/hyasinsight.py | 130 +++++++++++++----- 1 file changed, 97 insertions(+), 33 deletions(-) diff --git a/misp_modules/modules/expansion/hyasinsight.py b/misp_modules/modules/expansion/hyasinsight.py index cfd1e20..031ca1a 100644 --- a/misp_modules/modules/expansion/hyasinsight.py +++ b/misp_modules/modules/expansion/hyasinsight.py @@ -107,10 +107,14 @@ SHA512_PARAM = 'sha512' HASH_PARAM = 'hash' SHA1_PARAM = 'sha1' -HYAS_IP_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, PASSIVE_HASH_ENDPOINT, SINKHOLE_ENDPOINT, - SSL_CERTIFICATE_ENDPOINT, DEVICE_GEO_ENDPOINT, C2ATTRIBUTION_ENDPOINT] -HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST = [PASSIVE_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, WHOIS_CURRENT_ENDPOINT, - C2ATTRIBUTION_ENDPOINT] +HYAS_IP_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, PASSIVE_DNS_ENDPOINT, PASSIVE_HASH_ENDPOINT, + SINKHOLE_ENDPOINT, + SSL_CERTIFICATE_ENDPOINT, DEVICE_GEO_ENDPOINT, C2ATTRIBUTION_ENDPOINT, + MALWARE_RECORDS_ENDPOINT, OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST = [PASSIVE_DNS_ENDPOINT, DYNAMIC_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, + MALWARE_RECORDS_ENDPOINT, WHOIS_CURRENT_ENDPOINT, PASSIVE_HASH_ENDPOINT, + C2ATTRIBUTION_ENDPOINT, SSL_CERTIFICATE_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] HYAS_EMAIL_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, C2ATTRIBUTION_ENDPOINT] HYAS_PHONE_ENRICHMENT_ENDPOINTS_LIST = [WHOIS_HISTORIC_ENDPOINT] HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST = [SSL_CERTIFICATE_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, @@ -222,6 +226,43 @@ def request_body(query_input, query_param, current): } +def malware_info_lookup_to_markdown(results: Dict) -> list: + scan_results = results.get('scan_results', []) + out = [] + if scan_results: + for res in scan_results: + malware_info_data = { + "avscan_score": results.get( + "avscan_score", ''), + "md5": results.get("md5", ''), + 'av_name': res.get( + "av_name", ''), + 'def_time': res.get( + "def_time", ''), + 'threat_found': res.get( + 'threat_found', ''), + 'scan_time': results.get("scan_time", ''), + 'sha1': results.get('sha1', ''), + 'sha256': results.get('sha256', ''), + 'sha512': results.get('sha512', '') + } + out.append(malware_info_data) + else: + malware_info_data = { + "avscan_score": results.get("avscan_score", ''), + "md5": results.get("md5", ''), + 'av_name': '', + 'def_time': '', + 'threat_found': '', + 'scan_time': results.get("scan_time", ''), + 'sha1': results.get('sha1', ''), + 'sha256': results.get('sha256', ''), + 'sha512': results.get('sha512', '') + } + out.append(malware_info_data) + return out + + class RequestHandler: """A class for handling any outbound requests from this module.""" @@ -277,7 +318,7 @@ class HyasInsightParser: self.c2_attribution_data_items = [ 'actor_ipv4', 'c2_domain', - 'c2_ipv4', + 'c2_ip', 'c2_url', 'datetime', 'email', @@ -290,7 +331,7 @@ class HyasInsightParser: self.c2_attribution_data_items_friendly_names = { 'actor_ipv4': 'Actor IPv4', 'c2_domain': 'C2 Domain', - 'c2_ipv4': 'C2 IPv4', + 'c2_ip': 'C2 IP', 'c2_url': 'C2 URL', 'datetime': 'DateTime', 'email': 'Email', @@ -480,6 +521,7 @@ class HyasInsightParser: self.sinkhole_data_items = [ 'count', 'country_name', + 'country_code', 'data_port', 'datetime', 'ipv4', @@ -491,6 +533,7 @@ class HyasInsightParser: self.sinkhole_data_items_friendly_names = { 'count': 'Sinkhole Count', 'country_name': 'IP Address Country', + 'country_code': 'IP Address Country Code', 'data_port': 'Data Port', 'datetime': 'First Seen', 'ipv4': 'IP Address', @@ -539,7 +582,7 @@ class HyasInsightParser: 'ssl_cert_serial_number': 'Certificate Serial Number', 'ssl_cert_sha1': 'Certificate SHA1', 'ssl_cert_sha_256': 'Certificate SHA256', - 'ssl_cert_sig_algo': 'Certificate Signature Algorith', + 'ssl_cert_sig_algo': 'Certificate Signature Algorithm', 'ssl_cert_ssl_version': 'SSL Version', 'ssl_cert_subject_commonName': 'Reciever Subject Name', 'ssl_cert_subject_countryName': 'Receiver Country Name', @@ -550,9 +593,11 @@ class HyasInsightParser: } self.whois_historic_data_items = [ + 'abuse_emails', 'address', 'city', 'country', + 'datetime', 'domain', 'domain_2tld', 'domain_created_datetime', @@ -560,16 +605,20 @@ class HyasInsightParser: 'domain_updated_datetime', 'email', 'idn_name', + 'name', 'nameserver', + 'organization', 'phone', 'privacy_punch', 'registrar' ] self.whois_historic_data_items_friendly_names = { + 'abuse_emails': 'Abuse Emails', 'address': 'Address', 'city': 'City', 'country': 'Country', + 'datetime': 'Datetime', 'domain': 'Domain', 'domain_2tld': 'Domain 2tld', 'domain_created_datetime': 'Domain Created Time', @@ -577,7 +626,9 @@ class HyasInsightParser: 'domain_updated_datetime': 'Domain Updated Time', 'email': 'Email Address', 'idn_name': 'IDN Name', + 'name': 'Name', 'nameserver': 'Nameserver', + 'organization': 'Organization', 'phone': 'Phone Info', 'privacy_punch': 'Privacy Punch', 'registrar': 'Registrar' @@ -588,6 +639,7 @@ class HyasInsightParser: 'address', 'city', 'country', + 'datetime', 'domain', 'domain_2tld', 'domain_created_datetime', @@ -595,9 +647,11 @@ class HyasInsightParser: 'domain_updated_datetime', 'email', 'idn_name', + 'name', 'nameserver', 'organization', 'phone', + 'privacy_punch', 'registrar', 'state' ] @@ -607,6 +661,7 @@ class HyasInsightParser: 'address': 'Address', 'city': 'City', 'country': 'Country', + 'datetime': 'Datetime', 'domain': 'Domain', 'domain_2tld': 'Domain 2tld', 'domain_created_datetime': 'Domain Created Time', @@ -614,9 +669,11 @@ class HyasInsightParser: 'domain_updated_datetime': 'Domain Updated Time', 'email': 'Email Address', 'idn_name': 'IDN Name', + 'name': 'Name', 'nameserver': 'Nameserver', 'organization': 'Organization', - 'phone': 'Phone Info', + 'phone': 'Phone', + 'privacy_punch': 'Privacy Punch', 'registrar': 'Registrar', 'state': 'State' } @@ -661,16 +718,20 @@ class HyasInsightParser: elif endpoint == C2ATTRIBUTION_ENDPOINT: data_items: List[str] = self.c2_attribution_data_items data_items_friendly_names = self.c2_attribution_data_items_friendly_names + + loop = 1 for result in flatten_json_response: - hyas_object = misp_object(endpoint, attribute_value) - for data_item in result.keys(): - if data_item in data_items: - data_item_text = data_items_friendly_names[data_item] - data_item_value = str(result[data_item]) - hyas_object.add_attribute( - **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) - hyas_object.add_reference(self.attribute['uuid'], 'related-to') - self.misp_event.add_object(hyas_object) + if loop <= 3: + hyas_object = misp_object(endpoint, attribute_value) + for data_item in result.keys(): + if data_item in data_items: + data_item_text = data_items_friendly_names[data_item] + data_item_value = str(result[data_item]) + hyas_object.add_attribute( + **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) + loop = loop + 1 + hyas_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hyas_object) def get_results(self): """returns the dictionary object to MISP Instance""" @@ -716,6 +777,8 @@ def handler(q=False): ip_param = IPV4_PARAM elif endpoint == SINKHOLE_ENDPOINT: ip_param = IPV4_PARAM + elif endpoint == MALWARE_RECORDS_ENDPOINT: + ip_param = IPV4_PARAM else: ip_param = IP_PARAM enrich_response = request_handler.hyas_lookup(endpoint, ip_param, attribute_value) @@ -748,50 +811,51 @@ def handler(q=False): has_results = True parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) elif attribute_type in md5_query_input_type: + md5_param = MD5_PARAM for endpoint in HYAS_MD5_ENRICHMENT_ENDPOINTS_LIST: if endpoint == MALWARE_INFORMATION_ENDPOINT: md5_param = HASH_PARAM - else: - md5_param = MD5_PARAM enrich_response = request_handler.hyas_lookup(endpoint, md5_param, attribute_value) - if endpoint == MALWARE_INFORMATION_ENDPOINT: - if not enrich_response.get("Message"): - enrich_response = enrich_response.get("scan_results") if enrich_response: has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) elif attribute_type in sha1_query_input_type: + sha1_param = SHA1_PARAM for endpoint in HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST: - enrich_response = request_handler.hyas_lookup(endpoint, SHA1_PARAM, attribute_value) if endpoint == MALWARE_INFORMATION_ENDPOINT: - if not enrich_response.get("Message"): - enrich_response = enrich_response.get("scan_results") + sha1_param = HASH_PARAM + elif endpoint == SSL_CERTIFICATE_ENDPOINT: + sha1_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha1_param, attribute_value) + if enrich_response: has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) elif attribute_type in sha256_query_input_type: + sha256_param = SHA256_PARAM for endpoint in HYAS_SHA256_ENRICHMENT_ENDPOINTS_LIST: if endpoint == MALWARE_INFORMATION_ENDPOINT: sha256_param = HASH_PARAM - else: - sha256_param = SHA256_PARAM enrich_response = request_handler.hyas_lookup(endpoint, sha256_param, attribute_value) - if endpoint == MALWARE_INFORMATION_ENDPOINT: - if not enrich_response.get("Message"): - enrich_response = enrich_response.get("scan_results") if enrich_response: has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) elif attribute_type in sha512_query_input_type: + sha512_param = '' for endpoint in HYAS_SHA512_ENRICHMENT_ENDPOINTS_LIST: if endpoint == MALWARE_INFORMATION_ENDPOINT: sha512_param = HASH_PARAM enrich_response = request_handler.hyas_lookup(endpoint, sha512_param, attribute_value) - if endpoint == MALWARE_INFORMATION_ENDPOINT: - if not enrich_response.get("Message"): - enrich_response = enrich_response.get("scan_results") if enrich_response: has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) if has_results: From d00fee3ba07780bd59abee765ba035818a8253a4 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Tue, 11 Oct 2022 08:26:12 +0530 Subject: [PATCH 461/476] Update hyasinsight.py --- misp_modules/modules/expansion/hyasinsight.py | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/misp_modules/modules/expansion/hyasinsight.py b/misp_modules/modules/expansion/hyasinsight.py index 031ca1a..1ae9582 100644 --- a/misp_modules/modules/expansion/hyasinsight.py +++ b/misp_modules/modules/expansion/hyasinsight.py @@ -719,19 +719,16 @@ class HyasInsightParser: data_items: List[str] = self.c2_attribution_data_items data_items_friendly_names = self.c2_attribution_data_items_friendly_names - loop = 1 for result in flatten_json_response: - if loop <= 3: - hyas_object = misp_object(endpoint, attribute_value) - for data_item in result.keys(): - if data_item in data_items: - data_item_text = data_items_friendly_names[data_item] - data_item_value = str(result[data_item]) - hyas_object.add_attribute( - **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) - loop = loop + 1 - hyas_object.add_reference(self.attribute['uuid'], 'related-to') - self.misp_event.add_object(hyas_object) + hyas_object = misp_object(endpoint, attribute_value) + for data_item in result.keys(): + if data_item in data_items: + data_item_text = data_items_friendly_names[data_item] + data_item_value = str(result[data_item]) + hyas_object.add_attribute( + **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) + hyas_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hyas_object) def get_results(self): """returns the dictionary object to MISP Instance""" From 81375e16280c32c824f2ae63b09d5d618e26ebd4 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Tue, 18 Oct 2022 23:59:50 +0200 Subject: [PATCH 462/476] add: [variotdbs] Added module to query the variotdbs API with a vulnerabliity, to get additional info about it --- misp_modules/modules/expansion/variotdbs.py | 149 ++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 misp_modules/modules/expansion/variotdbs.py diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py new file mode 100644 index 0000000..d268ace --- /dev/null +++ b/misp_modules/modules/expansion/variotdbs.py @@ -0,0 +1,149 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} +moduleinfo = {'version': '1', 'author': 'Christian Studer', + 'description': 'An expansion module to query variotdbs.pl', + 'module-type': ['expansion', 'hover']} +moduleconfig = ['API_key'] +variotdbs_url = 'https://www.variotdbs.pl/api' + + +class VariotdbsParser: + def __init__(self, attribute): + misp_attribute = MISPAttribute() + misp_attribute.from_dict(**attribute) + misp_event = MISPEvent() + misp_event.add_attribute(**misp_attribute) + self.__misp_attribute = misp_attribute + self.__misp_event = misp_event + self.__vulnerability_data_mapping = { + 'credits': 'credit', + 'description': 'description', + 'title': 'summary' + } + self.__vulnerability_flat_mapping = { + 'cve': 'id', 'id': 'id' + } + + @property + def misp_attribute(self) -> MISPAttribute: + return self.__attribute + + @property + def misp_event(self) -> MISPEvent: + return self.__misp_event + + @property + def vulnerability_data_mapping(self) -> dict: + return self.__vulnerability_data_mapping + + @property + def vulnerability_flat_mapping(self) -> dict: + return self.__vulnerability_flat_mapping + + def get_results(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if event.get(key)} + return {'results': results} + + def parse_vulnerability_information(self, query_results): + vulnerability_object = MISPObject('vulnerability') + for feature, relation in self.vulnerability_flat_mapping.items(): + if query_results.get(feature): + vulnerability_object.add_attribute( + relation, + query_results[feature] + ) + for feature, relation in self.vulnerability_data_mapping.items(): + if query_results.get(feature, {}).get('data'): + vulnerability_object.add_attribute( + relation, + query_results[feature]['data'] + ) + if query_results.get('configurations', {}).get('data'): + for node in query_results['configurations']['data']['nodes']: + for cpe_match in node['cpe_match']: + if cpe_match['vulnerable']: + vulnerability_object.add_attribute( + 'vulnerable-configuration', + cpe_match['cpe23Uri'] + ) + if query_results.get('cvss', {}).get('data'): + cvss = {} + for cvss_data in query_results['cvss']['data']: + for cvss_v3 in cvss_data['cvssV3']: + cvss[float(cvss_v3['trust'])] = cvss_v3 + if cvss: + cvss = cvss[max(cvss)] + vulnerability_object.add_attribute( + 'cvss-score', + cvss['baseScore'] + ) + vulnerability_object.add_attribute( + 'cvss-string', + cvss['vectorString'] + ) + if query_results.get('references', {}).get('data'): + for reference in query_results['references']['data']: + vulnerability_object.add_attribute( + 'references', + reference['url'] + ) + if query_results.get('sources_release_date', {}).get('data'): + for release_date in query_results['sources_release_date']['data']: + if release_date['db'] != 'NVD': + continue + if release_date['id'] == self.misp_attribute.value: + vulnerability_object.add_attribute( + 'published', + release_date['date'] + ) + break + if query_results.get('sources_update_date', {}).get('data'): + for update_date in query_results['sources_update_date']['data']: + if update_date['db'] != 'NVD': + continue + if update_date['id'] == self.misp_attribute.value: + vulnerability_object.add_attribute( + 'modified', + update_date['date'] + ) + break + self.misp_event.add_object(vulnerability_object) + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') != 'vulnerability': + return {'error': 'Vulnerability id missing.'} + headers = {'Content-Type': 'application/json'} + if request.get('config', {}).get('API_key'): + headers['Authorization'] = f"Token {request['config']['API_key']}" + r = requests.get(f"{variotdbs_url}/vuln/{attribute['value']}/", headers=headers) + if r.status_code == 200: + query_results = r.json() + if not query_results: + return {'error': 'Empty results'} + else: + return {'error': 'Error while querying the variotdbs API.'} + parser = VariotdbsParser(attribute, query_results) + parser.parse_vulnerability_information() + return parser.get_results() + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleconfig From f5cb8d0f571b05f771c8aa946a6e0dc1ad96ee40 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Fri, 21 Oct 2022 14:18:47 +0200 Subject: [PATCH 463/476] fix: [variotdbs] Added the reference between the resulting vulnerability object and the initial vulnerability attribute --- misp_modules/modules/expansion/variotdbs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index d268ace..6d4bf81 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -113,6 +113,7 @@ class VariotdbsParser: update_date['date'] ) break + vulnerability_object.add_reference(self.misp_attribute.uuid, 'related-to') self.misp_event.add_object(vulnerability_object) From 98031beeae34264fbc14298b92f56968a447749e Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 14:53:00 +0200 Subject: [PATCH 464/476] fix: [variotdbs] Fixed some typos, missing imports, and some issues in the main parsing process --- misp_modules/modules/expansion/__init__.py | 3 +- misp_modules/modules/expansion/variotdbs.py | 37 ++++++++++++--------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 2506265..4388cb0 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -18,7 +18,8 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', - 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav', 'jinja_template_rendering','hyasinsight'] + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', + 'clamav', 'jinja_template_rendering','hyasinsight', 'variotdbs'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index 6d4bf81..b6b80e7 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -1,7 +1,7 @@ import json import requests from . import check_input_attribute, standard_error_message -from pymisp import MISPEvent, MISPObject +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} @@ -31,7 +31,7 @@ class VariotdbsParser: @property def misp_attribute(self) -> MISPAttribute: - return self.__attribute + return self.__misp_attribute @property def misp_event(self) -> MISPEvent: @@ -65,13 +65,14 @@ class VariotdbsParser: query_results[feature]['data'] ) if query_results.get('configurations', {}).get('data'): - for node in query_results['configurations']['data']['nodes']: - for cpe_match in node['cpe_match']: - if cpe_match['vulnerable']: - vulnerability_object.add_attribute( - 'vulnerable-configuration', - cpe_match['cpe23Uri'] - ) + for configuration in query_results['configurations']['data']: + for node in configuration['nodes']: + for cpe_match in node['cpe_match']: + if cpe_match['vulnerable']: + vulnerability_object.add_attribute( + 'vulnerable-configuration', + cpe_match['cpe23Uri'] + ) if query_results.get('cvss', {}).get('data'): cvss = {} for cvss_data in query_results['cvss']['data']: @@ -129,15 +130,19 @@ def handler(q=False): headers = {'Content-Type': 'application/json'} if request.get('config', {}).get('API_key'): headers['Authorization'] = f"Token {request['config']['API_key']}" + empty = True + parser = VariotdbsParser(attribute) r = requests.get(f"{variotdbs_url}/vuln/{attribute['value']}/", headers=headers) if r.status_code == 200: - query_results = r.json() - if not query_results: - return {'error': 'Empty results'} + vulnerability_results = r.json() + if vulnerability_results: + parser.parse_vulnerability_information(vulnerability_results) + empty = False else: - return {'error': 'Error while querying the variotdbs API.'} - parser = VariotdbsParser(attribute, query_results) - parser.parse_vulnerability_information() + if r.reason != 'Not found': + return {'error': 'Error while querying the variotdbs API.'} + if empty: + return {'error': 'Empty results'} return parser.get_results() @@ -147,4 +152,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleconfig + return moduleinfo From 153ca8d3d42180bdf15bb7f46096805fc532ed8b Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 15:01:54 +0200 Subject: [PATCH 465/476] add: [variotdbs] Added the exploit information parsing - Following a recent change on the variotdbs API allowing requests to get exploits information base on a CVE number --- misp_modules/modules/expansion/variotdbs.py | 50 +++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index b6b80e7..eaa5ea3 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -20,6 +20,20 @@ class VariotdbsParser: misp_event.add_attribute(**misp_attribute) self.__misp_attribute = misp_attribute self.__misp_event = misp_event + self.__exploit_mapping = { + 'credits': 'credit', + 'exploit': 'exploit' + } + self.__exploit_multiple_mapping = { + 'cve': { + 'feature': 'cve_id', + 'relation': 'cve-id' + }, + 'references': { + 'feature': 'url', + 'relation': 'reference' + } + } self.__vulnerability_data_mapping = { 'credits': 'credit', 'description': 'description', @@ -29,6 +43,14 @@ class VariotdbsParser: 'cve': 'id', 'id': 'id' } + @property + def exploit_mapping(self) -> dict: + return self.__exploit_mapping + + @property + def exploit_multiple_mapping(self) -> dict: + return self.__exploit_multiple_mapping + @property def misp_attribute(self) -> MISPAttribute: return self.__misp_attribute @@ -50,6 +72,26 @@ class VariotdbsParser: results = {key: event[key] for key in ('Attribute', 'Object') if event.get(key)} return {'results': results} + def parse_exploit_information(self, query_results): + for exploit in query_results['results']: + exploit_object = MISPObject('exploit') + exploit_object.add_attribute('exploitdb-id', exploit['edb_id']) + for feature, relation in self.exploit_mapping.items(): + if exploit.get(feature): + exploit_object.add_attribute( + relation, + exploit[feature]['data'] + ) + for feature, relation in self.exploit_multiple_mapping.items(): + if exploit.get(feature): + for value in exploit[feature]['data']: + exploit_object.add_attribute( + relation['relation'], + value[relation['feature']] + ) + exploit_object.add_reference(self.misp_attribute.uuid, 'related-to') + self.misp_event.add_object(exploit_object) + def parse_vulnerability_information(self, query_results): vulnerability_object = MISPObject('vulnerability') for feature, relation in self.vulnerability_flat_mapping.items(): @@ -141,6 +183,14 @@ def handler(q=False): else: if r.reason != 'Not found': return {'error': 'Error while querying the variotdbs API.'} + r = requests.get(f"{variotdbs_url}/exploits/?cve={attribute['value']}", headers=headers) + if r.status_code == 200: + exploit_results = r.json() + if exploit_results: + parser.parse_exploit_information(exploit_results) + empty = False + else: + return {'error': 'Error while querying the variotdbs API.'} if empty: return {'error': 'Empty results'} return parser.get_results() From 5376993ba987bc5113f8bff1e1d264945cd7aa5a Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 15:20:42 +0200 Subject: [PATCH 466/476] add: [documentation] Added documentation for the variotdbs module --- documentation/logos/variot.png | Bin 0 -> 104724 bytes documentation/website/expansion/variotdbs.json | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 documentation/logos/variot.png create mode 100644 documentation/website/expansion/variotdbs.json diff --git a/documentation/logos/variot.png b/documentation/logos/variot.png new file mode 100644 index 0000000000000000000000000000000000000000..717b7e712cd21f3f27c85228755b63e724d31fc3 GIT binary patch literal 104724 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 SMgJe*&rsj=NP(WiKmP;T{H?VB literal 0 HcmV?d00001 diff --git a/documentation/website/expansion/variotdbs.json b/documentation/website/expansion/variotdbs.json new file mode 100644 index 0000000..f561866 --- /dev/null +++ b/documentation/website/expansion/variotdbs.json @@ -0,0 +1,13 @@ +{ + "description": "An expansion module to query the VARIoT db API for more information about a vulnerability.", + "logo": "variot.png", + "requirements": [ + "A VARIoT db API key (if you do not want to be limited to 100 queries / day)" + ], + "input": "Vulnerability attribute.", + "output": "Additional information about the vulnerability, as it is stored on the VARIoT db, about the vulnerability itself, and the potential related exploits.", + "references": [ + "https://www.variotdbs.pl/" + ], + "features": "The module takes a vulnerability attribute as input and queries que VARIoT db API to gather additional information.\n\nThe `vuln` endpoint is queried first to look for additional information about the vulnerability itself.\n\nThe `exploits` endpoint is also queried then to look for the information of the potential related exploits, which are parsed and added to the results using the `exploit` object template." +} From 27673d0516b7c727c91f1838a076b5f6a51af212 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 15:23:20 +0200 Subject: [PATCH 467/476] add: [documentation] Regenerated documentation with the recently added modules description --- documentation/README.md | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index a455c79..524e1a2 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -685,6 +685,28 @@ Expansion module to fetch the html content from an url and convert it into markd ----- +#### [hyasinsight](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hyasinsight.py) + + + +HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure. +- **features**: +>This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API. +> The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. +> +>An API key is required to submit queries to the HYAS Insight API. +> +- **input**: +>A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), Email Address(email, email-src, email-dst, target-email, whois-registrant-email), Phone Number(phone-number, whois-registrant-phone), MDS(md5, x509-fingerprint-md5, ja3-fingerprint-md5, hassh-md5, hasshserver-md5), SHA1(sha1, x509-fingerprint-sha1), SHA256(sha256, x509-fingerprint-sha256), SHA512(sha512) +- **output**: +>Hyas Insight objects, resulting from the query on the HYAS Insight API. +- **references**: +>https://www.hyas.com/hyas-insight/ +- **requirements**: +>A HYAS Insight API Key. + +----- + #### [intel471](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/intel471.py) @@ -1606,6 +1628,28 @@ An expansion module to query urlscan.io. ----- +#### [variotdbs](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/variotdbs.py) + + + +An expansion module to query the VARIoT db API for more information about a vulnerability. +- **features**: +>The module takes a vulnerability attribute as input and queries que VARIoT db API to gather additional information. +> +>The `vuln` endpoint is queried first to look for additional information about the vulnerability itself. +> +>The `exploits` endpoint is also queried then to look for the information of the potential related exploits, which are parsed and added to the results using the `exploit` object template. +- **input**: +>Vulnerability attribute. +- **output**: +>Additional information about the vulnerability, as it is stored on the VARIoT db, about the vulnerability itself, and the potential related exploits. +- **references**: +>https://www.variotdbs.pl/ +- **requirements**: +>A VARIoT db API key (if you do not want to be limited to 100 queries / day) + +----- + #### [virustotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/virustotal.py) From a93b382f1f554a84b097caf23cf136163a347078 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 15:25:56 +0200 Subject: [PATCH 468/476] add: [readme] Added description for the variotdbs module --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a9184b5..653695b 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [TruSTAR Enrich](misp_modules/modules/expansion/trustar_enrich.py) - an expansion module to enrich MISP data with [TruSTAR](https://www.trustar.co/). * [urlhaus](misp_modules/modules/expansion/urlhaus.py) - Query urlhaus to get additional data about a domain, hash, hostname, ip or url. * [urlscan](misp_modules/modules/expansion/urlscan.py) - an expansion module to query [urlscan.io](https://urlscan.io). +* [variotdbs](misp_modules/modules/expansion/variotdbs.py) - an expansion module to query the [VARIoT db](https://www.variotdbs.pl) API to get more information about a Vulnerability * [virustotal](misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) * [virustotal_public](misp_modules/modules/expansion/virustotal_public.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a public key and a low request rate limit. (More details about the API: [here](https://developers.virustotal.com/reference)) * [VMray](misp_modules/modules/expansion/vmray_submit.py) - a module to submit a sample to VMray. From b964b5e2a61f4af811b400d7f28845db21dd18e0 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 15:43:04 +0200 Subject: [PATCH 469/476] fix: [variodbs] Fixed the empty vulnerability results case handling, to avoid the module to stop before looking for related exploits --- misp_modules/modules/expansion/variotdbs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index eaa5ea3..9b67d88 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -181,7 +181,7 @@ def handler(q=False): parser.parse_vulnerability_information(vulnerability_results) empty = False else: - if r.reason != 'Not found': + if r.reason != 'Not Found': return {'error': 'Error while querying the variotdbs API.'} r = requests.get(f"{variotdbs_url}/exploits/?cve={attribute['value']}", headers=headers) if r.status_code == 200: From 38a6dc810e8a6f3882a4a6977a130e851d049fb0 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Mon, 24 Oct 2022 16:18:22 +0200 Subject: [PATCH 470/476] fix: [variodbs] Properly handling the exploit results when there is more that 10 results - We keep querying the VARIoT db API with the link of the next content until there is no next result --- misp_modules/modules/expansion/variotdbs.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index 9b67d88..0f6202a 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -73,7 +73,7 @@ class VariotdbsParser: return {'results': results} def parse_exploit_information(self, query_results): - for exploit in query_results['results']: + for exploit in query_results: exploit_object = MISPObject('exploit') exploit_object.add_attribute('exploitdb-id', exploit['edb_id']) for feature, relation in self.exploit_mapping.items(): @@ -187,8 +187,17 @@ def handler(q=False): if r.status_code == 200: exploit_results = r.json() if exploit_results: - parser.parse_exploit_information(exploit_results) + parser.parse_exploit_information(exploit_results['results']) empty = False + if exploit_results['next'] is not None: + while(1): + exploit_results = requests.get(exploit_results['next'], headers=headers) + if exploit_results.status_code != 200: + break + exploit_results = exploit_results.json() + parser.parse_exploit_information(exploit_results['results']) + if exploit_results['next'] is None: + break else: return {'error': 'Error while querying the variotdbs API.'} if empty: From 8e97bf9938357c2d745216929a2f464aa4b59ece Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Tue, 25 Oct 2022 22:20:30 +0200 Subject: [PATCH 471/476] chg: [cve_advanced] Updated the module to use cvepremium & a few improvements --- .../modules/expansion/cve_advanced.py | 146 +++++++++++------- 1 file changed, 89 insertions(+), 57 deletions(-) diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index 4be69c6..32f86d1 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -2,34 +2,70 @@ import json import requests from . import check_input_attribute, standard_error_message from collections import defaultdict -from pymisp import MISPEvent, MISPObject +from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['vulnerability'], 'format': 'misp_standard'} -moduleinfo = {'version': '1', 'author': 'Christian Studer', +moduleinfo = {'version': '2', 'author': 'Christian Studer', 'description': 'An expansion module to enrich a CVE attribute with the vulnerability information.', 'module-type': ['expansion', 'hover']} moduleconfig = ["custom_API"] -cveapi_url = 'https://cve.circl.lu/api/cve/' +cveapi_url = 'https://cvepremium.circl.lu/api/' class VulnerabilityParser(): - def __init__(self, attribute, vulnerability, api_url): - self.attribute = attribute - self.vulnerability = vulnerability - self.api_url = api_url - self.misp_event = MISPEvent() - self.misp_event.add_attribute(**attribute) + def __init__(self, attribute, api_url): + misp_attribute = MISPAttribute() + misp_attribute.from_dict(**attribute) + misp_event = MISPEvent() + misp_event.add_attribute(**misp_attribute) + self.__misp_attribute = misp_attribute + self.__misp_event = misp_event + self.__api_url = api_url self.references = defaultdict(list) - self.capec_features = ('id', 'name', 'summary', 'prerequisites', 'solutions') - self.vulnerability_mapping = { + self.__capec_features = ('id', 'name', 'summary', 'prerequisites', 'solutions') + self.__vulnerability_mapping = { 'id': 'id', 'summary': 'summary', + 'Modified': 'modified', 'cvss3': 'cvss-score', + 'cvss3-vector': 'cvss-string' + } + self.__vulnerability_multiple_mapping = { 'vulnerable_configuration': 'vulnerable-configuration', 'vulnerable_configuration_cpe_2_2': 'vulnerable-configuration', - 'Modified': 'modified', 'Published': 'published', - 'references': 'references', 'cvss': 'cvss-score'} - self.weakness_mapping = {'name': 'name', 'description_summary': 'description', - 'status': 'status', 'weaknessabs': 'weakness-abs'} + 'references': 'references' + } + self.__weakness_mapping = { + 'name': 'name', 'description_summary': 'description', + 'status': 'status', 'weaknessabs': 'weakness-abs' + } + + @property + def api_url(self) -> str: + return self.__api_url + + @property + def capec_features(self) -> tuple: + return self.__capec_features + + @property + def misp_attribute(self) -> MISPAttribute: + return self.__misp_attribute + + @property + def misp_event(self) -> MISPEvent: + return self.__misp_event + + @property + def vulnerability_mapping(self) -> dict: + return self.__vulnerability_mapping + + @property + def vulnerability_multiple_mapping(self) -> dict: + return self.__vulnerability_multiple_mapping + + @property + def weakness_mapping(self) -> dict: + return self.__weakness_mapping def get_result(self): if self.references: @@ -38,28 +74,26 @@ class VulnerabilityParser(): results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} - def parse_vulnerability_information(self): + def parse_vulnerability_information(self, vulnerability): vulnerability_object = MISPObject('vulnerability') - for feature in ('id', 'summary', 'Modified', 'cvss'): - value = self.vulnerability.get(feature) - if value: - vulnerability_object.add_attribute(self.vulnerability_mapping[feature], value) - if 'Published' in self.vulnerability: - vulnerability_object.add_attribute('published', self.vulnerability['Published']) + for feature, relation in self.vulnerability_mapping.items(): + if vulnerability.get(feature): + vulnerability_object.add_attribute(relation, vulnerability[feature]) + if 'Published' in vulnerability: + vulnerability_object.add_attribute('published', vulnerability['Published']) vulnerability_object.add_attribute('state', 'Published') - for feature in ('references', 'vulnerable_configuration', 'vulnerable_configuration_cpe_2_2'): - if feature in self.vulnerability: - relation = self.vulnerability_mapping[feature] - for value in self.vulnerability[feature]: + for feature, relation in self.vulnerability_multiple_mapping.items(): + if feature in vulnerability: + for value in vulnerability[feature]: if isinstance(value, dict): value = value['title'] vulnerability_object.add_attribute(relation, value) - vulnerability_object.add_reference(self.attribute['uuid'], 'related-to') + vulnerability_object.add_reference(self.misp_attribute.uuid, 'related-to') self.misp_event.add_object(vulnerability_object) - if 'cwe' in self.vulnerability and self.vulnerability['cwe'] not in ('Unknown', 'NVD-CWE-noinfo'): - self.__parse_weakness(vulnerability_object.uuid) - if 'capec' in self.vulnerability: - self.__parse_capec(vulnerability_object.uuid) + if 'cwe' in vulnerability and vulnerability['cwe'] not in ('Unknown', 'NVD-CWE-noinfo'): + self.__parse_weakness(vulnerability['cwe'], vulnerability_object.uuid) + if 'capec' in vulnerability: + self.__parse_capec(vulnerability['capec'], vulnerability_object.uuid) def __build_references(self): for object_uuid, references in self.references.items(): @@ -69,8 +103,8 @@ class VulnerabilityParser(): misp_object.add_reference(**reference) break - def __parse_capec(self, vulnerability_uuid): - for capec in self.vulnerability['capec']: + def __parse_capec(self, capec_values, vulnerability_uuid): + for capec in capec_values: capec_object = MISPObject('attack-pattern') for feature in self.capec_features: capec_object.add_attribute(feature, capec[feature]) @@ -84,29 +118,27 @@ class VulnerabilityParser(): } ) - def __parse_weakness(self, vulnerability_uuid): - cwe_string, cwe_id = self.vulnerability['cwe'].split('-')[:2] - cwes = requests.get(self.api_url.replace('/cve/', '/cwe')) - if cwes.status_code == 200: - for cwe in cwes.json(): - if cwe['id'] == cwe_id: - weakness_object = MISPObject('weakness') - weakness_object.add_attribute('id', f'{cwe_string}-{cwe_id}') - for feature, relation in self.weakness_mapping.items(): - if cwe.get(feature): - weakness_object.add_attribute(relation, cwe[feature]) - self.misp_event.add_object(weakness_object) - self.references[vulnerability_uuid].append( - { - 'referenced_uuid': weakness_object.uuid, - 'relationship_type': 'weakened-by' - } - ) - break + def __parse_weakness(self, cwe_value, vulnerability_uuid): + cwe_string, cwe_id = cwe_value.split('-')[:2] + cwe = requests.get(f'{self.api_url}cwe/{cwe_id}') + if cwe.status_code == 200: + cwe = cwe.json() + weakness_object = MISPObject('weakness') + weakness_object.add_attribute('id', f'{cwe_string}-{cwe_id}') + for feature, relation in self.weakness_mapping.items(): + if cwe.get(feature): + weakness_object.add_attribute(relation, cwe[feature]) + self.misp_event.add_object(weakness_object) + self.references[vulnerability_uuid].append( + { + 'referenced_uuid': weakness_object.uuid, + 'relationship_type': 'weakened-by' + } + ) def check_url(url): - return "{}/".format(url) if not url.endswith('/') else url + return f"{url}/" if not url.endswith('/') else url def handler(q=False): @@ -119,8 +151,8 @@ def handler(q=False): if attribute.get('type') != 'vulnerability': misperrors['error'] = 'Vulnerability id missing.' return misperrors - api_url = check_url(request['config']['custom_API']) if request['config'].get('custom_API') else cveapi_url - r = requests.get("{}{}".format(api_url, attribute['value'])) + api_url = check_url(request['config']['custom_API']) if request.get('config', {}).get('custom_API') else cveapi_url + r = requests.get(f"{api_url}cve/{attribute['value']}") if r.status_code == 200: vulnerability = r.json() if not vulnerability: @@ -129,8 +161,8 @@ def handler(q=False): else: misperrors['error'] = 'API not accessible' return misperrors['error'] - parser = VulnerabilityParser(attribute, vulnerability, api_url) - parser.parse_vulnerability_information() + parser = VulnerabilityParser(attribute, api_url) + parser.parse_vulnerability_information(vulnerability) return parser.get_result() From 5526c2c195ddaf27bccc125c037c820ea07b39c7 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Wed, 26 Oct 2022 11:35:59 +0200 Subject: [PATCH 472/476] add: [variotdbs] Updated the exploit object mapping to support the object attributes recently added to the `exploit` template --- misp_modules/modules/expansion/variotdbs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index 0f6202a..17321e5 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -22,7 +22,9 @@ class VariotdbsParser: self.__misp_event = misp_event self.__exploit_mapping = { 'credits': 'credit', - 'exploit': 'exploit' + 'description': 'description', + 'exploit': 'exploit', + 'title': 'title' } self.__exploit_multiple_mapping = { 'cve': { From e18ac776bb02fecb90ae69d980fc5143f0c0ae61 Mon Sep 17 00:00:00 2001 From: Christian Studer Date: Thu, 27 Oct 2022 09:50:24 +0200 Subject: [PATCH 473/476] fix: [variodbs] Fixed indentation issue - if `exploit_results` is empty, we should not go any further in the query for next values exploit results --- misp_modules/modules/expansion/variotdbs.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/misp_modules/modules/expansion/variotdbs.py b/misp_modules/modules/expansion/variotdbs.py index 17321e5..6dc8880 100644 --- a/misp_modules/modules/expansion/variotdbs.py +++ b/misp_modules/modules/expansion/variotdbs.py @@ -191,15 +191,15 @@ def handler(q=False): if exploit_results: parser.parse_exploit_information(exploit_results['results']) empty = False - if exploit_results['next'] is not None: - while(1): - exploit_results = requests.get(exploit_results['next'], headers=headers) - if exploit_results.status_code != 200: - break - exploit_results = exploit_results.json() - parser.parse_exploit_information(exploit_results['results']) - if exploit_results['next'] is None: - break + if exploit_results['next'] is not None: + while(1): + exploit_results = requests.get(exploit_results['next'], headers=headers) + if exploit_results.status_code != 200: + break + exploit_results = exploit_results.json() + parser.parse_exploit_information(exploit_results['results']) + if exploit_results['next'] is None: + break else: return {'error': 'Error while querying the variotdbs API.'} if empty: From e8cb47a8c79cd5bdab7c8c416a24080a18a0dd71 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 27 Oct 2022 10:14:56 +0200 Subject: [PATCH 474/476] chg: [doc] updated --- documentation/mkdocs/expansion.md | 1916 ++++++++++++++++++++++++++++ documentation/mkdocs/export_mod.md | 247 ++++ documentation/mkdocs/import_mod.md | 198 +++ 3 files changed, 2361 insertions(+) create mode 100644 documentation/mkdocs/expansion.md create mode 100644 documentation/mkdocs/export_mod.md create mode 100644 documentation/mkdocs/import_mod.md diff --git a/documentation/mkdocs/expansion.md b/documentation/mkdocs/expansion.md new file mode 100644 index 0000000..c85cb12 --- /dev/null +++ b/documentation/mkdocs/expansion.md @@ -0,0 +1,1916 @@ + +#### [apiosintds](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/apiosintds.py) + +On demand query API for OSINT.digitalside.it project. +- **features**: +>The module simply queries the API of OSINT.digitalside.it with a domain, ip, url or hash attribute. +> +>The result of the query is then parsed to extract additional hashes or urls. A module parameters also allows to parse the hashes related to the urls. +> +>Furthermore, it is possible to cache the urls and hashes collected over the last 7 days by OSINT.digitalside.it +- **input**: +>A domain, ip, url or hash attribute. +- **output**: +>Hashes and urls resulting from the query to OSINT.digitalside.it +- **references**: +>https://osint.digitalside.it/#About +- **requirements**: +>The apiosintDS python library to query the OSINT.digitalside.it API. + +----- + +#### [apivoid](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/apivoid.py) + + + +Module to query APIVoid with some domain attributes. +- **features**: +>This module takes a domain name and queries API Void to get the related DNS records and the SSL certificates. It returns then those pieces of data as MISP objects that can be added to the event. +> +>To make it work, a valid API key and enough credits to proceed 2 queries (0.06 + 0.07 credits) are required. +- **input**: +>A domain attribute. +- **output**: +>DNS records and SSL certificates related to the domain. +- **references**: +>https://www.apivoid.com/ +- **requirements**: +>A valid APIVoid API key with enough credits to proceed 2 queries + +----- + +#### [assemblyline_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/assemblyline_query.py) + + + +A module tu query the AssemblyLine API with a submission ID to get the submission report and parse it. +- **features**: +>The module requires the address of the AssemblyLine server you want to query as well as your credentials used for this instance. Credentials include the used-ID and an API key or the password associated to the user-ID. +> +>The submission ID extracted from the submission link is then used to query AssemblyLine and get the full submission report. This report is parsed to extract file objects and the associated IPs, domains or URLs the files are connecting to. +> +>Some more data may be parsed in the future. +- **input**: +>Link of an AssemblyLine submission report. +- **output**: +>MISP attributes & objects parsed from the AssemblyLine submission. +- **references**: +>https://www.cyber.cg.ca/en/assemblyline +- **requirements**: +>assemblyline_client: Python library to query the AssemblyLine rest API. + +----- + +#### [assemblyline_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/assemblyline_submit.py) + + + +A module to submit samples and URLs to AssemblyLine for advanced analysis, and return the link of the submission. +- **features**: +>The module requires the address of the AssemblyLine server you want to query as well as your credentials used for this instance. Credentials include the user-ID and an API key or the password associated to the user-ID. +> +>If the sample or url is correctly submitted, you get then the link of the submission. +- **input**: +>Sample, or url to submit to AssemblyLine. +- **output**: +>Link of the report generated in AssemblyLine. +- **references**: +>https://www.cyber.gc.ca/en/assemblyline +- **requirements**: +>assemblyline_client: Python library to query the AssemblyLine rest API. + +----- + +#### [backscatter_io](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/backscatter_io.py) + + + +Query backscatter.io (https://backscatter.io/). +- **features**: +>The module takes a source or destination IP address as input and displays the information known by backscatter.io. +- **input**: +>IP addresses. +- **output**: +>Text containing a history of the IP addresses especially on scanning based on backscatter.io information . +- **references**: +>https://pypi.org/project/backscatter/ +- **requirements**: +>backscatter python library + +----- + +#### [bgpranking](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/bgpranking.py) + +Query BGP Ranking (https://bgpranking-ng.circl.lu/). +- **features**: +>The module takes an AS number attribute as input and displays its description as well as its ranking position in BGP Ranking for a given day. +- **input**: +>Autonomous system number. +- **output**: +>An asn object with its related bgp-ranking object. +- **references**: +>https://github.com/D4-project/BGP-Ranking/ +- **requirements**: +>pybgpranking python library + +----- + +#### [btc_scam_check](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/btc_scam_check.py) + + + +An expansion hover module to query a special dns blacklist to check if a bitcoin address has been abused. +- **features**: +>The module queries a dns blacklist directly with the bitcoin address and get a response if the address has been abused. +- **input**: +>btc address attribute. +- **output**: +>Text to indicate if the BTC address has been abused. +- **references**: +>https://btcblack.it/ +- **requirements**: +>dnspython3: dns python library + +----- + +#### [btc_steroids](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/btc_steroids.py) + + + +An expansion hover module to get a blockchain balance from a BTC address in MISP. +- **input**: +>btc address attribute. +- **output**: +>Text to describe the blockchain balance and the transactions related to the btc address in input. + +----- + +#### [censys_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/censys_enrich.py) + +An expansion module to enrich attributes in MISP by quering the censys.io API +- **features**: +>This module takes an IP, hostname or a certificate fingerprint and attempts to enrich it by querying the Censys API. +- **input**: +>IP, domain or certificate fingerprint (md5, sha1 or sha256) +- **output**: +>MISP objects retrieved from censys, including open ports, ASN, Location of the IP, x509 details +- **references**: +>https://www.censys.io +- **requirements**: +>API credentials to censys.io + +----- + +#### [circl_passivedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/circl_passivedns.py) + + + +Module to access CIRCL Passive DNS. +- **features**: +>This module takes a hostname, domain or ip-address (ip-src or ip-dst) attribute as input, and queries the CIRCL Passive DNS REST API to get the asssociated passive dns entries and return them as MISP objects. +> +>To make it work a username and a password are thus required to authenticate to the CIRCL Passive DNS API. +- **input**: +>Hostname, domain, or ip-address attribute. +- **ouput**: +>Passive DNS objects related to the input attribute. +- **references**: +> - https://www.circl.lu/services/passive-dns/ +> - https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/ +- **requirements**: +> - pypdns: Passive DNS python library +> - A CIRCL passive DNS account with username & password + +----- + +#### [circl_passivessl](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/circl_passivessl.py) + + + +Modules to access CIRCL Passive SSL. +- **features**: +>This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the CIRCL Passive SSL REST API to gather the related certificates and return the corresponding MISP objects. +> +>To make it work a username and a password are required to authenticate to the CIRCL Passive SSL API. +- **input**: +>IP address attribute. +- **output**: +>x509 certificate objects seen by the IP address(es). +- **references**: +>https://www.circl.lu/services/passive-ssl/ +- **requirements**: +> - pypssl: Passive SSL python library +> - A CIRCL passive SSL account with username & password + +----- + +#### [countrycode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/countrycode.py) + +Module to expand country codes. +- **features**: +>The module takes a domain or a hostname as input, and returns the country it belongs to. +> +>For non country domains, a list of the most common possible extensions is used. +- **input**: +>Hostname or domain attribute. +- **output**: +>Text with the country code the input belongs to. + +----- + +#### [cpe](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cpe.py) + + + +An expansion module to query the CVE search API with a cpe code to get its related vulnerabilities. +- **features**: +>The module takes a cpe attribute as input and queries the CVE search API to get its related vulnerabilities. +>The list of vulnerabilities is then parsed and returned as vulnerability objects. +> +>Users can use their own CVE search API url by defining a value to the custom_API_URL parameter. If no custom API url is given, the default cve.circl.lu api url is used. +> +>In order to limit the amount of data returned by CVE serach, users can also the limit parameter. With the limit set, the API returns only the requested number of vulnerabilities, sorted from the highest cvss score to the lowest one. +- **input**: +>CPE attribute. +- **output**: +>The vulnerabilities related to the CPE. +- **references**: +>https://cve.circl.lu/api/ + +----- + +#### [crowdstrike_falcon](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/crowdstrike_falcon.py) + + + +Module to query Crowdstrike Falcon. +- **features**: +>This module takes a MISP attribute as input to query a CrowdStrike Falcon API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes. +> +>Please note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported. +- **input**: +>A MISP attribute included in the following list: +>- domain +>- email-attachment +>- email-dst +>- email-reply-to +>- email-src +>- email-subject +>- filename +>- hostname +>- ip-src +>- ip-dst +>- md5 +>- mutex +>- regkey +>- sha1 +>- sha256 +>- uri +>- url +>- user-agent +>- whois-registrant-email +>- x509-fingerprint-md5 +- **output**: +>MISP attributes mapped after the CrowdStrike API has been queried, included in the following list: +>- hostname +>- email-src +>- email-subject +>- filename +>- md5 +>- sha1 +>- sha256 +>- ip-dst +>- ip-dst +>- mutex +>- regkey +>- url +>- user-agent +>- x509-fingerprint-md5 +- **references**: +>https://www.crowdstrike.com/products/crowdstrike-falcon-faq/ +- **requirements**: +>A CrowdStrike API access (API id & key) + +----- + +#### [cuckoo_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cuckoo_submit.py) + + + +An expansion module to submit files and URLs to Cuckoo Sandbox. +- **features**: +>The module takes a malware-sample, attachment, url or domain and submits it to Cuckoo Sandbox. +> The returned task id can be used to retrieve results when the analysis completed. +- **input**: +>A malware-sample or attachment for files. A url or domain for URLs. +- **output**: +>A text field containing 'Cuckoo task id: ' +- **references**: +> - https://cuckoosandbox.org/ +> - https://cuckoo.sh/docs/ +- **requirements**: +>Access to a Cuckoo Sandbox API and an API key if the API requires it. (api_url and api_key) + +----- + +#### [cve](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cve.py) + + + +An expansion hover module to expand information about CVE id. +- **features**: +>The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to get information about the vulnerability as it is described in the list of CVEs. +- **input**: +>Vulnerability attribute. +- **output**: +>Text giving information about the CVE related to the Vulnerability. +- **references**: +> - https://cve.circl.lu/ +> - https://cve.mitre.org/ + +----- + +#### [cve_advanced](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cve_advanced.py) + + + +An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE). +- **features**: +>The module takes a vulnerability attribute as input and queries the CIRCL CVE search API to gather additional information. +> +>The result of the query is then parsed to return additional information about the vulnerability, like its cvss score or some references, as well as the potential related weaknesses and attack patterns. +> +>The vulnerability additional data is returned in a vulnerability MISP object, and the related additional information are put into weakness and attack-pattern MISP objects. +- **input**: +>Vulnerability attribute. +- **output**: +>Additional information about the vulnerability, such as its cvss score, some references, or the related weaknesses and attack patterns. +- **references**: +> - https://cve.circl.lu +> - https://cve/mitre.org/ + +----- + +#### [cytomic_orion](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/cytomic_orion.py) + + + +An expansion module to enrich attributes in MISP by quering the Cytomic Orion API +- **features**: +>This module takes an MD5 hash and searches for occurrences of this hash in the Cytomic Orion database. Returns observed files and machines. +- **input**: +>MD5, hash of the sample / malware to search for. +- **output**: +>MISP objects with sightings of the hash in Cytomic Orion. Includes files and machines. +- **references**: +> - https://www.vanimpe.eu/2020/03/10/integrating-misp-and-cytomic-orion/ +> - https://www.cytomicmodel.com/solutions/ +- **requirements**: +>Access (license) to Cytomic Orion + +----- + +#### [dbl_spamhaus](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/dbl_spamhaus.py) + + + +Module to check Spamhaus DBL for a domain name. +- **features**: +>This modules takes a domain or a hostname in input and queries the Domain Block List provided by Spamhaus to determine what kind of domain it is. +> +>DBL then returns a response code corresponding to a certain classification of the domain we display. If the queried domain is not in the list, it is also mentionned. +> +>Please note that composite MISP attributes containing domain or hostname are supported as well. +- **input**: +>Domain or hostname attribute. +- **output**: +>Information about the nature of the input. +- **references**: +>https://www.spamhaus.org/faq/section/Spamhaus%20DBL +- **requirements**: +>dnspython3: DNS python3 library + +----- + +#### [dns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/dns.py) + +A simple DNS expansion service to resolve IP address from domain MISP attributes. +- **features**: +>The module takes a domain of hostname attribute as input, and tries to resolve it. If no error is encountered, the IP address that resolves the domain is returned, otherwise the origin of the error is displayed. +> +>The address of the DNS resolver to use is also configurable, but if no configuration is set, we use the Google public DNS address (8.8.8.8). +> +>Please note that composite MISP attributes containing domain or hostname are supported as well. +- **input**: +>Domain or hostname attribute. +- **output**: +>IP address resolving the input. +- **requirements**: +>dnspython3: DNS python3 library + +----- + +#### [docx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/docx_enrich.py) + + + +Module to extract freetext from a .docx document. +- **features**: +>The module reads the text contained in a .docx document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a .docx document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +>docx python library + +----- + +#### [domaintools](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/domaintools.py) + + + +DomainTools MISP expansion module. +- **features**: +>This module takes a MISP attribute as input to query the Domaintools API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes. +> +>Please note that composite attributes composed by at least one of the input types mentionned below (domains, IPs, hostnames) are also supported. +- **input**: +>A MISP attribute included in the following list: +>- domain +>- hostname +>- email-src +>- email-dst +>- target-email +>- whois-registrant-email +>- whois-registrant-name +>- whois-registrant-phone +>- ip-src +>- ip-dst +- **output**: +>MISP attributes mapped after the Domaintools API has been queried, included in the following list: +>- whois-registrant-email +>- whois-registrant-phone +>- whois-registrant-name +>- whois-registrar +>- whois-creation-date +>- text +>- domain +- **references**: +>https://www.domaintools.com/ +- **requirements**: +> - Domaintools python library +> - A Domaintools API access (username & apikey) + +----- + +#### [eql](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/eql.py) + + + +EQL query generation for a MISP attribute. +- **features**: +>This module adds a new attribute to a MISP event containing an EQL query for a network or file attribute. +- **input**: +>A filename or ip attribute. +- **output**: +>Attribute containing EQL for a network or file attribute. +- **references**: +>https://eql.readthedocs.io/en/latest/ + +----- + +#### [eupi](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/eupi.py) + + + +A module to query the Phishing Initiative service (https://phishing-initiative.lu). +- **features**: +>This module takes a domain, hostname or url MISP attribute as input to query the Phishing Initiative API. The API returns then the result of the query with some information about the value queried. +> +>Please note that composite attributes containing domain or hostname are also supported. +- **input**: +>A domain, hostname or url MISP attribute. +- **output**: +>Text containing information about the input, resulting from the query on Phishing Initiative. +- **references**: +>https://phishing-initiative.eu/?lang=en +- **requirements**: +> - pyeupi: eupi python library +> - An access to the Phishing Initiative API (apikey & url) + +----- + +#### [farsight_passivedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/farsight_passivedns.py) + + + +Module to access Farsight DNSDB Passive DNS. +- **features**: +>This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API. +> The results of rdata and rrset lookups are then returned and parsed into passive-dns objects. +> +>An API key is required to submit queries to the API. +> It is also possible to define a custom server URL, and to set a limit of results to get. +> This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit). +- **input**: +>A domain, hostname or IP address MISP attribute. +- **output**: +>Passive-dns objects, resulting from the query on the Farsight Passive DNS API. +- **references**: +> - https://www.farsightsecurity.com/ +> - https://docs.dnsdb.info/dnsdb-api/ +- **requirements**: +>An access to the Farsight Passive DNS API (apikey) + +----- + +#### [geoip_asn](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_asn.py) + + +- **descrption**: +>An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about its related AS number. +- **features**: +>The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the related AS number. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text containing information about the AS number of the IP address. +- **references**: +>https://www.maxmind.com/en/home +- **requirements**: +>A local copy of Maxmind's Geolite database + +----- + +#### [geoip_city](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_city.py) + + + +An expansion module to query a local copy of Maxmind's Geolite database with an IP address, in order to get information about the city where it is located. +- **features**: +>The module takes an IP address attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the city where this IP address is located. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text containing information about the city where the IP address is located. +- **references**: +>https://www.maxmind.com/en/home +- **requirements**: +>A local copy of Maxmind's Geolite database + +----- + +#### [geoip_country](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/geoip_country.py) + + + +Module to query a local copy of Maxmind's Geolite database. +- **features**: +>This module takes an IP address MISP attribute as input and queries a local copy of the Maxmind's Geolite database to get information about the location of this IP address. +> +>Please note that composite attributes domain|ip are also supported. +- **input**: +>An IP address MISP Attribute. +- **output**: +>Text containing information about the location of the IP address. +- **references**: +>https://www.maxmind.com/en/home +- **requirements**: +>A local copy of Maxmind's Geolite database + +----- + +#### [google_search](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/google_search.py) + + +- **descrption**: +>A hover module to get information about an url using a Google search. +- **features**: +>The module takes an url as input to query the Google search API. The result of the query is then return as raw text. +- **input**: +>An url attribute. +- **output**: +>Text containing the result of a Google search on the input url. +- **references**: +>https://github.com/abenassi/Google-Search-API +- **requirements**: +>The python Google Search API library + +----- + +#### [greynoise](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/greynoise.py) + + + +Module to query IP and CVE information from GreyNoise +- **features**: +>This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days. +- **input**: +>An IP address or CVE ID +- **output**: +>IP Lookup information or CVE scanning profile for past 7 days +- **references**: +> - https://greynoise.io/ +> - https://docs.greyniose.io/ +> - https://www.greynoise.io/viz/account/ +- **requirements**: +>A Greynoise API key. Both Enterprise (Paid) and Community (Free) API keys are supported, however Community API users will only be able to perform IP lookups. + +----- + +#### [hashdd](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hashdd.py) + +A hover module to check hashes against hashdd.com including NSLR dataset. +- **features**: +>This module takes a hash attribute as input to check its known level, using the hashdd API. This information is then displayed. +- **input**: +>A hash MISP attribute (md5). +- **output**: +>Text describing the known level of the hash in the hashdd databases. +- **references**: +>https://hashdd.com/ + +----- + +#### [hashlookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hashlookup.py) + + + +An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL. +- **features**: +>The module takes file hashes as input such as a MD5 or SHA1. +> It queries the public CIRCL.lu hashlookup service and return all the hits if the hashes are known in an existing dataset. The module can be configured with a custom hashlookup url if required. +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>File hashes (MD5, SHA1) +- **output**: +>Object with the filename associated hashes if the hash is part of a known set. +- **references**: +>https://www.circl.lu/services/hashlookup/ + +----- + +#### [hibp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hibp.py) + + + +Module to access haveibeenpwned.com API. +- **features**: +>The module takes an email address as input and queries haveibeenpwned.com API to find additional information about it. This additional information actually tells if any account using the email address has already been compromised in a data breach. +- **input**: +>An email address +- **output**: +>Additional information about the email address. +- **references**: +>https://haveibeenpwned.com/ + +----- + +#### [html_to_markdown](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/html_to_markdown.py) + +Expansion module to fetch the html content from an url and convert it into markdown. +- **features**: +>The module take an URL as input and the HTML content is fetched from it. This content is then converted into markdown that is returned as text. +- **input**: +>URL attribute. +- **output**: +>Markdown content converted from the HTML fetched from the url. +- **requirements**: +>The markdownify python library + +----- + +#### [hyasinsight](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hyasinsight.py) + + + +HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure. +- **features**: +>This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API. +> The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. +> +>An API key is required to submit queries to the HYAS Insight API. +> +- **input**: +>A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), Email Address(email, email-src, email-dst, target-email, whois-registrant-email), Phone Number(phone-number, whois-registrant-phone), MDS(md5, x509-fingerprint-md5, ja3-fingerprint-md5, hassh-md5, hasshserver-md5), SHA1(sha1, x509-fingerprint-sha1), SHA256(sha256, x509-fingerprint-sha256), SHA512(sha512) +- **output**: +>Hyas Insight objects, resulting from the query on the HYAS Insight API. +- **references**: +>https://www.hyas.com/hyas-insight/ +- **requirements**: +>A HYAS Insight API Key. + +----- + +#### [intel471](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/intel471.py) + + +- **descrption**: +>An expansion module to query Intel471 in order to get additional information about a domain, ip address, email address, url or hash. +- **features**: +>The module uses the Intel471 python library to query the Intel471 API with the value of the input attribute. The result of the query is then returned as freetext so the Freetext import parses it. +- **input**: +>A MISP attribute whose type is included in the following list: +>- hostname +>- domain +>- url +>- ip-src +>- ip-dst +>- email-src +>- email-dst +>- target-email +>- whois-registrant-email +>- whois-registrant-name +>- md5 +>- sha1 +>- sha256 +- **output**: +>Freetext +- **references**: +>https://public.intel471.com/ +- **requirements**: +>The intel471 python library + +----- + +#### [intelmq_eventdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/intelmq_eventdb.py) + + + +Module to access intelmqs eventdb. +- **features**: +>/!\ EXPERIMENTAL MODULE, some features may not work /!\ +> +>This module takes a domain, hostname, IP address or Autonomous system MISP attribute as input to query the IntelMQ database. The result of the query gives then additional information about the input. +- **input**: +>A hostname, domain, IP address or AS attribute. +- **output**: +>Text giving information about the input using IntelMQ database. +- **references**: +> - https://github.com/certtools/intelmq +> - https://intelmq.readthedocs.io/en/latest/Developers-Guide/ +- **requirements**: +> - psycopg2: Python library to support PostgreSQL +> - An access to the IntelMQ database (username, password, hostname and database reference) + +----- + +#### [ipasn](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ipasn.py) + +Module to query an IP ASN history service (https://github.com/D4-project/IPASN-History). +- **features**: +>This module takes an IP address attribute as input and queries the CIRCL IPASN service. The result of the query is the latest asn related to the IP address, that is returned as a MISP object. +- **input**: +>An IP address MISP attribute. +- **output**: +>Asn object(s) objects related to the IP address used as input. +- **references**: +>https://github.com/D4-project/IPASN-History +- **requirements**: +>pyipasnhistory: Python library to access IPASN-history instance + +----- + +#### [ipqs_fraud_and_risk_scoring](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py) + + + +IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner. +- **features**: +>This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API. +> The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. +> The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore. +- **input**: +>A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), URL(url, uri), Email Address(email, email-src, email-dst, target-email, whois-registrant-email) and Phone Number(phone-number, whois-registrant-phone). +- **output**: +>IPQualityScore object, resulting from the query on the IPQualityScore API. +- **references**: +>https://www.ipqualityscore.com/ +- **requirements**: +>A IPQualityScore API Key. + +----- + +#### [iprep](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/iprep.py) + +Module to query IPRep data for IP addresses. +- **features**: +>This module takes an IP address attribute as input and queries the database from packetmail.net to get some information about the reputation of the IP. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text describing additional information about the input after a query on the IPRep API. +- **references**: +>https://github.com/mahesh557/packetmail +- **requirements**: +>An access to the packetmail API (apikey) + +----- + +#### [joesandbox_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/joesandbox_query.py) + + + +Query Joe Sandbox API with a submission url to get the json report and extract its data that is parsed and converted into MISP attributes and objects. + +This url can by the way come from the result of the [joesandbox_submit expansion module](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_submit.py). +- **features**: +>Module using the new format of modules able to return attributes and objects. +> +>The module returns the same results as the import module [joe_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/joe_import.py) taking directly the json report as input. +> +>Even if the introspection will allow all kinds of links to call this module, obviously only the ones presenting a sample or url submission in the Joe Sandbox API will return results. +> +>To make it work you will need to fill the 'apikey' configuration with your Joe Sandbox API key and provide a valid link as input. +- **input**: +>Link of a Joe Sandbox sample or url submission. +- **output**: +>MISP attributes & objects parsed from the analysis report. +- **references**: +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ +- **requirements**: +>jbxapi: Joe Sandbox API python3 library + +----- + +#### [joesandbox_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/joesandbox_submit.py) + + + +A module to submit files or URLs to Joe Sandbox for an advanced analysis, and return the link of the submission. +- **features**: +>The module requires a Joe Sandbox API key to submit files or URL, and returns the link of the submitted analysis. +> +>It is then possible, when the analysis is completed, to query the Joe Sandbox API to get the data related to the analysis, using the [joesandbox_query module](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) directly on this submission link. +- **input**: +>Sample, url (or domain) to submit to Joe Sandbox for an advanced analysis. +- **output**: +>Link of the report generated in Joe Sandbox. +- **references**: +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ +- **requirements**: +>jbxapi: Joe Sandbox API python3 library + +----- + +#### [lastline_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/lastline_query.py) + + + +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + +Query Lastline with an analysis link and parse the report into MISP attributes and objects. +The analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module. +- **features**: +>The module requires a Lastline Portal `username` and `password`. +>The module uses the new format and it is able to return MISP attributes and objects. +>The module returns the same results as the [lastline_import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/lastline_import.py) import module. +- **input**: +>Link to a Lastline analysis. +- **output**: +>MISP attributes and objects parsed from the analysis report. +- **references**: +>https://www.lastline.com + +----- + +#### [lastline_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/lastline_submit.py) + + + +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + +Module to submit a file or URL to Lastline. +- **features**: +>The module requires a Lastline Analysis `api_token` and `key`. +>When the analysis is completed, it is possible to import the generated report by feeding the analysis link to the [lastline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_query.py) module. +- **input**: +>File or URL to submit to Lastline. +- **output**: +>Link to the report generated by Lastline. +- **references**: +>https://www.lastline.com + +----- + +#### [macaddress_io](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/macaddress_io.py) + + + +MISP hover module for macaddress.io +- **features**: +>This module takes a MAC address attribute as input and queries macaddress.io for additional information. +> +>This information contains data about: +>- MAC address details +>- Vendor details +>- Block details +- **input**: +>MAC address MISP attribute. +- **output**: +>Text containing information on the MAC address fetched from a query on macaddress.io. +- **references**: +> - https://macaddress.io/ +> - https://github.com/CodeLineFi/maclookup-python +- **requirements**: +> - maclookup: macaddress.io python library +> - An access to the macaddress.io API (apikey) + +----- + +#### [macvendors](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/macvendors.py) + + + +Module to access Macvendors API. +- **features**: +>The module takes a MAC address as input and queries macvendors.com for some information about it. The API returns the name of the vendor related to the address. +- **input**: +>A MAC address. +- **output**: +>Additional information about the MAC address. +- **references**: +> - https://macvendors.com/ +> - https://macvendors.com/api + +----- + +#### [malwarebazaar](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/malwarebazaar.py) + +Query the MALWAREbazaar API to get additional information about the input hash attribute. +- **features**: +>The module takes a hash attribute as input and queries MALWAREbazaar's API to fetch additional data about it. The result, if the payload is known on the databases, is at least one file object describing the file the input hash is related to. +> +>The module is using the new format of modules able to return object since the result is one or multiple MISP object(s). +- **input**: +>A hash attribute (md5, sha1 or sha256). +- **output**: +>File object(s) related to the input attribute found on MALWAREbazaar databases. +- **references**: +>https://bazaar.abuse.ch/ + +----- + +#### [mmdb_lookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mmdb_lookup.py) + + + +A hover and expansion module to enrich an ip with geolocation and ASN information from an mmdb server instance, such as CIRCL's ip.circl.lu. +- **features**: +>The module takes an IP address related attribute as input. +> It queries the public CIRCL.lu mmdb-server instance, available at ip.circl.lu, by default. The module can be configured with a custom mmdb server url if required. +> It is also possible to filter results on 1 db_source by configuring db_source_filter. +- **input**: +>An IP address attribute (for example ip-src or ip-src|port). +- **output**: +>Geolocation and asn objects. +- **references**: +> - https://data.public.lu/fr/datasets/geo-open-ip-address-geolocation-per-country-in-mmdb-format/ +> - https://github.com/adulau/mmdb-server + +----- + +#### [mwdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mwdb.py) + +Module to push malware samples to a MWDB instance +- **features**: +>An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB). Does: * Upload of attachment or malware sample to MWDB * Tags of events and/or attributes are added to MWDB. * Comment of the MISP attribute is added to MWDB. * A link back to the MISP event is added to MWDB via the MWDB attribute. * A link to the MWDB attribute is added as an enrichted attribute to the MISP event. +- **input**: +>Attachment or malware sample +- **output**: +>Link attribute that points to the sample at the MWDB instane +- **requirements**: +>* mwdblib installed (pip install mwdblib) ; * (optional) keys.py file to add tags of events/attributes to MWDB * (optional) MWDB attribute created for the link back to MISP (defined in mwdb_misp_attribute) + +----- + +#### [ocr_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ocr_enrich.py) + +Module to process some optical character recognition on pictures. +- **features**: +>The module takes an attachment attributes as input and process some optical character recognition on it. The text found is then passed to the Freetext importer to extract potential IoCs. +- **input**: +>A picture attachment. +- **output**: +>Text and freetext fetched from the input picture. +- **requirements**: +>cv2: The OpenCV python library. + +----- + +#### [ods_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ods_enrich.py) + + + +Module to extract freetext from a .ods document. +- **features**: +>The module reads the text contained in a .ods document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a .ods document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +> - ezodf: Python package to create/manipulate OpenDocumentFormat files. +> - pandas_ods_reader: Python library to read in ODS files. + +----- + +#### [odt_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/odt_enrich.py) + + + +Module to extract freetext from a .odt document. +- **features**: +>The module reads the text contained in a .odt document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a .odt document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +>ODT reader python library. + +----- + +#### [onyphe](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/onyphe.py) + + + +Module to process a query on Onyphe. +- **features**: +>This module takes a domain, hostname, or IP address attribute as input in order to query the Onyphe API. Data fetched from the query is then parsed and MISP attributes are extracted. +- **input**: +>A domain, hostname or IP address MISP attribute. +- **output**: +>MISP attributes fetched from the Onyphe query. +- **references**: +> - https://www.onyphe.io/ +> - https://github.com/sebdraven/pyonyphe +- **requirements**: +> - onyphe python library +> - An access to the Onyphe API (apikey) + +----- + +#### [onyphe_full](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/onyphe_full.py) + + + +Module to process a full query on Onyphe. +- **features**: +>This module takes a domain, hostname, or IP address attribute as input in order to query the Onyphe API. Data fetched from the query is then parsed and MISP attributes are extracted. +> +>The parsing is here more advanced than the one on onyphe module, and is returning more attributes, since more fields of the query result are watched and parsed. +- **input**: +>A domain, hostname or IP address MISP attribute. +- **output**: +>MISP attributes fetched from the Onyphe query. +- **references**: +> - https://www.onyphe.io/ +> - https://github.com/sebdraven/pyonyphe +- **requirements**: +> - onyphe python library +> - An access to the Onyphe API (apikey) + +----- + +#### [otx](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/otx.py) + + + +Module to get information from AlienVault OTX. +- **features**: +>This module takes a MISP attribute as input to query the OTX Alienvault API. The API returns then the result of the query with some types we map into compatible types we add as MISP attributes. +- **input**: +>A MISP attribute included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- md5 +>- sha1 +>- sha256 +>- sha512 +- **output**: +>MISP attributes mapped from the result of the query on OTX, included in the following list: +>- domain +>- ip-src +>- ip-dst +>- text +>- md5 +>- sha1 +>- sha256 +>- sha512 +>- email +- **references**: +>https://www.alienvault.com/open-threat-exchange +- **requirements**: +>An access to the OTX API (apikey) + +----- + +#### [passivessh](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivessh.py) + + + +An expansion module to query the CIRCL Passive SSH. +- **features**: +>The module queries the Passive SSH service from CIRCL. +> +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>IP addresses or SSH fingerprints +- **output**: +>SSH key materials, complementary IP addresses with similar SSH key materials +- **references**: +>https://github.com/D4-project/passive-ssh + +----- + +#### [passivetotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivetotal.py) + + + + +- **features**: +>The PassiveTotal MISP expansion module brings the datasets derived from Internet scanning directly into your MISP instance. This module supports passive DNS, historic SSL, WHOIS, and host attributes. In order to use the module, you must have a valid PassiveTotal account username and API key. Registration is free and can be done by visiting https://www.passivetotal.org/register +- **input**: +>A MISP attribute included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- x509-fingerprint-sha1 +>- email-src +>- email-dst +>- target-email +>- whois-registrant-email +>- whois-registrant-phone +>- text +>- whois-registrant-name +>- whois-registrar +>- whois-creation-date +- **output**: +>MISP attributes mapped from the result of the query on PassiveTotal, included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- x509-fingerprint-sha1 +>- email-src +>- email-dst +>- target-email +>- whois-registrant-email +>- whois-registrant-phone +>- text +>- whois-registrant-name +>- whois-registrar +>- whois-creation-date +>- md5 +>- sha1 +>- sha256 +>- link +- **references**: +>https://www.passivetotal.org/register +- **requirements**: +> - Passivetotal python library +> - An access to the PassiveTotal API (apikey) + +----- + +#### [pdf_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/pdf_enrich.py) + + + +Module to extract freetext from a PDF document. +- **features**: +>The module reads the text contained in a PDF document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a PDF document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +>pdftotext: Python library to extract text from PDF. + +----- + +#### [pptx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/pptx_enrich.py) + + + +Module to extract freetext from a .pptx document. +- **features**: +>The module reads the text contained in a .pptx document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a .pptx document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +>pptx: Python library to read PowerPoint files. + +----- + +#### [qintel_qsentry](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qintel_qsentry.py) + + + +A hover and expansion module which queries Qintel QSentry for ip reputation data +- **features**: +>This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the Qintel QSentry API to retrieve ip reputation data +- **input**: +>ip address attribute +- **ouput**: +>Objects containing the enriched IP, threat tags, last seen attributes and associated Autonomous System information +- **references**: +>https://www.qintel.com/products/qsentry/ +- **requirements**: +>A Qintel API token + +----- + +#### [qrcode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qrcode.py) + +Module to decode QR codes. +- **features**: +>The module reads the QR code and returns the related address, which can be an URL or a bitcoin address. +- **input**: +>A QR code stored as attachment attribute. +- **output**: +>The URL or bitcoin address the QR code is pointing to. +- **requirements**: +> - cv2: The OpenCV python library. +> - pyzbar: Python library to read QR codes. + +----- + +#### [ransomcoindb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ransomcoindb.py) +- **descrption**: +>Module to access the ransomcoinDB with a hash or btc address attribute and get the associated btc address of hashes. +- **features**: +>The module takes either a hash attribute or a btc attribute as input to query the ransomcoinDB API for some additional data. +> +>If the input is a btc address, we will get the associated hashes returned in a file MISP object. If we query ransomcoinDB with a hash, the response contains the associated btc addresses returned as single MISP btc attributes. +- **input**: +>A hash (md5, sha1 or sha256) or btc attribute. +- **output**: +>Hashes associated to a btc address or btc addresses associated to a hash. +- **references**: +>https://ransomcoindb.concinnity-risks.com +- **requirements**: +>A ransomcoinDB API key. + +----- + +#### [rbl](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/rbl.py) + +Module to check an IPv4 address against known RBLs. +- **features**: +>This module takes an IP address attribute as input and queries multiple know Real-time Blackhost Lists to check if they have already seen this IP address. +> +>We display then all the information we get from those different sources. +- **input**: +>IP address attribute. +- **output**: +>Text with additional data from Real-time Blackhost Lists about the IP address. +- **references**: +>[RBLs list](https://github.com/MISP/misp-modules/blob/8817de476572a10a9c9d03258ec81ca70f3d926d/misp_modules/modules/expansion/rbl.py#L20) +- **requirements**: +>dnspython3: DNS python3 library + +----- + +#### [recordedfuture](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/recordedfuture.py) + + + +Module to enrich attributes with threat intelligence from Recorded Future. +- **features**: +>Enrich an attribute to add a custom enrichment object to the event. The object contains a copy of the enriched attribute with added tags presenting risk score and triggered risk rules from Recorded Future. Malware and Threat Actors related to the enriched indicator in Recorded Future is matched against MISP's galaxy clusters and applied as galaxy tags. The custom enrichment object also includes a list of related indicators from Recorded Future (IP's, domains, hashes, URL's and vulnerabilities) added as additional attributes. +- **input**: +>A MISP attribute of one of the following types: ip, ip-src, ip-dst, domain, hostname, md5, sha1, sha256, uri, url, vulnerability, weakness. +- **output**: +>A MISP object containing a copy of the enriched attribute with added tags from Recorded Future and a list of new attributes related to the enriched attribute. +- **references**: +>https://www.recordedfuture.com/ +- **requirements**: +>A Recorded Future API token. + +----- + +#### [reversedns](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/reversedns.py) + +Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes. +- **features**: +>The module takes an IP address as input and tries to find the hostname this IP address is resolved into. +> +>The address of the DNS resolver to use is also configurable, but if no configuration is set, we use the Google public DNS address (8.8.8.8). +> +>Please note that composite MISP attributes containing IP addresses are supported as well. +- **input**: +>An IP address attribute. +- **output**: +>Hostname attribute the input is resolved into. +- **requirements**: +>DNS python library + +----- + +#### [securitytrails](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/securitytrails.py) + + + +An expansion modules for SecurityTrails. +- **features**: +>The module takes a domain, hostname or IP address attribute as input and queries the SecurityTrails API with it. +> +>Multiple parsing operations are then processed on the result of the query to extract a much information as possible. +> +>From this data extracted are then mapped MISP attributes. +- **input**: +>A domain, hostname or IP address attribute. +- **output**: +>MISP attributes resulting from the query on SecurityTrails API, included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- dns-soa-email +>- whois-registrant-email +>- whois-registrant-phone +>- whois-registrant-name +>- whois-registrar +>- whois-creation-date +>- domain +- **references**: +>https://securitytrails.com/ +- **requirements**: +> - dnstrails python library +> - An access to the SecurityTrails API (apikey) + +----- + +#### [shodan](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/shodan.py) + + + +Module to query on Shodan. +- **features**: +>The module takes an IP address as input and queries the Shodan API to get some additional data about it. +- **input**: +>An IP address MISP attribute. +- **output**: +>Text with additional data about the input, resulting from the query on Shodan. +- **references**: +>https://www.shodan.io/ +- **requirements**: +> - shodan python library +> - An access to the Shodan API (apikey) + +----- + +#### [sigma_queries](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sigma_queries.py) + + + +An expansion hover module to display the result of sigma queries. +- **features**: +>This module takes a Sigma rule attribute as input and tries all the different queries available to convert it into different formats recognized by SIEMs. +- **input**: +>A Sigma attribute. +- **output**: +>Text displaying results of queries on the Sigma attribute. +- **references**: +>https://github.com/Neo23x0/sigma/wiki +- **requirements**: +>Sigma python library + +----- + +#### [sigma_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sigma_syntax_validator.py) + + + +An expansion hover module to perform a syntax check on sigma rules. +- **features**: +>This module takes a Sigma rule attribute as input and performs a syntax check on it. +> +>It displays then that the rule is valid if it is the case, and the error related to the rule otherwise. +- **input**: +>A Sigma attribute. +- **output**: +>Text describing the validity of the Sigma rule. +- **references**: +>https://github.com/Neo23x0/sigma/wiki +- **requirements**: +> - Sigma python library +> - Yaml python library + +----- + +#### [socialscan](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/socialscan.py) + +A hover module to get information on the availability of an email address or username on some online platforms. +- **features**: +>The module takes an email address or username as input and check its availability on some online platforms. The results for each platform are then returned to see if the email address or the username is used, available or if there is an issue with it. +- **input**: +>An email address or usename attribute. +- **output**: +>Text containing information about the availability of an email address or a username in some online platforms. +- **references**: +>https://github.com/iojw/socialscan +- **requirements**: +>The socialscan python library + +----- + +#### [sophoslabs_intelix](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sophoslabs_intelix.py) + + + +An expansion module to query the Sophoslabs intelix API to get additional information about an ip address, url, domain or sha256 attribute. +- **features**: +>The module takes an ip address, url, domain or sha256 attribute and queries the SophosLabs Intelix API with the attribute value. The result of this query is a SophosLabs Intelix hash report, or an ip or url lookup, that is then parsed and returned in a MISP object. +- **input**: +>An ip address, url, domain or sha256 attribute. +- **output**: +>SophosLabs Intelix report and lookup objects +- **references**: +>https://aws.amazon.com/marketplace/pp/B07SLZPMCS +- **requirements**: +>A client_id and client_secret pair to authenticate to the SophosLabs Intelix API + +----- + +#### [sourcecache](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/sourcecache.py) + +Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page. +- **features**: +>This module takes a link or url attribute as input and caches the related web page. It returns then a link of the cached page. +- **input**: +>A link or url attribute. +- **output**: +>A malware-sample attribute describing the cached page. +- **references**: +>https://github.com/adulau/url_archiver +- **requirements**: +>urlarchiver: python library to fetch and archive URL on the file-system + +----- + +#### [stix2_pattern_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) + + + +An expansion hover module to perform a syntax check on stix2 patterns. +- **features**: +>This module takes a STIX2 pattern attribute as input and performs a syntax check on it. +> +>It displays then that the rule is valid if it is the case, and the error related to the rule otherwise. +- **input**: +>A STIX2 pattern attribute. +- **output**: +>Text describing the validity of the STIX2 pattern. +- **references**: +>[STIX2.0 patterning specifications](http://docs.oasis-open.org/cti/stix/v2.0/cs01/part5-stix-patterning/stix-v2.0-cs01-part5-stix-patterning.html) +- **requirements**: +>stix2patterns python library + +----- + +#### [threatcrowd](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/threatcrowd.py) + + + +Module to get information from ThreatCrowd. +- **features**: +>This module takes a MISP attribute as input and queries ThreatCrowd with it. +> +>The result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute. +- **input**: +>A MISP attribute included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- md5 +>- sha1 +>- sha256 +>- sha512 +>- whois-registrant-email +- **output**: +>MISP attributes mapped from the result of the query on ThreatCrowd, included in the following list: +>- domain +>- ip-src +>- ip-dst +>- text +>- md5 +>- sha1 +>- sha256 +>- sha512 +>- hostname +>- whois-registrant-email +- **references**: +>https://www.threatcrowd.org/ + +----- + +#### [threatminer](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/threatminer.py) + + + +Module to get information from ThreatMiner. +- **features**: +>This module takes a MISP attribute as input and queries ThreatMiner with it. +> +>The result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute. +- **input**: +>A MISP attribute included in the following list: +>- hostname +>- domain +>- ip-src +>- ip-dst +>- md5 +>- sha1 +>- sha256 +>- sha512 +- **output**: +>MISP attributes mapped from the result of the query on ThreatMiner, included in the following list: +>- domain +>- ip-src +>- ip-dst +>- text +>- md5 +>- sha1 +>- sha256 +>- sha512 +>- ssdeep +>- authentihash +>- filename +>- whois-registrant-email +>- url +>- link +- **references**: +>https://www.threatminer.org/ + +----- + +#### [trustar_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/trustar_enrich.py) + + + +Module to get enrich indicators with TruSTAR. +- **features**: +>This module enriches MISP attributes with scoring and metadata from TruSTAR. +> +>The TruSTAR indicator summary is appended to the attributes along with links to any associated reports. +- **input**: +>Any of the following MISP attributes: +>- btc +>- domain +>- email-src +>- filename +>- hostname +>- ip-src +>- ip-dst +>- md5 +>- sha1 +>- sha256 +>- url +- **output**: +>MISP attributes enriched with indicator summary data from the TruSTAR API. Data includes a severity level score and additional source and scoring info. +- **references**: +>https://docs.trustar.co/api/v13/indicators/get_indicator_summaries.html + +----- + +#### [urlhaus](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/urlhaus.py) + + + +Query of the URLhaus API to get additional information about the input attribute. +- **features**: +>Module using the new format of modules able to return attributes and objects. +> +>The module takes one of the attribute type specified as input, and query the URLhaus API with it. If any result is returned by the API, attributes and objects are created accordingly. +- **input**: +>A domain, hostname, url, ip, md5 or sha256 attribute. +- **output**: +>MISP attributes & objects fetched from the result of the URLhaus API query. +- **references**: +>https://urlhaus.abuse.ch/ + +----- + +#### [urlscan](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/urlscan.py) + + + +An expansion module to query urlscan.io. +- **features**: +>This module takes a MISP attribute as input and queries urlscan.io with it. +> +>The result of this query is then parsed and some data is mapped into MISP attributes in order to enrich the input attribute. +- **input**: +>A domain, hostname or url attribute. +- **output**: +>MISP attributes mapped from the result of the query on urlscan.io. +- **references**: +>https://urlscan.io/ +- **requirements**: +>An access to the urlscan.io API + +----- + +#### [variotdbs](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/variotdbs.py) + + + +An expansion module to query the VARIoT db API for more information about a vulnerability. +- **features**: +>The module takes a vulnerability attribute as input and queries que VARIoT db API to gather additional information. +> +>The `vuln` endpoint is queried first to look for additional information about the vulnerability itself. +> +>The `exploits` endpoint is also queried then to look for the information of the potential related exploits, which are parsed and added to the results using the `exploit` object template. +- **input**: +>Vulnerability attribute. +- **output**: +>Additional information about the vulnerability, as it is stored on the VARIoT db, about the vulnerability itself, and the potential related exploits. +- **references**: +>https://www.variotdbs.pl/ +- **requirements**: +>A VARIoT db API key (if you do not want to be limited to 100 queries / day) + +----- + +#### [virustotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/virustotal.py) + + + +Module to get advanced information from virustotal. +- **features**: +>New format of modules able to return attributes and objects. +> +>A module to take a MISP attribute as input and query the VirusTotal API to get additional data about it. +> +>Compared to the [standard VirusTotal expansion module](https://github.com/MISP/misp-modules/blob/master/misp_modules/modules/expansion/virustotal_public.py), this module is made for advanced parsing of VirusTotal report, with a recursive analysis of the elements found after the first request. +> +>Thus, it requires a higher request rate limit to avoid the API to return a 204 error (Request rate limit exceeded), and the data parsed from the different requests are returned as MISP attributes and objects, with the corresponding relations between each one of them. +- **input**: +>A domain, hash (md5, sha1, sha256 or sha512), hostname or IP address attribute. +- **output**: +>MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute. +- **references**: +> - https://www.virustotal.com/ +> - https://developers.virustotal.com/reference +- **requirements**: +>An access to the VirusTotal API (apikey), with a high request rate limit. + +----- + +#### [virustotal_public](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/virustotal_public.py) + + + +Module to get information from VirusTotal. +- **features**: +>New format of modules able to return attributes and objects. +> +>A module to take a MISP attribute as input and query the VirusTotal API to get additional data about it. +> +>Compared to the [more advanced VirusTotal expansion module](https://github.com/MISP/misp-modules/blob/master/misp_modules/modules/expansion/virustotal.py), this module is made for VirusTotal users who have a low request rate limit. +> +>Thus, it only queries the API once and returns the results that is parsed into MISP attributes and objects. +- **input**: +>A domain, hostname, ip, url or hash (md5, sha1, sha256 or sha512) attribute. +- **output**: +>MISP attributes and objects resulting from the parsing of the VirusTotal report concerning the input attribute. +- **references**: +> - https://www.virustotal.com +> - https://developers.virustotal.com/reference +- **requirements**: +>An access to the VirusTotal API (apikey) + +----- + +#### [vmray_submit](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vmray_submit.py) + + + +Module to submit a sample to VMRay. +- **features**: +>This module takes an attachment or malware-sample attribute as input to query the VMRay API. +> +>The sample contained within the attribute in then enriched with data from VMRay mapped into MISP attributes. +- **input**: +>An attachment or malware-sample attribute. +- **output**: +>MISP attributes mapped from the result of the query on VMRay API, included in the following list: +>- text +>- sha1 +>- sha256 +>- md5 +>- link +- **references**: +>https://www.vmray.com/ +- **requirements**: +>An access to the VMRay API (apikey & url) + +----- + +#### [vmware_nsx](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vmware_nsx.py) + + + +Module to enrich a file or URL with VMware NSX Defender. +- **features**: +>This module takes an IoC such as file hash, file attachment, malware-sample or url as input to query VMware NSX Defender. +> +>The IoC is then enriched with data from VMware NSX Defender. +- **input**: +>File hash, attachment or URL to be enriched with VMware NSX Defender. +- **output**: +>Objects and tags generated by VMware NSX Defender. +- **references**: +>https://www.vmware.com +- **requirements**: +>The module requires a VMware NSX Defender Analysis `api_token` and `key`. + +----- + +#### [vulndb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulndb.py) + + + +Module to query VulnDB (RiskBasedSecurity.com). +- **features**: +>This module takes a vulnerability attribute as input and queries VulnDB in order to get some additional data about it. +> +>The API gives the result of the query which can be displayed in the screen, and/or mapped into MISP attributes to add in the event. +- **input**: +>A vulnerability attribute. +- **output**: +>Additional data enriching the CVE input, fetched from VulnDB. +- **references**: +>https://vulndb.cyberriskanalytics.com/ +- **requirements**: +>An access to the VulnDB API (apikey, apisecret) + +----- + +#### [vulners](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulners.py) + + + +An expansion hover module to expand information about CVE id using Vulners API. +- **features**: +>This module takes a vulnerability attribute as input and queries the Vulners API in order to get some additional data about it. +> +>The API then returns details about the vulnerability. +- **input**: +>A vulnerability attribute. +- **output**: +>Text giving additional information about the CVE in input. +- **references**: +>https://vulners.com/ +- **requirements**: +> - Vulners python library +> - An access to the Vulners API + +----- + +#### [whois](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/whois.py) + +Module to query a local instance of uwhois (https://github.com/rafiot/uwhoisd). +- **features**: +>This module takes a domain or IP address attribute as input and queries a 'Univseral Whois proxy server' to get the correct details of the Whois query on the input value (check the references for more details about this whois server). +- **input**: +>A domain or IP address attribute. +- **output**: +>Text describing the result of a whois request for the input value. +- **references**: +>https://github.com/rafiot/uwhoisd +- **requirements**: +>uwhois: A whois python library + +----- + +#### [wiki](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/wiki.py) + + + +An expansion hover module to extract information from Wikidata to have additional information about particular term for analysis. +- **features**: +>This module takes a text attribute as input and queries the Wikidata API. If the text attribute is clear enough to define a specific term, the API returns a wikidata link in response. +- **input**: +>Text attribute. +- **output**: +>Text attribute. +- **references**: +>https://www.wikidata.org +- **requirements**: +>SPARQLWrapper python library + +----- + +#### [xforceexchange](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/xforceexchange.py) + + + +An expansion module for IBM X-Force Exchange. +- **features**: +>This module takes a MISP attribute as input to query the X-Force API. The API returns then additional information known in their threats data, that is mapped into MISP attributes. +- **input**: +>A MISP attribute included in the following list: +>- ip-src +>- ip-dst +>- vulnerability +>- md5 +>- sha1 +>- sha256 +- **output**: +>MISP attributes mapped from the result of the query on X-Force Exchange. +- **references**: +>https://exchange.xforce.ibmcloud.com/ +- **requirements**: +>An access to the X-Force API (apikey) + +----- + +#### [xlsx_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/xlsx_enrich.py) + + + +Module to extract freetext from a .xlsx document. +- **features**: +>The module reads the text contained in a .xlsx document. The result is passed to the freetext import parser so IoCs can be extracted out of it. +- **input**: +>Attachment attribute containing a .xlsx document. +- **output**: +>Text and freetext parsed from the document. +- **requirements**: +>pandas: Python library to perform data analysis, time series and statistics. + +----- + +#### [yara_query](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yara_query.py) + + + +An expansion & hover module to translate any hash attribute into a yara rule. +- **features**: +>The module takes a hash attribute (md5, sha1, sha256, imphash) as input, and is returning a YARA rule from it. This YARA rule is also validated using the same method as in 'yara_syntax_validator' module. +>Both hover and expansion functionalities are supported with this module, where the hover part is displaying the resulting YARA rule and the expansion part allows you to add the rule as a new attribute, as usual with expansion modules. +- **input**: +>MISP Hash attribute (md5, sha1, sha256, imphash, or any of the composite attribute with filename and one of the previous hash type). +- **output**: +>YARA rule. +- **references**: +> - https://virustotal.github.io/yara/ +> - https://github.com/virustotal/yara-python +- **requirements**: +>yara-python python library + +----- + +#### [yara_syntax_validator](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yara_syntax_validator.py) + + + +An expansion hover module to perform a syntax check on if yara rules are valid or not. +- **features**: +>This modules simply takes a YARA rule as input, and checks its syntax. It returns then a confirmation if the syntax is valid, otherwise the syntax error is displayed. +- **input**: +>YARA rule attribute. +- **output**: +>Text to inform users if their rule is valid. +- **references**: +>http://virustotal.github.io/yara/ +- **requirements**: +>yara_python python library + +----- + +#### [yeti](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yeti.py) + + + +Module to process a query on Yeti. +- **features**: +>This module add context and links between observables using yeti +- **input**: +>A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute. +- **output**: +>MISP attributes and objects fetched from the Yeti instances. +- **references**: +> - https://github.com/yeti-platform/yeti +> - https://github.com/sebdraven/pyeti +- **requirements**: +> - pyeti +> - API key + +----- diff --git a/documentation/mkdocs/export_mod.md b/documentation/mkdocs/export_mod.md new file mode 100644 index 0000000..c0848f5 --- /dev/null +++ b/documentation/mkdocs/export_mod.md @@ -0,0 +1,247 @@ + +#### [cef_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cef_export.py) + +Module to export a MISP event in CEF format. +- **features**: +>The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in Common Event Format. +>Thus, there is no particular feature concerning MISP Events since any event can be exported. However, 4 configuration parameters recognized by CEF format are required and should be provided by users before exporting data: the device vendor, product and version, as well as the default severity of data. +- **input**: +>MISP Event attributes +- **output**: +>Common Event Format file +- **references**: +>https://community.softwaregrp.com/t5/ArcSight-Connectors/ArcSight-Common-Event-Format-CEF-Guide/ta-p/1589306?attachment-id=65537 + +----- + +#### [cisco_firesight_manager_ACL_rule_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cisco_firesight_manager_ACL_rule_export.py) + + + +Module to export malicious network activity attributes to Cisco fireSIGHT manager block rules. +- **features**: +>The module goes through the attributes to find all the network activity ones in order to create block rules for the Cisco fireSIGHT manager. +- **input**: +>Network activity attributes (IPs, URLs). +- **output**: +>Cisco fireSIGHT manager block rules. +- **requirements**: +>Firesight manager console credentials + +----- + +#### [defender_endpoint_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/defender_endpoint_export.py) + + + +Defender for Endpoint KQL hunting query export module +- **features**: +>This module export an event as Defender for Endpoint KQL queries that can then be used in your own python3 or Powershell tool. If you are using Microsoft Sentinel, you can directly connect your MISP instance to Sentinel and then create queries using the `ThreatIntelligenceIndicator` table to match events against imported IOC. +- **input**: +>MISP Event attributes +- **output**: +>Defender for Endpoint KQL queries +- **references**: +>https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/advanced-hunting-schema-reference + +----- + +#### [goamlexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/goamlexport.py) + + + +This module is used to export MISP events containing transaction objects into GoAML format. +- **features**: +>The module works as long as there is at least one transaction object in the Event. +> +>Then in order to have a valid GoAML document, please follow these guidelines: +>- For each transaction object, use either a bank-account, person, or legal-entity object to describe the origin of the transaction, and again one of them to describe the target of the transaction. +>- Create an object reference for both origin and target objects of the transaction. +>- A bank-account object needs a signatory, which is a person object, put as object reference of the bank-account. +>- A person can have an address, which is a geolocation object, put as object reference of the person. +> +>Supported relation types for object references that are recommended for each object are the folowing: +>- transaction: +> - 'from', 'from_my_client': Origin of the transaction - at least one of them is required. +> - 'to', 'to_my_client': Target of the transaction - at least one of them is required. +> - 'address': Location of the transaction - optional. +>- bank-account: +> - 'signatory': Signatory of a bank-account - the reference from bank-account to a signatory is required, but the relation-type is optional at the moment since this reference will always describe a signatory. +> - 'entity': Entity owning the bank account - optional. +>- person: +> - 'address': Address of a person - optional. +- **input**: +>MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target. +- **output**: +>GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities). +- **references**: +>http://goaml.unodc.org/ +- **requirements**: +> - PyMISP +> - MISP objects + +----- + +#### [liteexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/liteexport.py) + +Lite export of a MISP event. +- **features**: +>This module is simply producing a json MISP event format file, but exporting only Attributes from the Event. Thus, MISP Events exported with this module should have attributes that are not internal references, otherwise the resulting event would be empty. +- **input**: +>MISP Event attributes +- **output**: +>Lite MISP Event + +----- + +#### [mass_eql_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/mass_eql_export.py) + + + +Mass EQL query export for a MISP event. +- **features**: +>This module produces EQL queries for all relevant attributes in a MISP event. +- **input**: +>MISP Event attributes +- **output**: +>Text file containing one or more EQL queries +- **references**: +>https://eql.readthedocs.io/en/latest/ + +----- + +#### [nexthinkexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/nexthinkexport.py) + + + +Nexthink NXQL query export module +- **features**: +>This module export an event as Nexthink NXQL queries that can then be used in your own python3 tool or from wget/powershell +- **input**: +>MISP Event attributes +- **output**: +>Nexthink NXQL queries +- **references**: +>https://doc.nexthink.com/Documentation/Nexthink/latest/APIAndIntegrations/IntroducingtheWebAPIV2 + +----- + +#### [osqueryexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/osqueryexport.py) + + + +OSQuery export of a MISP event. +- **features**: +>This module export an event as osquery queries that can be used in packs or in fleet management solution like Kolide. +- **input**: +>MISP Event attributes +- **output**: +>osquery SQL queries + +----- + +#### [pdfexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/pdfexport.py) + +Simple export of a MISP event to PDF. +- **features**: +>The module takes care of the PDF file building, and work with any MISP Event. Except the requirement of reportlab, used to create the file, there is no special feature concerning the Event. Some parameters can be given through the config dict. 'MISP_base_url_for_dynamic_link' is your MISP URL, to attach an hyperlink to your event on your MISP instance from the PDF. Keep it clear to avoid hyperlinks in the generated pdf. +> 'MISP_name_for_metadata' is your CERT or MISP instance name. Used as text in the PDF' metadata +> 'Activate_textual_description' is a boolean (True or void) to activate the textual description/header abstract of an event +> 'Activate_galaxy_description' is a boolean (True or void) to activate the description of event related galaxies. +> 'Activate_related_events' is a boolean (True or void) to activate the description of related event. Be aware this might leak information on confidential events linked to the current event ! +> 'Activate_internationalization_fonts' is a boolean (True or void) to activate Noto fonts instead of default fonts (Helvetica). This allows the support of CJK alphabet. Be sure to have followed the procedure to download Noto fonts (~70Mo) in the right place (/tools/pdf_fonts/Noto_TTF), to allow PyMisp to find and use them during PDF generation. +> 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option +- **input**: +>MISP Event +- **output**: +>MISP Event in a PDF file. +- **references**: +>https://acrobat.adobe.com/us/en/acrobat/about-adobe-pdf.html +- **requirements**: +> - PyMISP +> - reportlab + +----- + +#### [testexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/testexport.py) + +Skeleton export module. + +----- + +#### [threatStream_misp_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/threatStream_misp_export.py) + + + +Module to export a structured CSV file for uploading to threatStream. +- **features**: +>The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatStream. +- **input**: +>MISP Event attributes +- **output**: +>ThreatStream CSV format file +- **references**: +> - https://www.anomali.com/platform/threatstream +> - https://github.com/threatstream +- **requirements**: +>csv + +----- + +#### [threat_connect_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/threat_connect_export.py) + + + +Module to export a structured CSV file for uploading to ThreatConnect. +- **features**: +>The module takes a MISP event in input, to look every attribute. Each attribute matching with some predefined types is then exported in a CSV format recognized by ThreatConnect. +>Users should then provide, as module configuration, the source of data they export, because it is required by the output format. +- **input**: +>MISP Event attributes +- **output**: +>ThreatConnect CSV format file +- **references**: +>https://www.threatconnect.com +- **requirements**: +>csv + +----- + +#### [virustotal_collections](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/virustotal_collections.py) + + + +Creates a VT Collection from an event iocs. +- **features**: +>This export module which takes advantage of a new endpoint in VT APIv3 to create VT Collections from IOCs contained in a MISP event. With this module users will be able to create a collection just using the Download as... button. +- **input**: +>A domain, hash (md5, sha1, sha256 or sha512), hostname, url or IP address attribute. +- **output**: +>A VirusTotal collection in VT. +- **references**: +> - https://www.virustotal.com/ +> - https://blog.virustotal.com/2021/11/introducing-virustotal-collections.html +- **requirements**: +>An access to the VirusTotal API (apikey). + +----- + +#### [vt_graph](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/vt_graph.py) + + + +This module is used to create a VirusTotal Graph from a MISP event. +- **features**: +>The module takes the MISP event as input and queries the VirusTotal Graph API to create a new graph out of the event. +> +>Once the graph is ready, we get the url of it, which is returned so we can view it on VirusTotal. +- **input**: +>A MISP event. +- **output**: +>Link of the VirusTotal Graph created for the event. +- **references**: +>https://www.virustotal.com/gui/graph-overview +- **requirements**: +>vt_graph_api, the python library to query the VirusTotal graph API + +----- diff --git a/documentation/mkdocs/import_mod.md b/documentation/mkdocs/import_mod.md new file mode 100644 index 0000000..5fe6ccf --- /dev/null +++ b/documentation/mkdocs/import_mod.md @@ -0,0 +1,198 @@ + +#### [cof2misp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/cof2misp.py) + +Passive DNS Common Output Format (COF) MISP importer +- **features**: +>Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input. +- **input**: +>Passive DNS output in Common Output Format (COF) +- **output**: +>MISP objects +- **references**: +>https://tools.ietf.org/id/draft-dulaunoy-dnsop-passive-dns-cof-08.html +- **requirements**: +>PyMISP + +----- + +#### [csvimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/csvimport.py) + +Module to import MISP attributes from a csv file. +- **features**: +>In order to parse data from a csv file, a header is required to let the module know which column is matching with known attribute fields / MISP types. +> +>This header either comes from the csv file itself or is part of the configuration of the module and should be filled out in MISP plugin settings, each field separated by COMMAS. Fields that do not match with any type known in MISP or are not MISP attribute fields should be ignored in import, using a space or simply nothing between two separators (example: 'ip-src, , comment, '). +> +>If the csv file already contains a header that does not start by a '#', you should tick the checkbox 'has_header' to avoid importing it and have potential issues. You can also redefine the header even if it is already contained in the file, by following the rules for headers explained earlier. One reason why you would redefine a header is for instance when you want to skip some fields, or some fields are not valid types. +- **input**: +>CSV format file. +- **output**: +>MISP Event attributes +- **references**: +> - https://tools.ietf.org/html/rfc4180 +> - https://tools.ietf.org/html/rfc7111 +- **requirements**: +>PyMISP + +----- + +#### [cuckooimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/cuckooimport.py) + + + +Module to import Cuckoo JSON. +- **features**: +>The module simply imports MISP Attributes from a Cuckoo JSON format file. There is thus no special feature to make it work. +- **input**: +>Cuckoo JSON file +- **output**: +>MISP Event attributes +- **references**: +> - https://cuckoosandbox.org/ +> - https://github.com/cuckoosandbox/cuckoo + +----- + +#### [email_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/email_import.py) + +Module to import emails in MISP. +- **features**: +>This module can be used to import e-mail text as well as attachments and urls. +>3 configuration parameters are then used to unzip attachments, guess zip attachment passwords, and extract urls: set each one of them to True or False to process or not the respective corresponding actions. +- **input**: +>E-mail file +- **output**: +>MISP Event attributes + +----- + +#### [goamlimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/goamlimport.py) + + + +Module to import MISP objects about financial transactions from GoAML files. +- **features**: +>Unlike the GoAML export module, there is here no special feature to import data from GoAML external files, since the module will import MISP Objects with their References on its own, as it is required for the export module to rebuild a valid GoAML document. +- **input**: +>GoAML format file, describing financial transactions, with their origin and target (bank accounts, persons or entities). +- **output**: +>MISP objects (transaction, bank-account, person, legal-entity, geolocation), with references, describing financial transactions and their origin and target. +- **references**: +>http://goaml.unodc.org/ +- **requirements**: +>PyMISP + +----- + +#### [joe_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/joe_import.py) + + + +A module to import data from a Joe Sandbox analysis json report. +- **features**: +>Module using the new format of modules able to return attributes and objects. +> +>The module returns the same results as the expansion module [joesandbox_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) using the submission link of the analysis to get the json report. +- **input**: +>Json report of a Joe Sandbox analysis. +- **output**: +>MISP attributes & objects parsed from the analysis report. +- **references**: +> - https://www.joesecurity.org +> - https://www.joesandbox.com/ + +----- + +#### [lastline_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/lastline_import.py) + + + +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + +Module to import and parse reports from Lastline analysis links. +- **features**: +>The module requires a Lastline Portal `username` and `password`. +>The module uses the new format and it is able to return MISP attributes and objects. +>The module returns the same results as the [lastline_query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_query.py) expansion module. +- **input**: +>Link to a Lastline analysis. +- **output**: +>MISP attributes and objects parsed from the analysis report. +- **references**: +>https://www.lastline.com + +----- + +#### [mispjson](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/mispjson.py) + +Module to import MISP JSON format for merging MISP events. +- **features**: +>The module simply imports MISP Attributes from an other MISP Event in order to merge events together. There is thus no special feature to make it work. +- **input**: +>MISP Event +- **output**: +>MISP Event attributes + +----- + +#### [ocr](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/ocr.py) + +Optical Character Recognition (OCR) module for MISP. +- **features**: +>The module tries to recognize some text from an image and import the result as a freetext attribute, there is then no special feature asked to users to make it work. +- **input**: +>Image +- **output**: +>freetext MISP attribute + +----- + +#### [openiocimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/openiocimport.py) + +Module to import OpenIOC packages. +- **features**: +>The module imports MISP Attributes from OpenIOC packages, there is then no special feature for users to make it work. +- **input**: +>OpenIOC packages +- **output**: +>MISP Event attributes +- **references**: +>https://www.fireeye.com/blog/threat-research/2013/10/openioc-basics.html +- **requirements**: +>PyMISP + +----- + +#### [threatanalyzer_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/threatanalyzer_import.py) + +Module to import ThreatAnalyzer archive.zip / analysis.json files. +- **features**: +>The module imports MISP Attributes from a ThreatAnalyzer format file. This file can be either ZIP, or JSON format. +>There is by the way no special feature for users to make the module work. +- **input**: +>ThreatAnalyzer format file +- **output**: +>MISP Event attributes +- **references**: +>https://www.threattrack.com/malware-analysis.aspx + +----- + +#### [vmray_import](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/vmray_import.py) + + + +Module to import VMRay (VTI) results. +- **features**: +>The module imports MISP Attributes from VMRay format, using the VMRay api. +>Users should then provide as the module configuration the API Key as well as the server url in order to fetch their data to import. +- **input**: +>VMRay format +- **output**: +>MISP Event attributes +- **references**: +>https://www.vmray.com/ +- **requirements**: +>vmray_rest_api + +----- From ea071519b249d02916e4d3aaf01386bd505929aa Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 27 Oct 2022 10:15:25 +0200 Subject: [PATCH 475/476] chg: [mkdows] footer updated --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index c799d20..ea06ad7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,7 +16,7 @@ edit_uri: "" use_directory_urls: true # Copyright -copyright: "Copyright © 2019-2021 MISP Project" +copyright: "Copyright © 2019-2022 MISP Project" # Options extra: From eaebba291272504c5debdd969c0e68c8cc790864 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 27 Oct 2022 10:15:58 +0200 Subject: [PATCH 476/476] chg: [mkdocs] updated doc --- docs/contribute.md | 374 +++++++++++++++++ docs/install.md | 192 +++++++++ docs/license.md | 661 ++++++++++++++++++++++++++++++ docs/logos/apivoid.png | Bin 0 -> 6955 bytes docs/logos/assemblyline.png | Bin 0 -> 175511 bytes docs/logos/backscatter_io.png | Bin 0 -> 25590 bytes docs/logos/bitcoin.png | Bin 0 -> 9918 bytes docs/logos/circl.png | Bin 0 -> 19207 bytes docs/logos/cisco.png | Bin 0 -> 35608 bytes docs/logos/crowdstrike.png | Bin 0 -> 34911 bytes docs/logos/cuckoo.png | Bin 0 -> 11970 bytes docs/logos/cve.png | Bin 0 -> 20015 bytes docs/logos/cytomic_orion.png | Bin 0 -> 898 bytes docs/logos/defender_endpoing.png | Bin 0 -> 663462 bytes docs/logos/docx.png | Bin 0 -> 8617 bytes docs/logos/domaintools.png | Bin 0 -> 4886 bytes docs/logos/eql.png | Bin 0 -> 62384 bytes docs/logos/eupi.png | Bin 0 -> 9621 bytes docs/logos/farsight.png | Bin 0 -> 12300 bytes docs/logos/goAML.jpg | Bin 0 -> 31790 bytes docs/logos/google.png | Bin 0 -> 15903 bytes docs/logos/greynoise.png | Bin 0 -> 92083 bytes docs/logos/hibp.png | Bin 0 -> 20147 bytes docs/logos/hyas.png | Bin 0 -> 3219 bytes docs/logos/intel471.png | Bin 0 -> 6713 bytes docs/logos/intelmq.png | Bin 0 -> 30358 bytes docs/logos/ipqualityscore.png | Bin 0 -> 6769 bytes docs/logos/joesandbox.png | Bin 0 -> 9780 bytes docs/logos/lastline.png | Bin 0 -> 7194 bytes docs/logos/macaddress_io.png | Bin 0 -> 1854 bytes docs/logos/macvendors.png | Bin 0 -> 5064 bytes docs/logos/maxmind.png | Bin 0 -> 25782 bytes docs/logos/nexthink.svg | 22 + docs/logos/ods.png | Bin 0 -> 10161 bytes docs/logos/odt.png | Bin 0 -> 13074 bytes docs/logos/onyphe.jpg | Bin 0 -> 10439 bytes docs/logos/osquery.png | Bin 0 -> 1659 bytes docs/logos/otx.png | Bin 0 -> 8752 bytes docs/logos/passivedns.png | Bin 0 -> 19024 bytes docs/logos/passivessh.png | Bin 0 -> 58594 bytes docs/logos/passivessl.png | Bin 0 -> 25737 bytes docs/logos/passivetotal.png | Bin 0 -> 36361 bytes docs/logos/pdf.jpg | Bin 0 -> 8005 bytes docs/logos/pptx.png | Bin 0 -> 12347 bytes docs/logos/qintel.png | Bin 0 -> 47612 bytes docs/logos/recordedfuture.png | Bin 0 -> 39310 bytes docs/logos/securitytrails.png | Bin 0 -> 7947 bytes docs/logos/shodan.png | Bin 0 -> 33516 bytes docs/logos/sigma.png | Bin 0 -> 27681 bytes docs/logos/sophoslabs_intelix.svg | 32 ++ docs/logos/spamhaus.jpg | Bin 0 -> 6002 bytes docs/logos/stix.png | Bin 0 -> 3730 bytes docs/logos/threatconnect.png | Bin 0 -> 14988 bytes docs/logos/threatcrowd.png | Bin 0 -> 3117 bytes docs/logos/threatminer.png | Bin 0 -> 6174 bytes docs/logos/threatstream.png | Bin 0 -> 3488 bytes docs/logos/trustar.png | Bin 0 -> 37780 bytes docs/logos/urlhaus.png | Bin 0 -> 48474 bytes docs/logos/urlscan.jpg | Bin 0 -> 13553 bytes docs/logos/variot.png | Bin 0 -> 104724 bytes docs/logos/virustotal.png | Bin 0 -> 2776 bytes docs/logos/vmray.png | Bin 0 -> 15325 bytes docs/logos/vmware_nsx.png | Bin 0 -> 53372 bytes docs/logos/vulndb.png | Bin 0 -> 4801 bytes docs/logos/vulners.png | Bin 0 -> 3942 bytes docs/logos/wikidata.png | Bin 0 -> 4385 bytes docs/logos/xforce.png | Bin 0 -> 8534 bytes docs/logos/xlsx.png | Bin 0 -> 10015 bytes docs/logos/yara.png | Bin 0 -> 62135 bytes docs/logos/yeti.png | Bin 0 -> 316869 bytes 70 files changed, 1281 insertions(+) create mode 100644 docs/contribute.md create mode 100644 docs/install.md create mode 100644 docs/license.md create mode 100644 docs/logos/apivoid.png create mode 100644 docs/logos/assemblyline.png create mode 100644 docs/logos/backscatter_io.png create mode 100644 docs/logos/bitcoin.png create mode 100644 docs/logos/circl.png create mode 100644 docs/logos/cisco.png create mode 100644 docs/logos/crowdstrike.png create mode 100644 docs/logos/cuckoo.png create mode 100644 docs/logos/cve.png create mode 100644 docs/logos/cytomic_orion.png create mode 100644 docs/logos/defender_endpoing.png create mode 100644 docs/logos/docx.png create mode 100644 docs/logos/domaintools.png create mode 100644 docs/logos/eql.png create mode 100644 docs/logos/eupi.png create mode 100644 docs/logos/farsight.png create mode 100644 docs/logos/goAML.jpg create mode 100644 docs/logos/google.png create mode 100644 docs/logos/greynoise.png create mode 100644 docs/logos/hibp.png create mode 100644 docs/logos/hyas.png create mode 100644 docs/logos/intel471.png create mode 100644 docs/logos/intelmq.png create mode 100644 docs/logos/ipqualityscore.png create mode 100644 docs/logos/joesandbox.png create mode 100644 docs/logos/lastline.png create mode 100644 docs/logos/macaddress_io.png create mode 100644 docs/logos/macvendors.png create mode 100644 docs/logos/maxmind.png create mode 100644 docs/logos/nexthink.svg create mode 100644 docs/logos/ods.png create mode 100644 docs/logos/odt.png create mode 100644 docs/logos/onyphe.jpg create mode 100644 docs/logos/osquery.png create mode 100644 docs/logos/otx.png create mode 100644 docs/logos/passivedns.png create mode 100644 docs/logos/passivessh.png create mode 100644 docs/logos/passivessl.png create mode 100644 docs/logos/passivetotal.png create mode 100644 docs/logos/pdf.jpg create mode 100644 docs/logos/pptx.png create mode 100644 docs/logos/qintel.png create mode 100644 docs/logos/recordedfuture.png create mode 100644 docs/logos/securitytrails.png create mode 100644 docs/logos/shodan.png create mode 100644 docs/logos/sigma.png create mode 100644 docs/logos/sophoslabs_intelix.svg create mode 100644 docs/logos/spamhaus.jpg create mode 100644 docs/logos/stix.png create mode 100644 docs/logos/threatconnect.png create mode 100644 docs/logos/threatcrowd.png create mode 100644 docs/logos/threatminer.png create mode 100644 docs/logos/threatstream.png create mode 100644 docs/logos/trustar.png create mode 100644 docs/logos/urlhaus.png create mode 100644 docs/logos/urlscan.jpg create mode 100644 docs/logos/variot.png create mode 100644 docs/logos/virustotal.png create mode 100644 docs/logos/vmray.png create mode 100644 docs/logos/vmware_nsx.png create mode 100644 docs/logos/vulndb.png create mode 100644 docs/logos/vulners.png create mode 100644 docs/logos/wikidata.png create mode 100644 docs/logos/xforce.png create mode 100644 docs/logos/xlsx.png create mode 100644 docs/logos/yara.png create mode 100644 docs/logos/yeti.png diff --git a/docs/contribute.md b/docs/contribute.md new file mode 100644 index 0000000..ef312f6 --- /dev/null +++ b/docs/contribute.md @@ -0,0 +1,374 @@ +## How to add your own MISP modules? + +Create your module in [misp_modules/modules/expansion/](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/), [misp_modules/modules/export_mod/](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/), or [misp_modules/modules/import_mod/](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/). The module should have at minimum three functions: + +* **introspection** function that returns a dict of the supported attributes (input and output) by your expansion module. +* **handler** function which accepts a JSON document to expand the values and return a dictionary of the expanded values. +* **version** function that returns a dict with the version and the associated meta-data including potential configurations required of the module. + +Don't forget to return an error key and value if an error is raised to propagate it to the MISP user-interface. + +Your module's script name should also be added in the `__all__` list of `/__init__.py` in order for it to be loaded. + +~~~python +... + # Checking for required value + if not request.get('ip-src'): + # Return an error message + return {'error': "A source IP is required"} +... +~~~ + + +### introspection + +The function that returns a dict of the supported attributes (input and output) by your expansion module. + +~~~python +mispattributes = {'input': ['link', 'url'], + 'output': ['attachment', 'malware-sample']} + +def introspection(): + return mispattributes +~~~ + +### version + +The function that returns a dict with the version and the associated meta-data including potential configurations required of the module. + + +### Additional Configuration Values + +If your module requires additional configuration (to be exposed via the MISP user-interface), you can define those in the moduleconfig value returned by the version function. + +~~~python +# config fields that your code expects from the site admin +moduleconfig = ["apikey", "event_limit"] + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo +~~~ + + +When you do this a config array is added to the meta-data output containing all the potential configuration values: + +~~~ +"meta": { + "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources", + "config": [ + "username", + "password" + ], + "module-type": [ + "expansion", + "hover" + ], + +... +~~~ + + +If you want to use the configuration values set in the web interface they are stored in the key `config` in the JSON object passed to the handler. + +~~~ +def handler(q=False): + + # Check if we were given a configuration + config = q.get("config", {}) + + # Find out if there is a username field + username = config.get("username", None) +~~~ + + +### handler + +The function which accepts a JSON document to expand the values and return a dictionary of the expanded values. + +~~~python +def handler(q=False): + "Fully functional rot-13 encoder" + if q is False: + return False + request = json.loads(q) + src = request.get('ip-src') + if src is None: + # Return an error message + return {'error': "A source IP is required"} + else: + return {'results': + codecs.encode(src, "rot-13")} +~~~ + +#### export module + +For an export module, the `request["data"]` object corresponds to a list of events (dictionaries) to handle. + +Iterating over events attributes is performed using their `Attribute` key. + +~~~python +... +for event in request["data"]: + for attribute in event["Attribute"]: + # do stuff w/ attribute['type'], attribute['value'], ... +... + +### Returning Binary Data + +If you want to return a file or other data you need to add a data attribute. + +~~~python +{"results": {"values": "filename.txt", + "types": "attachment", + "data" : base64.b64encode() # base64 encode your data first + "comment": "This is an attachment"}} +~~~ + +If the binary file is malware you can use 'malware-sample' as the type. If you do this the malware sample will be automatically zipped and password protected ('infected') after being uploaded. + + +~~~python +{"results": {"values": "filename.txt", + "types": "malware-sample", + "data" : base64.b64encode() # base64 encode your data first + "comment": "This is an attachment"}} +~~~ + +[To learn more about how data attributes are processed you can read the processing code here.](https://github.com/MISP/PyMISP/blob/4f230c9299ad9d2d1c851148c629b61a94f3f117/pymisp/mispevent.py#L185-L200) + + +### Module type + +A MISP module can be of four types: + +- **expansion** - service related to an attribute that can be used to extend and update an existing event. +- **hover** - service related to an attribute to provide additional information to the users without updating the event. +- **import** - service related to importing and parsing an external object that can be used to extend an existing event. +- **export** - service related to exporting an object, event, or data. + +module-type is an array where the list of supported types can be added. + +## Testing your modules? + +MISP uses the **modules** function to discover the available MISP modules and their supported MISP attributes: + +~~~ +% curl -s http://127.0.0.1:6666/modules | jq . +[ + { + "name": "passivetotal", + "type": "expansion", + "mispattributes": { + "input": [ + "hostname", + "domain", + "ip-src", + "ip-dst" + ], + "output": [ + "ip-src", + "ip-dst", + "hostname", + "domain" + ] + }, + "meta": { + "description": "PassiveTotal expansion service to expand values with multiple Passive DNS sources", + "config": [ + "username", + "password" + ], + "author": "Alexandre Dulaunoy", + "version": "0.1" + } + }, + { + "name": "sourcecache", + "type": "expansion", + "mispattributes": { + "input": [ + "link" + ], + "output": [ + "link" + ] + }, + "meta": { + "description": "Module to cache web pages of analysis reports, OSINT sources. The module returns a link of the cached page.", + "author": "Alexandre Dulaunoy", + "version": "0.1" + } + }, + { + "name": "dns", + "type": "expansion", + "mispattributes": { + "input": [ + "hostname", + "domain" + ], + "output": [ + "ip-src", + "ip-dst" + ] + }, + "meta": { + "description": "Simple DNS expansion service to resolve IP address from MISP attributes", + "author": "Alexandre Dulaunoy", + "version": "0.1" + } + } +] + +~~~ + +The MISP module service returns the available modules in a JSON array containing each module name along with their supported input attributes. + +Based on this information, a query can be built in a JSON format and saved as body.json: + +~~~json +{ + "hostname": "www.foo.be", + "module": "dns" +} +~~~ + +Then you can POST this JSON format query towards the MISP object server: + +~~~bash +curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @body.json -X POST +~~~ + +The module should output the following JSON: + +~~~json +{ + "results": [ + { + "types": [ + "ip-src", + "ip-dst" + ], + "values": [ + "188.65.217.78" + ] + } + ] +} +~~~ + +It is also possible to restrict the category options of the resolved attributes by passing a list of categories along (optional): + +~~~json +{ + "results": [ + { + "types": [ + "ip-src", + "ip-dst" + ], + "values": [ + "188.65.217.78" + ], + "categories": [ + "Network activity", + "Payload delivery" + ] + } + ] +} +~~~ + +For both the type and the category lists, the first item in the list will be the default setting on the interface. + +### Enable your module in the web interface + +For a module to be activated in the MISP web interface it must be enabled in the "Plugin Settings. + +Go to "Administration > Server Settings" in the top menu +- Go to "Plugin Settings" in the top "tab menu bar" +- Click on the name of the type of module you have created to expand the list of plugins to show your module. +- Find the name of your plugin's "enabled" value in the Setting Column. +"Plugin.[MODULE NAME]_enabled" +- Double click on its "Value" column + +~~~ +Priority Setting Value Description Error Message +Recommended Plugin.Import_ocr_enabled false Enable or disable the ocr module. Value not set. +~~~ + +- Use the drop-down to set the enabled value to 'true' + +~~~ +Priority Setting Value Description Error Message +Recommended Plugin.Import_ocr_enabled true Enable or disable the ocr module. Value not set. +~~~ + +### Set any other required settings for your module + +In this same menu set any other plugin settings that are required for testing. + + + +## Documentation + +In order to provide documentation about some modules that require specific input / output / configuration, the [doc](https://github.com/MISP/misp-modules/tree/master/doc) directory contains detailed information about the general purpose, requirements, features, input and output of each of these modules: + +- ***description** - quick description of the general purpose of the module, as the one given by the moduleinfo +- **requirements** - special libraries needed to make the module work +- **features** - description of the way to use the module, with the required MISP features to make the module give the intended result +- **references** - link(s) giving additional information about the format concerned in the module +- **input** - description of the format of data used in input +- **output** - description of the format given as the result of the module execution + +In addition to the module documentation please add your module to [docs/index.md](https://github.com/MISP/misp-modules/tree/master/docs/index.md). + +There are also [complementary slides](https://www.misp-project.org/misp-training/3.1-misp-modules.pdf) for the creation of MISP modules. + + +## Tips for developers creating modules + +Download a pre-built virtual image from the [MISP training materials](https://www.circl.lu/services/misp-training-materials/). + +- Create a Host-Only adapter in VirtualBox +- Set your Misp OVA to that Host-Only adapter +- Start the virtual machine +- Get the IP address of the virutal machine +- SSH into the machine (Login info on training page) +- Go into the misp-modules directory + +~~~bash +cd /usr/local/src/misp-modules +~~~ + +Set the git repo to your fork and checkout your development branch. If you SSH'ed in as the misp user you will have to use sudo. + +~~~bash +sudo git remote set-url origin https://github.com/YourRepo/misp-modules.git +sudo git pull +sudo git checkout MyModBranch +~~~ + +Remove the contents of the build directory and re-install misp-modules. + +~~~python +sudo rm -fr build/* +sudo pip3 install --upgrade . +~~~ + +SSH in with a different terminal and run `misp-modules` with debugging enabled. + +~~~python +sudo killall misp-modules +misp-modules -d +~~~ + + +In your original terminal you can now run your tests manually and see any errors that arrive + +~~~bash +cd tests/ +curl -s http://127.0.0.1:6666/query -H "Content-Type: application/json" --data @MY_TEST_FILE.json -X POST +cd ../ +~~~ diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..3eed0f4 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,192 @@ +## How to install and start MISP modules (in a Python virtualenv)? + +~~~~bash +SUDO_WWW="sudo -u www-data" + +sudo apt-get install -y \ + git \ + libpq5 \ + libjpeg-dev \ + tesseract-ocr \ + libpoppler-cpp-dev \ + imagemagick virtualenv \ + libopencv-dev \ + zbar-tools \ + libzbar0 \ + libzbar-dev \ + libfuzzy-dev \ + libcaca-dev + +# BEGIN with virtualenv: +$SUDO_WWW virtualenv -p python3 /var/www/MISP/venv +# END with virtualenv + +cd /usr/local/src/ +# Ideally you add your user to the staff group and make /usr/local/src group writeable, below follows an example with user misp +sudo adduser misp staff +sudo chmod 2775 /usr/local/src +sudo chown root:staff /usr/local/src +git clone https://github.com/MISP/misp-modules.git +git clone git://github.com/stricaud/faup.git faup +git clone git://github.com/stricaud/gtcaca.git gtcaca + +# Install gtcaca/faup +cd gtcaca +mkdir -p build +cd build +cmake .. && make +sudo make install +cd ../../faup +mkdir -p build +cd build +cmake .. && make +sudo make install +sudo ldconfig + +cd ../../misp-modules + +# BEGIN with virtualenv: +$SUDO_WWW /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS +$SUDO_WWW /var/www/MISP/venv/bin/pip install . +# END with virtualenv + +# BEGIN without virtualenv: +sudo pip install -I -r REQUIREMENTS +sudo pip install . +# END without virtualenv + +# Start misp-modules as a service +sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now misp-modules +/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s & #to start the modules +~~~~ + +## How to install and start MISP modules on RHEL-based distributions ? + +As of this writing, the official RHEL repositories only contain Ruby 2.0.0 and Ruby 2.1 or higher is required. As such, this guide installs Ruby 2.2 from the SCL repository. + +~~~~bash +SUDO_WWW="sudo -u apache" +sudo yum install \ + rh-ruby22 \ + openjpeg-devel \ + rubygem-rouge \ + rubygem-asciidoctor \ + zbar-devel \ + opencv-devel \ + gcc-c++ \ + pkgconfig \ + poppler-cpp-devel \ + python-devel \ + redhat-rpm-config +cd /usr/local/src/ +sudo git clone https://github.com/MISP/misp-modules.git +cd misp-modules +$SUDO_WWW /usr/bin/scl enable rh-python36 "virtualenv -p python3 /var/www/MISP/venv" +$SUDO_WWW /var/www/MISP/venv/bin/pip install -U -I -r REQUIREMENTS +$SUDO_WWW /var/www/MISP/venv/bin/pip install -U . +~~~~ + +Create the service file /etc/systemd/system/misp-modules.service : + +~~~~bash +echo "[Unit] +Description=MISP's modules +After=misp-workers.service + +[Service] +Type=simple +User=apache +Group=apache +ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules –l 127.0.0.1 –s' +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target" | sudo tee /etc/systemd/system/misp-modules.service +~~~~ + +The After=misp-workers.service must be changed or removed if you have not created a misp-workers service. Then, enable the misp-modules service and start it: + +~~~~bash +systemctl daemon-reload +systemctl enable --now misp-modules +~~~~ + +## How to use an MISP modules Docker container + +### Docker build + +~~~~bash +docker build -t misp-modules \ + --build-arg BUILD_DATE=$(date -u +"%Y-%m-%d") \ + docker/ +~~~~ + +### Docker run + +~~~~bash +# Start Redis +docker run --rm -d --name=misp-redis redis:alpine +# Start MISP-modules +docker run \ + --rm -d --name=misp-modules \ + -e REDIS_BACKEND=misp-redis \ + -e REDIS_PORT="6379" \ + -e REDIS_PW="" \ + -e REDIS_DATABASE="245" \ + -e MISP_MODULES_DEBUG="false" \ + dcso/misp-dockerized-misp-modules +~~~~ + +### Docker-compose + +~~~~yml +services: + misp-modules: + # https://hub.docker.com/r/dcso/misp-dockerized-misp-modules + image: dcso/misp-dockerized-misp-modules:3 + + # Local image: + #image: misp-modules + #build: + # context: docker/ + + environment: + # Redis + REDIS_BACKEND: misp-redis + REDIS_PORT: "6379" + REDIS_DATABASE: "245" + # System PROXY (OPTIONAL) + http_proxy: + https_proxy: + no_proxy: 0.0.0.0 + # Timezone (OPTIONAL) + TZ: Europe/Berlin + # MISP-Modules (OPTIONAL) + MISP_MODULES_DEBUG: "false" + # Logging options (OPTIONAL) + LOG_SYSLOG_ENABLED: "no" + misp-redis: + # https://hub.docker.com/_/redis or alternative https://hub.docker.com/r/dcso/misp-dockerized-redis/ + image: redis:alpine +~~~~ + +## Install misp-module on an offline instance. +First, you need to grab all necessary packages for example like this : + +Use pip wheel to create an archive +~~~ +mkdir misp-modules-offline +pip3 wheel -r REQUIREMENTS shodan --wheel-dir=./misp-modules-offline +tar -cjvf misp-module-bundeled.tar.bz2 ./misp-modules-offline/* +~~~ +On offline machine : +~~~ +mkdir misp-modules-bundle +tar xvf misp-module-bundeled.tar.bz2 -C misp-modules-bundle +cd misp-modules-bundle +ls -1|while read line; do sudo pip3 install --force-reinstall --ignore-installed --upgrade --no-index --no-deps ${line};done +~~~ +Next you can follow standard install procedure. diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..dbbe355 --- /dev/null +++ b/docs/license.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/docs/logos/apivoid.png b/docs/logos/apivoid.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f84a7c70228f40b8e69d8aafa565becd01ba5a GIT binary patch literal 6955 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 literal 0 HcmV?d00001 diff --git a/docs/logos/assemblyline.png b/docs/logos/assemblyline.png new file mode 100644 index 0000000000000000000000000000000000000000..bda4518a8e21746d87999775bbc65918902a76dc GIT binary patch literal 175511 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


T#z!6;o8GgT3ad7a?3>Jw1h0i;VEvmoBcRo! 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 L%^8xZ&*gsu`sR15 literal 0 HcmV?d00001 diff --git a/docs/logos/cytomic_orion.png b/docs/logos/cytomic_orion.png new file mode 100644 index 0000000000000000000000000000000000000000..45704e9278088bb5305b3b0b20fcb4158b8fe2ee GIT binary patch literal 898 zcmV-|1AY97P)fVtcD? zYC!oEge*lRQ+<$8WgRLQmX~&DAQ85>=1)@bO%R&r)SEd4S*k8mCidD-B(Y&t=*w~O z;XcTeR4$)D$+J2)=BFSvN6ND|M32|YY?V2PiyQjV5Nq}ZH~WGw9F^OSNMlH3F?>0Q z@M}P>toG{WoDSjU4Yc_bWRt1fD#q4Gya7Tas1l?LVoPKTTb+PjmogaJD4YdTYTlZb zTOf0LGTGWRr^DO;Td?kexJ+sgQ75me@*y$5@)V?-^gAGHOjLcSJqB?jZSHq& z5la3U2oGU;3Tv==+&u(wsWhjeo5JiIWIy!~8udwIkjq+iE&2|K@VjBS|D1z#7yI@0 zYjnUR`DKuB6AdGC4#L_|y;Lfc_s_WDs(-pHR6l<%iXj?D}4NAl(nE7D=@~eG1aa z4GaqJ=UtHQr*8GJt9r@%35d(3xB*iBD53dfSZL718|U7yLCk6B&+H43fx!tRE3aao z464#g`}l7Be7mDA2n;&MpK{{z2c6ip^SU>^{zP366bgkxp-?Ck3WY+UP$(1%h5AeS Y2jOxQJ{Y2W1^@s607*qoM6N<$g6^}Z-~a#s literal 0 HcmV?d00001 diff --git a/docs/logos/defender_endpoing.png b/docs/logos/defender_endpoing.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7aced968ec5d429cd20a469d8bd6684f98083 GIT binary patch literal 663462 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 literal 0 HcmV?d00001 diff --git a/docs/logos/docx.png b/docs/logos/docx.png new file mode 100644 index 0000000000000000000000000000000000000000..018d2c1af88c652429c8a00d11e974a4af386eff GIT binary patch literal 8617 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 literal 0 HcmV?d00001 diff --git a/docs/logos/domaintools.png b/docs/logos/domaintools.png new file mode 100644 index 0000000000000000000000000000000000000000..69965e1b79e38db30c6bd6f74a110565efbddaa2 GIT binary patch literal 4886 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 n&a^>$6vF?UGWZkAtiM3NYNF2-lL_c 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 literal 0 HcmV?d00001 diff --git a/docs/logos/farsight.png b/docs/logos/farsight.png new file mode 100644 index 0000000000000000000000000000000000000000..31a73c101d62b1b19d2a48ae954282965fae9690 GIT binary patch literal 12300 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 literal 0 HcmV?d00001 diff --git a/docs/logos/goAML.jpg b/docs/logos/goAML.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e938eed84847fd9b9b36defb82e9138ca2b070b GIT binary patch literal 31790 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 literal 0 HcmV?d00001 diff --git a/docs/logos/google.png b/docs/logos/google.png new file mode 100644 index 0000000000000000000000000000000000000000..492f44c27eb2d402e0dd3446b4d38192e75874c4 GIT binary patch literal 15903 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�ZkvUe1M)ErGJS$u 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 literal 0 HcmV?d00001 diff --git a/docs/logos/greynoise.png b/docs/logos/greynoise.png new file mode 100644 index 0000000000000000000000000000000000000000..0c57e64567d59019bb24e5d6ce882496674bf2a2 GIT binary patch literal 92083 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 )nTE=3zb*}Z|b1~rxS8uFuf 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 N&zPLY=AXhv{vZCp1fBo@ literal 0 HcmV?d00001 diff --git a/docs/logos/hibp.png b/docs/logos/hibp.png new file mode 100644 index 0000000000000000000000000000000000000000..849ccf27e525cdfc4c01196a6d55dde96e2518a8 GIT binary patch literal 20147 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 GjQuY#UXp$Q literal 0 HcmV?d00001 diff --git a/docs/logos/intel471.png b/docs/logos/intel471.png new file mode 100644 index 0000000000000000000000000000000000000000..08264e9499fe9b749ccf0a609a488c9c5eb69657 GIT binary patch literal 6713 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 G5B>{C#F}mZ literal 0 HcmV?d00001 diff --git a/docs/logos/intelmq.png b/docs/logos/intelmq.png new file mode 100644 index 0000000000000000000000000000000000000000..fad627cc4627f70195e7bf798beb839857322e23 GIT binary patch literal 30358 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 literal 0 HcmV?d00001 diff --git a/docs/logos/ipqualityscore.png b/docs/logos/ipqualityscore.png new file mode 100644 index 0000000000000000000000000000000000000000..da52d96680f76ed4c92b0b6aaab0ecc0121bfa68 GIT binary patch literal 6769 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 literal 0 HcmV?d00001 diff --git a/docs/logos/joesandbox.png b/docs/logos/joesandbox.png new file mode 100644 index 0000000000000000000000000000000000000000..8072f6ea18c6817d029e3615546b5b2cc1e96e0f GIT binary patch literal 9780 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 literal 0 HcmV?d00001 diff --git a/docs/logos/lastline.png b/docs/logos/lastline.png new file mode 100644 index 0000000000000000000000000000000000000000..6bffe77f6a3ac58f7d405952c7df39af05be0a54 GIT binary patch literal 7194 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 literal 0 HcmV?d00001 diff --git a/docs/logos/macaddress_io.png b/docs/logos/macaddress_io.png new file mode 100644 index 0000000000000000000000000000000000000000..e77f45521bd025b92eaa6e31d25f39ab446bb43c GIT binary patch literal 1854 zcmZXVX*d*W8^;+lV;e(c-?EK0(c9RvB>QeKF=85plO|@6rOahy?CVg9k}X?OF_xsp z7-KC5FNHW5bVeFkI%UarMqStY<^Ay7_x=Ap|NnJA-=1`LS34mA838UXE+GedYY$Fe zKRSFooXVdmUB+n{?#^B|oUYOlrrZ&hv|Og#fm5M|aim6f1ZP&I;Z!&%D$&Na=bTNl#(oQ=)KbL8~F?%ZsVXN~7Y z`-)~4wRsdbPKli9`Pa#ZTYr$!#Xsga5xb*S`X4}o_iv`mi9;h_I|)}}mlz^620PUD zJK6SONvdM&nw$SE%xW{OZ-+Pfocn1!PAo*M*xZ%rEjDfYoYmD+%bTKaBL3uESj5S1!9B(N2r5BD3yr$&+#mtw}H4Fy9-6XX|c9UiBy z@v75ZS~WwIXBNPHslMy+Zd-g$p4n2ZXHKe$hL$X4p1JK_JFxqOBzB%z-?R1kKf4g! zYC7TZ;ALjW9)aQu$q^5^mh5=;E81tR_>nP>k6u<>Wutx9u;*$*&LGYkt`S&$e(_)A2*y;U3=}Dg1}NCMEklql3?R2YkPyXBS+&b_gWq zW|~V^C_pOTGKDMRv_143 zV@%v!w!hg#p8#J4r(TT(i zM)xHPo_3b4e{J9s6WXvkg_&ugw_{0B6JYjpp>hBJzu2N;EM$Zu-mQ+BwYL@s_vX39 zNZY(1Ez=L)F@uWr-e~5?mWD0jazL{Us_4<|dQ@8GKlp_Mmvu@m7QK>REF0H0PSgD8 zi2vHWL&9vSF(hB}4>(6}E60U9blvRrwyZRXy<3*m6LnDIeOkHva}s3%8M^*0$aJdeVJZVQyg zEQ7X9_7I(twF0igBC+MyPKg-Rc!dm{Xh0m_1Lh4@YelDs?o1L>`Uj9=Z>+Mh#Ke)D zx-6+Am}8=giNY|3Yft5$m%BzI?M#gZG4z+t7v zG73nQ@JfZ(oAId}&2^BrbU_#(%H7ol-FA2+F%#{2P5|~O(d!mzKZ6Bl= z*sGOTs-#~|;a4p&_LS4Nv%y33S)N71?pNZYlO~@$3fZ^S`?IQae%GQqayH+i-$U$8 zg8lr&t4$EjSVxrn0AqMpxR+96B4`#TeA^pDA5GuTth%FgT?TiHj%u}g4h#*p#1w-P(%YYZr~effj4 z%%oBwCXpXjh>5HgbJn8+#he=~$Br}yPL?fm^bx#1a^sgNk>B8|$&rZzWzRhNolF#Z z;QA}6M+dvmU`AvRl=%*@yB>Jk>_*`2v+k5m0TmSUm;j0i@I)~+BT!7a79D(cfd>9G z(9{7V+-WTu3n;q_)a9Mxn%|EjRw9(OT;~To-Pi>O!PYxqnNfSmot~$JZSO13gn+ATexSN^1Gtbdfh--TJjp!T5xi@u(HDQSIwwxgLaGF>l=8g0OWGNui(nwGCul(cX0@ODff9$$ViVdXc4%c*B) V4l6eAalRfd2OC%G=jSnr{{q-pV|D-l literal 0 HcmV?d00001 diff --git a/docs/logos/macvendors.png b/docs/logos/macvendors.png new file mode 100644 index 0000000000000000000000000000000000000000..3316ea39aba93387d4dfcbdc0cb87c74bd10cecf GIT binary patch literal 5064 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 SyTLzn5EH|j2DN%FQU3?S5@dk@ literal 0 HcmV?d00001 diff --git a/docs/logos/maxmind.png b/docs/logos/maxmind.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8a6c6eeb86e4da5c024539b7ab4c6d492bf398 GIT binary patch literal 25782 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

Cz4h}SCsQ>(uw*xfx`$x@&WLHZ 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 M_BE~Y%XXpv15Y~0(*OVf literal 0 HcmV?d00001 diff --git a/docs/logos/nexthink.svg b/docs/logos/nexthink.svg new file mode 100644 index 0000000..f18ba8f --- /dev/null +++ b/docs/logos/nexthink.svg @@ -0,0 +1,22 @@ + + + + nexthink + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/logos/ods.png b/docs/logos/ods.png new file mode 100644 index 0000000000000000000000000000000000000000..19b42f1f6b0e31faa1beeb8c0a7f07c95cdc80f4 GIT binary patch literal 10161 zcmZvC2|QG9`~IvS-LLvd)yX(1NmO&tCSDC0Qa{ zBKy7*e$RNn@B4dypZ{OSr_XuLIrsD2*L~gBeLv@jxP42Fp6)yy1VQxb7_<%qk;Q@E zahelgBr;W=9{hL0T2l=T9g+UMtbO|wg5Z!k`kJ2ii^UP27Z>$ww^x_5my)sKPgAj% zxM4{7p!eKl+UPBPD%P{tjY|lW2;XZcpUaUr!5|uCrUY&z-OTTG-zEJT9G?YC!Ruja zPAX~2GbJ~0anN8^b?3So)2XLv$xCxN9yvKm%LBQGcY3ndpFhp2_q>&=>--G2bX4X2DWTMi5p&@>zMexFAW>*EgN=ye{Lag zBRR%Z>ZZZD&bS5a=cu^eE~E7v`i1jjWm1#^jv3NHkS*Z&QCkn^R}WXoy4 zx!I=Sqaxh?-Lgrygg~tow$Ra!>&5m!mxD^?0Qz)X>e=k0J!`jDd6hSM#@qDCcb*dp zfB}Ek(Z?CT>l(6)_sTPZmrZV$z0Lc=TPUNOI&uWp!95VPm%H5}OjzL995``@d0#&F zPUjN|O{Ga)EI%`eRqt!8ESe)lWo38C_Cv<7@)Ayz8uh;`0E z7-C-3lHiuW(NBT54ynu56U8F|=k-fN?RcVB%ugas4QRelAFhA*wQXm}IUTpI2mR9xmyKko#&;6O5yH*hy5&;82RSJFeW{MM;9;Ft>%^Z`V&{rEwe|g#y_Y-jLPy{1a8ZBDhuSagWM`<; zo~62D`Z&6X!AtP+i>d0ks-(4PTm86r8F#m~PPSTfwR!+$TT-=@ARkL0GC9E4j~&+} z`T3qU@Xl#06fHJ^C{vef_F~8Ddkmf}c;;J4Eq;iQsxPlw;Zj$V5jeR!>Ee1lEz}^T zY9eo~w(ewh^VT-Yt6Vi_A`b-XcF2qG}8fGqf?oy77{Tkw|2EX>}gnHu$E5%CjlN2um)OOlITNaU90AvjJn| zYC7RQyr>~osoDXJIfaFSdOBHotX4UF@QZ7H=>@IoCiCgVp121Clb_XG~U+p*&lXN}CfP5gh}=`vCZ_J41% z)xa_xQn4#&z3=MK>R!1Ll5t;g9(9%6IC@p#l*T66WMdZleA?TRgtY8>R=TN1?%J7> z(@l+~BEmJ7bFYkrLT(NGR9pmYFGnXMzN-j(-gM8Gia~-}?Ud)+vfl3a*6|iQJ+V0b zh4kcP$?4wKQW5@;wH3-y*V=7rx*N?RXi9e*=UHd-)qPo$@+FqB%m=Jr?hQRDY2V%v z3?^X8eNM)Wajc7z1&4K4K1$BI8jy2Xw8aB%OMEh$$LQslct;l>wPj50(8?poh%Squ06>RI}G*dy&K$F;{puWWgj4P!=5b3M<28PAoR*6S)Ao1f-rbB*zd z@PnUbYm{br+x%oxQ)+79?Oc4B$i8r`^as^3!g18?14p{w z(-c!-vt$S&y?-zT$Ab;d{LrVI-7{qJd%~I3dN=H9eG?AN-cNC1OTXH&&#;q`d-r?` zEL}?Z3rF-k&YYgr3VrV{gCJT^(u`}X9ep#Ai6CIKXb2CuP*9g@S=6@%b%uNU3GDuf zJ?6g3=qWC4p>1R8^6NP0vS^NN)PL;E#8T-hni;g~zF$bTS!eWiy!f#?%7N{TJnu*$ zp@V%?>0A}N>Z{~|N3ln+BCB6U>V$U=0F**9D`e3N1Hbl#x<|5F z)4Vw%9^4w)kVLSKW^ZohXQ=}Z3T&FWD z4s-1570nBs&62%MrHYHUUbE=Z5>zJ^ixrkKV{uwSLPF;y@7Mwh6r)1HnQi+85q1?v6I8>^tHhke7O}M z$7Cg__d$Zb2y1KV;3Ayy-*NJE+Pm9Gm8ODKovr8gD9-RyoNprzFHn#bf3?MbeO@Y) z%EkCw32ksg;NZu34LcwqbWfoQ^PmCE#wpROn*eA?H`_yM<-|r9JQSb z(Cayo?wLWQYlKq$u%}3%2(P!4UaCiRTvHmWclQG9$&HPG0oMfWot-@;nAjfSUF7Z{ zfG<-LUl^E?vUISlqHaF0=4fhBrrFPHY*XR+eQ&uvck>$G4pY)}W6VO^{K5lK(hExI zu-R+VQES`zeX|bTB%4w0EJ$isF91@c>S;!D$~IAe)7zBbKSM|EJ(~V19-8}q&xGK= z@%G(8SPxCJDyz46Hfpi&vr=8E`+Hu>LC*o8@d zrnhDsE^xz&Oty#zO&mSGr?-#UMgLpI5>j3PVZCu#3WbNkQ8A~^iK0}(PN~)Y?-Li@h=_uZ{-nL9Og741M5C$k(th6&4s$<`bgnb$5~Wx4Tfn=84Bvn30G?i5ja zwhg1*>84(5wZ~^XkP{F>Fqx!UW$MrcOKm;AEC_#VHe#go`nL>tGM_(5`5)m}`@5#1 zx>xEh!vw&)=uxIMiQoGDprdYG@Aju7+tq3YoBT@8CiYLPOiRHQ`AOQ3x{U%uExxuR5`&bJfh7-{xVIB&ofF8P=N{ryo= z22SlxH5CBYGe8`YPK}~j=cL)}As7aOG)oJo{473d1jt|djIy%6 z&vSWi@n7H5dA;f3#|31FlVvc|Du5iJF8PF$wI&rzf7e9Fk^?`w0uS*|) zQDIJ{%IUA6O@Nz&Sq~Gk zoIZ}we&)v_?TxG&sTJ!^Y|NG=k5AA)Su{hvv3GFLd3C#cZ*!j6*>3xqpFOsn@4$UZ zOFB>^E1V$f@G;`N#s+ zD8V%Q>51`Fb(ExvhH-;ITwUNbX!Ju$=iW+^?nY>B0TRGteb?tz(Zd)W4&dkj#dth$ zv@J>3^K+WvmkhV8mNqk`iOzAIbg8@~md>9Sk=dZz_(39-efW2h2@N|?sm=M7(X;d* zeNfkLsbH@ndY-aKG@5=tkEEo*ambz|h`pVCtstCO)Uw~x>%0{a@~4V%408={v@e@3 zrAN#SfI}10{ODWkehI=u>uXIvBO3Uq5aI$g*NZK;j8&vv#mLFJdEX+6se$Fr;9@5otRzoOsxlOa5|BGqU{WHv73Ie&PI|3csFuXLWRAn4uGT%J0+sOPVZtNm(S zhq-JHV$lX)`OOnn=JJTjsatbjd%DX1f~E}e^k73uc12g5++n7<<@|vmVUz zq>lJp+YNLc;UFW2pEXtHo(({fOs+pnUfdtZ2kn7)^@9lQylu3_6}r>&FZAo`_c?)w z*58MQa$c!~UmESKl<(@7mG9E1N#z5M3fxT;uIRBR_V?aTi6$mH_Q$stCXH<7YKXu= zzJAfi-x!=C2e1p+C2|&L)l_Ft5vv?_atkly{*0VjD@ZNTOt-vWG`ch!dUtX$^frfq z)xqDSY3qY4#bP!sO%H{kO~3uciZX}3oTi_Z^CFf56ZInmZ+UGa8xd1kftpb-_BXBr zD?~cZ#BbXD4zDw|oetj+Gj6ff-pTXnF*ztLsoY?`St#sA1A`(!lujOrYiS-nw3}E& z6B1zR({Bek$Dsn&xxDQc>A}3cE`CYfX3`T^>c1PSTXE9h(3PhM5?*PfNzYA5 zpxq_N5op{7C>`IuYVol9e1Jpn5wk_+jFoftepkyhwO%ihK8fi51+s3 zstJdwp9f^SY=<+)Ij$2tsGW9Q6Vy5LU&}F_)XCuE}f9#iJBqR=8Z}Z~1x= zT_lSxT?<|iUbUqp|9FyBx<5KfvAWe(&UV3$$(c7NFBT0P8~t#KptZ1LzwD>XzrJ#Lo3CZYbfn~V_+T{Qh?TS}6k$Y)f!Jm|X@|-Bgnwry zEhB^mfZz#A?etbvFf5w_oW;`+Hp1~0wlz>UE6~B7r0+G$wAmlDNLt~_6^Ax3g4)=@ zg}*aTNhV6eXh1A7VZC`Jgr8konDoRRR0`$aL7}4n-Ig{aGLHf4{*~&Y_n!qMSK-l^F?2cw0@{Rz#D} zH)Bz%0Q-i`kTwH=Z)JCXf0k8anEt^Yp9Fglxp`ez+1|%CF6O^C=f-77p{&$)#G|z( zubWqnb;w~S8A%2kL9YT$J^?FmsIR2wL;_WF$)NbrFo?m9wQxj$5(eFI6jsi-d~fI? zGMsnl7M3=gW{jE~UNIcnX2vc)v2tdCHrtJ_5_Y+igVo=ds6H`SE9*GTCN6eG9`wyW zI;r4FDbJtl3!W`=8L4U-;!6rX?W|-XQnSl@@Ov?l$&pvi13Q2J?(ZSB1(AuX0w7TC zg+NsQ1R%?n*zM_39`rq`m^t8L@L1RE6Fem0{1VY5mfC0d(W$CP(Qx^~>Zhcf7}FY3 z6~1?_U@5|^Y)nYbyXh5h&)olbl&?T}a_$5TiD`}ZnUNh;?qkoT?(g^kZdC25gg|87 zab_WydgVa#iX&&aJ3p?irpa`wed?kYjx{*}I&eurAk+sDiTaYT=uCBJP$HlXK=rEX~E18H~mE!(IP@y z0^I(}!GjU93dbX>r_AZ)$*yd(Yyvjjnrj5OzzW6kL_!nm!@1@5@3)4vl=E zAsmJ#+(d{A#v`orzAkdP3cncq83}0c?xQjO;tKtu{Dap=t#z(`=LCe#`Dm^lDD-s! z#?1r)E^Og`mJY;`7^fY0VQ4wFMt?E>P*fT~0jC9IDEpChfwx1;5g&D`J(Mc`kW?0C z8iC|Fq~psBDCqL5tR_;2JlYh2Tsfbc%^*m#DvlmZ1J%;|1c){9S1$}7|EFy1U4MR{ zDh@)$6NjBXG|MBzy_W%wcODqg{Bb&<0GK(93!*OxVJtx>u-ZMp*;(LB8l2=uyCg|k z`kmrPzb7wsUhf`V=inMAu#O%_qKBSPc>d0y8nWs39`jQkm5q`r!AdI}J^`%&j8Fng zu0d5Z3<-RD=kYgcF zzpA6v_vp>YKnVpZgtZcK7AY~2rOd|=>v6Oy*2O2fIugt#|Io>4I>%rzq3oymPgz&i zduUbFz|@3c{YMu^edqJhDrlmCt6653f`YzC-R1!L=d9-7Gq1@@a!^wSn5Z$FL8~Pg?I`Tji(CSTB&b_&9TMe@`&?(Lei*{DuA zaMC#Ll4V3k!d5fDPGi%WlKLeBsmk-z#cWP<&_FVxq*o4!J97QcavAaSt;xMT7De69 z?(od&@_XrT%I#%}?`0O}DHW4&vN{LKu6~_n#PtGl?)<1I;r%9-x^}k~lUzrRJ@@p& zHiLAD_6O|!6(vWO|icN>@;P}`_iAOx2 zfp8d*kSJ~t88{Q5HjGyK8yS552er=8?hk5mXbA`kuzESqS6>!C$M4Bws+ME4mx%;0 z&h7JvtQ9kG8l&?Ykbn%pvZ8tI?pQOdLyMD*lvKG zg{Ccizlaa5vde3Vf8qm5Z+W!D`mtu0aRkgF){g&b1VIWh=Hf z9Li>W9QUs{e!03CS!f(m^VPx)L>op+iZ&<^5V}DD2DLGVR~VAwV%(}2x7XE5yb8JT z8tNJqB(_Z1Ugn5nvEL1hiR`=S&H}g4+kG_JU8XoFr_=PMM}(zYB)+dl#9rGqE|Z65 z{yI+Pj;&{pv)ZmOmnVrotXL{A6Wg@oRo$It$V0sV^uxE>6>)3(?O0%-xEiMfoJ6i(Y7vxP*EZY4#fuW|;yiNu3rYU+!E2w0H4 zEp~&GRdK2Ml%4X0xt+@Jt=;25(xkUmwcgyQCLBMi+I5RvLZWsSMZ*Ew#oc)LU>MrEmA|6kmIF?~R)V%d_2JVgTq7eM2dl^GW z>dZ=WSU^2%UKw3ZlGGJ({ZtVVhuK8YsO2XE=bjF=X4sKl^Q3~$i@%0jb9@&C*E4f0 z3>SCTUJpGo{@`Ynw|FaEQK5fbUqFO49js$*RT0m5Kt5^VVgLXgMv@kK%)bw$@B)d! zzYTi>cG`pNP=?AMRk(ssU`aodFf@Mq56IKvm;m^Xj4#`t!U{G&_Y;u)Lt%4?CW7xhBs3+qR{Xz7F6 z5yuLEGqc+J!VZ)!e8)`%`GcCNOIEV(PH-B;Cd zy#k!e6wo`i+<(dA{fx@&^kt?OLqEzu_@`c3M%|cGdwoUF=U!hMCDnBPA6s9(lVDj< zVtcV&O8;g;A^Xtu{92DlzsbSMpSilm;r8(7^qUO}<|7r3Q4i}5sJ0gy*#7Yu!U_HY z^#{%bmie)$W_X4dH5VVdeeLfIt2Z%`VH&(dgu?&kHLPt1eF^ueyAMe9PYMA_EsOS< z>7K9ixa#bG;Bh8E>f*K{jMMerA+K`Xx#-=Gmjmj*Y8>q}KmMHfxYvg6B&xv8YWg(L zu=8ifsC78WGj7THa5lvNIkK&3V?M43|0@_jM=7knFhRwk%YZt2_kWMFgRq`1qC4pW zCNY#=5t-oE2HldDf2)3tYLC)hL*V+ zLq|4&D>L9c9MZ09$E4P5L=wJH9Td*2dm5-RbNG*3yS{92`yHpuRT#HA1W}ui{uaQM zB^u`khunEYzN;92q@hGv?}&CugN+udUusA(j=SK7ndPFJC)G>BzaRy2Dk*4LLgSNM z3qOtkS=$vFc%qoY&!xxuwHx{ITHL0QDn3b}2!Pqa zHcEVk6~0Xh>OTs9=In9th9G0&^8mPy@mXrnDu6*5gD$EEDZi|_mA8V4?dcVoSuHS5o@nTxK_joCt-B!z|1a>dDs`H_8; zCm~qO4LWL~oL$Ng1y0fmFurlklQAhVQtP-RT2TT>%`gzE1ME2=Bsit!dP53oJI*fa z%kp~p6}?wqTF>cAy)P@zS*N1I2J;^pO80ej7<$$P6K+)Itm|)IF#UWc$D4hixc~j8D07&*JyiMd-7tzHojKbQ1X3jxjG3U@3d>w^9}-GdK|?*Bunm#nR2xYxg$mbyB=oqY0lgP4 z&#^ZEu3dy>wYQ4;b$}0hHpqy{gub-*$Y8q$?b6K$#&~gY*OTdCaIFtJ_JTgU+kcML z<+u|f)s=r$-ha9^09Xi+5fnFwJ4or|Agkk^g;bpXx5pz@ZIU`~rpKyTQ{d!}i3qTT zE|N;t%U7T~{;!^kSm*kB`nLrGGzm&ok58v>ku(*`q9{t*%KntpOAfO$RwqG5-Tc6p zV`;G$_kSA;;_xuV<;3YGm6jU>^nGm%T%m%gbOJMK5x6n}n-`gQ^TW7d^*)l%_ zC6~y>m9}`XKscwOp1IdpOX64Ix=1qISBJJm*jDpvY}(U4?K({|2pcZ;r}AUS-kW7* z2pY7`-?h2pv?D<>R@|Jj#;i&Vd%;;FXs_0_2}XW}N-v%A8Z2f$5G%|C(=}?uYCPw( zWlCDHsGkDYxoXsU>eG0{C;yHgsSo`$Re*3CCBA>6cYmSnbHgv6x38;z0=;BN;Gz$g zy89_1kQk`Y;g*sTb|zTqvx8Y?pge?nEU~wKp)kyEwwhnlRH-xIRn?7m&udstKp3eD zDHqB^!h09@Q3kaf!f{_+M-r(ZjP&~Coc7dp)1%1|OTJC>_~^^&0@>}h#t=?#UYuWR z!0?RAL8J1vVg6CHLFtVvkGX5RjO`&@Z*kASXp$@E%;EYIOZ)1%z7?I%hcdgx5M+Nh zFW`Zvn)mf)rTJMA`sc63ti*QmGYAp-U=by@&7v=M=9GnUH^N!e;9v(i;@ix3Ri`JX zNrM8)=$j9skDa@GHN%1&Z0tG)mYrcQgzaq>GRdGGhsR}~vI|AJJ!)&;4M2p9KCfpS z@xeCDhGXO?E+e4}93{TjW>@Phe*9L5TMFyw-ER=x3Ceio84sq-9cU1}dcQ;YASZ=& zTb6uqVpDztdz+3I^Jn^-BbfJTKwgGhp+loe&U=Oo>G`y8DVx6+4i2c3$cU$P=*cJ{ zOeV3YYL(vct&`bHX~*42eJv|b=?5uWMc1tAu!C+iP%<{~qKUjm2l)Zdm$3qS%Hp!k zdj09W`w!KR$Ue0bx8fza=PDuS*1^q|uRd?MYP=gee1+!Jk+G=JsWVaxqXll|MGwm} z0<2|uA-GGIiH(b;xv3G0Z=|C_z6NrUHQ<_3O9L1cap literal 0 HcmV?d00001 diff --git a/docs/logos/odt.png b/docs/logos/odt.png new file mode 100644 index 0000000000000000000000000000000000000000..d177a217d2155cd9081528989f556e9f4214489f GIT binary patch literal 13074 zcmZX42Q-{f*Y2xNA{Zh{MDGz1L`0u3Vi3JW84@*mqW2b}M2`{?y)#3UAqWx?M6WYS zkm$XQUhnJs{{ODK)@2#PduE@#_j&en_SySHYN{(yT)%xC000VQ1Y8>c2;#w?zYtRJ zKkqZ7D8OH&=Bi3?;PUD_yQ$~{0I&hd@F%)npEssFzv=F0T<#nm_WWrV)aB>ki@NS3s(i-3UdcdHn`<-;? z$=}*E{Q3DC#eXhaR$UTHzKcC;^>H6Me7YsFq(pmsoA(*Q{)I^V)HcLZC||zFAJi}X zpnG}jY0TvaS!f6{Zq66mxUA?^v5t(E{i4t6-E7)bgOM#to0D@jdfB7<`EYWu`79EP zdu34*lYf`9@lTiWT0?Es3smx`ow7YztfF9EZp>qt5$}4j|NT1SWuvUARW~tb2A{3& zizSjoPJ6Uza%Ib5(}-ik#hzk0xy$0WGzIN|U$nmi`rY}*TID%?jd=>}-Od>W8cu)A z63w@!P3DW1WErKo?pX;C!46URyjE^V55s+#27EqhEhINlwqgge=3A$_y3s)A_R|g{ z_G#V#m6>a1HZn9GN6W%CXRYTew!+FduFAcC??@V$P93~8ZZ#_UfrYCivhFk2_#{_> z2`=QbOnP$cu$o1x$Jx^-1lq!H4j2SPCsoY&n;!v*mIXNJmDwIO3szU8D#OrCXNk5h zS+0^HcfrmNgCP!&d}|6bj6W`D0xj;+?Ybx$nPTXSY$T9~%~BNI+gZ*q;HJ#G6)274-ZB$2#ULMiHT!!V$nG3gZ@Eg`fT1-NxH z*s9pguCq4W=Q7Zr7-1VXfp1gU2>X9E}_Iir6*->6p% z%Afcqz`eh5x33Yis{v#bDa<|X%&Vn&MBoTY^rJNj)|JU8- z`$EQD-9o>f-_skO(m;kvLrkd!Qquy z;tGmIcvT56_kDVF@D>cB;`}gm5a80k_3Q5w!YpS8GsNalisKFk(BJpnW=xj&_8yc} z+Z?-m@jvyyNf~dGh_RO*7(Bs7-@lkM+aFxz!4p?$JtI=FFlFhF7p|)R@h?stIY;-^=_a%?OJP)+A6&tYS6=y1A+}-05Z};6n4WV z8arSrW1_JzV{X^7vq9?|GMCcXYt!2541QQ;|Mj}EX4T?cPtRt>W2L7(? zO$Ne5zRfHAw_W70O1e!=c+caSU*)0F-`%dw(|yzqtrN&i-R{ThyNuaS>7_*TlquTU^gh%h861KnDPkrlU>ev2LC;H z>JjC6&`Te73URA&Ts<<7>A!Q|h(q0b(=-BT5JhQFO$D?wP()a$wtf0td5ya4*8Md; zn;KXU!(^p1`oi-b`%rRi2?(6%85WK{CYuFMaF(8pkqR033C$cnKB2h zKVCPGo@2c~NE7)GeTik<1*eaV71%_-&f*UpVV*B^9T z>|Mjv-^(>W+w=F!t4}=nipu-U#RDU~!2lhr5AqWe6SLizz~q=MO)adssm%Ea8sl!C zV0PgVNjYsOA_9}rk`gTi1%+iC<8+1kmEDf3cNJRnGo!U`G*nxE-mhA+YT+MGEC6~S?Vg{H6e)$7v;@07j!yU!-dW>nx+{H|o~U1s%DeL* zh906B$0EaF8|h~SYjR?eGV=FntK_En08M}-#19e@5Ykyi{5c_#&lhkU=KZ#;tkgZW zO;*%JOF$UPRtg<=eBm3hx2Z)9YD}97_3pFOnc;x9J_!QY+2LRuq@~SeasT)4sJrl| zHyqgD4GC!y7lxe7+$*A~?pze0oO`R#6+MLrHy&5~ct3+h3%5MigGfWNRwHPe;Yujt zqmJK(VBISJWchI7R(i zb)H@bCt@2>c_ZKlEE3*z9v*VS8{*T1ca$yMKSw)W_mwo#rnG6?sUjsl(zax;LJEmx z%Br~Q@z)37S6(w%EXcyGGi7j{0R~UiK>XhV@&9qmOQ-Y;E^@sQDby?Jm}DoQQ+_#r zMPI|bvgVd80wv>C%mqOJfqA}C97{qC{3*o>+OTM&Xrk+}hs`f8I0}-0W&`C!-i049 zO`PIWAnZeFJw2{0Jn)7kiM3tgfdW1S%f*sBUE_q<9}haM!-bo9d~Mp<;C`;3QJ*Zf zKelaVlMuG)>avUYoKAmY#HB<;K8fg&JY~07KZL7Vl7sAOq4lmadiX#u?lC2*gB@=D z>`ausirZ$`i(sCo6v|lb&pPF{D_dH=J^#(w691FIg4cJ>`9$k$9PCg;l;^@wq(ilq zn>0@OUToVRDq=)cvHU!%$9j=%(R$fx6hkc>RqoErF`i~4$LBrsfp*iQi#z20y=*w# zT`r-5Vy&!%cdM+_ZGD<$_9jPjEIqq?5Kxd`Tl*+C1!1NpWkt(A6y`A3Mg~bBCV@;n z=cCtp2N6stw_@UzWz#59wsSQMSFQB50>&D^dDo=&ht)z6sa38`;kS(;;6#zj1vEd#u+tn!CcF(l9G<^Gs;85Aq0e6&ve;c=AA+jo>ij#=g1+2 zP=J7juM3(ZRc5bDbtR*?m=xQBnS`myz7#5mp7$|Yq0{k;2}Fx;`W&)z;QhHDz{mQS z5nqb2k$(1d!Jl^HdcYhY<&h0vqhO7>$mx^uP{slCG|9ZImQM zuQ{CvQsyy)cB1gszdv2Oy93Q3AxugGC-|7~)@}6gK=*Edj^7+Ls77Cs*iFlYM#@q7 zxHe+Q92;yCqz&gSSwzd(0m6GHeO7>z=>xRVrVMV(@obKy3k(~V*6GQWT?@}t`VQfQ z$Dy6;c$=E=h<#+ZU9*z85gV{eZyVufLnWV2K0dzGA78mt+-Ag4X-by3_0Y6%pYZto zJ@~-gzp??LkEgEbN=q!`lL$9 z=v0qViWnOM!w?E&L_LCg7~H_!?ivG~L-Ju#fs2$15&pL63*g4z1w9_8Zj@N=n`jsd zjS#z}ecLm(ju?@I0zcm0h4+mGlAW(dOv$&Xvzt?MRQI=FRZ{CwId9$FUJ{IzA{6Ek z;GTG~PJYpCgq*E<7lWz+nKJ%E@g}cJ`^OD;e!+zM$FBFkwlkb&-M5eD;%rLz2;?x4 zL(Gs!B$r^qo70;dQ@ zSBMM=-9ZMZVQXYRex!p0EyHhd*sy$gd$EvicI{j;?16rt0+;A%NS5*3<-=6~vs+XBVCaWJpk`ob#8FL!K_fNI35j9f z6fx@aO5y9MYN|UtxM6Rptl2e<-F9{5XAxgAq=Gs}Mn@HgXzGu?Al(mevlBF0=JKH+ z)DVhv9O0X}*T^=P8wLkgUOI@#b1iImk65`ph&lB00C`AXxABPOi-H{5(P`M8wc^@7 zh{vIS)?0Z->t%r+weOuPUj+lNIiiByE%H_47;;#n$7M&>XiGFw3G&Ef>Tb!w3O%sHd@o7)kW7wCjg1OR~ol{8inpXDQH!vF%P z6ezj>T0$-q92W_V42-yXBhUqv@Se#j=QVe)+)(yYXmj1q4i)`L2pfXaaVW(Myz!+- z!M82XKhUqdL47rQ6Sxg7hCl6RIG-Jp*_)CfBlDTgZWD$Nm6Jng&``E|J9~R8^wc`b z+LOz4@x+VMN#9PRm1&$D<=&qsN7C^58J8U{90m~`4DhjQx!Dwa1JD1S2ie?JVjx2% zg8JTR?5NE#Ez*2*4Wvcb@2hb3Ue63gh=cZUUvb#MW+=ku>JNcZX#JU#?<#}5C3#=r zRU!z3f-I^$Gp?f)cZUyWFE44vYc6yc@Y;QzU7j2iwq}=sh-a15$sD{jGi9t47j3WF z24}hAW_WQ~nNF6hzstq3ypNz=agLzn z*kDBZx5`R7q+VR<`gAbtihUz#^dd~~ai=N%5#WJ`0YUafD_<}HNfzppA+Jcy5ed@M zm@X~5cEYaP{*Le30J2LIJ_hd3<{$`gpTE>mP8GC#j?49QVc@TUDtr5~c&AN>=R}XR zRZvmw?^FoZGsYVQ9E$DfqY{PIA$YP9)c zd-zFa>iv5_q=B(<`k`ckA1+omUmEG#+APUcOSJZ*4h}leialZzg(i76A=!3@x~5aOdckn9OX=SI|_CD&`p1&HcGQ@og7wD62r#9vr&L+SHMJI zc(d{4OS0&_Zh3_^LwfyzL!v7&VG&&Lp$&Eso|o*c44^g!o#*h~^Vh~1>MJLqVPGl+ zBwn5P>?0j+B$g%>&3u+t$*ZHP`=wLtrvS$4n>H&KOmZZcCOTLVWcgNTje`{l!<*+T_JZif(=Nag8&X3rNRko8si$L6fusf^Yqgt z1{rmjEbvH^{gzKYzi<{09dC{^(OBA;f6zWQldsSX~$C&bfAW)_odnxpIU-{Iw|3{O2lX`F|S}bs&baE+Oj9;}P7 zkqu(tPwnHL*TQ>f&;J@=(gVPF54sapKlVB=hP~>vwvs&IhiQ7f*RT*6^YP)u@|LT% zd6?5$nT3WeyWyVfFBG7#H*Fc7$A z$=H$MgE+kihB7?2Jr^M{a2-4?M>EiVfC_tfog`fzmvR*#M_-^RYB=9x*!Z5tGx_Fz z8^PgJ6ZOkY7^lTbhdz0nTzuM|T-sYq#N;4(ZQ7-jheZ1bx%fq7f9UaX@-L8_wj+=5 zKk(0;Lj2B0M@N+t^-<5MJC7xso?5BsXfWluI;C$(!%?H2T<0GF{t#z$ZT+4p&MN7i zMSik@pZFL2jvpIqrm)eQU!H_gX5e{66Pd%L&WOHN*N1EDmL=biG`4#9tjI(rR2T|C z5J+Uk$pOV-?As<^-POh6j#o#I++8FJ#0%DgZG}BFxma4f{v8JyySuwrVc$ve3^ghh zI7z$L^j&QD2|lm9U$f@c!5|eyhp7BhvBAH=`KtVqC3Z+sp61s&%5k++%ype$qCU{S z7`GCInTQ0}1q!F;01HmSIi`66`nTKJdKg-6@`D*nIZLFEp5gokaF8GLtKxa zWOF*@La3GO!0iOq`RLtMWq`Su2Nv~<%oLD7yok`v|FB2Nu_L>xECwP`ah|7*IHFq z9E+$ZB9+>30ye~mL9hB0j)pHGHfjaWI)F<4f@hD0B%{5Y^0Y;Uy)2{@Q_mvO{$$2~ zZT_rch%M6(oAP_x5{=eWjt`H+PG$Y!U2=JsU^a_ts%nC8o^A05MhyS z(~2GTQYg>8gDE(1O1Ra#N_`v=IyE2I9bRqwZQ%e$bR#!BM?&WHdxCX3W1;aR%iQ#? zZc!%YhA)~aopFCL`KJQurFs*WEB@}v6 z#WwcgK&Ai4j9-3nL-(X7L$1B-b?$0PE}W|e?c_e^>nP#)*Ql}yHIFG1@7j&`6~`*} zO*7d>&T3p@+dWTtcLd|}pQZl9F5pe@JU1z4bZz|?UXOY%w;L@`McsozGr*(y0As_K zR=i;^LdzzOW=`4~ zXdScB^w-YCZH_*<3iNbc+INiD#tZvvW>;pqogMY{T7Hy{dwg9>B&=@sF~B%3mv!|l zzN{3HdhWg=CUSl2sgAIhT{o$eB-={|^>AUAfP22Hhg}cRAF_I1?YtdMMz&0Ns|7P> z7Fkg!Iqta6=-QRYJ!`M2Fr=D0auJ_4p`?8aJTct8!^%YWt-OCa;NN?nDkiMm@1HRu z0a$OxC(P(%g_<0@I>G6`=?)s`9kTg7Y4&NFYRa}>DsD;lQ<2XD?BAzI2b|K0zQG0_ z)uza}#*qe`dnqN8I9r|Pl-l}g@CV|3Lr}Y9WkZwMEY|3}E@&t`Ciu%@-nRw(S>qk} zb1jG6P;mX+vP0(1AcVH^SJy2xf5Gc~l9@8ejKNagu)Oo(EJ8iE9TxOw3&F54 z`3%2mb#k=gi$BRoc5co-`SDZi^@zB9>0NVEOv<5z7EwyS*4@cB+kakRm~*iXO($OD z$#=~&5Z==X0~CbBR=?jrkV9dNwqN8`ISP7TZssa&X-);@*fCVOLXs8x3z=#h(nUv| z7nn<58CU%}OdnBwzrnILO1f6FU&WWtZ#5;ec{_Q&oU82A-1B0kA74zaLy2I zdStDRG+?HZOCOx{oXM^w78KbV#u#C@9%A$wxWgF=s#S zYlmGw?x?{Kb?WK*U#3ymV_s}-D2`4vIK@m~%;_?wyUV6fk9|ax8VS@&sIA>@zF&gR zwiVkqvhy6(-YB)+*X`>~xD$BK@J|i#$M*N3kvOMs|-QRFK zQYO&7b+diAA=AvD&@SEw{mmeA=FdtTX2M6%ph?^j-;tS5FWFCEwU!kWB1xP;^ zyc?w|Ygoy+AJ}&nyoq<*V2W#an1rdM}<3_Upuu zMDC8mmgI#SQv|*UE-2G~wjm>l`1s0~$`TeC4U$8i`^PN+nDORVQPe;@wYxD+A zvc*u3XoOn5#-;E*9#`}F*6GT{ehJ{*Owe_JA)bT8y@OFc;ft5 zCTEC&Y0Iomlh|Q-C#kjLqrBrf^}(0)$nsC`rV~s=S)!|M5hbA+va#yTlNa0KPmL2@ z`)Xa4-XP+&Y2C=%jLK3kA0WqT`=*ClhpU`oF18NV_V=%)cHy-XOr^@ZcFpqh@W$fPAx5kRY|;R zR_cDY@8dARW%Ws%_~4Ml+wzn6^3ICEs&m{F(+LI|1J((lm}mCYi!)+BydjE@a9r4|MKrv=3?y2~^jDD+8&so~1pDs?v zSoH%-L$eJ8M|qJnMuU9*x|G)W?xKyT&tjl+d{(dIR@Lfir}f0%5vpvY z#zT)QPFV@9wzj|Adzpu0tv7Do@-&*W5lC6BT)E71DC|{^(cZ3TdEBI)2MeO@-e+?w zVdY+q@jkR&=paX?R_dwQ8>~gP+b^7sBPtqKygIP=klVGHP3MJ>(x}vYVwz#E_xib8 zA(6K>@jK(Y+&;&_ld6k4^Rq3NdP3(b`WuH+l?f(WZ*fa&za?-bXm5qS7X0DTQpwVH z_KCUeIYLza!^|vgr653}3cI>8>7-eRsd=>S>%Yl5>U^4k`8jPyvBiO14fAy#G+Vl; z%zo|vFH^#9Sq?E-4Xt_*yE~M(Mi@ymySCLtpE)q=X-bvf!)Iu}KO)$IUFBwd=W>B9 z-1o6uS!L5+T>E+WQ>b)IT+y$YtyInSIfFXKc0`}2YGvu9XgKX&GFtPr9gmCN~ksAqdQx{$?pM@n?qAaiK}mMW&@4*tk=k= zY}0`|wiIJK0=K=FE5owdjCxya)ZZZWr;hf{>-P50xV68c0e6n-sqZy>>C)8x`6#-j z3|*ky|3_F%D{kD?vsZhDUCQ?FHnsPqll`zyZ@N2L*2_NtlI*{dvBaWN@k9ZGqwWaz zVWtfSp0pC5KE0gHavGjk$RhPo$5o|0>TLpHcv<~>b+B5aucglCx026Mp_$!&Vw^l` zQ?-9)syLIVc9hbWS@XN|(t+gb{U2=ntOy3er&Yv{Pp!vuJ@-#64&P}P+B0EMLl&at zUET@*S`D&>rwmMJ480JEsL^j}xL3cF$gdww-J!awIZ6Hl@onCh^xWA%dwpkTvcmRa zs=6_d4K<4Q6kq+v6j%bTasqB_;@cCdsqGm%qejV3ye!^1u1+T!!NThetL|?o(4F+-@-gX1GK?J4WCiq0~ctfS@35e{ez$vSfj=&amnW#Ua-Fp3s z+CI-9P}oq2LFTY=zw~Oujrms_yBhm{oiB7c&i7OfdR!vz-%Dz$P2rL8UfVD4hGo*V zoQn6_e_n5h{`gunD)VA@7Dh9FX%uj=DG@nYo^SH)I8|xHW}9;2u=u8wU-)4S-#}QH zbjIoZ3abdh@!^=*S_B zTKp@nQu6ms5xXh<_!jFGUZ2g)@o&~Nmc3Qn4bEMc!#kHg?tLvf%lQ8AQIE*$PG2pvWFH$K4T#;J&;D zMOI_Sne6Ic($N9gY|+8AF&dHu5p;-7dpUP93aPM0td-BZM_i@Si`3T9;54-%W1#GN8 z|MXkw=^4|Hxl;?Z&o@g32mbt}tQ++82lrVrmmdB&D{RQP3S*p)J0a{E-$++x!b zeR}d@H?6$;`%-j*>{pM^Ya&5aKfp>i>`5y*bcg_uyyb;U%Par-usQ+&!d`Sz1Da5< zkfa$8ZtcT60GrWOnG{w7)+S+3XfTwaPWQgHst>$=Kjjsi_$!=#o|C`gs_F%hfXxDc z(8(>8P?7yzz6p}+Dyw|GqIN+K{oJ?!N=G`c5lFZd6%)EvqTaHJ%;vk@Z_ zL=0!#uL0LzfVjxRsQv6Q=ZeE7sRY?TrtrzO_|n(=dHKTRVrTDvFz(&u@pmZsXJD-G}wBcB6ZDP>f_%E#NvL9~L5Lc~BP zef5>XIV9TmZnFVhv|u?6_C($xIH_9+?{X|f&}NY4xWsbR4uH9VO+*)n8otOUCfWJ~wUKeS#R3Fh^!(Va>ua-UNNyASj~7A41pxyV zF~J1^%daqg<(?~LY8c>TSIW2n5e#dfx2x-^ zgb3Kvgtdii1;2R|lUklXyM06eP6~@s3;_6az}^IK9aQ|)!zVxzFJV69=^q_NKE2F0 z$R{hVwaLl@)ld_(fOp^ow|cp8Y4krcLFnUJktY%_2>27ZWLYD?E-k=aFhB)YK4w!S zlLco3yFUNl3wSrgcs2eY80iy3m@_nd>kO?d)969C&_ zphiKUTCHr7K+-pn^meB9b6Da7K}tY{1cXz>^BmUfxdZkz5EnGmbr{b7#W;*DIzgKS zZx=5G+R==eus!1feIC3WJs4sr=ZYj%fv}4I7n-P#`^toT3Y)be|0tkDa^*8C%1b|j9dD*K_Na9;6#X&^ZTo0(o6^VgSK}7?^ixcL*;(`S2!v7P1H83E1 zK6%As^UWj@e8{vU7@u8OEz!t|kT0AgfHi+6196o89T)s{va78(i~uNz`Cnk$eghFT zK=?oKzWF06oa*iGzqcM;NblNn zc+YMJLplw9lS1OTleGOg( z1kJg^Zd>9IkpekLNKmk&rnw9DX8=w4|3)SFAzChwKT#NmNQ!J}iQAC~QDQIu!9L7X@c$j+Czo?lZ&P6Vhh{f9V|dl(Rp(%q4SKvHrWac8=7^9mSHd;*b1 zWQh--r4mDJB5i}YsM+6h{Ug%a1!I!q2U+fe`cLiMMw9@I;0lj?S4|T>hy_^xw`7mi z&SwNYOtZA?{~2r$!JdHT1toSoGzDPSuBhO@D*s3C|L5gDmRZ~u0TOkARj4A7*Be&{}TdHKs@^TNmZlR;`deCPqM9sw}Bnc;AW z5d|-drwYc?7h#ka@A7gJ0OtMAktI@FJx*s^y_<;TLo=ySgwRtnI)JS&dhgl6@0{vK z=M#%{HBID*#ktQ^XeUtjL|IwS1hI?U40a(WyS4rVv^D-l;+aw2fbm z@mfz$@4Pp)kz1j9epsRZi77x02zp#S^z-7TLg4iHVMBA#I=hYIlHsMI^7+rZHvp*p zdw)3@6%94xKjY$3j=_jTmaK~e=N@q`^z||k0Oo++^Y`^K_{Z)}&z87%6y4&ZUxcuu zXt;WW@ye7?*63Y52+*1$i^%W!Aj*0W?U~<(b|%Qaf!aY!aELm$=NX^=DDQwtN-p;h z$yjWD7-{_21zLh>JzN+5B))cR65v%P7%wC(vBo&#<$F7===yyM0II5gK;43NgqMR8 z*HY$7k((LWuf3bGvn%sKOqd-LLjkr}5s{N*q`{k%#r~6fS!O*=2anf?lrsuIPDdl-v%{Rdb*p~OMcM4wxJ_W@Yav^dseT~1<; z*XW_QVh%6=H*jPEuYTdlXk7IWN#X%y{xcAi-DDSiu69rzHNGMBg`W2#Fg}uFv$5^UPpbfytfY)200RR6Fwh5hS_kFGym|9ZSyf3=Mqc7C z0~Bj(V&?+K1^{;UuFk4bVh}BD9SGtYfCRjNzFYvGk%^1rYh`75;C~I*GtadHz!dXy zUH@yg|CxbmYUW}B?I04A&1>T5>iCRfp%~Z1(#RBw3!s?E8QMW89)G4A z|ARN5vBf|5_8B{?tG)pM5E>LiEdIev&)E1M{45K^#M0Rgn#UH3sqJjtpndooo+Uvu zv)53ArX+t~7eEz|0>l6aU<|kcR)8(w3NS-cd#KL-=W?(9mQw^Apk+*;u_NFGI73TV z0G80QOi-#D-~yOIQ*$WY4EoqYb3nth?w?Zt_>WFq%sHOxgNlqM3jpvNPfr&N0DzbQ z0FNP0PxpCGPmlQk06Pl+or(V`?~n*p=P{HX`yU#0764!d0ziHHe`v;q0MG!{F~PE< zk+ad?c3`0~$lM$N&Wiy6T^j&!pt?rU{r~0vqi<;4&-DZOzW_kp2LR+p0U#|M0BE7@ zVd_0C0B-t8Qf{%ks^a2bfpdcV3 zB_$^($HAwhrX-^#AtNVyt^@{J6cGUt0|^O(3>S<`_WvB7x&bf}a0Z;g!cYPrFbpgh z=BXDtAz%OyEX=b-{TmRG;NTHpLC;)bDE*oHFAJK2;9y{(GCa)#Xs}Qw7AzKY9MePr zSb{-ueU?KHFkDAB7$d&hp}ep7j~@AC!LhAhY-Ed_1!_|8Kq>ay^3e+SzJd?WHU9qO zZc_E}$|pLL2WPp5?lap2blA|v<#_AY3+3Bx zLHdg9)XXo46A@iy<<+@fw3OT+m$`LZncr|o{S>eL&d>=upVuAAD8%DuLO!bPl)cvl z8W^oXomonUKNh5!VKf+%z*hM(p7OwpHCG+=6aYlbrERVYDq23AJiu2?B=WJZ9rlt7 zt4GL~5VI@lNjN7NfBjnZ?E@`gG=EyZ1$vd$obkc>!=R9lcHV6fis6Un~1Y!%%9W44VH=K#4D($5;rvlVJM>)iT0{Vzgb4_P5_jozZST z%@?L4PV0AH6tj1Xo$R~?VB+jck23RFa$I(>#Ahg5?!$BEW}q#>$L{m_?GanNr9Egd3bC9o=sWhTl~1{^0_(&Kfx}{N9-KkPyk3WkrU`%s3v0>AkpLdX?97$ zj^TT@Z`T}D(f5*+7XXdUC>BfFF6Fj&6&AU(72f)BfJ8&Y3aRhEU|BhKR7@JY`NB_9T<`lwv=2MrJ)jH zQ{Gn(ed86d<3lF|0QQ5eh=-+c&$Qg*0>R)BVBUIGdpSEtesOP@HKy4aaGLB_KyYgN zxqI%;AwXFhC@Bh6t7Sv^m&^B#b@){32~uEtK^Hn=cVJ1z@z>Y#u|F!}A!@J2gvLvi z68HOHp-nso*zSfDszHoI9&Y7a=EhvMXByPR7_k5tI2aHD)T;j5%-}#!1A_q|h*;P- zxNI-Ll%jYP)Eu1bP?JM~nj#E5=<3G;ImslG3#(O6l!xqFjdBa#VYB4r)X%9FVtQke z0rh<%MdYTzPXJuX9AT+VyjptVaLvfRYz3KB{!DJ#l*(#dK_UH&Q{>uspoh4oQT9Y) zwMPE_dG}t(5b|wC#K1TrijVLCe4^!%^Z-8O${jAutXC2lufI%^lMqf`o!mmcSqolN zXP!>D&H`B>eY}{X#E>LD?nUq?@&$Gb+(En83M>-pKJMSm9-7{%(lFF$eeO^7U2*;p0zpqEjsx+lE+LZE6lPEOVwxosld z=agyJIO6N5cfjO@vp|i3i(txv$tWQ=m{7jM_aohF+nFX@>%Ek2zYA6SAiAAfE&tDS z3MV=hT7i;TwWCPR(ys&LVw1V5*Bm!o^ z`(#M7d6Ta0U%%gu>w4OJUdfzqE)p`r+WjPzIG2044!loOB*mYhZH$ysY4LQd+;&Os zm#?h(;IUM5&Et&{FBN0>v+ejQ!~rvNH*?2WN_?jV_cMm3X@;=8Bc|u}zQX%C<~kl9 zZZZ$^7MDM>#Xe^lm<}}_V^-SxZzr;b;V86p_?*yVIu_J5HT=y2$z?_@$mNgAaJEF9 z8>2Q~`&ftVRoYhlxo8$5{np^PS=o>fDi@W_AH*|<^~;#mH2uEj9a@Es&fzT2+mTaq zua$s3|6f=?WnzD|e^tO>IgdT+?{)ZVK<0m8(IIhKMTB3;b85*Rn3nti31cO{sc zT3qk(J5bwWsMdyDTEAbJOfq6%i(7`mk!DJ;mVYG)8%S0b-DaznU3vnzv=VwV-_aB@ zO2pHsn0wQY&!JaDHwLFC&`U{cemte*b3zcwiMmRY|2{~grRpV()YU!G7f0}RzrrV9 zz+qDVLuvIN*M2^>1wrh7S5=P*bMJ(a(|%s70Z_ii4?)nFJ3^zN-v+YfYts>T@w-}! zK8eFNaW6CnJ8L_)uprrx8p%2W0}Xl2X_Q!|(&TibwqJaeyy2Wuv5E)2v?ie|Bqpo) zsI84nuxvFmPN((;xN=9;B1YcnBzkN$Bs9~i=*aa(ehFLA|4plZt{T*1E(#n+TV zVm3=`jUPM{0c##mk_^fIJUc6Ubf9dT#L9o0a z>$s{)^yUrc#lFjeivu%h34IeOrng%XxA&1%&3Y9*5)#1+c27laD*dE971cRH9TQsErdl(lx~a zcMfTf-H&72<86`ye9}B#MB@^TaM`+B-yS*ylB?b`?s$Agl$U2kJ-L3T>J7s_BdZE8EcU&-n zf(XSR>de|;3q4xCPN^&dACKAO{5Kh8<$)%`;@Pdt=!H}hGPkJ{7t944CA?AYeLYeZ zNuQ|+>HUmC8Yxix5Ft^DlCa+OGBT+I4_k}|&GpZV<~gzZa9vw!j~rP=33>@By6biC z3XW?L=(G{X0-%!sgoKQY0RN9q{X1=-vxb5aI@49)v2dtf89C*4iK(g?I|sy7ui;X2 zm`t3$;1qr1@-Z;J`>f`_T`htLXkt`O3e9)Q5Z|{+qGqNhY5=s5Szh9AEoPS~b5ysw zWN%+&daV~>{%h!c>q%DonG#yh7tRF)d)2fyBhT9i=UCbJqAQ*!K-{b($>eoiRHQF4 z2Klzkmqli_Y%XmI%Jb$>k>9;Pmn9+^uU@~k8|}Qmx7je%GKdXihAX}TXtmV8vMfB=OOKV ziWq+SLd34^_1#eg#c5oJ+_(=^foLt%=en1Zc*X$H;5SuAlOzQNwizGZ{6hIueX1t+ zIr>$3f^j{B^u3K{C0dC+RF`}VoQWhi^2uQZb@|#Bp8m_4QPhyA@B2Ms+M$3AZC`X$ zXdx->VgNa*N&_<>>it!`9EyMm_;w#56uY4iHvs3g0zX4+#-IGGBWK z-xq|imUzscC7L*6asA{#%Pu?V&5yZYYbW$&_tGg9Ll3m7)**5X97~|T)y=BNs8&Qe zuG?JptPIzTysL2QNZXR!lf<9tvN2-&EaY4fR3%$OF<(rWANPg|HI=l!3qRfKRqrz1 zA4281eZF}2sM#8IS$pYUNb|C#ZcPI`=(C?5NvIz}qN$VAT(RCQn3rT#(kaj8y9Xu} zro|pD`q)CUcdb2a?MEz%d_#12(q|S(PDMH+q}0=p2YOuWdSe1j_%F6j3F;i0fRo;j zpOm&m20V9Xg4=$Nstovk&HojdNr!zGe@nii5rxyhrShfpc5ZR8jFomuqvM9?Y?|Bn z*Avk21lY<(4LZjJCmhzH--HHt2sxP*rQ}mC+77tTeEI{YgHrfsec3yDnI4y9Z;V#Z zr}|6(?GtbmrsXg6$6I>eh=-r}dtO;Y-uj;(Am=8M2V z_ZgX-Dojg+^K-O5vyj9MyzlX7V;z>a^qfxx+@EOC71-|@bXgo^57v^)vm#)3>ZrXJ zy3Hr(T%7&7y#){K77-(HDeX%v_joH&B*S01(S&BunqK2a^XtSl=KhW$<)XNfKH;rf z*>U*%qMt13Wa!J_XLm(D={*V8z@^IOM=nUqAYJSF%oC8+?yJ_nJ748 zMCChqS2ac`$lq-kH|uECm&^Iv&DN=UO|hReB%Re6pZJPI>v?+(HnDd3^@NclK?Z)u zyB|JYS<&yc-r!%`eNT6JtYtpMi>CN0g?iSo7V$=>#fUU8zInJGQf zR3Lg-@Kq%Kn~##wIyZ#)>;mrVBdk9XL;GXgu8WAV&O?^2*0&NZL~jj_q+VZpp--r9 zUvrNrtvh~IiFbg_ll9a@UR-2;!Q>rlv+S|nC0vtpgTE<*2T(GxCBy(?X) zP*|K$O#Ff$E-pqet>*e<VRug;BvY69;t61?#tan}lV)0e9=QH6*yNeaOBj zsLyZObneet(hoG9I`~_j^>?#J&T&v**ZbYoqEeBWU6_&T9ui73IDh1wPtSFbJU(ck zVrx@+ea+Udvw!*H7m1XGb{{UdflpX-UyhM&J7>%vCXAW74WHl+V7e#m zjK1(GiNs~nVtAni|2B&MqB`0YliuUL7G?Llw!&&u@)$(D|2Cqd61O?G`2E@btu9Xx z{F2jqyH9FV(^*SkBNFy=fd8t8 zC3aC(mA=niIb8_F^j@7}(k*w`#g+Vq#TO&&?cOHS_uYeVjDbX`ANoCMMb8?W0_x?K z)5f^}Ac`{3FU;#l@@Of+Tu)hN5vw@b?Cg65|Hw6h1MW_$CGVNJcn7$$$~|@skjDk> zSs=5c7`V0B?$bx(DB%`ecKIgm3v8>3{7$6autM@*NKCB0si~~JQ7ZXN{{+0YB?v}) zQ%o_Ku%yk&J;m;vkRk zX2I~R%8Wmh4}-}Q?3^Iy2Y>fzW{aWFir8>g06y6dt2>x9?zi2Yw$VqfXs+pe1vh!^ z1!}!WCWDj{74LjOpK^@=I2%N=JMB45Ym&0}GtKppD?8%8=#@M7Y)pwA7ReM8U6OPT z*acfj2@L#)^(0n93VY=5T0AZ_HPom>ek`0-TQk&Tm*@St_h%l8IwSs5-|T4`dUxQ? zf@b-{<7N9?ttw=N*5Sv5##?m?_IfPoo9ib)`7v4e7r~A1VfynfmL3cG4;bdzvHyE2 z1p@{spkCc50K(=Jmy1>1HF3IjCi?H6Wf6+4D989xX+v!01L-!V=-%n?-+m{@C%LGp zQAf(Unsh*>wi5EU3q;#ry+0CE+swbtUK7V*;XQi-UK}ZfDq{tL^Ugh@lgP_tWhK() zF9U9nrWLBZ*Vld?izgYX1bpGDx~bO1Y{>qrrAzwuzVg5Ft{7 z%aq-tVbSQN-RifjusW+@<=gwRDT4ntO%oq=91JC>BF zt|S9q8DhRi@D<|~exUfRwH17bg)UEYqK?ck0rSfb9OV`8oX+WY^1Ny(29J>{vk@zm zJKCS(jPDhQB4iCSFzgsQlW-j5gh5CW$&(Ojy*)En}t-JCeUcp681EgY|<)e$e+vRLKgDJP}$ zz&Qe{D7Ad)i!uFFUjb!Fk=L$cZJ^i4IAo0LRl{e^ry`kfxe&r)j1|X-SQBYO@>x7G zD@jr4#u$`E&#F14$Gbe_TI=2S1XxSo-+kXnZ~2~pLA#t+fW8H3kTeUQzALCZPjc~F zNRXL5r7a^hB+$?X( zooieQpF(vU1hN-nvyR+k>%+$lCPBKKH)dCzg|U>{e+2o&A|ttY*vVJN$Qn*Vm*X%G zWI1WVY*Aa1-LHU10ieC8MxE@#Y+w-f`ZA2&b-E?awwGCC;`RAJ<;cECH@#eK-Ta+- zsu#OvRv8c~x{IE6Su@*4y8?3P#fwmp0!?kNP5O?`u$c4nsDeWj4&AvO6TJ?H*HeNJ zO?|UJ)gllzUZ1Z=_Z+_a1zLs(J;!G6}AW$ zw~e0mL;TpY?sKz{UQfVddul+8lc-o0!x>z?+CRBuG1?IBZs^f=?8(Fc>(%veilmfH zfEIz1$Dr-+tybY}z)JIzz95~DgIo)t&F`}XpH%{BfUjd(mi@IjuRb@!NM z-)66;cKRJMikp4jHNeg(86{tDWp;~7vt+fyc6-o2_7#Ou{FExFrg*%s@_Eg2dL;he3t`A7e% zO?`*qO7^*s-<_g9KT}tyC*eb^rb2WZX(@KE7Q&4nwGv+=uY8?!4S7~)3My*qdq6p^ z^{+H-nGOVb3WG2&efXV0)p(!qxrh)@zedM|*u#ObCC}rcCiLyy!`scz10qS@b4K5;oJ;^EW{36exY%i(VHQUis)*s zO6}v*p+pnrd7-D&3O|Ixr=)13$u@B%&Q6bPzT4G2HQy7J@n|G{A9G&8Q!jGkTK<;y zjzz1JlY&w?H)S;7peO&K$TN||f^5B*}SV-$O_%GA% zg7}ggKTWv{M}E`o)=XaQnoq^nw!HT59Sj%4d~GM36eMLarN;ajb>p%e$CUA+=PN1W zcP7PGRL6OX`H2z*CH+cwf{%X8LcSfwt#4*`{GtBg@BPK!yBn;FG2!l^E_?F&i!s5A zF)5tqI9nGQ&kkISy_y;mv~v*L&B;8+dB&x@HRwhW&h0^oa z^K&ue8wBN!{quErGvtp13B2(Cm;GxDga%1Gul(ox&VOJ84f4_D=U@K$MW^pB z`X}H~@pqrV>V`Md{f994C>aQWL6i&L_p z&;t@>4tng6DX9k79+Tgo){7=MnRnxbpu1b969H>2j=Abhl7x+(b@+h!2rA`Oh<$_N z^6L}UNQ0e76!RX1u9~ww#=NU==9>=k5vPzQ_4SptDqZE56|joY1IcPcQT{L~KVZM_ zsRjIr0~fz62~qi!w|Wz&m|gBJ05iruizBH~5};ibrlZ}ElW2{mQrI>$tr_rgrTR{S z5In#@(^(l469$#-B~&)x`9AI6Z2(j@EHFES0=g4`ZUedkswdV?+0On7`FtdVmC7jg zQY=VFLHY^6k`OuB7a3wNu->~O+|O^N%(Hlav`p&#f{|m(OhUe^^Fa7u z^&Q`B`duIC0AitPbWESB{xmv2tS6csnGO%QlZQu8DJzz^@x}jWv((qgcDuenzz%ysrTKd~IcDv7yr1`du&{8T|8pJr@4gS>6cC5SmRl{_ zbvp6SctdlFVBHO8nJ=mVND33&skFu1$enU?R)x61tK!yH))+dXNyG+0hN@y-1#eb+ z3|zU|*kW=AmlnCOuUvAgPQa~$4PX;dY!mZ3{jUO z?Ci>Vt*<0Ih*K4u(&XseuiH4$xo+H~t0E}%r&JX&)o)c33B8Myeq;G^5>Ub2c)d*V zM~?U)i2c$-yyo60$oXCc-@n_-h-F~A{6JiMP02I|l#AEkXpdqlO{m#EhW#inv$23la&Od@GwiAVshO8;{yuuS7xgHX-hIQ}^Z zCqt#erV3Of%_nx(Lc4}hNKic@-RHNJbYdh82c}l=YtVCs!7i+V-ww)8DHvh=Y&VHo zR$g9bXngJ>kZbH5Tx-iK46E_;)fYF7vBgC!b6e!cuGHYGIC?28+x@vu$i?_cNY$(q zUsJo+{kz!Sc1-dR5$wckMl4l#Dfw9OZAs-p#NCWB;iJDv!HuDdcaZtw`kIi(s45Z4Uf**z#Pp60BQT<~ z#MS{Re9)^K?Tj_GR!-^8I6|CVw|+<*3NfV)1BDiXrmk~lt^I^O)?91V>*h|*noVk7 zIcXBA(&_II)S9|ahbd+ZH8l?d3vx&$p0<0Qt;J!azgB;uq_vCxu!m&L7w>RZ-mz=9 zY%nhQp`^d!$lAg+;BQ29iFvJ%kgM4Srw8xEmY-qHcFe<{gM5~RWE&+dsW(F0?wBQ^ zqYP%N{HU;4^w>R~9rg3KqddZw4?o2c4QISaBSJB>oi9m)BG`bdU2pPmZJ_@pY;u~8 zAs;tC;#N}gBetQ$c$7kj^ZXkr-k_c=?ydIGi79du&P2@U-SmROFFH1+QJey8LXVzlU6%}e&O13Dj{o-K#Q+z~>0)rjQ zWC~v#&lhOypm75`pN#$;+^G*k*`3phB=l0J?-1pPAmE5V|J_}&c&QqWrQdgxNTCDi zs!2cEC4eP!^hus%estMpnlzK4fC1Hyt+%#Ti&S%Y@+6a(tNHys^AAxc+H$`+_vH^SFerh$c1L909+-Qpjj z8NB%86r{iD_TMk$(N}O&i!`XnFCvjUQzaOr&3!~Gxz{S${gwZDcja^N3kpH5-PS83 zi1UEOucqC%PH=(|Cm!>>fzy|*e7DpzNK(|~xWS8OHKb>!yPHjd_uTgPVx#u?r!(XA+<<4TBY$Cc96CAqZl%+C=yctMSCh8q3FS;A02?cYzYcU_Fg_F@ngRVVxkPubS>^#d4o zQQsaT#nvq(8qo6F2SfNzTT74R;K8jMk9@ZQSvVYtF6fRH!6h<12|)+W-yz)siG$+@ z#KOH0Zd#5O4I@&^i6ZxT#0@VyaIeHlBb@jch7uvCS^RfSHivv==AaEbt20 zoYhtK0DH?&5CBQmfTPEU8`Q{#4|_qP)bC(=od)=)H@xG;{va5QiP0E2(V(V41bdB& z1S8g^sLCiv#r;0QX1S71Ebj!RV?;y}w2~8cbvVUIUS4L6!(^u?H&*$E(~E`@cRZ3J ze2mN%EswtLSB|8qFo7vEL|1>w-RRAJ`Vnf?!a>Ld zNz$}n1j_;1>MHUoZnomh3=mcvcWD`K7*471767 z-BQt{4_~&I0qx|5QB)p088Y;o4#9*Tr|FT-AQ|jhu#{=@wTI?=xU1c9gp;o6S6&ow zwFH=MY^E;83Tc?tvy$^Adg-UNigNOna`V2#y@4$Oc~8K{SrMD0p|Y!L#MO+teiar- zN|78gvYRXxxoCp&!APNxkJI$rz~UDWn9(P>XqGPaE{OC7juLF)bQ!*sCvcq! z%mbyov5Yu5Rei{AZ!bF&#RIz@vfCviO>ri(Lck;O68D*UjmgHb{%+~DvbBAbov7qyDh>TjJ@qOU(juyn zb4S4q3v44!^AmtFZ;dTtDZXx;CT`JpJ${@ysejFCW2pxkGM$H+RAD6hfGWcm&gp<; gfRK!Qho+(hBewhF3Fvf9(9LK+oj1_G~)P=F!njg_GMy9YCTWmHqNzAX4{7ShIi%hf_iQVe*TjWOa zyI&*@&oLcxE0v$^X^KUgx}%bvr+eyOXp{XDPd{k-3QzAsWd30lx?Pym3IyBm(W zrXy>|(okLdSt2ZVO~xpPz40oVZa~vbsZ>@7mH}`Az!3l!09=8FI{*#tL&48C zPKMvMKM-`Y?*1$3n?DA{0fB4)taSBA{){p<`+RrLpoIltd~!x(J)Y(rdEsIa#fOD9 zXKdCzWN1XNFbj`}Of|EhCb6@PO?@zS9(V6`+uJ4}5J7Z$&NhRCk3_RgjUpUAh{qE& zRw*0m#Q=B*hny@a>PA2P5C*`yqwY8-@5G|{U$ht!jDE&go|PZe{zN#X>uC$ud|iB5 zrw$`wyk4oyws9wo+O?fd+Gn>ZDM`USPn=3F-FNo7AiAHBQ*v{gh|Bz*sJqAHStd1u zr$M(eMb->Q3N!x$x68eak(?)_ey-UEznXHM#y3FpPM3J6aotNzjM?3aR*<>`SCi$%fDP^Bi8~LZ-rj~--k1f=_65n@VS&Updf8VV#t zZVX=Vz?g!3)GJYWdex4+?NWQVK&^VrGe%f9yCF8OBvdZ{=s#ySles*4x^Y8{;-#fz z@ggsyAYda7Hql?|d75uFdu<}S_lF?G8+}DTB3amCNXYK^cQ@1F>z}FK4_}(AYYX0?gEB>C zFQ^A8-$|dNZW#;8Y5cUx*F)62rFM#D=ke|MKvfulc~wDXo-3Y6`(?4F-a*kP z=g8g;9sD%B3(_kd$O#yzQ#U-<*6i5#9gN+kuNVoetcuu#J-1x12eXE;{cw-R@L9v-e&3IrUBs+tZ>x&8wW#3AH`!OJsPps3`9AKk7dObuXm-Bu@BS zbXiV$F-DiY;af>YIR!b@y;5B=YrLmb=ksdRLi6Orj?1GX8wKIX^p;dTH_L%ZKT&Qq`BN6~m43Vy)_6T9;LIVDRcv+?RC1>X4oikVBov)4opOuSgRax&I}E|hv;Kx zQjgA#o5&8Kf5!CTAEATBEbZ>q7%6uNY0v@Bg4lg`O&=p#q2!WQ2vH<(z9g{3DE4$r zp=0Uef2yqR&2;QofLl1*NLFLJrQyPY#$48P&PdT_%WEqBE2w#-;&?@9g`<7<#*0`{|5Lsdamk!yZlO5RcZs0sjrzc*VkqMxZ^!>x15=re*hgl`vL#} literal 0 HcmV?d00001 diff --git a/docs/logos/otx.png b/docs/logos/otx.png new file mode 100644 index 0000000000000000000000000000000000000000..eae32c15b2a21b6f486a7a80d4e59479a27500c8 GIT binary patch literal 8752 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 bZ@S0Nikv9varV#uPnCzN>8e&MTSxvs@EVFR literal 0 HcmV?d00001 diff --git a/docs/logos/passivedns.png b/docs/logos/passivedns.png new file mode 100644 index 0000000000000000000000000000000000000000..4959a84779d952e542a23a998cb2c1d5d01dfd80 GIT binary patch literal 19024 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

!lFlbQ;9W+kwD2P&4zy>EjJDkL>n*0mkC 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/logos/passivessl.png b/docs/logos/passivessl.png new file mode 100644 index 0000000000000000000000000000000000000000..e92c87d0fcef34bd546d2569526b97da644150c8 GIT binary patch literal 25737 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

J<$%*G|;$9^=6eE5g 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 BJ^26t literal 0 HcmV?d00001 diff --git a/docs/logos/passivetotal.png b/docs/logos/passivetotal.png new file mode 100644 index 0000000000000000000000000000000000000000..87cef69582a217576825927a774dc486151f4bd4 GIT binary patch literal 36361 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 i(FhB^H6DZbi96`$ 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 XB2l+KA-8H^uo3y_?O$sbbUX83XNx!S literal 0 HcmV?d00001 diff --git a/docs/logos/pptx.png b/docs/logos/pptx.png new file mode 100644 index 0000000000000000000000000000000000000000..11b2133765e9048106c1cbb0c4d67b60d73b8566 GIT binary patch literal 12347 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 Hmze(mT4uy9 literal 0 HcmV?d00001 diff --git a/docs/logos/recordedfuture.png b/docs/logos/recordedfuture.png new file mode 100644 index 0000000000000000000000000000000000000000..a208c0453e811fe2f8fefab566158f5d4ca76e9a GIT binary patch literal 39310 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 literal 0 HcmV?d00001 diff --git a/docs/logos/securitytrails.png b/docs/logos/securitytrails.png new file mode 100644 index 0000000000000000000000000000000000000000..072dac54642202af4648b3279996bf69866f6e30 GIT binary patch literal 7947 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�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 jKDj0Sc~u + + + CC812F0D-F9F0-4D68-9347-3579CDA181A3 + Created with sketchtool. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/logos/spamhaus.jpg b/docs/logos/spamhaus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c868e462e9767250edd18403d6dbd9a584271ad GIT binary patch literal 6002 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 Q>i6{j%l~N%pyaWC15)zZ#{d8T literal 0 HcmV?d00001 diff --git a/docs/logos/stix.png b/docs/logos/stix.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b824149da6a3dbae0a814e0f92838ed32e7f1f GIT binary patch literal 3730 zcmV;D4sG#?P)gu{U zQu+D$^YioE+}y_iGP$|APEJn0zrXJ8?t_DaqobqbCdtXk7#J8v01*-r5+NZWRaI4CVPTE{BQ`cRRsa>R04!tx84&;kPyiH_ z0406^A3OjLEC35^02?14A0z+?8UO~Q04X#84Js-s;D331TAkHjY-|~-R+?2 zliK8VDdPTCotVC{9aiJ<+dA&MTG_NWse0`$j{Bjp+B&I~%2~`vH-3+`?f`eavG`-J zRL**Gzi0%+8@CMivjBJF>0VMlS}L>lz6O0`BOIqJAM0!QOXaS>fYcXu@Xvjt#Jy?V z`7OK=3{vcc*SzabP2bUOYZ*b_tNG|l+r3!@ePr#6_v+qj>h-Ut?`PMweDquOXYbXW z*U~4qrtfFx^}sMctw%$ZQX5lXM*K-;$$KmE4S3LDmb|y3lJ|C%k+ZW6Mleyix*gJo;luU91NO+ zajWeeeR-6D_deXNMGX#WTqi}MS{W=E0aXpXsY=3OE58J7D&(BklaE}YZJKkjZPwYE^+4B$KjtdBb!%qE4 z{H~ZasW=gD=fZNGRJ_NjS)2%0DgbZG4L80NEef{@K<8r(!u>ykXSS?}cdt30c2e-} z(Yr}m?e%LFfj74(a4SuoM(|&TWKCX%JFXZqpZD?Mc_#($c{UpE+PxQnH*AHU{}%4J zOl)`TH0gWdmfvBAUi-YAilxsR?e{6Vi4VpL!P|1f%^yU&@EtoL$)Yf8@*6m^net=3 zj;m*Tf9Nl66ru-d3CK6q;;gQFsT)y~yy7 zVVLj^n!GbkEcK~u?#fBLZRRk4rySr#)&w&4GYW16?^z{Jjf=(`F%oP7b7ij|D48BM zm;oFvdb|lA)tz-cwFl}WE0x0WCRmiIe^{US>pp?j1ac_q@K#POFNY&GmiOS)AB`}RdE=9vR>I|`=ox1{^>>m=c6#1@c7PPjd@Ef; zvL-BK35MUac-u&RK_&96ujv{+#UEXb&?8c5YNh8LP3gp7CbuX|k~QJMAbNfi#{0N} zD$zNEPe_B&Y;W96l-e`aPCk*LOvjrLl3eLMxIZBaAq{V*f+{hC3eDy@#rKBxfHz7SDkQ91jAxl?rUvXi)6~n>g`KtqmmR;4)&PCr(*(ass4F`b_;unBJ%c^z| zR|ei!x#u6Z(f3ovPSWy@EQ(;j;}%7k06|j*-jzY#X|Sev6Owr31PB($A0QW&mBD^{ z_Lw+{rOFiVXc!BoN5Hl{ahL`w!}!G4KnX!d#&}ySm?@1x!WoTZO%f6yNJ8g3lu+@_ z5uE9*D|5V6=@HV{oP{i3X?{eM_f^u3%NiW%^w5aR@kY`k{5d2%_tdi{3f^@0_i6j& zIQwwLAaCxwcrP^MgEyWv0evg#1PDPWZ@uW{ReRsb#@r-tJ{U`gC`i7;cj2+hbSgdD|>D{z+`jqO=kq1mV1K z_bQ?RvOW!#QQmNRglN&3-;j__B?;%9#dkVrX^&dW@{XcrqD5K9t(O2HNRfY%EkLi^ z$_?}8zRlMpYa->(Ql#LmoYE_F+STbk4fBT6BjU|lE1gP`Dqj;vKv9!U+%)ef8CXn@ z$jO?hd1GsKsp?Yu72~{lFjE`?%GQLM03k@3|DD5XlFAt&QP-Do-cg7Nuqe9eRFc%| zNm7pqCg#yoFut#^nUT}?$1VZBr?D;!AKj0ND$*XW2Ysz5xQs!6+=EXsPoi{wwB zCrXM&0eBlP(t7D%f4nw@T1^(DMl4l=Jf&)X`3C7-f<-R(uA`*F>#jqVj%TMqd>SDkyI-doXCsU_P?8MM2jW4_lDn z413%CQ}V`(hh-=@CE6tougtsEX09{d0(hZ|# zjyJfvfrTu$uwJSw-*jAH1IHaJSd7Q~dO)xOgk(|pdO$skg78+vbD(&;jr$I`Jfz>1EH91h;`Il0|{S78~Gk*_kO)jRa-NEA*as?}tcfXRi z@UGkdZ#V&hRe*3~Jt{mt&!ygDhNns;OOepFecrsDDP94BUm2`tN=?AWdFTD?L`4q4 z_Iaxx6}TFExZ!`&LjiRwY%2WU`4%57T)rk>9wqw!4r12C7h%SqM?GrwoJUKlWop~z z%@;eW{o9~Nizi&sEQ*SE)&<6KDeq|8yun9cB-E4P(PYu0=v4q$#?x{f6DnQvTjtF} zmSB7`_5>a{BEcWmlf&~eETtQqF7=|i#9n-jGbAb@RZs{=KoTf3O{}ca`}! z{wbW=_*b|CU)H0ak31h!0+lI?R3Gj`q6~3t@N{7)eH?CnCg^XJ_ZqGa`m1>Ys9%Cs zD)03qrErzJx2ux(cEx!=_`JWFzMY-d{lw$_;Jvu@U)-6#ot>B8tS7hLi$8qc3)8o= z>smf~bN|L?@70%DwKU)xmv6qSwJ+W)`)l2A;7ikYw9{HX*2C`7vcCD~C#417pzMc9 zm5)l6i@N{MT{%hIl$HT*ZbJgwQk^VH8@?Gmd-QQvYn<<00KDFKynD7+DqlVOz1r~Y zN40SqeFF~x@M?Y1sFliBE7-ohjyL(cTD@9obE?N%cVJ_xjgt7Lk07*qoM6N<$g1U!EyZ`_I literal 0 HcmV?d00001 diff --git a/docs/logos/threatconnect.png b/docs/logos/threatconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8a5b1561c839769446e5a9d65ea12aeb5f1a7b GIT binary patch literal 14988 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 ZX$3flx%ZIUZuqB*hKjCoy`oj*{|BS8c8dT2 literal 0 HcmV?d00001 diff --git a/docs/logos/threatcrowd.png b/docs/logos/threatcrowd.png new file mode 100644 index 0000000000000000000000000000000000000000..94eacfc5bda962d9bda7385f37d900bc598e3128 GIT binary patch literal 3117 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 literal 0 HcmV?d00001 diff --git a/docs/logos/threatstream.png b/docs/logos/threatstream.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3837ef92261912fc2ca824550561adf9ec2dd8 GIT binary patch literal 3488 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 literal 0 HcmV?d00001 diff --git a/docs/logos/trustar.png b/docs/logos/trustar.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ac52138cbbab144bf22732e0ebdbc81d48be39 GIT binary patch literal 37780 zcmXtAWmH>T(?!w(rMMP%inqm`;!g3R!QI`ZI20)E?(XhZ+%33!a1ZvS@3X!iSy?M9 zb7peyxiho(o|CX2@)9T?2tL5Tz@SJ;iYmdtz~23PA-;!x^6R9s9r_0As3ai_Q#nC& z1Op=kBPIG>#SIpmfsn2;e>*rCf7%9SZo64eq!0tpQG8bIUx!IB1E=;=`5HprvdmIx z-jWSs1w%hi>-DXd_td<6O?+Fdui?|nAx zd>u!*2SsB8{m`eV{SPudnKKv?PwlvBWoeWfm#iincrrA&{`#(5ZUB4+c36C)4){i% z_6O}y2Os&aFuSUD?r)zPqc#|PA3Lt_2DM0cCilEL|GeSa^M`XOkT2#T4w85r=6ri) zkU~U+&A|9_R4$-IOs;1J$N0Mt59n1Rla6$NhTUs(fV%6*(E8_q$LaKT-T1$yc$>y(Hk-Pi5uVkb!aP)sDvw zirsmXLS19_!oVvY)`Ufk;_}3|tFpg;x7YM?Ez*`WZ1ajCzMpKVO>5`%rH!@}YI%xv zasy@_=b3vZSbVZ}%VnY*GdEd!>~Y=1F36vsU)_|HW@_5bTFb}^JIQ8#lA{~IDbD)` zCI?}&0G=tTjfP`gaBy(?er5;P{6IPA>N`1QE6-nEt(2VI$MZu(99nKh1h?-F;!IJhl&i}^JzEio~X*LIzc5nd7#PPkhE?(5R< z!?0xSAeVoEOp@lv$cTd#$I2I7APFjlE00FEZoB3^)>`&}vUn zO4{E-e(zT6?Y4SjRufa6Uys9it{;?*aU(26b$?p#^?fU_2{b*mfJbg+<$e4$Whgqy zqSYo!8~Ca`Q3vipAYF~(t9-svN5qfxLu{MQEUpj1Wzw9>T>NVaI=xFl{Wi&`YH{RL z50a*p-pLS~H+h^G+;pX4SlR+7DB2#ctc$O)f)B=af11?%OuW>534c28>f(AIBN>Mx zE5ySMFSz>CoIreaQt<8B?6vIo$mlVnVHBCrWkj zFSX173LwLFVEsY;ajqbFyeR7DT{L)E?8QTxJgdjKVOKpB>r?$DQ~nCOEjg22KbG@5 zx?h-%LT2scaAi@tm8VAfz@-4*{rl)`^;%mmmwjkbI?RH`_nM_ByJ$C_%DxbQfF{4i ze$9=7Ix8m;zWog?Jvwiv011qsQwTDIjACs6twYMFa~01p*9&=noHYLf)6}JN)bh%9 zcX!u|!~M!gE7X={0NLLUdZQ73%QJt(fdwVv;o$*?_a+;;WjRUdYE4KtV;*Y^KBa_& zx5S@hz=&Uov~tNV>MqBWB1dCiIlb_D4b0q~uJ|%@T(2(;FI`}v>!S%ew&Wqe@y(-3 zd_@Bhu^pJ%YfJndi%y^#+UG=T-?ei?;&WQlgRINpO$VNL9)Q!8Dt_-inQ&m+skAS; zQ+0(F9Xs}EQMRO^+bIYIuJPk>6VSlf;rHcTb9=QROvI-Q?&DI;^jsr-C1j+Q1?_Rb zqW`=dV|RLR`o#a7#FADiZkLvh>RhN#Y*}L2YKWEPCcw@8=p6M^eLh}l9nt^GzaUxd zTGrmdA>%UQkDrrly6rTb^W!BoK556+RZD9(jogc50V>;@k(s=_FkhY@$8YZNLituW zpcx}Wgm*qU*vX=J)9tp(KI(wf=V6P<+HnMf999RLCo0IFd4xnY$PScNV;-RX(xC~=6cf)H1d!8%Xx40s6MWm#|*B;CD@h&Pye_TPe znYeB*d&S8tWtr8V&6j>p1x-TTA*D?;<5_~faIRKpYKv($E6V6u@o8B@jr-qt7FQf& zA|X3O|R_OSci{@7FrgZ6bB)xyKV<*&v`Cel+k>(>mn}P zi~u%rvffH0ak_kVSg;ifJ$-9Xw4hHd+u2OUBa&0RYePhsrlr!A#yNl_i#45OH_}m| zt2RLQ`9?@+KIlk$g;o4pbbZdhj=$X)bltXsDsOLZqaE<)LR>Q=CqX_OirdK& z&n1%Yeo@=48Fw6}od3=Xa4&E=olHW|(vCR6Q1>xP(wq%tzAYd!ary4$^(=VScHYU# z^lcb{932K0;|?Z!n0f=<@08m!=t)s5WACn_XlKVYOU6i>5k~8B) z!yNZ`%`e+KQ;sC9Pcv!KTfzUf!q6Z=tGK<}937G3sq0{P#SUkdbhfgweNJ0SJR^WY za&y>IeEL-RN!dq{T@KO{qF*6(fAgMTwj&Bs-{d_Iv;UgbHwozm@u@@-GHN8b8}0Q>55n-D zb7WE@X>Ljfq>R)e8Y@?OvUr&n!icmZ!#Og8DX04qxCJ9{J41qlYpjDbAkwZkn;r@d4&JyJdR|7M#X1rVlWiGoqHsZMe|!4G)~rsGpgup_eBLg>(WZQVyZqOLw;mB_||66IAAHXq;ZXC z?lMrbqr>S_*&TJG-i*A-DxN*`Kz42(yk1bEo*Hetu{-JvOJ8&{bKlsJz04ZHAu(;M z(!9|1mTP_=$GVMl&?>YD>ijg$Z1aEj@rICG@z6J^?MT8`#MkRY|-d({eLy zx;T3^UIa%+^Kmg5MC+Y#RIA$%1;!pEi&CC`26ihhEIX4=|RVYV7C3O`{LG#!i^6M?5x}& zPUWm}U}dd1Ow%_`_rDk4=NmeamNb=eara-Z!0R(!X!U&sl%pte;5-HKb}J zgh;%={Eofyu6MZiO#wmnI}0Q-_KAy9`3?Bb1d?%D7~OBbR427X_<0KHO?_GpEj_NU z^C}#U-VAwNRC!Aj66k2#^eH`So^rt1i*Ky6t-%yvO{{r)_sG}PECHZ#M$^7z?2$@K za^=y3z0`cKtlrg7<;`j|4ZW)~S2~-&VHMtEXa~tYJ;b@~?9_^_1sGW;5^jz3l=GJI zkaLd=R58WXk3JqOs=SK8W05Z}EAwn`U4O1)QJ^XW3k(V#8K=q<^9|#$0&rj4Fy#oQ z#mvte1A^G@Im_}oPup{%UZxgPn9o(U5{S;-c*x1OChu1r6|CntWeGMD{K{)Q2e4jf z@tC#UyjA5+U&q~%y1ex*+jdu<-7poSUk~V+rV@n~%Z*ySejXGGt6R^X$UhX)mwE)e zojeFezdaqoPvK=N{BW)@3fF}DW)QtBanP|1hHJ!na(WvaRvNWtKr7&qv81MHbv1C{ zNJM&eJ45u?T>dVHSon5m$YWnwdsL^mZbZeCK8v7|;$Z^XFe1H)u8mk8YMo>K@H3-9 zL>$cHNv5e1;v2J}rC}*pz5V0L+IGJ%CbSh-rQl;8W@ugV(SBG*TB_@VN(#9cF^VYA zPXN{%9)fs-BZrd28B9*rR`l`uGg8~y)1}RQ(9>i}k(Wz-MqG!!^uNv=!Czy?vrEoXu49`g0UWLKQ)q~K87K{S3tN6i9rN;qdX7O>T+q#!?k zw6{KX75&+ErOXyk~v$QQh>$&7?(k$&01M z3}$-Q#Ms#LD0r#vRNS_1dWE)^WKW^_>(5c-wks_0O5V)v^13kP@Xx;aN-tk9@u&DR z1bjS9W{D>g=BD~31kE5s47Ql%Gzb0bs)bt_CykDFDNj_*vQC2TDdEvG2ZMPxR3rt0 z_MN?tc{m|6jCj2z;l&b1JMk70q1{a;AIh76)0r#fE-RXp+fZnH zvAz8MWAu8~=Co&I+p~l02EeGl^88?@(PiZGnu(|L>~P?B!t2-!mk`8Otsf3Q5Z%cC zr0W&1yt(ri(0JE5IZu)b7TvbgbSSPGaBvUa7IQ?NYBUK>SagVppX+vt^6*o)Z97Bs zR#lNXN}gpPgF!e^kyWRX#PzSDm|?|jl+=TPeztI&3dd{0a}1>?=CkW?8+ZhK2oUTW zrbEN2#q3Fp4ZP{wDdT<;>d6S#N|&9|&aobnLN6Dp0S#MPcNfJgaDFO;>S9Y-eY%_E zlU%}+T^|x;`pw!3!e|@1&9s|7Q#HbtZ}?(5wo@rV;@y2+n5Y$Hm}Md>!EZUG~2?zHbBwAbQ6%Jv+#g0*vO0 zq7OD3aofK$Hxw5io)eYttt+7A^DL#yWhQAUK`+#U#HQ^Ap+eo?TdUUMb(5kRBF~Oe zweyxLS|%GjOXX(+7mrFY#^zI zbQABF$coqv=ve+D>3y}l1y&ZE5i6xiR)3k^1IO=sm58!h|H|E#BeE?|TP+%4E0^gT z$O!6Yt-?6EcFTZyq-zlx%l1$p@XYuP=xgTP! z-|DWBH6HbROE?MgqlH_mjY}|ht7|cCa-EMB%rP`&;M1WQRK=8xqC8++XWwY+c;R-D zc=BFnXSt+St)1mb`weQKDXrzpY&_Q0)^2y19exN|U(cY)t&B}G!h-Y1Y<7geSTG$+ zOvFbNBYdczcg9c7W)aB>?nLp{E@Qm(Ei zo{j=nx`<|SWD^F3X|#7X%HUF_ZOIChcrw)gUxNtJN){d`0}pM!NXVLnShTA3dUk?T z_Y^Qq&=JGCXJ`wj2VUwl;}yGW z7WMaO=$rtXmanC-35DsXjhvX6n4R8}{P&@9`iFL$35=9?G}t+w*V_>+E_#Y@R()ZC z+@xm;IKcB95hiM6e-6O=J4sv0VMA zh>yizq#4EIovd}0kVxBcAgc#V{m(vB;9I?G#M+D)NaO-f=|0wR7BbI8!=xCm;E2#pG!^!x{@;So?7xwNre zN%@A^K?4FhBJE1?=ob;)pdR8Q!7eLH@ijfiDUifErR<CU6-qaA;n~Xz|1_u5{8BG1f&Btr;Kk_&@swWFXQmLK$pFLxDk_QN|8N?7_$FnF6;*Opa1EkT!ly{@7$MHs6F5J^@r)I z!bbhIkSApaRP1nWE%eWOO61v}V6i5X#ye}PR<2x#nF@a?+57C{$_JwT^ByjM<82vO zhBe=Wr;m1VSyS@&4^NuoTAQbm2Qi(6r975ijYA4LI^1{6WDhCMJrgj$%)2ym9Zuwl4_ zc{4ysu$C_LKRZT<=9&s)I6X!0*+JhnFlL9r0-V*=!pnZ`)Dqg7^+45zj!5TELacOH zn{###B<9unE-|4Jc=M{%%mJ8c%8eESMhK{HA!?1#2;9wXYa1 zIB0=gKRA=-HP=18B`k!cB12n07{!Vq24-|S6M+l7Q$6Emduuh9-Sa<#onr~#E5LX& zLv(L?4kH3srXQ$7tDoHdJ|qkQix+_#DHcpsSc>=lGV;j&p%~3;qlMi4x~5nzQi{?r z-YgKkn}Kf*_b=#TppGv}3v(w-wk&H278T`qiub>y<&peDG4WSf1H^AeuYMwYb-WIx zv5?P369;Pdc-NM{g>sA^E$rLYp`#Rcm-_ zkmJOTJ2wVD^kHT2{&qipn3q?yzg1C!*haWsol$Q7g~`)Y!6UZ3qz#rTB+xGkF`r7~ zDAk^yf5Gf@!b@0`Q|d37pTH+?R)|@RqwAZj7)Z;03+OLWY5^{TmVi{6whgVGm}p_4 z5P(g}Tu3Yy|5Nksk4NGRY`LvpPb0fUj)nQ>?y!$K^XXmkR~E2L zBBQx!9k-g72N}0SZvDGQL0M)zC^-F-ktwOn6`R%scygBdOY7H3=*5 zx4ybcqwcS!hQ{Nc_1z~m%-Ng(ZK`x)pct-r>3LhT~E70rEzgj_|XF0!{*S3 zhC-q{4d^y^Eb8-)SU`uQ<-F6;u5$8>W$Y|It_t+*Ah9{h zhqX8@D7lGvbC@igq%${s(ojpd&Op+aCAtwMK;q30@#^DjR)sf|20>w4va;&QgCD7z zmvaEX+5A@LPqZ)@J>poJfS;_u>yz|UQn6b+c?A{3?dJCIdip-(#)OA~&m=HoQLEP4 z<$#tHEHnJMlw=^|RRkC{GaaO{qhx#;ft=cfT&@;Wb*m z#y{60@Y(PD<1wrk`va>Np{;`_wANpGB5&uNK1zB+ORbrBcTy3zQ9?G$xZki=5Ddh} z45pq8_Yb}<$X$JR2Vqj{z{~j?9d2e(y&@uhV)vi*6t;3(&#Ke1$_6R0b5)?hJrx^_ zCXCz{o_8Y1yj3N#%%zQd9nU{XL8XK*X^f|=eEzm_=jU~iCoUNUkoRF7XILt~P5f|$ zu(DCa#r1ybn_`8WvEN2<3WCxM_N#qrH715O49wHEkn(8;rpxX5y&ILsR=p^~k3LSp znZeb=66mYo2V>ts<($7Or*}>2MAF0bl`+H@;xAXyZ3ZFT73w!R`G9jmptTEv_XObq z6%wp1ARB4wy&0gsS8Lsj-&9hcg_-$vaKAn9Ye@LV$FbboHkw;pI9ROYK3Jev!T8gJ za!bGNeUQ`yE36qj8=R)TC|NL;i;Jk;c^KwN0FVTa^g{f(S31og8m4{h_T-osvk2fF z)^RTWg(+BEh#~t^Pki2>B?>jT-Q-(oeei3+gCDIuUfCc^`kWNvgG_f4&`sUFtZA67 zJtFA&R<3)P0Jg%Z&LzvI3b#y=Q-WTn_}lJ|@QSBm)0?G&n6XlX<)SsZy_2LFc?OA8BKEoZKp#TMy^ zP!DXc%lzz&t7;ZDw+rjZd$T?%wPBQeyavb>mAfVx;))^aS|3E$7nwV`ticOQ&p3WXu9WZ z@m1~{B=v2d(8)C8!M*L0-=EA9EUaI+>W4y=?LeB;PIo1B^38zm`suY|N445$ZBbfe z`lHQ~Z&{C20q7UvFwju^3*AQXP!4i6K}+wy&Tp}G^%9aXqCl+)I&GCC$g@-Z2)Zsl z%L><*iqn7UK=%t4lF6oiCBS!JsZ*pCGQB=@(8p`p)S)`^xw<;L&3yHCDd6WKD( zP}%uHmW+Htm{T5n$}LjIYT1}U6Qb<1!YM*w8$k8n0@>`}aq(hC^W;H3wN}zoY6sermX2xgcP7v28x4e_qsJs@3S%!<;;$xB6+5CDOm{BA_vY~}8 zxF?j;`u4C+l9`SL?Y(^gdTo_7^K(mP-e=tG8r0F~7ilnT?=|7aFQ2v%f#|Beoo3Uy zG1T*g8{RIWvMUtN9Wg7&{(sQ%*PHlJ&Wk2sL9IHEDuY@n)JXn6F#HyT9JBdzS|vV@ zL=xzmUI*mAPdlAgK&2X#@w)xtg_AE!j_wX;@zR@DSk{;s1`*ytXC8*9z z)V4aD<5R$#`oI4kk(;yBig(9ux$u)1bubqvB$m-7B)L(nFG>3NGXReKi>tKnd{S5w z_k1x`-h045Z)O;5QUMeqnt^9Q-fyoj(WfH{`0k~$_lzQt?0h?NJtMdzlv7df*8CEi z-14e2aq3U(6fh{iaKFc~(SI`XFjlEM#Fc0dl`M%(d$a2aeQ0OLW~GAs=>%i0E)7*ir@T>0}WPe|JMU{J8nt zPKH=>w+#Mn{4!KFq-8+ljOFb7o9zcfWLy^A)t1tU%cRMuaLUv#21!~-{?%C3c6xuc zs=#HC&Y}tR>DRb|(rX!Ua`X>yQ#5AS_4L?#2wH{AK^>KqXG;x(u`^4lVuhOl-n|YT z=u=<)kMi1-i)3$o1l6p$3w9PH=M92j>X8WERm>QsIn#pqI_zKm(UEPF)Q2%i(By{* zi-NTJb-asT67xn(Y2x!ZzLKKc|6 zY;qIy!Ig5(kmkCBEWii-7oY_k)DE|vVebB_$m@TWe4VFG230efx^8h$;=wNm>PfCc zguu@aStG2&=CBHisZcfFjsJ2vD!FRKxWm(R%dvFscr;Cu4_o=k@BKZWS(pqPfVsou zG`rXFLa*u4_Y@@aEhG$v4SD$;3i2$I_qsS|uPzYyc9TSlsoZa}cEB3}W5I{1zRK zoXYM=<&9(9JH<1~f;+g7iac8aZi?9qzg`yYHln$jH$xuF^YU>el~RhPeGwkJBmkNd zawxy#0zC4%U_hlPDRBe5jS|>&(1Tt zvok-%r(z%Q$EDv&W$QQ)>F_s(OnQy8cK280D;ZRAno^wKO2KHpmkVeVs}07$amj3a zSXwN?Y)x29G5R17y8+kIqyV>qhBr;g`SCJE;hP(+9bsFv-0yo^7y0xVH&c4kTao{_ zSHr+^c@>+D>)YV(d{oJ`N{-m&6gsO27qWLJM%h>NoP_EbS28sBPRU3`cST>#S^)|ok&>um3-ZaY;jtKNw=c;B|I{I^;AEjaRf3^)rU zA^{!w!E1(iaI#6K(+`A(q`%soyhUh;#p9Sa)MQo;G4e=4Puc!krMf=@y?cJWQ+`w* z#VHyws#9zxDPN_n2P9fgShn`C97JMYH_;Gmv`hVNnu<)ihwS@}xH=PMI%o9js!Pe# ziowI0k+Pv{;zvP(#Xv3OwT&cEMRfOwg#I`{U~<$TO32Mbz81|b(n?3(o;auMp_uvb zrH{Jn%b8bcNgU|JCm;^lNiN&oSL3JnDLJ0YYtXlspEb_UOCLT}oItc_6Rsn=&kU)Z z8jD+xQr}u5$2Tzdc-H}e8><2hzSq&E8xbjK7Amn{!x4qxbAqP&f2i~B_D-N|3b7#N z*o4Hh0D9&1-0O}WP(MlCT-;*5jNhU&pJf${88r)(y_{^KIA&S%=5e&`V!=81PbtAPv!L`g*J2*xrnL4_^QIe~a} zGN_D@6W{b6+Q|iS2vds8xBo$WnkkS`KCvncamkX2pY|xuOph-^hWm%~HB`MLT0fr7 zX4+(e+6HQVK7O%xGd*6SW6$0nv3c;T9u`xSgjq(63{(rwg^*+1ZEtTsK_@{>tFw@z zT9~B}@ss?<&+_MO3ZqHW_|s!C;nJd_Of>x;f?ONae|0uX4gvG9{5a0|2(w@-K8k6v zLpRAg1A8tx!Brm`De;pWHv^@@GsNb!C<(T@kje!yj*xWn*>Ho%S7CYIjhWvpLi zLPVet8z#t}V;HF-(8NN=cRVP=*MGIOs(U$&NzJIf@^&`%%1H_)bEedSaCz>uQv)6f z(80-FJ>-!CL_d=#()O3Vym$S2kc2365~gG;(g;9r!YmD&*3W|5r_bLs?|UWXKSc<6 z2Lzx;mOJ-OTx6{Z4er8$-kKF;$1Z8gm4vs`SG2EFRMqZw`P}L+QVZM zE2byEo`-{eJ(izIs%#-bgH?!0Z>QVk_U~hlS!;=i0rJR1G|7>0RJeI(4$UTp4QpeG zn^6i;9#)Iv#R}rcPjg>4_rp@Ox(|1S;nDp}gn4svG}$Fs^{c9?x*Qe0d&OonJ({a> z(@7wTV!^t$?daUTO{Z@KKJ1Fi_9Qp!CmOEF-wTHR9+F+hiB4Xzy5Zn>XbPel5SBGCF~ z3^yfjR;>1s4dX5d8BaG=-GW$A$uM@hRZT&BB#Z~{La51J!GF+W!*yKfxW92-T$;1G zxQGUUq(gCR_4keSpGJT*%rX*6P~v+{@#_;d4406;p0xe#v?PY}AR$>yGh*yQ?!bHi z!;4X6&Dh4iJc`%sY7pq8D2+1qUYN`TNk}B8KobU06SQ^G_}3)WvsjX2-274~|Mww{ zAI4|EsB)`|mjc0bRY%dRqBD_+mxzb)d+meM5N@zF6p5qZXKR~%hMW3fR)YJw6M%ac z8ynm5G%-+gIg=~fM|f;W6NwZkL_TP`;ZZ%cQ((0q+{G69sP!dnA4bxv&+|ETC=8zp z24&5YnHeRO!0I{x*G2cDOHe(x`P~!It_M8E&sXQn#RY9Xvb4%J#@6wTZ^}F7`^hA_ zD@P~!)DgHe_^@|^j8S+jla8w+11>^ z;OdJRaUrI=TK)nEX?a`r*S$V`+)bzRw@npk>!*v%%&MGYiUl}mC;)eGf%r}R{yuijTbhjT4Q~M>+Y9`|platCK7T+L0PdKPc#`*ps zY!e<5Kjz_Knttm=&v58aLL&p@z3OOZwMd+@Hg)r)Emy@%7T3}b@pOrLKya~hS;c``X#d1eC1IhvJ$ zgI)RU9~l7cSbl$nEpuAd9UJ*inyMW!Sfj89jKh(a8o%s?qMOO-J?<-4pt(OkZ#oB* zh=|)!8bk*nxEl!FI}z|#i~J}cyMruem6#&su6+0XjLEUsq6`jI8=r zh#V(r5i)c;egqu`K;&^)<}7&kc6L|NvRho*UetUmm6*WK z5i3@X$(1}B^le)&u#E0OegP6?uRO+&U(>nA;V)|ns}2aDBHv_zHDj(%Vt1=wwp2ytRpx9WHw0DVN?kXtRDwk=)nw|_0Cz44vV92emg9zx1s+jA>vvRH=%F}puiz-xuPw$(qy*(X1Wjdp4ZiM<0^=E&&xPEp zw)1MY`#u&Yw2y&8j2M1*iSrtNg(BwbwGyhYvAcg84)B16^9sdcB@hqeyZmD18WZhm(k4#5JoSKraoSJ$BW6p-2$LbgP3f7{q*8c&;B5r)4nZfWWye!oyv6Y{(*(+)NE|0-$i@Y`PVcHg89gNNf8f&LKOeZV`3{wwDp&7<~lWsTMGxq~tL*-kQm+D}i}*csm1 z;O!z7j`km4$lu@NZ?oTli^GoMk4L30&JSz$r5-;OT=rEUCH{=c#9aPYZ zOKYYfYX>U3R%v^@oF8-U$T@ub%Kx#^=APFuQC>ACjO=!y^ir=FL$Z;yfHe)sNy*Jg zo5XbOxckk-vf*>UkDm~U8MhX~2GD_1yTZV}{@Xk)vs)VSD{cEFS4f8#XlkxYikTvQ(EI?r#P+il#gDpk*(u^Rq|!2pgN!+|k5 zCg^iuOOZB4UC&tVpYlU>&;?&cP$5RjnGj*BqAet$h>QtMP~BUPmSM+-CuElP zKWf_Mq(GI5p7!)6%^~i2fP6+3Mf+dWGf7_$H%3=PT!_Uaw`NwF0_}uqDYL{k@u+T7 zaM1W)N)1aG%l*14uuN4spD4oBi13UbZ{h81{;Ee>Mm3mhm>0JHUGwGDy3=hkNg%1s zgD#_nedz1!oeh%x39*iBW)QCWT*{zG+Iic#K(uaF`v>0hZbHw}G0gUm@MJGQj`dBU z_q#y6h0U`J_CG!zPl)t8iqD#vul*|L;<_u0CB?|r)cH4lhr-O~rmre%>9ym@=$C8$2)Nsuip{dIWC83q^cJJ^2YE4_o_AEw6xnL%7N zEqB*Mh@Jhq4b6eD0*t`$hK8%QyUt(AHcz)ypP7q^cywDujy*j?RLt!F-{F(1ywh_Q-NSY5EBzMxlin<`a>Ei^h(~{}ty_P2m%nR0kh2rd zc}(`|flF`Yt*Ob;Jz!PeL2~0bCNBL#){lJ&U@b5InRKG1v2FB75kyEpK$Bi_@%+wN zJ(*~h7B+C~ISa4Rs}6M%Rg%Z39xCd&?_lfN{rZ*B@-uE@s#ze*vtE=Z2c1t7@oDn> z=E$;lCu25t=P0BJMfvWh+gSc~|Dpd<{4Ax2n7p%w+VwXP#(eqHIBfDRa|2s~?l)Jj zg6K}3@4i2413ruzICAvik#bjMcBh1M9cO3+IJ>+BX0ZIZb-qo{qo8#$d^=g|sK0>M z4LO(|SX19a7bmE|8ms>M@wm91j0oSj{2)e9_V`QgBtx-5z_5x z!N>E8@Pcp~0t%ck3%E$n4KnbX(;|8_rOTb?w=Ju83yV@jv(1!v1B06=VC!}N2t1D4 zRnJ=?=&-D5G+~P#&~v_EEdejpyR|wTz2qYWS{==^-XCmySgtZ8aZnBU2_BS)yMMln z@S}%OaAAE|vPk&Ng<`AENrL5`_2G`Zo1mv5eJ?`8x+9Xa{;WWZlz7T2F0aaS&_{dEx2cas66o`k zLt#-Jb|Ta847qv@F@EEfv37}mBzeBpgg~jP=mY)?w`3+7lC;PI9_tw}t=e={pV%@s z?v_&Ut##G!G5x~*D$Y*!mB}ev-Q^L%UuBf5A6hyTkyhR9xo^j6@7nLzJ+C#JrcXoH zOzPzPD$?^o)74JMyi0H&B3^ehLz_DLy8;T#f6W?$O*=sag^c+jZ3G4 z{_?B#59R*OGwZ->3HM_HLcE$T^5nn2s>aD7_BtgRv4@;%5SD)68GrdhY z$KUi=*7`FDIc7_i@OOIy%tsi+ofLJsf+K~)HHafn+qW_pFzR^l7#277wB+A0fzfk# z9}$*hMp0YCZy)bRBHEOiz}Q)jb0$BD3k(*bl2R*8NFUL!q0|mZQhvL=AM)Bj7E!)$ zM^lLJ>T-v1f}^ky7Tix$S02JI#8vX3r3Y^)T}J)dx>DjHXF(lwmvaBwTmReD05HYa6L4rt*v7eVzdhT1FuXU|ID>hgc&ZCp5U1PoHz+ zwwXAWy*Z%VZYH1f6jBqB?Q^nNUu%3UOjqZ3j4ahz6F}bim_Wqf1*SYd^6?#@hOfo( zyoQceD|tw_rxv=81r&r70oSBRZMe3+MyEs71FDOmhpXi?Vpb(B-coZ`9H5$7qGM<8 zuBSbFd_zL5vlI-CsvxjAMMv*Ur9E?P;-v1?hTdYmnyW13FX~ZoJ4xEOd<>{!Klrbl z8@h*RO+-TA+T}fv_4DEW#GdKZNNJzbu2aimZFPunWJ%(paB4M?Q!kypZrP*;V?ADAi< zd(VV~owPW;v9ay!#$YvKWOLu^szgS)}gWE^lL666qMH=vxCEEDxfMY_U8;Gey{9*#0YmO&~gd}FL zUOG9oGoxd7Yfmq4Tqj&Zr*j(vjhGR985ui8V#NsF9Uv}QZj|31j{xD-BuY%5VRD2w zm~PF|>*te%mSm{iyC%eSkBU^Y4$^ReG7vD&*HzU{x(X7UZ;}dHMqE2?xgVitbi`mZ zQO5V5x~AJvt;NCZls*rSBZ-QksX(&xAgK6$2)ZNyQD&U&(CumPX?`#fQ9AL|TYlJn z)fho0gdQ%`R~wu@2Dy;T-gOpcY9$p7PU7EA>|~s3=4VY3N}c#N{sun>6g#&%YQ8Om z{DQQnWWg_hC}Z?$5m>@P1HL%QqWxl}X2N=ABP*WC(p}35Q}AIrp)p2+HDhOMV-Mr# zouH)543FMf7ouow2&T^R#uDNJWif(8eLbvc6{gX$xrqo#W^*-ZMaNV5YRj&Km)`L$ zTa#2U6TH~79IRbxB6)UIojPZ(+gG(mq z*!uu2UFdn<8dkjtcUgfN#L@fQf5sEx5Au2&@yP`_pEpoa<>Cw>Zp((G%GVu8T`jI` z`T-egNR-P`8*g72Uy*o>s4&~R^-H}at7I!urwY?cm)}DMS3D03_7K)4-0E9|P!atR zF`G@XJ+n`e(*7n8d;Vjx~QM`^5?yruVeFz(e(8QSX4bKO|uhTlXyx2>D9H zM>&T?soZ{M$k}2?Qk!7CuOr-bFN&l93~GJ8`iQ zAebMBdcQC#6OqmWMUI?4)Ab0?a#ub^wwHN7PelPX9&%(yIrgT{ldRCp(}XpA>3HuD zvDGv_$2FvBb*|4taC>by(n3c6a^n#^ma)S&FZEm6u^^ra-QCT{Rg3V>Az8kF=0X;C z97Bnl=h#!{?b|&_=1+#RI9&!Usll7!w>OIqAvozp-Em}zU+QJcgukFfr$mefyC@Yd zlOJm?F6lfe?5a;;fmeuG`C_4*G6omWy3oITP22RoH%iQ{xQmJ$T^jC-a@af1|Nk!l z91pKfOJV_uOLda+I&|OTh!{qq_{|`vbYABqTTiQ@ve0Y|V(0%u#TfLUE2ceSwYM0IrDs6Sp`W3HzqU{c3vY?(Nw8qi%{FL}!A zah3CUwEcbytScEN04$Ed^+tR81BT0UGOctrmJ(>->?;fFI(-zpw!fE<^>I854khya zcFe@Ymz9t{(ub>Y_tX!(i2PnJ=+@uu&Hc}U2Q>v{XUX;r-@77yK9v4Hnyxx7s_$vT zvg*-K8K%C`d~zC?PG~4bmdr2nb5<(%s!5OSkmWur$1v@9*>ef6qN<=FXWj zXXcsb@U#c69j`k)%#`M&N7hWm{z*ZbwI;0s`bEuHJ3S4hG>nN);zqOgq5HP#GxIXzb$5I?n$Fh*3_scIz7lxlXI$`{7;c> zv1_F*jpQ-Ip6s6FmBus{PcP7qS@HBv_v_dE$ru3K{{m32m+Pp@NqaYw&mbBj>5()k zI5fE1%%I*j&FELV$IUI3=cXQrNrGJA?i)h{>cL(S_LK4Ma(9-{$#jwO6g4a#lQk^B ztBV9nW_;w~EmPy1WwV||eN!Gn;>DE9fwT>?XNMmN^p~Rq6t+@?T&nCxbMtM0yv-{r zbPFN=dCh~3_Qitq&=Y_hBNMX~jw4^;hI=q)IAb9cSWtXciFdFX`e)Os=Um-T*yU9D zGFZip1I1HRR0yvtufD`y+BMo^%VrnOj#wlTBr)+t_aac4QKY38zgo(( z%uq`*+QTa7_J1O#YNngG1i!Y$<4vF_hSt1y{Wzy-$`qhd&duR>*ZN7L9JD`op-X|- z&hDB`L`=7nlc5q^#I?u$MhwQxps3k}xyk(ey7NcaWYk_Ra`L{0&#Xl^`k8%$rTGco zK+C=y&W2nZF1Tk1r4pr&TfeFl75o!;dvkQ7)UO<+?bQ=H8})_X;rPSUd5gHJnj^S6 zhd_tTt-gSo9OS{!TI4r;V5H@7u@Xu*ER#V(xXIACU3TwQYIc{8v)5t2{cBx4CYb>( zDeobVd_Fk%GeRKx6B*YxbF89xOV3WNDMoqE+8vtxYidbN`IftLtt*fFOZz3geO9p3 z>*ZMZFX#KSEjh);uzgtz#O2AR>p&SS-NV`ZBFAn!{M(0a7?_}g#%H@AYM<;FjWHzn zcSnfk)GUM+o7~rfzBm)z`I~GZGnfSA8u`3n*b=oLBYxa#IYsGdHzUltgvSKb_-en= zdb?ma52)tbjZps%`mUl9&S#=wny!&6(K^i03XL*lUVY(cA==RfSbUNAy_LQ-#YlLztu3+2I!XgXx*cL9CS{-Gsl4+cF zdP~i#_5(Ew>EMjhW3)!bD;tMtYQJ=x%}?McM@) z0Bq0CG}bc!Iy*&{fQA+SmdECeosUoa-5}w#68moOH((7iM8>&Us8Oeh)vgFWRdS*D z#!8jO;YWQRxMCPU5RGu>3wP?#*B_g&?w8LqpTB2>?R|P8`yc;KNb5pUyhaVmAq8=D zbyb}Dc!sbHSBs5B3li_Z4BwQT?-4w@-li<>sF<5&XnJY->k_?&xXtzs<-*0O>yS+S zt?fUSogs)Z1`R)rW0=WK{!=Zs=LpC&Qq{xv7IR&|#a@9$@+N^gEnNuSNr{!Uce_ZNyelODabjAp!iwC^wtwUocP#P4 zg;=@=L~q9U*2Cjc%1|Vg;AdG63_|f}mFZ7NXS6D2(lxD!p;PgtBxDod=!}wgh?x5; zGp+^RDyapLCMoCMH{l}Bsv1>X@2)*9#}uCY_OID}sDS|uNZIS7PDKm0=9~OSKbz9x zxxfI(#l_>E4x7q)wXC6-_4*gxn?Mh43c(({5|#&v8Z3a z+AV8wxxc(n+$`c)sjHZO4e6vnwrOB`_(#_TXQ4e2a;f}U`5*~(e7SupF)+|gscI*=;Phj) z*o<PAxh2`E9ETA#GdbENZOAaf?Eb_@ztVc)FJwBE@9BfQEmkVEjQ<@OH(YH@u{wo;@-RTk!5g zn14TG;%Z{Y#@vEeVdDC#)qPD+NADR}Ryq6q0P%9RygZU2gcD#!0ayc)cLlK^C4Ux0`G=Ssz2H32!{O1SJDjO|N(hUSh+@Gr;?eqwdieTe;XLL3QkAb@@|*)(>782^b9m z-_Gl{+`p(#d?Tt|50^ZR5aZ6T`~-(bZv`HHJz2Re-#UmflsAtk++G^MJN$6VTUZ?H z?8e>uFCHCOH>rwwT8&4AqR$xRa*7f$V0rp3FK_qn-deVg4l^{zk(818b2Z}KpNJ`p zp97b~w^P(C(;Zo>qjiAyCB%FX{E*a$^*u?{#kXH7dPKE>w<-5-`}RtTkrU-QZ0yS5 z!}kL=ZP*RH981m}y4(9blI$`|W`P{z^U>(0sHWi`n#PDxaba&TDHJkX1Bx}UDp z(&CF_Ao^R5q=u1SlbfsT*WWy0API2U@?7y-zN>&f_i|NWFb$qvqMhVxyn;bJ`97xj zFCGkNoT2%EC8dO)%POgMF{ATcJGFRjpk0;Cg%IX^SN!sJ`7q^c{XvXX0-XeLh_ia) zbD$fwhtgO#bVbQN+#DMJHB8AZqrP=PV1Q@oW+h^)XhUGW}y0PY8q6{SBPL z%{f?fBJ48tv;@aR;i?nn-b9T=k6w;bULF2PAuNspI9~<_3=N!X+2jBut9R{6&~ba4 z&%!Jl2p>+zR~uM*{yguQZv|dUWWgpOozK+RYJPPe6+^ZwC`zw1a@zeQy_kFZ)?e{f z_N}pf8IH$J8*dQoXRI~s3(ZT(80NE7v*>Nrq2MNGiI{XQ)<#1^ zpKrjGEDD*Wk|dxyhrgSqsB?nQm(2hW_ZsdtQXhJKw$CRDOUysf7~0`0?M#HARo=84 z)1+;lp8FQ51h4xMKpy!6dB0}IH3E;V`Zf;n*vpvFRydi|oJ*>qkz){IGt+8fkS+Ig z7yKj*YsI-NFQ-(cNuLhp0NX0VPuDi|^|cbZM*o(3Bqur^1kFg;zRt{0*Eb?M8ew|! zX+p}^O{Af)(v&%V-hY@uF6*P}$apI)R9)PC+toao1%YFBGrk7AVC z&xwwYEu<4_0=PuReJggC>E=b_=RD#Qi^cPVTaIdmei%W5exRv^GYHsb#tER_l_!=v z%hUT0RgB6k4Y&;Hu;Q7wZ+QvykoIhOb?jH?o*QpK4wIg%sJP?QWux$ zMBSjK5;?U{3|gR*ZsXHyuO*BfY`Z}Gk7D0!Rvot{RNVWY8zNTpr4%oz*+5YZt6efG zd9;4>LNCEQ&Noj`v{OZndOGa(#~)cj$t7}%GfV?hX7e^J-L$D-Y+OtNnLrq35E^iY zU2*(zu{LBX03QYK`x)GQSkb^^vlRB#;}h6B#u%%$e8@TJOx@7vK&ouIqikcHgf|pF zr0^pZhky6&*YLp9uhBg3A8RlgMV!Cl6tDFdD+NqH1FAG9yeTbtqaV@ z!z#~S`2;h5owisX*=lrNm*vH6`7u?Q<>UN>^Lk=3b+*e?)Q9b017AC!tM$pQ+H>xC zVyOV&B1Lxf_EG^`wk|{rN^_^}8j}Omzm;`UFYwDcve-*8T?PL6@GAS!$S{(&|FV8> zlFk(J{>=msH#C&`y7Y88%_VrtEp`G$X)U-#bDPzsf8_9jCJ)KPVJZFdZ@PDfXL9ok zg4w3i$iz${wa=QfDm~X4v2q3d5N@~c5o=Gu#eJqWv?eiCSN8kAEPAMEKe0!6n&alF z31gnwbjUO4>6>Zccy^xFvWXz5jBQm+9~5&`mA=BK*8U}NysB@ z?|>=laJ6G<*uHssaCh4;eRS0dET~n=f7i#9OnInTV_vne%0bqnr~RqjrtHbR3@%- z@60l7B30p(WU{|0N`^GzpxKg{*00G;AKD?VaOQXRRx#2$RLp?WUn$Pgpa&S2s z>0ZVJO)=vgdC}OgPXY8I$$9IuNp=5s2m?X%;KKnB1K+gk-7v{G53@6Bzw0NK8*er> z=Z+j+TB$lA!gcj)C@Mxw942ts0_BUDRV|Ai1HQ+j#!-!XQJX5(I(L5F^_d!mG7066 z@rWhB*Zxn$yILd;y8O(=g*mY_0|dGsO59*_51TWn$LDpZs5ay7;m=hXt94o6JS=zT zLS#0g&qdITZ*iEza!E=wyaO|6ey6XFU5@2jT9+J*)i=IV?&z>>K2xdMP^F`hg;NEd{3 zsI^1TU+L(EN=aX<#)qtGshi;tTFgU?e!FeD0ar0fGHWILd%BcRSF1L&D}Fd!&96TfaTvx?OuhOmg6`KYZzl zW7Ufv*V*ehKQ-d}BqMak530R>qi6nHi!G zFRYdmEqJ$GMZ@p@iCjgzp{H)O$Rrf~Q*YXJ?fp8Ac;p z)BC))3u=s%Ar*gKi{?ZQ$2`xdNnD%&{m}>96HqJ2o+>mRddk~NSL*_s^7^96IKTIy z`i)zb&0thA-oFGw!|9diU!g#aP(>D>{W0g@&Xtp5?$W$iDs7rXB-19%Pi-xl)zKz$ z#@nZ{e<~HJK*cMn79vU-KwsTX_>U4ijV4Z~H2KOu_3=alV4zpw=aQ8DpO=N0iGfy5 z(YPP%F$`k`1Hc`AF^XWp^zvHlEoo?(1us=C*JQ{aS+4 z-5L|mH|E1OYjm*f!e?l~A#K=y$U}cRUsi|e(tvuwKX|ae^4)K>WBUglDz{7nxCeh2 z|FJ-LNL+cbkIZx(9H~Y2%#MtyMt_zp7|g>NHd>f;7;m2aCwhu4$v2|_X{{h`-}J1c zU4;kl1p;tc$YO_~{7pWzw|DJqGbP?Ia^4#=lzT7WDcsa8MNL50+#B=T zU($~LX-@P*%4hh+M=N9xKogR?FGE??E@CZq^Ec3R+To37OWL=w%km*{QFEE4uhP1< z#|@Eh46@hx#g*p?G>4ah&Mp$HYos!As~*KY!#$Aw_Iqm9MKbwiloO|qeH%Xkcb=;C z`bv3*LS;P%YAE|zmD<~EAc%}5Vxq0!JACW=-FxG0xCCg_{?51T!bvMAgOJ)TiGD%^ zey%yH9Z^CSw_3RtOBHeHkmTHA=}4c`R1i*yRuNPRID?8$X?p4>0%Iqu;^UelGG z)m`?N-a1onXsII!EdCy@S-_8N!eU~ip0(488KFs3pXMy4oSw>=POIwNUfFWanRA)m zFO`)^%Ff}vp4w_W;~Vv$yjx!n)mxH1GcU$%sl1_oxWP_N)eZ>9x%PAvr83`RBG(oU z+&Hf;&_bsKCbrV?RAi-UwI4IOxpRD&f%Q;P9GQ~)Y%dx4rteUF`ZLMI6PRw1v`lXy zlA7x!=5}FwwJSxA7+gxuH2yBA#FrC2BmtP1>nF0W}0~GCFR_t(35#)Pds0cUemV(mmDIIyYMKMNMolFyr?w(Q(Qur?{MWq6ga1)&PJOTz!ysDFV| zmlJR&j<`ukvCKMR75$A$jSPIHM`Q~MYrMOfw&~a^E&A%^u_KzS z-A}a={UX<~NdXr-o{75NA^~XPi2tL_+22um6jq7L7O^lwde?!5q@4l#@(G03>L}%A&T)EF*IHKh` ze%`wYf(CrMSp9v*FP`|KQu)xS+GE!e>$FGVrDt}->MB=dK;Z5hEGhJxUO58##_#o? zSd1RPAfea#gWav@e`A2EzvT8xT610w*9~cc*khn0sv)KU%aX`tx&^A80rYSR_$zjZ zu@Cc){;5=*Ha^2FBX1sN8p`115w%Sg&})H4K4dG5xr8}3D?kKHxoc}L{EBJgu*u%14uQ=E3E z;AV0mh|PQI??UapM}8vzLb6n!JlvR!BEys~=Dn;}wQX+dh<|j@Lc(o%%yZlQ()W%y zsKY~Rmyt<~$xn81n@Y6sjw>1E(%I~=3;(8`w~#UbL0HC-5=raCptr!c^i*wA=}Y`? zUn*3us8=Uld<>RxCmycrXDcF9ULG?o{4EIuIR${*e`p0B0|KtsG%tUoVzqDGtd*(0 zFkEq=WwRBfEwZaj50UDt-uyWaIV*ELe`u1+A4D5mQWt*1kC@fA6`?7L5q&WmNxVoBdK4(Pwip>dzKc@S;D5&wX;&`EOd1XdrBu7uXlqa}5b} zR{rylhPBtz7!2ffR>miHg!crlzxXr#t$ve1U5`dbjN(GA|%t0W`rb@F!UmJ;j4leC7 zw*afl1m5&>VaTzP0OfwNkzoEzBwBxnoVrhF7lhi5S%^vU#Xl(A0nn|pKL^1HTOy1%Teip1n!M-s(kax z{g7nyOorzxbzMyfiGdBfyJs9SI-KK87XvEC*yyegFF+zT=OJQ(qkW>DR_~5=Ar>-d z6NiDGpC22Lq~FrhdNUIXD$W$Fm=Nx z41>egUtosiXg|Qh4$o*T8%&a0B&t3&G?;lv~Sw#N|ZqMtJ*X|wXvC0gwH ztNNR9BS7xhLRz}W@?xspVs)cr#>#b_*k$87j)x|ucIBZ)1Bphfq)c6?j~8su1ZeGf z#3tEP*Yx9ljL6cz0qLo9l+8IO;$@-iu*7={J)3SU1$`?nSLDQ*1Y|Iu?o_=KVFQ$< z1{(ch;j$ZP6XXrB;-i=&yw$$Q=2fp(mgabofx79lCrM5R2JpABdI|4hk9J<%4=w>Y ztI{IDH=l!~D+&GN$+h#53J1I~iv(c|N@vsI6NKd&VOVsGKm3wDt4fsR| z8Lyp|AGNP)wmAGy8}e_3Nay~X+%I)u2Vh&a-cv5+!~1y20C9;w!RQxC+V}IP!bw_s zx@z}s3Qd>#p3xv-+c!PZ?|>d4X$TLx1%Kr%4Ngt_aKzDWLl~@K4IssomIhZQhiEI$ zBWUoq?pA6c6GsZSJicinTIrKPYjwR6k&0-PxFs%AqBZS42TkW24xP!3!q~5SZ-W~O z`*|4%njXgcn(y(-espSjmbRcc{iZ-r1;9JKq$x{G1gssPj~0{zR=q@hyOE&}?Xj$u z*Ii;!5g+vqR9eIYM6wXTy?-GVH0Jq$71b*nAF|Q%V2pY?FLR*s;|c&05c&yL^lc?& zzSz*69@^mkoUuSGD8dE)OFU{qNo(T1^&#adO`d1-V8$|P;U`ye{6%!ka^Mer1x|Fk z-Cc`#1*o>*=&x)*J?pz*H17+flM z7xg)nPKiDbE%_H^0~-Bg!N)&Kj2Y98mwWCOVQT79UR>cBz}ge+$Nlh)TRPv*Q+rf8 zoQz)(3Hk=wG^FM|ViGuy1sXsg;OxFpGuLR#k9#N2k-gcLGix_5V}n%WLu zAkPg}WyHUe(*Sq4)*G4N%Q?+PvH$!l&>a;q$07=E zHr(bc(1!K|i~qZ?)Ru3e$aBkmz8NIV4!W(c%57_UsZVouur|Ox`^xmR3@ziIWH0I* zr~sVlr2&N7>;!8d2nsEI{6H{L_*iVmWt2^@6vNPQR^_;6;Awx8TuzZdXs zHt>BvpIS4Pb?)nFC8YVmGv>~v3Q%6)hvRN~AO~)^QM4@?eEaa9hDC`EAFg3W6tda4 z-<@HZkpRi>#h+SRH@m-Yr}&!Y7Ql?}s|wJ>IRjLa$MTR$p!^&{CKorCZtdJ!06T## zSw8D2r`>)@vlO1;MFJcffF6vr?Fw8GG>-Z%{B$=X;c`yL>6^dWxODsYb6S*p6i)aO z>qDc__$l;oR8Y?3S?$pvH`kl;#gtV;1i7*ZH&~i}+S2Wt=xQ1jr@%CgWNyn4HB;JF zBx?Sb#4Lf|W4VaQ_a-GILS&r{YgC;`6x6L%V<}tx`ewAZ%pix6D7tP(>=h{^;sl!$beUDGmBl<(luKzAIpndG% zNZAMV2In6$;h2X?pa7hUb{5V@u=4E~A;dg`qlOl++3Me9 zF4pjxWa~=W?+{y8a(ihYzzaRo3{SGI*-P z(rUO{4@9og#7=5bWUl7UUDQNa!8!hDm1L>dduIjBKA4`SZFV@wWgnp;DWSwh+15AU z08Ha!y1-Ws*r)ER3PW>NbNk%iol(+Z{m$|Xqra={F6L-kf-}euwNV3Kp2sd6-Q^_S z$g}uaUfeBAV0zSr1zwl&4Or*!r7TJfXq_L&xicZe}TWH(_4{qJuO zi+A?MAps_(FTT_}Z+b4ClajE7Q|{YuoU~XiI3GxKEH2&c87#G+Tv6XS```Xpo7FcI zegZP1Z>1d28%Rz2-GqsKeRFxzVH>IXVH!wo~uavkWdTGkBaYU%GTm`$I>z{Yw3Z5@}9byt7I5giA zoG9+j_5=dX*?M+~&@=B)SyrW)cY{k)*2^75Cf zF5%h)(Q1!H_TfbSb_;_1+pE*g;re#1g2+PBhI6CZogde{qIWN7FQDF_;u5aVn-^9# zFMp{hO>>)9;^nTz$wYe=zoMVvxhcKf>`Ln4*24@o`RtyW-_lp^#UdeY-Vy*ZvX)&g zuP%LCU8{)gDI?S7NfIq}@bkM&dCHn30S}-5hxS9?X}8|N*V>aVccGh;Ha%tk-pljh z$>R+-A5$4gxAuc|G<5ZKP2)Jt$J-?xHwJ$XFd(A$L&uK#+Ize=o_)8bxSN07;&wiv zvBA~YkC3XdEjxU4CrEM89LDlu^V>g}R*L_BMb&dl=q8S(&%$x|o&TqkZf|SYW38L58MK%2`qZ9-Ki#J#O4~l>Es97f+&FY1f)r&4=#c5z%b6Xue<8?{~?YCbh zxciUL;|Sge;?RY^>KZtp6HsJ36L4I=!dU&V@N3&{oyFZ`x|PElS9YI1`z1O;9q|Ey z_)xB-2q>?y(L@@}s;595yLQS6`~$b6MNwnkjr(ik)iVODp3Vv@$(FAS9(&sFmLpzc zMp7-CbE^EQ8MaU-bMa_xLDi%GBrA}kueKQL4lyx!`=EciC5f*#Cc@)P{%2xp;cEDX zsdpipNC}g6Ol$&UTpBU@`S#S*FAo2`U@3L~$5cFN$f%WCm7skK8-$rE;9$8W(NtZ(}CewJjI1}{N>+S~@uk=1jHA=^y4k)v*&0~W?nBK|E zrtFZ^3kh+Z{i%%fC0Nr;SpDJ(61rYm{+%X!oDO)Km4}_6DQ|w z0`tBQ5jsK{p;~TPrS8J^49R~`%GSZuA|8PHuGue~hXImj`aT$6R3j18wJ6a+v5oQjZ4)Md6+z*T7ww1JA1a*7`eo-?Cfjui1^bpUyS7#@l4D#NeuPdl% z8WYHk2+)Dam(0r5rxLv3$GM;RDSC9d;-O+K_lzD5w87Y#+B@4z`6qF`5L1jwxuN;? zYJ&lyP^jttM%(*AhuSvcdCkyXbg*=5JXnWVmuiyVP!n3fa*V5tq^j zKI+*H23w$C3h=19-K}obKz2QB;;uX`g#48YPJi@o1F}4PP&g6r@)3=BgpEYbZ`?OH zz*;E5IvBdxMMXtIMFxzM!M9)0Gt*y^jLc4!D(97PJbZ%#q&UN{X?R+Bg5O{1Rv>GM zk)gUdQu#dkS-WZz%GL7c^?8KjnAKE{dTi)RFcEHtse#+)S|(Bg7$rJF6446e5p2eC ztWzOkZYsTivn8LS$8c;^9V5S{o|n_vDedlThu0OEgWVNQ_=V~O&;pJ78{LS!Qm z6OXlV;&b-lsOx+wpvUR9Z7n|-Tc%YKth1|gqH|rzQI+35{3uu8U)>a!#(l;jaF`xJ zZaV(`bf6;rX`?%360SerXwLwd4)tTMK)^RF4a@*gNnzm^wfo|&tN|=|NFyR4>SmSc z`x}Z(xx+>wVMD-d=ton~tf;MMtPD5T^t`4%PS?HT7d>3EqoVxwbE@<;DO1cV2s0(H zXKP+ofLu1-)gC?XcJ&CRHJGf#?l0P7Isv0%NBP0ZafL z!H*C`2scS@0sc+P{X4GI<72{RL2&}#NC(Coh1W~!0KN`eO+8k7D`7l97 zjMb%q5Oh=4%*^a=le4Q$L&WfDlMAO6jl1((`dFTuR9F0ncgZ1P%a1^S*h!eMM0h^D zdK>e#Hq`fDtb&(nXyaD&isb3+nf0UIh79ROs9WYLYMczY8e)b4qPGWD_7YfIbP|W{!I8YS-B7m6!-em`r4~X3V@OF(63`)U`x-%8$)9<8nm|GM#~DMPc>SDs_>= ziQI+Kn0})BMD0WL>A;PF9ewXoCYT7bqiojCd1Y@#>D?ECtxPm4a$rCTp_8&J)Li+L zZg|)yC3bS{vGJAu`Oss9$!7$16nDF+5hf!)J*tLet^iS>>^Ue>omEaYNX~lbK+M9p-%B~n>vR!E z5N*=Qk!L^8txDXi!ZXH29xwh7Hd_lWKoV_Y;}Vl0lfC+@$mSLt7Gz{jef?F`c;nUp zDTdtD51IXHdO&=iwSA3MW$!f3nhxM3a|&Du1?A>y~zmy4_cu-*hret!N>fmqc|~zN)!5w%#w~( z_a3T{CEuL)ULLUFRsMJ41Ze(lm@q-OJY1{GGbVBBsrvL&v|yo3ZgwoYrvjW(XnJdH9&J1#Ie9Exd$G4|m6{k6h zLod3uQdd!9n7gvleZXO{`m9y2GqrP;uK+`LF6y>U>LKE`-ShN!Nt@%?x z{Jq3nMv7>?)JIrPK=cH3=!hKavYUfqm7|59Bbp&(F7oO+Iv2Y~7=fPQj&Q|DNtMpj zx^Ci-O*Y#`3HJZCd@E(AUVK*8efpRsz!z;koc`3gVZrf$^F$#7FX&&?V)mek5wN(S ztaPFR-mW1IO)N1PX#r5NM6pcq>te;i&w20KL&#mY%r!M9GXo;0%j`HUJD$4-zgQgZ z>!b=Xs#^J;!TS^WziozsJ%*E|pog;sWyq*sto>2^)pi?LPWVGeuH$8S)KSn1ex@}^ z1O7*zue`=ofKz=8)^XJF)CuJ8RgL9PWVY{d6)XK-s)>twE!;D(F zYz1v-o(n>5qR^~xt?;bytwxuIDX!BjgEDx(QZP%&-OXe$@hUA&5B1j~08_O)4(@YP<@456_^q6Ne*`SiOMzvT&j$odGi4*e2x91n zi3w{NttA3d6;Mzy@54aMrQ#FZe1K*D3*FQE-UR?a$e%?p*RV71H<);POZ?VDKtx{b z@x23Ie(f0+CaX;ADp*Hf$Mkn{%tr*ZM#8jH`>@l)pQK)Nuxl0tR)#-aM)a_< z-9@n%H!?u*g(>yp5xN}lZwd;cwZ|bs@I;E)QQ@eHAlSt7ZXFMgs}9!~tiL$D;j8YR z=?Qj816NobCnPlhW0zUdhTqqKR!tz3-KX3xgW^Jg3qqcvua4|=%583pq~3vp7;Q2y zf_%{4v`;s#T0wJgpB<;=^N6Lxae!JvW9)OlA{{VcS}-%13oL|UYP^%9A`<2Z-yBLi zw=}H3V5LN3Pz0UK5nEv)n(E7VZVGXMSr=v%`lPcxLB)i{q{UB*X%>t=59cNlxs-xZ zJuhxx0bAp9q0k6zM?uBUCBS^X7auAvE{ab2&BFfzZU9HkPavQwK%nEW`UN6Y)Lws106A6ktMcbJVYPalMV@vDdJDuBGB_d` z!%y}(PbSIpOphputKW7h?{nfTjgt|T*-4e^7`}l3k=F$f1?o_}VWRz1!qeOprf;DL zHODy}%oAK#bNlvKz7yu_xr*C?9nuj*)EsSDlw zk}TzWhiH%7%DL{>gJ(9@&HiFUpvXdcxNO7e z>xkDIecJn{?i*lXUpIq!N*3aKz?Zt}0+`mIVGoQByb73Bt6pm=!GVNX)9`WoFzMQv zhp*Gz=yEjtmh)1$tJp?Ov*8*GI6v**Oy0x_KYS?&?7$q?n3E@3b4S+%8=A#uuIi^n zlIpNzaUc6*{+kDXY&jGH%q8Vfuj_TXF48fLB?oByFH@^zmbVnZf8*~V@|5*6P%>J} zH-F*GRlx7v?cChmjuRO#q)Pmu=f`6Ee@=c!TA`5MmFHA9|f|>_Z z6124q^7lj@7%oxv+Yjhy7*?76vTJV&UeTXxUp>QzN2E0i1kKAxdxMZ`GgB2K=1XNh z(cOJ*TJ6Krmf;=M^Oe)oh4w2hCNsKg{IAzJwmEU`kFOP8>l4J7#^*-GOSig#r)w%= z%#B7Qm)yt-tz!3rG91Q#_X-4lHIcG1(l89DEt>1BRBI~WX;hX;l`3+hO|>b*^aH9Hcgy0Ou#Er_8_h4}H4$&JWU0me~%3ZF@NeF?LPZ^Gs1 z=m5~cXjn4CyTPG&e33{W+w=41&&=%XyKQ!n5F{seJGJXxTGp`$iX=qJCI7YcQYf2k zKe0kMy)h05*)fw;p=Q2hi&Jz8Z%4Eb_nMDnE+D^(>^HSE?k)GW!z8QxK9Vv3GtxHH zvIS6t`S~$m!Vb*nhMUv9>lvc{jy|8m7OTjAAGbL^A@1sHrK~?RDz1N@TL7KVkSxk< zKP#AWBM7H${d z%^~Qz?>USo!lK4n08xQ6nA^6y{!qS5YWfK%jL4X7s5#YJ@OuB%LCx_Q0g9{Y?Fns5 zzq0G%ZEGzeF-N&rb?Q+J)E5})dw;^WdZDZAz-Qgn#zXKX0PWfgHTEz!Yi!UjJAas~ zMw6zdrsw#=api%*(!UY4&|25PUi(lFtd4sqlgDmI5eEer#71D8HQ1cu&40Z^@}nGC zLV%(zOuWOMkBxhF+ab56A1Gq@%@aQv$Dy`>$7^VY3~qCvD>n^c0*pYNwY9l+fi=#~ zj4s0?9HETfzWBCj+%c_WCUXmeuct=7T%6$C@ZGk@m#dOr3mYw1O=q@s%k+@sShQ%{mFn9Es0^B!;op?};26;oJC{{Fl6XlByPz9}xx*=3|LQtNRdi zOiz`Md|ryk^tfqdKps`B(yUaQd3G)Ev8U?uj7Xr{zc8FNpvZhONb{>| zf+MYFHdj+TOwJ%swMg=V^=2lqh0CbW?kdAhEN9Gijf-Qz){;pbYrAeF_LTqpuU*s;O{dR3o1gM3V!!>+rgChch>lu~ zQD7bfqR$pWNBu;;ohc}{o1CNN+r)>e!BK7s3^8-=JwiPf=c*Lc%De*ewA}vt?Xq2& zm1t-{75tUVheL6@j2eqBAn(!o5j^c$j{n&x++bF{Obp_=gEM#TI5Iq(t|v0y^5<)i z(VHJZ87m~qv-(5}z>b;^a$fN?4RNG5<_96!XUxkFKGB8W{!RG90BLwh-39#nF>PRA zpg@g+=%dJ5y;k2|P%V29D)kc}vhN#>`RMd+k{T=H6*LG%JlgdeR05K32AE#p_n&;e zfzP55xYqWcKeKQXp9GXYO8y< zf5vI@P8GSdF=BLBDN-yLlduIZdZ*2QxVG&-Ge&o}+@1IiDvtwo4}R*3+mR)_^ule) zx$(hIs`+^{Udy9mk?c`+@Jo&$SkVV_eoa#qnS7^_;v-HKmO7n^k8Fd0%-R!Nwt!`j zK!G&g4)CpdC1bsruHT$}EqCoFa3S5zdK_RqaHteVTYO0KbWSSIL=~l2Z$*(=P}_8j z?&46PhApi)1h{4TYgtqnl4?i~k8c_ms$G{@SX6|c@4gUsz->3jTlcr@t1Uw9?v6{p zvKh7FFg6a{wGd_Q@uP#_>2o-~lW1oNl6dGN8Q(M>bSgX1!f@kJ*_7v|ja;Bri$K2S zXt=Z6ekRxzuOlhxpMmq{7iEWr@FzZgez6c(nQ2x}bBs5=ghmDL<`a=fem6IpG`0EY=mMr zg4FC4`Pj*6SL)};NU#TzQV3+b{5l2hN!$GM&(C6lkp<$mB>|imgL$H#p;j`|Vj$$) zbPv2N@V8Y@6B8@M^9d%d6dQGw0N;@FS|r@2As;U{VFyfBv5oCJ#pAX2C~LZY)5)l2 zMI49{Lcr5Wa5dAVZpmoxjF1_oq5&{HQdHm(C8?hNyLUX!CW`hm7;AcYI6|2X=USu& z9l#bwP;sVXpzmSA@J)@nC8NBlu7&qXq@$J5M%-{m@e(=pQ98LsH%1=&`w~+-uQHr8 zSnck1n%OZnZ`!^kU#$tf;*;-imBR{^mi7c;l;_-tOC%?8-G#|FNtHD{>V@;6pH7QS zjBbnFGyF4uQzPXiw;Sew0h9YU^<|6l;n*NJD~&&-0-rLpN=A5-U-NvcmvkN#(1v(w zGm75k!zK%KQ!Is+gl1c|7vD>+bjR1S3pl7y_)M&@Zyr7ZE<1D}WbU*!e8gm_OH!Hc z?RP6}Q1U(^;ahYIo%iXOhi+oQSbVK7=Wv8%)tz+Wi8Xe9r!y^X%i4hB>N}gb=&GP% z;GDF`aOG{9Cm(tnA^AG3_9ndAD9S(F0g~Ngn_h2G6Lc?4#`W={WgFiNtK^T@CliNO z#B~F(L4eF%8zsjeoD_XgD#Lrc_^2dwMgd+H@SCa(Q+hf|n{|(DjBc>h=k=w~g5==+ zjU4Hadi7N1T)GopM^@oU7^iO+iBO=RZt`ab5Hb*;<54qN>XhtXeJyBn!~>cGYbxY! z&{<&jvkTIxj)=Y6 zFP9Ez@gVm~TsPq&-3Xw^t{eLJGv+@euPZk0n`3-irj7R5X07?*gR-woaSMbZ;^p_S zi(CAy23LYW>I8VLclJ5#d)Nm-)Kh1wMG6=^rv+sN@}RKSDH>RJH}&3sIwYt0Kh__} z@SJI}cJ*~0H23=U8qws#61)mDB_sg?aS<4l9iahoZQ=Y3`DfMD3l{V9^|)@tMYhx_@k)g`HQL!wUpJKz#!2Q`on#k6~ZK zJ_n+%K6fQ^fUqk`Q=_!1s;c%B78FdlwKVYTqZ68A#kmoUa@H=J&SChSU!4~RPGX9i zcJz^xT?w!+VV}ajg?$YB8oRPEbGb2i&djw(wl7_}bV4i^Te0`7_ofeyXUOy@+7fm8 zkKY+9o_MgLy>|ZFZ$1Q^ruMZNct)O%lcsLpfemZO<6 zjWsi6{c;$7!?V-dX+8VW=VJL=`&A}~c9FBp67gJbErU!3zQm#{`Db%f!Ap{SVp_#2|J6{F!bLXT{0LV!1J zxnsD$Dbwrt2{vxAUZrF3ob~Ed@E>YkmUj$o&hYX>6)hq!EoQ1|DjlQY-}tBoqHe+V zi6ZGofPDe`1ojQ=BOvPf)rFclqsOi$T?3>|z4sZRNc6XVJ(V_eXKlLS2iJ8D!_W9% z8^rz-jRv3y6F|V+1bA@Vq+-7`VMw6H<8nSug8qiNO9bnCBY+-zZ*(khj{kr&)6>RG zED1h2_vYrdih=at-M|Y?boADD?LQAuw?O+t5%eX%f9w1=&wu;u1K1Zp)b*_sEpkVX zT?@(v$z$cpm4ic}&@&f&uGw3Uq)WBU##_0rV>JAaf4g05*i~x~axen~%txR&Cn73G z`sIF^k<}iLXVKibbFqVx`KmD~iy`buVKetlG~H(`ff6XteuI%M=a;iHm^ox@>Wo zjf+wtz<=np?)+^e@IM??*!;}yTJMluwP|uVs_*o;jxhX-n-4?OQ>kFwYfA!d+OUQ8 zN|$aa4xV;8?V zj@g5NE)LutXw6kh>b;jzFaDW2pJUecnl$Nfy|x115r%)|{iEVvm+v+gJXi|?x)6}$ zQH4Q?Hf)iLGGi}M@0@z+^H1nv3Nkem0SLRHszZNcR;*YtE)t3S;(V*~J1p==8{C>0 z)v+kexBqQ}___vD+%$oXOiW8)L_t`vp!d&;zUFedeomXUd|}$cz;MM0K-d*WYK;V` z2S0&&@V_|S?EEGPyg1RQuE28`zNIZJe(=jJ)&Pi7fPe}FO7q$UT@22NzD+&!pHmMV zo3*IG+3ZO|*v(#pD%;N^=taL+NFD^t zM}W6ey{*(QO7fzcNYJ0;0kGyP1uWKz0EAsD(k9Pm`SRscDMbHE>bd_t_u$X8C@1j$ z`0cS`)?Fh-}rJ|TYh`qyfjj>#6` zT(DrlyQVQ7hU!iL!mfK2n9~3f_!@v3TeYA_) zo8n?i(3~(}H3%p`z(LEujxGvGHxKcPf!VQ*l;mO(^i2vRjU;SFAYn&rGd?J89|Y(b zd<8v&|7lCm@$e_L9`_gL(q!6gHSTuBVffMkSz^($U47()(;#3?0v=jeX54^)^moOf zaJDzLhMu7>rf2B;tXW!=N(%yUJ76u0K_2EM!0XV5!{Nt+5o!M3v!1*?r_*KXfcM$H zI1ImN=`Qi*@r&jyJS+!+BnV`Cg?!UszchYesL|_^m%82V-(o%YBtYVpYY6n|c(1tw z2SA_~0_)bT%W7z7m>ZL&C%!)K8b)Dy`GU{UZ9C&I{IBLs6tjMT$A`Tj#VLys=$9Fj zDcmky*FSRHA<4ffC@5GtbLPxeixm^a(UCy64p&EekhMh!kia`h;2)$g{eQ1%bltM| zY??UQ;E`!#mn&_K!|*ldTE*Kma1JjJurdKBDfozj5cSRjVrX7uH-+1OO@jU>67;B* z%Z;+>L*R;&)hB!8Y6k+p``z!RkRz*Z3rP=sdES%0?`)cU(Jx6W{>L3+!E@V0BudNE z;{^g1B#@sj(|+gy>H7X5e}+eXnf}pTws7IX?G`L5iew-H5OxDqhSg1>fp)o6#@XcD z=ACWz-r&w3CjRi=IqJpt{Vd+_0DN@ z`*j0CE$J@#CE8_ed3AL)b~I8GI@0cz0EE3;EI6nYfy;yKzEAnhJKf}%wC{YHIC#NJ zQ|A8mEM6;HkPiqXO2Ff!x##_YQbqrO7@Qm1NxkzG`T6-TVK7{xByqix1R(56(nMM* z5x6`jeqJOdzJIjd)&D@9M;yE8mBSGEl(^z%WeK=R%!lU(rShVX7*QBG?{bK>9B#+l zb7eUrwd4sv*pp|6J5?fZc|`p;DEaS)qvCr<8r+2kFSy0gi#)0x&*N3Xj%0fwz|YM` z z(e67(>fQO=lRw@r@(9<*%MsTlPJpMV4I?qoaWI{pro^Dne$%pShRN@Ye_K%g@L2zzH5_-=Uuw7qOL z_2ehf`*teqlyJ;B=~R=HeY(ZnF7#(wTok&;lsYpt1e$s#56ZqIplYn38k@w4to}>pXys^r5+S7b{PEO8V%q=%jg~C+D2|(Bt zM~Vc^PT=|HpD&3-B2y?tKZTyvPxeQh*I#In((2n>;zFBKTxfNO`ZhPF*r{C6JoT(F zBP{jHiiv(1QBjx?5&g2|K)N&fB|RJG(E4_l%eDQn#~wSWvMER&1WZK$!fvYSg0XrK z;9h-GQ`2Y)-;XCTsUX20AB)N38w1Xvbv_b$5_|rv^SOAc9hrz{_KDS#B-6-rQIr{x ziZY|^BF>+AY0(;oL)uHs_Y(7c6jI-to11$Oz4658;%fU5fUw)I&QW582&`VcI;W+j zrGk2o<5}z}*$P@6ui|2xBd00o6wM^^O#w+X)AuI&PM@}Ye$UUrbG%V0mjs+XMQ)lb za_D<5eb3K`HPfnY`-tB@7IBJ_?9I;3-Zy*p>}G|k3dw+gtq4HaZB^YUtQG`lPW=E9 zr(q;g!%6Um(R(=MJB;4L+d`t0MBd9{-yC#^M!!SQNPXdt&^s*gryPoyYw(`OCFFEh zOiFjlf<6U}Ko@!GEZ`j?9t&pB0)bTiWAr{wT#nKEIB_{f{}dgkx#Q>PI9?zC0tyj; zuqy--$$&sS1W3%JB}r?<1nE0nC!#cIi&xW)L@#~vZ`vJ?j!Sgh!JFpLb(gNCJOpiKLT|bK(;>wqTB}9S z?qtGAo`4={3zzfKC;#Say)Id#kyx{6r_uKg@xJss7D;!D2D+|}Y_BKV>nIC;vxv6~ zH-9czu;4VE!}KzOffop9K>)(81!d#`0tph}e*j*1;f35#C{#$dvgj95@3xSh^B3_a z9m}O-9(sF8G(Gg2#)``x{@%^8_H%3koe$CZAb--&Abk(f_m0o2j`4Xq*G$oedV0QH z$Dj1Oo{rafJf8X={pd$c^c#XrK=1+qBN6!jVFqddJlry&00000NkvXXu0mjf{(_nZ literal 0 HcmV?d00001 diff --git a/docs/logos/urlhaus.png b/docs/logos/urlhaus.png new file mode 100644 index 0000000000000000000000000000000000000000..3460d81888b6774a9f1b6f4cc903cff6eaf8ee1f GIT binary patch literal 48474 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

4Z5MZPL zI2srP8rVxOXh47g;1FQ19`)}51q}fS0}ciYDt!yWL8bqeyj~%pz`!A(UzPww5DtzC zfeN~fN7?_)@jqw?bvF5$(u(>xMsvOomGIW%OWKNY?q>^l7yr#BsP1_9IXFk6x3NxS zFHb9&2ULj8R`*77MOq)Kxw3DGJ(-Qqy~K{49!UuiIoNgl+A)bZlE#i~n#^gr-GPzTEdp3Z)^ zKnS>u6`6B|^3?wR@*I2Eoltyvle$sGF`omzry#UI0#8*X`U1;$kQDj{t{AzYZ~F>a zmaU+{3INpDgm&;p#H&6JE!UwX#ti(8Hl6RbsVg4F>!CAuI1yP?tWT8h&HFxlyCx~p z2MI802y)F>@?Rw@|19x;Sh!~)a?$Y zTwU;cFv3NSJToG^;Y2vKlaB+J^$VvxCMJ6GjCF&A{(8$;UDHV!3^#11`}`1967js; zH{aBn6*$YUy0Agc0>EXa^f#9s;DT|2+%S8N)2ZY+#Ox=6Kn1e>@?fjG?roWg>H^X5qnh}c#C%p zGHsQ@kq`JY4HlilCKjKuUhPLqN>K><02SPoDPSCMz2Os_YwyK_l3!Gb7ObXi(*)^2 z>3}g9!eDUN@V5d~PB5)8N)0P#0jMdr6o-Zj>QL{D9NU|n^aYaF`^#Bp<#s$7Kr<}2 zocg}DlTLsc1Okq91k%eETmH4em~_YR0+G7vZnnVn49^>}ED?6fDV3%dz;-*1Oa%D} z#4O-6d_2dVy}2xtqWSH5HJUjT6fFVZjZ7r(rr9<`D>0_Um{`DpoJ$PFZp1^|Q~=GSDp=Oq_6D1U=D?UZ?oKG)D-893mdY2AaJ! zaRy(NhFjSW{An20A#zkklW@_EFfg}xpJBu_qw9J2$QtWZb-5b!gu_-HeoH#e@6IuZ z!uvDJ(rQNj+@Jer^>hP?t~Q~-^h0OAFaUP7Kece7dzZZ|3~Z&=yY&fGA@TXZM8YxQ znGtjpZRUUUH`@G?KX(Je6L$>1SMs!+Q6~{LU-_%9S3?89eO|{U?|U;T!&CV7_=u(pgE?kwT<%aeB5Sl=xX7mE-EeP0 zyw``d?=C^2FZ@Y0$Pr)VK#!I&f)^lVicMbPjjP&KeMUpd>|;$wWWIAuuMY{TfW*1@aD+D?SJ#jAg&~*r~Yf$)`!1|%yE zssSE!o&BAEU~mm9(i4n}8q;=9N)?|!5a{Glwz%Z9t@NBoNHM^wy_To77iABE;c!o4 zOVJw^dDNU9!5FhScmCxEUBSNLaZi_PXzxtDBXG5-<1(3Amek@uiS4o0|1YlpLB2i+ z=urVMNHB0{Z~*3?hXDi_I3yH6%nXf+hK?bONrFX6#=^?3Xv+Z#{;(h(FevaBAOTw# zD!MM{FuXkv!_w#^sHblnAywJ<5ma8o@A!H^-y^M ze74``xA;U;$i|XQh8s`{iq(O&E#8Pk#%*URKg1MeGKyrvNgbgbYOQypsIuu`+OJ($>ZOq7$J1}xc#aQ|S>T%Kg;pOD1 ztHr*%t(B65^8%}L#LUk9vglnQ9{YEg*ohLEH+34Qni1BHvd6MY4fqs&55qb|a7s!l zUwzrT>F`;tr=%`>7xnVfy<_R*Y(3DvpdI5J@3wm+qI}h?6r^x+wnR|zf33YgE%kmsVaYR|~JpnIQ@ZR5Ifxn)p* zQ&Jo{8~di2itco`IeaPC#r4__;!)qc1{Gr2|KDdTd8;=$+v~kN zi~5VOCktKtlyF%|w=TAwTwWz|Ed*uRJ;>WiSK_%%;(0&cBg7*CO?ed}C(Yciqd@{q z^5EPX=>+$=&W_ZpJ-0|*ZTPM_{+I{HlKJQm0nI7bNjo(ve7s+Ur1u`hF1dKe#&*gp zs)E91Yi?_=R;6~l5Ug6xveWR{!3h64T#mj8x}9GR#X)nq1uBDzj6ig!34djk&_CN|d2+oNo%#n~nbR6c*Wsw)xM~d*Sl_%oyBKuMkgk{f55E!%|_fT)Yd5{$UO? zfNq@e*e)u^K{v{JO!BE74_}mVQ3u(a2Y=Rv1=CMSXVirCQV1WJVXf*mphs(rlJ;9t zO5aKa%Z$8H?AXG3mE}tC7>rr>lDJxbB+K#fmYs`5gcCyQmV?tg%x2GmUTr!`G@Y5! z8%)hSXUC786}=c$(5n`=(Ka?@;VrsG#p&U*?9=`eToxflF2Qqpt?uq$@INdauFUY7 zk-3su2^8;)M^)uNjQk^^X6Pk{#o{GfK9Zb8Dpb+odgFY--BL^Hq*?wxI1O|+tCZ=j zmIuAi-40(RNJELjU^c++Sn85dmNO6qE?Dvj0wl!$3htvjex^;9p)L*y?O^0157M=N z&-JR2)&b{!zSpA$QWmxiw@QLqc{7g1Gb%JBBz;Ysyt*IQ44+QGSAHjmW+=2&QAu6^ zB%?j#8%d75Eec-%g@J?2#*mQA-iIGUL$(uGo|1|vbi`edsyDM}LyYO5 zI1$>|`cQtlXSLSa4_+=>7@;>H#(*cGbnQ((xYb=uZTf|Uuu1w^c z^DD&q6pTtg#9jJ=qsRDu)j#yj$0{ZARH)?ruF^i~+6twOdfJZe@czTdosTsm2ls*< z1to!HZMA=4%$Tq3rlxz17>vdy;0rI$!1(mNKp>;6sK2>|zsFy;#)C30-5g-N-b55=n?uxXdoOg=%QTNTJCn-%9dZvHLV0F4#?j_u$V0sO_ zA0tP;?lQcz_45Np_cVNe(mBLCtxOMDLWvAH(w}DqY_Yg)4_HK@8qb?=&1$P>Nt6|>Pk8tgnOR@TAKbNn3MBcp3P_vGQp+)GWdIW$4mJzrL&{OT4e$(o z0hVEl_}wppO2+b1n|ek`W#W4vSHc z3Rs6LHFofVOvzwlYJzU_QJGmCY1evF!+vhXE%U-OA-pKR0ezu4LT(nmjln6^vtRCqL2BdCTF_34gLxef=ZJd(irNz= z$$a8|^TbxnW5`l57M$;;#Hs_~nK=f`PGIZCE!~v@$hl}i&IJJu1pxu|?_~FN;tToe zTO=$P%u1weqL{40BFc(?dpaJwX|BD89V=X@ zRE*tSX%f7rEP5JGWz-%F$ulNQxf^VAOWMbe3<)f>DNpnUJ(ck8u-B8 zaFwAfL}ne@)Q)6k_gz+B|9e-}y}J6llF7Sn)8@#zd1EfPiczM*^2hD|*erT7n`7JX zFpH|#`d{#cTJx6`u`d7tD<4~EKbUDZUUn1`-p0CJpyrjHF5~cdu9!)DF4K2P&xK_* zg?e`+t~dR8%e=%~5yV#I{XOtCdq*P25$2w4n9+CZ7%zZ!f#*$k$t~xR%A?WSXv;mL zG8IBXCV%4#-*!l!EQY(T^5)XQ1GlsZLljFR;ugti{J@}fR^i_)O?|oBV3xEcZkdIb z<+R)9GJ;w z)D`pRpJzS|*4j49N{|jqNQ?{ACFLzG<3@VJo>UhZ7|Vk*3z;Y2##C3SovT8yRYfuF znL-Hrc^_b(i2I{p?y^8bjUSX~gM&lEK*GTOv$FCU$I(CojhRIWl@v6{4D2AuSlKW{ z4efnnbJ!LA;&Q9HCNafq9sWtYp@m)(ZLD_M&j{GQiNQhs4syrop)RFuiW{Fl#PPp%0y#4M$5e0P%L@WHfbCmJbb z1C;dL)IK-!4InnY$3rgNrwUZ>d&5`Y&|{U$H^7RQ*Q%CIhLkA99@}jw#jerq99LIN zLH5P(*XLBUzSd(5==Ttw-!5MOJ7yD3b8A9>?zt+w__|5nG287ah{)17`5`&i6WoD( z+bdkF+IVw?P@Yb^8fItGjo%R5jNERB6@2wGU;3MWWR+R))({=t_cMBIDs7&leS7DL zC}m2+e*-U7N7b9Y#=V#-->F_h9$^?;Mb^z)$xNLW(mQw+Hl~5DEE>$6M(I1^sAR|5 z5!YH^G?FfB;Jt^(8#0hmP7(pbC!Dh0n!OnVzyz6qwC!cH!1 z`SASBC8H$UZCr3tsN3k6*hwmC|7LztEqpXmZj)|JBo_6}VK^oe{MS!Vg_!$2w%a<> zjU3Uz38DocQ=seTRpq8^s-yjCud`oKmvTy!+X`Gdbou_Qx(vTag7o5PI4hvlF!?0KJH69II86bq8efT z){ILs5p6;pt`UB&t^IzqEdS!_4{r-#C;R$EI?bHTQme5O^xS?A}8 zofd2Bj5b>28DDctJ(Eo6~wZKd1~69#JfTZ=hW7D z>{|%R*KHmKE|mmQsCvxnVSZyRY1G(adcapHvErzBsh?6DDu%2y#Q=aYIL6-u%5}Za`Si647EQ6BoK;H zt|1mJ4QykGnlVLc&d@4>kxt2)FAVcT+)t*ugyhGwcqpKceK{+}3)6-`$-K1NC|_j{ zbdvQ<==iF&nEF&jo==rss+tSn#1s1Zi9rxq7n-e-#>w^_im~vX=wW#IUzW|N! zQji22CuyZg3_H}w$C-!^b7OqH%2LTKaCqy~>*$Sk?O3|fFz#6}t>@rKMF{i2YF z*&U}pI((We?v_v?v;sR?#2}9!FCgF4V?RZcqBPtdm}q8HeNR32#;rm9UHt$9W_+Z_ zbn83vl<=VCUvzFihq33@Ecab3H68UG*Nmv^m(pvMr>$XtVh#Zkyln&_X$DHi3+x~;kY3-^ibf&4fOF^{0$G^$crlEQphl+7o3}8@# z3pkiZ-WFM!(-BITZRfh;j5EYU*_wNQUAq-(xd;r+-^7$F5yYsyXw0vq;lA8P$FYQ} zdqP&!v32A*<}@fYpMJ+l?warwdKq1Ep_qwafcnZBIar_w3>%4E#ZV$tOW3N4m{Z~X z+Ma!+g;JBw2eQ(6Y)@j&CDVM%J_Jc+`Aw+t368vA*CleuQ5Zgrt=}8Ml2+`&&O1gP zE}=Cc2GwJvVcZesVKN(hpF)zuWQoMf8YEm7lTdpMX5V3+(+=kEy0yD{_OPx%nWT|g zHYQwfzHgz!-*zb;ZcZb$X@(*1{joqhrk>T*(jQZi%U_-4*#E5pwx;%X^5yhJw15zG z1Bje+>LFBPavgA9Qu*QicWyz43R=zqgMxtqy$JZ50D++apv*@^36pEAo{det0=yhIFP!JK%5p?+|a!Fh`y?b56)RD&rnu|Zo`!!l%>F$5T)%Z=@M_Eji zsK$a%m=i_9 zb*dT1h}@+$L^WaRjKT(vx>7N1&kry#=wonXIVriUO2HQZC9`D*pYaa2J~TA~EaMFe%7vCSMI&1QF*FI6 zq2D7BmODSua4(;5=A6!nMLx{#h(|#z>8IH#WKowG4|`M9WcXwH#B9dMdCGdoY-wVe z*bY^;!VrF2-Zz?zpL)kL&~>?n6h1}}Rq6YQO3p5Qyk`F;m32axHUyXTFgL@`e-aqY zSzOCKd(YTpy>l?-LK(f0vwf(`Wv)RuOC>=I&68a$X*RFl_B5to4)~!{y4&K}P0j^2 zy1M+p;Ej!M7NvxEYr;YnU|?=X*1{+AHf%6I%6iG9bt!8h8yuW&;f$xBF_?X z9&Rj;uM>AxBAoipRiU3KwWbqp)Lwwu5KUkI^2Z~s$Kd-$i!f6A;d!3ZojEWc!phKM z2mTM0{PbUOpZn^-(~s2?A_QV{0+?-b85*jU-Q+TthFzTj9qhTDh;C)l%-935q0$5#4dn{-CGSz)NhJ+L6DD<;qJ#TYZ zw6-a!LS$P&Xt>xD`}t6R!v1@1OP!Qwo)cY`FKVFhT#6JJ%V{cdFJ02w;vWg?;~MGc zJpX;1Hs)Pd^Q8m}A#I;p2 zPc|xq^-5`B;!x7hwKmA;tzArq0^I=ZPiV*axR04H0K%JMQ9c%x=4h6ZHHz`y1d@D2 z&i4wP5B00>r1o;7ti2q+$BBKBl){BHMbJso zCpv!>#*FN9=QuagX2*`vKmA0C>#5aHEQ3FC%O$U6sh9-A{xn`0`#p}Yu4)nC9*Txs zr@$Mlu-24;xND_2R27p-pR91*Ns-665f@KU!GQmwx_eMt@)-%kJ zN`vKa7rsgTb)JYBH1ffbKx|W#EZ)#HUUDE#2a@xZV8RD~r^l~NL~W*{$f@Im`h_mH z=Bn+Vyk~iA$7GBk?NXQL#=t<`O2>Ujx^D`=*sMBl79k-oI~f)?AoZn`vc_#pzV z-@@ikH%=(fkDBINVo1r&GDq#oxJ)|VGB7&g7bQ?dTYTbWr^F(|$tebiTl68xzaHwQ zF-zcH( z&`0VNzctotR*(7%TC$#1Ch6D`+XoBfatWfs%&MVyG)A-FMwE?s_wYSA_>1`!(VyDZ zj@jS{(I0 z;OQ$oZ$aozCt~oUjL)WnHZMX zPl|%)|AH?7w;u=seIcy=(Q@|v9|V@T{?{MXC#Zg4T+v=J-LITNf7r79_)o6}6b`6g zWt%|iE;{{CyaYU)xSxE$L2P0m!Etc77ht1_TcAW?{8f_T>2d-Amg(^_JNb6rW$#ro z;BtZomN?_~m+a#&v&$F|;wSS0@NW_OIXt)B{__0x0*JnfQng7DSw~KdoI5Kd%`}ivda@Ru*8AkOiwj0z&b3XBnZL-sXJr#gMV)@(JI;B35bLA zpzvRgfWs2k6#M%Sq80#!pibz#NxKS|Q-!Yk?v5bU1UX_)nssOnO| zPH$i0hBl|yyN@4cfHTH=^!6$2lZD1NuUY;~;|XQD3!9Ez?v%CXdAG242HVYodIzvy z{UID@hRS45N2|C$??#X}h=^JMO#IyLzc2$@h)&uJx`w!5eaa-?oh-T6QTuC}-+q%% zIEPzbBYIqAD&o@gI`1WlGhj8!Q26W$dxNo4Kv#8M|_01q5GxPM#`^TlBh*-BygtcyCf9jaj0q6Ep%B;el zRo@)$A8T?cp6pJ|nJ7OnhWf)>u1n$Iu8Lq6jD_4QSUex^j27B4EhHxwrQJ}r-)WYc zhB1Hp5JqZU6l_K1@Rq*l{VIG`uz^^bU==e7T6`VT_x-Q#PbU;BpJy`K@-_{~adhwL zV@B#|1VUMKety4gJm+WFD7kY+jU1vxx7Qt%>Zg*`g)^pra2u`oez{-fr6QOQE*16j zv8)-r-b6psW`RdZHdKN-Q63p7lzXzy7b~AM%^*MZeuOQhBtQA6tkOs=;o!(T)EnRZ zNNTiUu|g_53llRd}4TUqvXtRMQjHxz|&7Q6K0CWUcE zRcWlTeJv&yC0}}o>K4noN<1i(yQsy!s|E-mw3@$rhlKwEG$p1=Ri@YQq=v*ZWch#m z?RB*FdJ}5!#uhUS?mlcP(~_I+K9APfH#uYSNe_QW>T}gFx3?J;ut7XT={|iM^HrC; zqfQcq4cB7u&d*v{a@+X8#C&^X0;yJo4g<}hz5O=GDL~oaXGqLf__~vU*5*DJ7-cDd zk-yPxm3R(ZQ91rdsM#qPg<}Q2P@Pa`di(bpf~*~vob21)@x6&RK_6X3C)^!jqKrva z77rgWC#Ry{KbL;t4_^(?*!iWms>Is&Saerv&}EplBoupzqNKAA(S@b7(Qz&Waw8fv z(Ap|!PZVga^*?Te`a0WSR;n_v%khn!Tt639?E2$HuS>13UepjE_K;cB1O2;jN@#<1 zMSQ{Y0h**!@JEZwtoH2JFG6U`4Erp`%&tscY57xRRoio3dI4Z2D^TDI>0-NYAuQD^ z+Td0(rpCTknw8OAqA6Qs-tukcXbj!;hggl!$^$J5?@4Wf9r><=W_LJ8VedjlT)^E& zxrp0fp}%V&r4840V%l4wy>%eAMvb^k>=Za(^&0rSUSyUX<``DHmc*oj#MF@J4&}am z&GmM7{uIg&p13+!^)uFbU|!XP{?PG`f}d*|PR>ssyiYEfT$zF1cHxydyNvXRc=Tf? z>+js#pj^{_$)>`0ci)$(ATbPxjbCio?0p%W$BPL`ljlJa3)<_Q3_8t6>%4#NeV@Kj zCD1y^z6!wCfu5jMKY~rcBLHuS6H@k_$|F`cytt5qp(4Dr8cnMjt=#=22tBr}^o%O7 zXQIZiA_@owz}*d7LCB6y;w_ZBF}X*tanp1z%$JFA`32uw zec#4zwtkCtg$Y%dFXr0rY&s14xVQLxGsnjnkcCvtcLz$4h5!XhF zaE0DV?ZZSoMI1XuWG91>s(Ws4NFUWO=a8G}-2~d|>W-+sAZe`P#FF(M+|WV2_=;LL z@+7cPhbPOJ8!}mwC)MU5p^B%Byo=@5FWe`r&NX#=Z^m(v4L_v{g`A>cZ$~2Oma0?` zK(k-`HY?PG_n9|{zg8E5v>k(%y3^D-gE0~MPOF=dy`E`aM`QtN^m`ME840=xBnD`KVmQQ%FId~Nt zdz*%{jcnsIR=U(1iU;P^P+$81f--*4W-$b)DE5j5?xP=Ox*2*Mv}rGZ1KM2AX^$zw zJ+PfwL<@ExD!f5n|z zZr}v(_IBM#ZAGtXW_q;>Xxx0tX=y+WMU5-$)Zl3LyXSDjr&edg02?c0kPPA(o{@CV z{DOHTW#Nxw{yCUOYAF^++|d<4MI%9fA7w%5VRVn*wpJ#Q11(-y<8u_ZGZgx83+6}j z9lcIylaF?y!D)l91bTU6T7+13Wyg3zMKB#qVnlXk&n@A{c;Q>Qa&)PAbVP zFK0sC6)oa{M0d0KZ7C!9%iL<&D6Duad$Ibcd%;th{cQ?+#AiT{uKPy_8QF2Zf{`79 zbtOcvwK@{fRXel~EWj=xbApekWi)1XEi0ws&#osBQ40Bx9@gq&bFI#Pl1=Z4Wlw!%9qRWsH8mOyf z#nb(N@9t&O`k+^+a%-2=rEoI*3bm!9^m&pJ1_MWyrz$~w&*y|vv#Ms`^hy7cum{B; zD1g7tk~@mh-t8gsK?0^5(uVVq_bW4b#3YBWUt`l?2jLcX0kTF*$pP~Bov58BH}8j(he3GpHRi_l0g8LSnGG~A#*9-I;C{>wZv9K11Ags%5N0G|#{?=H z=2r!(zMNt!N?RcFSgatW51J7~;>TPJmW;1imENlEIsLfLJ<;>HB9oDN*#ag{V#P6E zmGVcvg&#ya8y~;bPbbJfK7jXi4)db4?AiR)t9QA|{?m>UAzQ)knK~ktRrc8kS)Aqb zHuKT(2^1v(Ei;U^7Xrkk1R1b>a3IpX>*L~~sFo1c)bx08DKtRH$el)kg^Wm(uF1bD zcJLVD7$Qpfwa>|B_`=+{WPUkmmfSU%Coap18`{2(XVhA>O?qegG_X)FijS!H@^Lei z@dYpsM29NxNiiBW)o+4>2+3@|xx!1Olvn*!5EG{japio2htMfq3w{jGk7$VBk@#RM zlG=|`p4r%fB#nxZDxEc#n+{3%8}vS`{k(w2>r24Boi7@xm~^`hmLI8p%c*yYStl$w zYAC6h*a+&VmtL>3UJs$66Af&UZNT0`fU3UHxg^8JhJ-=1V@^yIu_HEr%Nd4hl`>%6M!2$e9tUdY;18|(Rt!!9maRUNVNcLJ7356^{ z^!M)wiWgw+K9yOfWkClcC;Fe{`f;M2cdrr()0HliV;~5x6-totHQ9=4DI9U#=i2h1 zI2HOJEg$#y#6_@^Y<=78_al{D`+7v-T3L!IuEc^t%g{_LxrI2Ee8?`Rjfy0GGeHs_ zL8+0{C)d*#Lf_P)x%#Boui`M&F-8PxpRJ<(tfrtDM5Y+ zqk|9Jz7^KPd zu9&FFJAG$`I6HnnB3$mio7PUnWWZ7>OM6=^q4 z@N3i1I5zyMvleVFCD!cm^~=D^{dof*?hK5hG6(&@$v)X;*(j=qcWjY-ka^PK!b zRMz0GYUfdZ9a{@lI_pAyyk-BVH-S_)@8-{zClpsr^-c zC<$w(0N`^=Z%c^-%3!Q*?%`#V-loJQPS)(b3!wM5166@B%S{W6*Thnkwsc~JI2Lze zCNbltYA#eg-WHJ=^dp>K$QNzVu%~@ii2TEi6KQ xkr}n#m=oj1xAJvczZ_l37k+EgQ>T!5Fs1g*)t#|nYKo!JyMR_}w!L2#{|~ka1)Kl? literal 0 HcmV?d00001 diff --git a/docs/logos/variot.png b/docs/logos/variot.png new file mode 100644 index 0000000000000000000000000000000000000000..717b7e712cd21f3f27c85228755b63e724d31fc3 GIT binary patch literal 104724 zcmdqJg_dm?hqoPtGNID3Dl%#^h2nZ@A-7NyrokM#hl$MlMq=uA6QW?6XyF);7 zXb^t)p6&B}|A*J>@|t1qeb?&sS!>UGMR`fWYt+~9@bCzwrJgE-kIQ&?m*3)F09W3} z`AdV3t9DXaj(B*SccK6PxMhgC;NjiDlYaU{)h+4wq_xAU)DUN{^0S`nJiI1h1U$Sp zx&u#6%B%>)pW@aYmy5{o(ukUE@Fh`=b~C z|DTI&)7dgYXADNA6b`S21@g%CuTn!7#KbY{E{=83*T?U8yuD)R{Z6@##|_vX;OP5X z7DuR0Pr`S{>AzK2BMeqooTyuVT3>}mSlz*KL9vzz@6mMGu1%P$xC3ez9kKZhWK{B z$1#Y^SSyI_^1)}4{}ywgReG6myz-rIqU3lcXQ)+>BZOn>F)SN)1papM=rG(22$;pj zOjlh6MsZSP_7Nv1VnmU4mm))P5ADMbF*07&xb*j-0QezNp5~+O?V(pSV6z8rp|yPz z;642|Pg!OnSXNyt`*%LN89IhoD17$)8%Cvf%6RDi&A^GBA_ctJ@J_5}t-k*(b>>6d zX4x2UEr^Y0Y1@Dx+8B`tcaR4zg5MZ)XVJfRHpe~FXuXlWd4W|$i6@;Gu; zTkLiJ;Fw}Z0Iy`agsRgoY_LPpQ{q^;2rI+k;E`v_@==ATf8oFL&{019d+tsFeHnTc zg5hq(Y*(RDdR%R2pi2S~u@JR<&+j&y$+6L0qkqxAKn9)ijwrmyIcb2A!GE|DMx^41 z_1#B9U+9W5NeGUnNoUSu;Bm2@Snebw?TQ~s_c9jQ(@hDk;qmt3j=n3a_&%xGJ}J|j zRx%4mlNB?Z+Pae&(FQz0geAqwG*Es~fezv8REiS?ulQxb<`G9qn;MVP9`l6QkeB#| zdp#R>{Jx%&W03}h!;1z2(l2`uHuZt9shFyH88^`x>{=)uk>m8tp3@5@(Pt| zm>4VEo-S6kwzIu- z))XClHBIWk)7(5~-_fk;jHBY$>o~%G(&C80a1?QWKudCO+z8j%G0yeL5rL2LlHy$G zIhgI!V=R&w(<`RT=4ba!*QR28(cwd&PGaVYy$IoMGe<^%EFl6~^=l}+Y64cTmdk>+ zg`{C!-gG25_FC;?uQTisRlUuVRB;+~3TsgIi;$vI!bq2NbyM1wjE4oMFDH&X!*~ifp>5!u!`p}vOzrV! zj{Pl_uSfo)l0^LIhaz-W0CqQup$!_(uVKp4PhTc6;f&MPU6_v-ARZ}N9ZOOcsQF)+ zPsa)4OF5kCvP?#vuwsMB0@j|){t!Up?9!nOd`r6sC16-N6-^r=Je`l*iC8#HVTTy1 zU8;@Ky6czco8DF1!w+!;Z zt~gojHNFbDG?f zi=)Q9K$@0qmui2Kb`(1#{+~;qvO<#>e_?_&mqp4vS%=V8#>C*#hSH!VKDZ>73h!Du zIyUe+FdwB=1odp|h*)@j37k(ByAjk*8anUxO;ZEpZt&$0%3q= z37LbbVmT-4TUCGgmGEf7=FuiEm^?y75LG#7B30n0sC{)739jHtJ;gDzHOCK`gd}O% z!O_as38qM1fT6(tccwQiKaf2<%|>f;p0}VeW_|Tj>frNEqETW|vwh8^4X;@AORY(d z-;>@ri}jMvwxP=}DPU>n zeigD~xApCdvi+4?0}yY&FW;AkEW*B%>c{7ZF!iGsxT`wwzN$Y=zM16Evp?G0`Z7cZ zY4rENzjp)~CGHYSG7}wnQsJUZ#oMruh%C(BL4T>5Qy&IT<9#xN*Ckr2?qp^qmbBfO z#$u5zlp1l+GM{u|4M|N{7W9dUM$%4F2hd|>5A30pJ~3!RNA*=$bik~{Yh<=#etxs3&A<_6=C9bhVD-8$MhCu?P`1Y+mp9-33k@R-7++tS zfWBD=7`CDu04WBMJ@Fmmo|mERu%zPr^~<|jv;yj91p?1-%!^jQiQx!C^G8RMRkw;N zg4&Lxpb~f^J6cIla9_iLt!h41(^QPZ9wj|U%PGDAEfNV!%2aI0JsAYiS+wAnOcqGd z{}+yIw$<>eA&B%pJRmpqVgonum|*U?Ni4;n_a8LqfL*%06iI<@MN8wvVJjeMQ1QZ} zt%9Wdpdj3dS)y?Ayp@y0t|EaCj#OYzTaq!CrvS0_(+ilwh3(~0Jf?Y9#vDabOENUd z1TTP_iqtU6WV@FgQ{F}fz9n7^L9@cv;~~tq>7{Dq6+S53-9oHET7mZ~wh0YBzE2nD zzbNy&vCrG%SneSC0CK5#?VoXm>`yQ9m2-GND0G8X9==gRX;dCmImq{NSwSm>;W^CI|GQ~O z>0MLD#jZjh4&t_D$AJ3w8XWJ8{;%FrSo#S6xJi`h2VJdi7ZCDb7Ahr4rqOGj^HO+NXL`tlo=n~!cWnUWN z;U_~_FwTF4xu=yD6f@_@TXM({VZ2n#MN^4|!4r7-r10Xh_5-$T*Dzjc=6BF(+!Gpn zm*)cvHTA~h;Zy9K497zh4yH6(jl!o_jSCl?R*MVNiS)#98@uTo6#Ma7c49aVT$~T2 z0~(E=RnS3`cfn!rX;eN#LBW%!8O|n_YQL58AG%hm4-btIv=qP^)(Kmw^95GN9JBYP zgW$1_jy4k1#B1{s%e%w}0_)miKY8zasF6X35_|pkP{iBmM2w-XxgAVFJpBEd`)cuR zC6OiWso5ss76HVs18ljVJ#59mjOy8Qm-E7>YR?uK))brwZ)fG!k*}Wps>;E|E#dW- zSN|7N_;wRwB6jh_@fRiMV)6P{9TJ=EkuKr+{hTr(JkF%M4&Mg)ZbB)D*g9_SVw=2V z0x_w9IFLs_PHIbzdB3KKdP?YN!>rr zUalS#{ixd}XHFF~*GUh_SE~e$&sF!XMA3iVduLorPMEZO}jE9g=?bk2uj@PHx5XA_W@eM`#*?2xkuIaC>`RCmI zCfML79a$Q6A*vxon<$3Q3qdoauPOQ(I|uPW8OCal*>-&K)4tI9_`3Q`O4nkk>$jfk zzk^g@2_5`9P{`^{5RW(FCEHip4aw@7`qY~D)t>)c8p_IFSEJAvlY9;vfIZmKPR4Kc z)vjJ(pIbtmZRN6+Lu1H3f?RE|EY8#WEk~A~H^Qc+sCMsodR>X&%Yv{LicJxWRIalO8 z_34<>j{IyHB(#Ed8qOCTN0#oROI7=sxys}HhA_Z^qY<1QfbMw~k(^^ zUTP?R$>XeFXxT$2ZssE7J*3O?3u@DoGSZ|)CtYw!$5&xo2KB2+sI&A-|B7lij}1G= z2_w6DoPz#J1ztb%ibU3*iKUXsz_V;HCQIH4O44|mGzF^vaUl5tpuJx zj~8n^T*<<0KvU!GGvU0yC)PzbQI>*J@*O_a;1saO#LdV%#}YvF~-(PT(O z#Gb+Q;&dwJa~|*bjY9JFV886GbIc3aNb!<8S1eRm=i1_b_8VAPifJt5PJHP(;R1pWUD9NFKw&Z;DwET3yxT?Dh`HZBtuJ1H2ptQyvo zZ#CC3*GiQ|*0c5>ApSJTam`BHY#XKy24Hh52@J?E^l}qOM-o4390*ERaxb)|f{Yq6_`&B_}sp}cz z=bC7H+WzGCL6x@rv{Ll0R#jXQIJ<=BfeQnCoA*fGk8e@?mkyC8zu%o5D^IH=6*pRO z$qK^3L0@5T%}lE=TAChRd}QN%L?w&#iDIa`=XLmnutmAS;%9nlGHEOZVtOwgPO!|h zstDu+(Zz&?N>Xc&s#80m>~B8R`k8&#CN81y)x*W;VjWg;dgJ9K#dN}#Q)u@bV>aaF zBu8*jupU9hc$YMoQ!F>YP-?fmor<;Qgjxb$doE>st^AuVCxd;Dn)|{2Rwxd#aL0vI zzOT#lSjyh<6cqeR?QPrd8ku%bt4cJ}?EDiEOuN|`Cq%sx6-?mJ zcxYHkO8T6?k(1sZk4X8@@BTCJikf`*%OeY9uG92CIKJQ=Cc&XWibK%Q)FeSJ!v;s{ z)3T?;1_w6t+VnT7oD2eB^n?xD1Zj2CFyetp5X!I2nel=IFbczh?(^-BS?<`#@6 zZKZTcqbF-=YT1_A3me=jX4##)H{B1CWPd5C{EJH>i(r|MTM>VtJ$GC*+sJ=qB?-GW zwxQI|3q9~X@b3ff8SEF+lc&7iIB3&YnO$(~rcoWsWv+(ojadBIycZ;o`Wo^xE0byW zmGVL0=gID6mb!F#b1I46ue=A9VoIk89vRUHu^+GRDGj8Csq&Uzp^{qN{KoKXrn&oL zQs(A?7^hV9+TN-@V6HEPSK_}L`fF$7^;_f4ZGu5?@LKbEYBbibi{CamQDW-;#NZyE zM>SafPL|}Zb)E3(@A^>Qy0e~bo1@J%2ijL47LbR~IO>~5FUSg6O(VGpFsow^Uf)Tq zbrb%JeW2Q^Q%5@%mBks>C&OpgJYRz8eofrP)0mWSsz)s>_${=;?)o9i&-A=0W#E)k zHC?jKj<$--U(5UF-O4YTfaLPpLkM=aX2q-6|H$=Ne}2b6J}YYUb~OyU=`)cI=Yx1e zBsDdC?iwpc?(jpoVki;mjmfxD5W$fhcxbP3w z{=L3?$WJdId}1E4lu65T-leo1!{-laUp{~}tBY4l_Hz=wYDG^s!m?)V=-TXZb7yQ@RZaZ`hP{IHaPw4L{j5!%2%+z zy$nYJLyR)ns<+=`7tA;is7fOC-e&uUEIxK*V5BNzb2bTQ$>Mhj{P|>luezT&8!vVP zJSTED6Xm`O{0i}^i?=btk3H0i z)&M>s*9T>W-EU)?%~|y$iRBXXo4MLK1)Jg-?&%#nwmA#NCZHB#QTL^+n~gr_92C+0 zO?DCCstsX7D1oCKYE%c9)a*sbwkPwG!AQyGpDCe#%OG~XbXdEFIAkRR0Jd^9XWuG7 z$(m0T6IUFRn8m@y{MkD{w$qP+C(Efm04iVA=JIp{+nQl9a7}l=DRe`;_tFSAjBt9D z(~~V$Ad|?GVpauPp>3_l^7!kjRv;ev9vK?p6xX-@ea+W6W|TmWVSPb%38^t~b)TN| zJU0}$g++>%qlF^*VVe4|bL{X!$vU}PWMEVcR_qV7=j7COOe})KRA>Vmr;}flwYDaV{vR#WC~W1-FHXGf47wI|9lfDhOcd` zmLE5*AV)Rdi`yN$e`W1gGqR`nDOF7jj=`Dc+InljZ7a4*C>IYf`4+RKa-7>xs>bSZ zu!X%yY70o8+h&SbaKsnOZt zHy9^Zj@CE-9E;NVYFG#Z^cPl&*S;Lsxr+E;Ga$J5hs+K znAOqRpv<%S(V@nJZU-MPlqE;#tj+-tRhKhYl#v}aPLj4C3JHyVP<|m$zc#*OhlnSK zz&hWGQf;D&&MWSeI$pA^9D7Hhp^~@)kHfc*Ubm%SZj1;Jo%gY(+AmkZsbV3FR zK}aK3LCqex#(eppac3tnq$Rn>)Y<+Dj3BU;)00+IHB0g@&vts!ebEPdocZ>;eKt0% z^mT07#+nY&MoV0Kk6oF<^^;Gv*CMztc9GvW$1lQVR~pgHVkhyuKNcz-36U8gQ+w31 zzBJnt&`;P@bS(19MWI_$GtEJTt74pEg8Xby#I?@jIQ%PInfqk3*-hdfw7(;b+o=%N zNhrSnXs}oZfXZqyNhA%CYub@^xuVOq{gVy>dsA0CD7(&rl3;bMvX)Y(67|}^Ad~XZ z<9+cCeqax~Mp{Bz^OVa!uV#_hNX`qWCx_|;nD1*C!xi0uu8o0Hksb`y6;jO6 z)8TCp_W+lO>jmK3NH{IO?Yy`A+ofBUpVLoq@*S(+%l8%tSgiJ@ZhLnD8Lx47PgU6H z^tYA+{>7JWu=16IRs`GCxY37l9r|Nch`V_eXJ0{J1(9lxA4%+9tFJM9IL?U@;IJPT zkI&fyH_Y_)P?h$yaZ<6D&@JxwRr7!8eSONu2iq%m8pQXqw+?S>ckGCKFpd460abcy zf?_j7EM^&J+qb2F8F*Iol#dmD{1VMlIHJ+BLmwq@U93W_QL6@u_r@()K{+GapM64^ z8dOHk9~VF6yZv`S&|Ksg53%V#zXI-O(nEL>VJ-vtuCwIoDlzNNhjL{PkJL)NQWK!1L6b%*ZvJ-4PhV6>v%vCV-oGr3+ZM6CA>1%#E^)jGyCeh$rO!{#k?gnMKx zR$;Y$5 zTpm*iV@HHQQ+jhE9Yq`L964WK;S$EdB42a_0K3@mr{c=fZj+-qc@_f0VD~Y zch;SRn1t5%WAQ>y&;A4@)!X(15ee6xJJJ<*g;t6UbKgn|$L{&nmf-R2VX3yUQ z-^oqkKQ(`kB0qa}%Y?QCz!=(gj#NX^P1Y~%*}ztM6Re*wtf?%{k}Bagy)4s#c|2rN zaOO89*RMK;7uBY~IegRI4341Gn(%sRCx>M2}hn{nY~fJj%Ot#`WX3X;76<`RT0Aex5=w zth4ix+IyjOas0G5V1ODs8}ab+NT5P=xujYG))^M7=%*hlsjuKC_Dj`f*e%TVjqaoJ zw*61K!4luKL7gfiOfU8w;Sws0CpPMLbdbjf93(E5*j!D>m7lwZ-mzP;649(R0}DL- zl!Vm9e-iYrE0$hOP|rTYn&Gdv*{Yy43e74NR8d=5^NK_23MHl@i0D851dAwEiz^Fv z`28p`^|VRIboehu*}f1i$!eFcU+sQX@=7=|P}VeM+4|8`akGi@H>c#MQhZQCP)=}E&uvI-HtW)|W&`4D?-V8)xcdan9fK!j}Bt1C$zldHVHZPCHPr!O<+{`Rq)=I{S# zU)n>5X3PP@8lUSt-iqnM)*QLzdLQlc0ZQ1pahk?+xYYzDT|+ZQ2c3L?4YuIzw(*vjabiE}^hDhPgkFg>wC%Uo_PS5zBzv=P%7^I`O*06E=&5m7% zWZ8ZY1o&4uyCJ&6q}rXn39rgV1$n^eDhSG{Ge#0o@9b$sQ5;@GG5g8(kD>w-H`U_| z2AhA2{M-~xI0^u(^`;a1Fr4)keYktrU-Ur^UHR8YC7UPkOBM^!vaRdf7zU?`68;=N z>QyoB2jrs4`L|Vi{ErLPI?DEvlesMc>eu1EpnO3nfl-o;idMKFU7IoI;yJxIdyD?x zc_{R;aGFtF7zw#ivo<2UKQh?N^mnJ}i6y#)!-Hi((oMCmS^{Ojhc%A@eqvCCa~9wy zuc#Ud1}t_ynFD+Nq_%?i$I3QxYgUWz+;@kYAlK5?awU3#+u%qYB18BW>a2xXGmMff zbJd@JVKm_~tET&8;EjxO3XCJ$G#Rdw+{&&pAV z!brj8c*?ppthuTOx{~;!!j2vBynuW5AC9o=;NY}@ND?MuNlchb6JO2BoFr&UJ6RC| zlPOjhQj&W8Atb&j;R@gdO2Pf#@w8)}Fa*8`4I6vw2{-)BJP!Qb(fT?ellV%Z zb^2Vv@Y?FwbgWhiazX-ws&snvZQ2uzjDDH2eA=S}sob7EZUw4nCjUb=GP0ezqHQ0GDAamywh=jaDqwX;ro>8 zxv9xecH#p$V#iZ?bt^ET6ALh0R|FSR^B0L{7vW-lm&~IVo{xCd&^9Xewq9L3cGJ7u zEeZ#>Ut*e}VASPdkK+Wn|L2VBz8gK{)#9s-FpioQXq&$;OXYX>1<&>!G+yo^4ug4+U$ zOUuX9H21%Az6udcq^3Eew7}KZ%710CY^3^}9i5^UwX5dz&lz+Q;<~U%g15+t;K-@A z9Xl|!WLwQMB?OW8Lphc1?N(6huBI=6v9Z_;kIXIi+JXW;%Q)6`z~^uGx$5#mAyD0* zYL#F1U^Ffeutz|#8|{yzMSei_l8Kw`%$njf;AL>qr8A}x6ZLA@V>YzLlsc-?)_r_0 z-bRWI%Kz=6JF(YL0&bkxN_1NqtTbk$%QT{?zbsrWh|!fA0S17W5CF^}d+qie$Mw=8KbH?~0w!S=X%+oQ z7G`Ih<6G=Q$(!KBc0O{0;kUKxYFeA>1U6nn7F9_(&k3N6z(X(Z1z=;eV?YmpK-g^& z?aOr3Ej;5!exdmaw?X&VDg!t`Z!}Q1+9VS3ivG@8UTc59+>{AMj>TEfwzphzW`nik zX?Bv(RFMJ8pQgOHxIfru_0P_@N!ni8>*o*uBG)cincR?*Jvp^<3@i15hvKbOFJsS50!?U8e^vD$5Qc-^QLR!5F90kBx!!eVL|3U9Fw1d4sVRrRmUc5>nq$7OJ5Jt;e`@il+MAYg$OPbeW%UsJIHLea zGs|FK@9j})UwhL=5ZUC=U2YIc?SUwNe!VYDyCt9?ng`L>XQck3v;;DKPu+ z!977b2lyN8D+j^iNmU>T5EPy3aVg)TD&|l=6Yn(w)R3PRw-XTCQ40=0LjZ&&UcLJn^uh|t6U`)6x%(TAJMJ}6I^L?K z>8@cIKOT_Ddi1v_=90BkI=r>vDZ(r?4w%wGqKL3@l@=W?hk`BRn?{`xps!5{QNYvD z%7hKy8g0;5D-qcfglj_|2Id(Z1IlWSB8|%W^$qoBvsNh$pec`{{4n5gF@AoYsc|h*G zuoB1j?zMa#!qbyE$?Vir%g`f`+l(%R3z8jugs~e;G<>Jc+C60ZRjH4g&c39VY?AzE z0(nQ2@vjfO#b(b}XJ@M?w0+ud>gU zBvbsNQg^7oZe|YHju_qL{xBTG2}{$_?#?VZD(iaKN1~6O1DnwsK%hmX zAT?yu!mW!x>m>At-)i)fLi*9;IMX&OJ)=?|4X7{8x0xwf$$O{Klz2aZc2Vn{Vx~!R z#qcd{R3%-;*&SiV>u5r_=ne zQLe3DLbe2-*-yi$FM^4%nkDF@Umul+{8Hf1iZO}W)$yB-2Af^@kj2ogfa24BeLwa5 zu)b5XJX8x*3vxL*{a!8{HVTAEFAD~P{-pm^yCu<2!}RHA_F|3bbT?#Hg9QEnx&ZoT zzl#z?cSFdPUa^VCAK&xiF?E$>(e>hs2j8?W3&R2^iKd%XBRdE(2|75U;elFGt?3Rq zi8;A?ZYCz3vF_b%!nrysV;0ADMd_xxS0U9;GsW?3$!i`T9Ou1m!{&2hMX6jmhIVej z2a{(FVsFt8w=LJMTl930(Yrw*-pZW>6yc8Zv!pf!y=%79K9-8+4cMf#zp?Tz`<~T+ z=c==^fhe0@oFrD+M~6EU$ZzYNJ*>QUZ$Ybme+<+vDszxo&qw<}-;H7KZEqRlD-Ng> z=Ifo25~^*yRaLvx3c4~D**LJ(diTnkce!N##Fr@pe|aZ-K-33YqM7c=X^*#*nsUVEP~Bir#g&(aA|pNmps#{awkMNv5zlk~(@o$cJLjXoaUP)BBkx zsK-Tp6>*kC2OFZJ9@nbbX0mL28<@V*ZgA-nE^4ZZr59fO(B-;*m^t8fSe=KB2=s`v1&714 zZr#ErCrKAU*|4{W1{Dq%Do{;XTDeM+~$V#T&y}z+um(J9xYKtjY7^yE8Z|>9z$H;tt^+_nC!r z?_s%`uuBv9*{%C;s;O!llPHV496)gxrDQU_+j>j4+@GU2$av$3mG;* zG-F8VG8*k(J!x@d{wKfify52(3}qkh4qaV#oE1IQ2$+2xkNu$iJ26OjtM(%Vw*%m? z$>xB?Ai(2$;R~?i9jQNeQtE_j!wGvPwclbLR_u-?4C1)mkQaJZ1*X% zsGBb>$+q9RiLHZ1zB}RROt+ho@4w=uUgM7dPG}o@~bjGdRHUnq5p96@BNT;p?FN5xE6Fq1dUsp3Sjbv=@UZIdW&*N7J z`6J#~WVmFaETm;!iw@EUS*3UiY^w4@g$s&;=wGiqDFZa`UJ}XJ7ln|Dp00r zKz^U53fFV7+0oBpe{K zJy&T0F^0wW6CB!WF5^0i!Wpg8eT@8`T)R%<6k*r7T6Z=3UyZ)OF{SAd7pSl}pcpcilvO ztIVqmA~wBBWxlW&tF7Ut^kmQpX4T3jn+q7c7hKS(jH zcY9P_zo!k}z2n$kihiHM=5_dLT6Xw#aRe#+2G-V9bix=@XkHWBX5C4LmUIe;us^AF zwP@v(k7r%^0)`|LTY9eYcJ;{f!Hvm{+k^8yH)YFzPZl)h9E8q~I8S;N-EYSa*{UoF zGIko>u@iKKnu60)5>`oVLrDU33}&u1B?aX$VYr?2D(YU8z7+X=T4wCITAQAKMOL#1 zm-v2PE+(H*%_J2>gb%Or$ta!NDh-OM6iV$O4?WLrI%Mk!-rEL2l(EY<-M&9hG*H3* z+!M!Z+n0*I68e+P9CPbV9|Q+$U}fXHrcK#Dk`)|n<>E35ZrO6xq;^%IqIPr84mMLj~JY=6__5L4av zXXywok7)6RE5roJGOGV;{pSin3GwymR;&&DI*301+3=t-^(NM@;$g zmA#3ZLwBtgH@`JC+!JM0%_Dm`ePEv}fvv9vrfqIgT022jXd3lb3$BhPOf4s!R!V#x zsTw?)+Apl&Fb#Zm7lOR0=hs_qCCqZrSW?Z z7cOMCtvI!-r$+_JTIA|#yIpWA{)i9qPj%~uyg(*ivac}QXRvo9!1Ov#9$()gxt?p5 zEGhj@fV*l{WP?hEtba>-iOQq!MrTlSD284Dn~{i*vS_x&KJmN z{V2bLO!@$&v^u~7|1@y1pCZeGQ+CpdH@?^l2KQCM3^oV|KLmcQy@fyWkPdbUqC$P)OCKWcPnEc!diJ% za>@37nu=VQ(GZTdnk^_*6I8hT}jX|-?4Vx&^gA-GFp&0&IjuD z^X(L;EC@xIV<(k;*{9v!aBRPh<$Wqn42dl*jm!Hrf=0+Q4z<#$^n2V7=ZonLYOjkK zV1>M>1!~-zExdb^@ zj>R@Rc2ptrAJ2Cin)hASfl0E!N_zhV(lL#OEoKOh)W?31-ZZbb2U0Z2iEr>I!-LBhY zCsg#VI?8^-m@i^o90g1JE7A$`DQ<#_3O4~-zgga|T42%$7E%q{))iLblwA)Qy^9ie z>$b=0nH~A*{>gDt5VqYxuJ_!N1#9EQ3a9oQ%?r;eX>2DW_xa^b91|C2`KkN?gT71h zf8(}#p2rRV?*&QJ{9p!N+^9vRsS;73L|UBVH{Bf{|GJd>&=E9EqFPn+{vlB$gJNhr z@lT9DEzC~Z06VLlXheob&;0XA%e6Z#jTHuc1*anD4 zalHW4C58z3A{xNk9Gtf~9x`Z|--afj4cTixsk6-#0sV2tR9e=`GjJ!xTvX88nDTZI zd2$g0$yQ8ws&YHA29IFy^WLR2o$%5&g=^&7p~Ep3PNTnJuuNlvRy#LNt%^Y!gLmh@ z`P|dJu&w)f{2Hp(xyXraH!F`qu^ zJ^1nxodKLaFfx)~!CDI+X+Zherxz<}jMh%qh!x`U=?*m~zxOIW*F0~|mHnq1ylt1X zcbC|;zb^-eh2r&%ahqayK&T_b2ptzs;c8spT4AQd^llJmsI9H%;`}GTsZ>5}H9hGt zBb?HGBa{sqZw`5x*)^Ydlm#I&->H>&4f%)&ZU@lIP!<%B&0N5;a}WkzpwOIl-O@YC zLcxWqHh;Ep^)mTm$=qotqB-_w;W?BP~>#QjjWq|gTvD++wQ-KBF^ z?Zz^=xvJH8Tvhj1lZg=HA`AC__sGF9#o`;t*N%gSRxbxkO}Rx&qpe%&Z#n(!XRyhM z=aT+ET~ekBFdTo?zto0gG1gp_v;tu>-m{e|&ZZ7D3n%FsLsgaeXQg&CAW=?2Ws_9E zl^9aq@|5<=oQg3^?LYA9u1Ut_J!0yK!!tqDYHdU@qRkqGK&X8ke%H);{W>W-1CzY@ zT=cwg-^)OcWJ@c!`WNcXS8KSsY{R4qNM&+!ae4Lv?mf|Ra`u}pP(*9_tmKYS=sQBz z?~h-|=&8S6IjLJupP{zSqk>KKMW*z*<2s6C`Yaamb*uC_uyJa2hXp3}d%xX~DF$-h z$^}h?J(;#O>)aFVjmDJsgta=ShZHX6!ta%hJim$-kWg*=61!w)D+Q6dG-sq$Hu{BT zw(uYy_rvygBRbc<&YqdB-HbBikh>K%ahw^h02>f~6)FFMf+;;!Q_28ptlb-^iT8W? zKK715^otSemuAo6ziQrn1yoO%fP#q!6ny`-6vkd-9aI}@3~un>R9ljK`33i8@JKHr zh`fl`5LViUBoF4^jZ{q?UQi;9qURIP>ePWE?>v#oJ@>tzAaunWXJZZSwpsB-vOb8JUdbbKLn=9oQ^3`pdHo2=79^G=cXBxvU zyny?c@t(0TlUD@3VvufP`xW<`4T3%DFaO6%_g?LK4(BS_8hzE$1O1|F_fvfJKD~Jy z{sW3G#BQ{s=lo3-0u4W&{wwl`Kq6PdO->QGi910o65J94D>%z_U1MksYd2WCeJPDh zbDvweoKukfH5|8GVPQQRH8>8JItcAGdU{NTm3t|;#y`<-~H^xuZP|=+3nPPd- zW<60QMyarPJ?SoNM?K~$Odu94n)0q=bB8!)+&^XVI=apvBPLvgJa<;h+4fZH29T~! z=M0t-uL}4LgXoOXEWIwJ#UjmqeKrP2H6mKT%h^_Pg*Bc;@n3_|<%ybUiw^6`^0V`@@0E%@(UR+4HmV;PuD=7j6Lo6^=Ywn zQauMmc+1xB=~=s0tzVkh?}pu|V5LSjYSn{g3U1aIGB`LUCI1+7z5nsR@Cb@>1ETgP zCZT^Y1tEn)HS=qGLRztkdOa-7Y}CI$UuGhRlaF@R;d={3sJ`OiGPMv7-R(t#kBFsuFDrkIc`P#8ibWbc@?=HTs2J3Na=;I34@s z)HL+ZN!?~uLFh|ee22L3!84$8BdY8_~#b)DO*(A3@dfW1x{@tWlx#APXyj)n99w5shbyI zx{Up{&aIor>E0C{ZJmhAPrmB_DPG7Dy)-|j;s)NTyyRW-6p+qWFsc5Z#7duH%Z#qK z_VzR>d`a6uP$(OF%BUf@Q~ zBoVUwSaHhXp`^&29Yyf!+gJaR^S%IA-tbmIv~-=ABZj;F?U4lRV;2nkJX$ z8#cAhbM_;)uU$!C(c2wEu*&{z6P(PUOmqKYKCxtDJfn-uEUV@|+X z-{k&0>g?{NAC>P2dvbEM9y7h7cx)&z2ge`Uio+y>iT1RFs&cFRcgmXiYBB{UKsJeo zSG}lxF?;ylk4hH89vg*9h^vFoHuuNxb-W~pCGxg2p;E1@sG`~pyV?^*-3){GzrrPD zfid_Ufu!yAwZg4v;c0_qRjT?mNn;>)3*!KL8kGi;LHCX@ujxRmr1+fc1cf>B4VOTK z>?9<2OY*P`TKoI>_-r z|4sjjlK?F>e$=Ewm_VHnEs?dt^vAno(w4;EYd>T;d5ff0REbjOEH7hGJD@cEDl+gQ z^)0XS@-vEkuW1+4N-N1*&KDVAN+ytBFvf5{yqPrShy<>=W3f-4fD>OKO5s)(Wa)aj zQ39W=pRLdBlLU0=YF;nn>iMrY1*cfOm9NK|YI#Ci{2vJ)1(ILSpV^o;_Xum52U)Jc zD)gffW|2r*F$8$oX_>5GdieYY32l;(-?e8K(E{r5;$y@5)s>HIJ{OJC5S)K0KsZ#0 z*jby-Y*?Q>{02Otn9;&49`A@WC1*P(hBc$X@f5In+XBu zHnK9UZIgYrn{@+^S<-zuq0JMZ1bk=QkeTCj8-R$>7u&0y!xjBMo{qcvz0k+zCZt!b z?O8xwlz7#omKzc@;tU*mM&;v*!(Pv)r_{y{!wEN20QLZh41jBYmEV?m;_1wh7pSsZ=ox~KGiRRz` zzG86V?9r*g9hRPRm;i-@s*(tzmtjpmDq9G9s6k|ZEYbEKr#tq1d(k2O{#z|rH*3c+ zr`OAsm(mBqq1Z(Ow)h{|q9kJ2MV#AaDQ1(KAj)L$y2f<)a33u@-35T^Jvi5C5sp2I-@6RR zX6NY6NAT8)HW)zKdZZguN1juwM3&hdmZSK1TO$FeN(gnnLw_lV47B$RJExw_Z4b8p zner;wuoJMVq`2K;PZ_W$8NqF9SbS*yK-9luajqA00R%o}QxI1&|DAUm+ICAik9M3b zukB$2GO~4J+5GDxM_!5Rd3kPDhm0dh4qZt^zaDgmSh{#^x=2i07*J<)lGkqVVAbC9 zbAVO~@M79&Dl=Qql4qDI4i2BW@k3zAjFrH3-i94d%slDy46XbL`biV z3bMP8S{-I0CImt1&jI8({`Cfjsk+Aob87d&Ob$N*ck=x(E?wP1E{i=V^SQ})z)R+= z;ov=iGc$OpH$#lrRQ(bOFq07b$ixvu@7NU>+5H878vY?2dG4I z>(cl9(|!8zeMTrj8tic$ZGH$u-F7k4Fs!73bce7F^P?NZZEMjj6#s3ik1uE(2iOCk zc+5q`6JdGxEekF+{o1(V#I|gxrF{M1f-7Y}HMD3eR}y|3=ARmS0or>VQ#>VQIy9kk z4fIBT7O^69ml(r4W0-Je-FMMOnw8kPf(=Q@al!%^8xfDBjZhtYd&5*e$!3IQqko#} z;8@6S78Ezg1Mb4z;l9Uy<~jeVbO|8BE3SO`e@uOKRMg+|{vskGr6?gONS7cjErNt} zN=Zw@(kWPgi*!kf^pesmElWyCNrNoiC0)O}!29$4o#P*#!@h3Loq6WDGjn~j1kftn z)7E?YAtAQ6iYvYSn{m7OI$r5?L~C46apda@e)X)M{lrQ_vbNKDO8hzytz>qzTWb_! zO!hA%Ph)C75Gjebjxhm(aw37^UC$h28lWa!sI6W-Etw+=nJ+m&Y-T1Y(&eLdg}woTBEf zZ*~^5l;r+oXS(I}eiV{xTvw3a* z?BX{;Ta@58+RB7-#(VAy^6c ze*Vlr-(nLPcn(f7tdArwB>5V|hoDRp<$Z?&2y43Z$L3}eh<25#S!Nw6EALK=UbZmm zzCz(H_VsQ|JYwn95>DJZL$IGKKzza&s#dL2DerhSD3jDXbaz*j$v~(1n0(3Y@?wp4 z0w6ynAI&cqMu;1$+043L>!((Z%`Dm^ z*Dry9*R>QDw=7)8Lhm8#wLjQF@^p|EE&f^G);MyFH4 zfG@QlnR6N$JXXBKd#Qpb=*~xbN7@_NwBrG2c$iYYX7yqbF7gsDnt5VSi{dabyCwUE zG5M0&mUf~53^y=f*BGI~6#t60orn0}Piw!pTgq>iOiGs0YH1EfuseXK0AYUWLC1d& zqZNubxcuxPp7ou{vuVfhd+fgsecqhp_&)jeeLaN}q7q@Z<47Ua0|{?ja`EC%CmD^| z^%d_j`1pK-@w{0N$<;IwC-Wn#ZUaJYE${s1_0+yx2Ro8WM6YAiI2b{c5!^n1&RdOk zSwMmsL;`CsD!jV(r&V%7pKT0`=MWc?6C^^pnP0e~mS5V!nNIR5TnW>dN82M`bopJ= zu!cvP(~*}&UEH%*0nLFmeW(|zV(H4YiM^dH6Jwp{Z!fcu%Vzi&(w4)=*P2%_wOP<= z2pfnLmhLZjM(G=D?~ax({ppoQPfe-rQLj!e_<2&FL}FcBH$i2K%d+X*i9Xq|_}Vz4 z6AdJU?KMls&JnJWxaZz^seRS!&y8g3%bTuig2HrdNQ}(;t;O-8Qb7~>BVA&Np0{FR z&Dk6kO;#tfX>$+N&0iTBnn=@Y-)PJ7J^pj&;-54y+lKu}=GRVw+y)*$&j& zR#xbA-UeXSzYkA4%9d?|I70>Dz+E`vH9qpY5thskvolMzWewS8MUr~cQ!Ll~_Y)<= z)dj6@8%2EQ|1dAhjqYBUZ;0FSgv)3(t}zCB=H5Wm$oZ!apR#hwV^#>I*xe&#AmtOs zb3fh(CcOLBOJ_-{yp4%d2leb+{*;jVnIw%G=Yk{jTd{F}^T>lZS;bK@TJnO~UNSpbhMVOl@F9 z{x<{tKB^gCo>Iq~I`x3W2|F$cYc-{%aSu8I+oqh3!0VeM&~_8he{q2yAZ?OB7Y`Ex zrPy%T=7d0u_mg5NJ2f?bx6g0!K%*kMdh!3Pm8 zr?q=g0#$RxYWbaj3;i(N$d+_MpMW2B&*5mY%P+Adn=!_I!rnvaGF2Kf`w-a2GLBi= z3a?-w8IQejDX79)fm2ayIAbyMr>G^vcXjgQTW4!<*wN(uue$F#<{}q0FS$jCH!b?( z<+(Wq1Hx?OcBJG^7Bo%AZOm^aHl*6H=rj+1EE}ZBC;5qvsm?&BglE(h!q->l&@`@j zANa$&A%JLr6O*;uZ$^SU=P|_wc~FS2>@YiRBwkgh@Xv5fW)g%p&N&HD5`e4c-d|ID zM0~qHZRV>L_M5wxpx1$Ks~q*(cPd+1m8*x{TApbI{^U~&qKXKR{`91$8LbloPh`;8c;TLZV&mU)S~VRb-gzEWo8_{^)8KPk}L z`b+*6JX6l=ap~cZ;iWJ$e*_v#MGSQ3ytIdDk=@PBv~o8gqLL~AH?-CC-xgdA>Z#8e z7cg~MaSoz#8)&Fhv&1kj5Fh>wCBG?H>iVYqtLWa6OTwW=t9DeggV5|8w|K`vK1jP4 zy8wHTRCa*WB;tW0c}l+~YT>p_NwXG<%oteOo|mTiO8&=jYCqKX6a7Tr#pRkkKxq>v z(rB@R)D$0bEVP?IjE0huE@CTtp;Le+(BJp3-{8nz;%$5xGi(xDe>zVogED56(QP9 z`sBT~G`o=^m&ZY3DFc;?Q90?*=U_8lR6EA8si&kQE)<0BSif%sJ|hTgD(*blf)^qL zpeyakPlbjaCNq9OFQEkScx(XdW`muAEWsaV6ov-CJ}!?y%~IhAqj+Po6l-IhvpBnM zVK2&`2|EvhESCfy&Iep|2XFp8Sfw$=xDKd0NyK?eImT; z^h40uC>~&-fQJq#yktnO3_Wb=HSQ}*WG&k)DP;C{d3)Y8GW^U&xfh_FY%(i+MS^o(7a_)JJrykWA-(aw42c zIkkPl)LYY>S%h9<%hE?t4teNoL6 zJQqS)psFn}Ya8*^mc_AMz0 z+(@i){`oSXXJ2g4ex>yj(zGe7!H?&hxXEK+ixjPB!Khd(CB3JK+p|};CEGKDZgB4FttfdR`Clv1CkIAZIwEnx%hV zo*v6^LueVRiwYNMOza}Xb7}wusLh6laN@%?EZ-X}G4#w7m_~6ztL^SwW-mc_6<9-K zWgCmJOQ0FRLtcHpyz=0fw*+Sk@$`>-N=Gpw0wF|O6CNc=J;;eHZd@Gavke$F`jU3h3>RE}jEC&V!=t*H>Vsx&bM!XYOFgNTNEwXo!rjGg97!Fjy;6x5b+7>wzkXNA=~BtZPT$Kp5kp)lzT*rOb8Lkp*DJD| zTq{avpcaJVj>gr}1(~%1x=LYr+LzkHh!p$|R^j;lOBU1zRPKBrg~>D|sFH=J97YME z8%j|B2d$ptlzn`!W3M=KeFniqh<)2kaBQHG7^O>N(e;~d9Yot91c5Q*IM=+eKusma z9w=~C*#j)vo(b6vZb4aafr3W`WkypqwZMNWBCHnMd$@apIMc)^ufF$kC&yP!TzqCXDLJ-a`$j!s_53HYO)5U&1ZBq z;}6rRB=4Xc5rA@))4xF;o1LXP5#KWu#eh~;kmC|#WA`!d!~A<K)|Er#@l|8o9tTOhc(A-zrF)ANAL)2Jb zk;0YW`^d7|JA9aycRap%Yw2G_%rSv;U2LMWx*t$ukls0~d#@keVlf+gW1}2>rCCJi zh%4{T2ofMuCABR8^bl6A?{e>GUt)@zx`-96%ZUdtAS1Qoo(Ag}Top4p@{);xh|v-c z@f#y-um4rM9og}MixVVw`@58^nHuy;u#Y4pR2Gk1`G-DAtc99m^Bf889Swt%MyZ@g zF4?xsKN4e~x9z-ViG8l`H5_Q<$X3jUcG;F*Dg;QWY%?F@*xkKqI!x^cI6qvj&-6h% zvDzLi9DdiJ%#Y?kj&}aItjY>$&|m*uNxLw!>wSAYhWNJ-yPc{AJ$FbR)F&~uyH#wm>n)mG{Z84rr;d{`laujA zr7{X?Q#PRckf&A4zhF@k%lwxQ!b2aZLjAD@fz!wy$7 zNgXw?hE?W=Lo_Hmjgk77h1?-VwEG*luho{-kLtuJ3G9`(?-b0Wn1?R=gl0n$JACHZ ziLt*fS8IB@iGAH~$KJi&FArHHXdiEcf7JYo zF*f6MHSjz{+^Yn9@d#bA5P5cEu40aL?&D=_N-2zA5r=T1W8(wa`MVif)%;f*nm-r% zhL$(b`vp;`i`k5r`P1>}bS4Qa5OG>A5CHFFlErrjxN7+hqNu(AN-0J6x`%E0VWi_M zJ;lEN#I9(oqW|MhGYtXTUmx&MQe2X?kRas5X@S|gg(|L`UB)4mgwJ64gsj z>H(wsQE5b}XZpr5ays?+p7}+c#$k(%weJSw6+#xCxc-ORuLgL(cE81*RZ+h>wm~mg zIr+M#*FUB>Mmi2O?s+?C(-xfUdu@R8Ai{Po9WsJi?Ppw&^_C63I!jGV#BrhXj&CvG z1KkxqrGeM|!69|!A8}P^E*9V~yDX3n*z9naf-$mOmjF}E>Qfd}ax5NwEg_GyBB7RO zYjS*Fjs1eehlIm4^q-9}vdX7&P}=qL77pGQZDBP{}EO2{wtd~^_gS#|+DccKPW zU9Az)mu>vW_^g0Q3#GTrZkLVc4;Aug9LwX9MR!rV<* zw)eBf%{>vt@{QwM_iI4MaEw?N+50JZ^LHZG)`Tug6M=&58K{(!vFT418I1!e?l)uR z0doZz1?0(!-EK{*SmouT0ucWf87K>D)7h2M3qfym+>DsGF_UYv1Z>^!+yc(mt7BI0 zIhZf2u|fQOGEidW)2yTNYcqFfOR1F93oIX@f5{(Dt3> z@sbdSIQ6sHTRR}tTm#-S@BQH}oTbejTW`suc!aC+NZ99#!&vXR@RZ@DO9bJ6K_zYn1VX_j$u~TBlipN~Ho_o8jl(f0cdQoT zUAo4@4>&Tkag=(Q^uSK(B25ECi>}sakG~1XT*kv5SbgskOik5i8dE#hH+ z9F}TD6u9MreZQW#5v5?6cx&4c>&m4}z3IJ3TzRPYZonnry$K&pOIN%su>F5Sy245u zC2TtwRUTX|E$p{X5yF^^yc_vZ`1ZD=O8!n>K)S|=*DQd6T;+#np6HnA(a?JJETW^- z4rHyu)kxlzjj|O^pS`%iP@gQLmpbwU9<5D$?DgHBaPNP0*afaQOThaZWB~#DvT_bV zzmOQ45;zMdqx@0oIKIEgJqDT{!PUb!`@w>d~0A>ASvQP<~NRU_(fv5k3mLfZ3{IO!Us=tcJdK6t<$g!AwW8*OauvQ!Zd+3A}m0I+(BkkMLj0 z>zF;P*ucaq$|d#MTsCS{A^b~pl|Pw2N8OLoeb=qxz4@H(9yI>At!ibLk-Wh3+$#Is zwqwr~Jj#)3ha+0H9jl&;NaGc{Rke!#o}?TUvO@Qg#>PRs5QN0UO2Gg%O8#5$kjLuK z5I!|02iq)~HwV*uetCDFWMp~|?%udwf4p8jz?LmjJ=y^}43~YY-0MLU0KYbqNXXgZ zd0C?klFFEwiMmx|{C&9EA>5mGNz(&wU9qy%DdDT4vlBy6`|Z#DPu8=F-Jmr1p8?VI z0RGrp!Oum<%;A^Mt;T)l%TO+e|F7sMm<bS=n&k5@niH96x;7O|3uWX{J8u5Zbr$jPV48$&|lg$74Em6 z&3PHB4!7qNZXy-mM8fd&)hdnj=c%2lyIL} zRmk`Z^=@;J^?Zzhko1aUmB7tFQRjKhtKRdxk+IHoQxk5xg)qR^;HYm`!~r(#K$b(B zxBPnJGnBQb$Hk56QCb*x`4|Q-e5^4(cr;@(S?;KOM5@A+PA|a4YkKzIc<=J^fTC`^{8;Y$~m4G|KD&A$Eg$ zZgmdJcdPL?bkGZbME3~y#+>_o+sm@Y5DA+M)UU7eQBSM3;$+g-U-lK}PSt|D)4*CN z`s-`NAoy!&|8&}snRdA>P!@!L5oOC+IOAWz}}fWJ7-h;=crtYaIc>41GZP&J6hJGF+N#BN{d4(fX9T>YWk@Jim$9b zv2$A!9O^%LM^zR`TYc{cL~fL0cktE2O%TgJfbg#d0dGi7+<3^_L zHbv^ML%vu=UIG<*oy&jsQ=TXe>FTm>`Ryx+$}y&V(^MSOGA$6)$eR3sU) z)0Wbhn}!4x#w#R-Yba2K=RP3<@$4WK@!t^-uH7|!g|7c}7qlxIwdWj0YfskguaTw@ zF=V^SRux5ywu|(AI&~seD~M$}DD90Q2`Pkk0@CgZqo?}fXQSMRYJw7Z`$$4F8hHnU z6lX?pTgsC)Vu9``XAH~eoq=jTLnVCvi3L8ptepv7j7g|*C<}bO{xD$rsj{G)V96)y zIa?O8xOL85Kyg9Z(hs4tD}i|=6rVt1iqAWIaoSWNeVnTW-b*Xi0PjHAAIBdDLFw$K zhgHV2pd28kvpNoBAV^r)2^iLrHrgrghO^NVksdYheSKTqOIb*HwOGP^EsE*$4m?e_ zkRQqPP46Muenze2_-y2Q&h zFKci?{C(k~#6xb&bS7lopEZ8nd(t9pMZP~1CSI|{;P4=y9SB&3ZnErI{&7q=XS5ql zoA=Ih_l_SbZ?9(ImOXjU{664%c`$JR&%+qjri84~7e}Sb8cE&_pq$ayHPmpD9K89; zP7J3PuHW%QrlQIh#xe}Up(0x{_G=K&rRIkspwPy@my+;RGRSH=P zN~jsR%|=L%_k1nQMebxi(c#U>R%<&dVc-ioxhGX(J||KadD@Y9#gKe|G&nb%ko4>> z1Kv<)o9xZB>oeBMLGsNQ6727w8Gk#oN&Z_zHB;)s+GG3`biqMhc6qM#RvN#2FU;bi z8~)6lstjq2G=HowAM%4V7`Exyu6M*entF4*mY_|G*Qz8NI%;Db zt1`8p-EUQb&{|>2yoD^50`Y8`J*owq#2}Pog7rqK&O0dk13c|VS9WACWaeOdTdjA@ zmR-B}@t=oyt=$ELErY_(%d2=x!QInG5c$Mtj2OK#>by$S_EMnbKNNFs5pEP5<%HP& ziy#h6f~*k#zoQhDIs6OUw`vmle0ZjHV}^Aif3+Rs0oG5!$=d-opDxK2iH@qmyu}H= zsI=kN*4WzzU`x)osvXX!isH_T$rB&_iGc}Ihk=kwkPs_RPZr3fA9c0s3Ak|341p8eAQzr*AVNuNueupbx>rdt?>yMZ7iq1|~*6Yvn^(a5*LG{3mvVTT^@#691 zlgY%o4Z^_pT>9Ss=^71f>cWuOri6LNDW9D#_bFd(g9X;MC9u*x=Tl$L7fxwT_KT{| zcj`GdKE5=lMpTUsgAg#4hd&Xgi)h|x&6lI>KeHma?HKP1#B0o<-rz*QhH~bn&_n{V zcBTG&Rb05Gc0a0TaG0|&O|(Y13!?FhcQAnJm5{X6WdJD9wXEcYLo(Fs=&wascB{c< z-PNT2ozhGJS9|DucdE`%1Z<6twKN>Db7)I+AF|uWTgYIMu@1XhSirA3>Go3=woHPm z1j14{;(@i9f>UPB*z~@cgyfTkK?sLfz3azWEBgg5zB7Cid090VI)Vfx0Q4o-BU5pft6l zK|c;@Wn%7%T_fY0qq8t^-}6>;ze7^LgVRT6o5$^_`cjW!sB{;Vja)PQ0mko&@DPeu zhdEJ^A7(Bv-&qHW1o~D61W|pDk>7EYz8AIukJinv<`a&G!1iL+{w)Ed}Si02IepU*`cV}Aa*9hy|TJOjxi-Veq zL3!P}nwo>f#04j>KspOA=2%7HkBH|oJqIOvnlISWd1;cXa*iQf>cr-SGg}88ug;t- z7BiB#UXH!IKm7aE`N`a)`qPP$`tzNslOvk*e~+S?^Uz(s*)E4^Bt2)t_&YgCMKGzf}_XqJ^NHZuPBt+`Tj!5>1{Fra;=rTT$2S{Uj|2{9)UU=+w-SbcXAS zvG@vulmygcZfeVz9dzF{@l*>?T0u@U5TDuDa2wNK%LR?_3ONw5zZxwA6{d|UX47q2 zdrJak$q;0`#ZanD2eq9OA%Ha>&|D;r*c~S z@Hbj&UY$(u)130gYE_u=&j!%X%SGJj>tx2Pos*D#*=jRY2cPnJIPw2#@I$?UP)(_n732tIRt z;chRnByg>?(z(7DYy(BW5!@0hBJcwSs&*ej!bfZYbdmqO7omb|T zF=0|!M)*IKoapvRK{8b;93g*s%?Mi$M=Wg%@CXrg_je7CzeRrFKu(>l&wLf%{%;Ej z&m^tIYrK}j?oD!`)suhioy&%CNc*}#jvQfGkOJ*4RE0Sn{2|?K`ok{_(o~;0@!3Nw zmaH=1XHtDLaz5W1^E2dU+084eJIWS6wW*MU6PCqA7gQpdArSTlM6Hun_bRbDGZJ4* zO=7-gXE7Ug`w%$-5*c*C$$CpE@s_*|i8YsjBKi03F*`A}PCuo69%zC+s57=Em|2{7 zp;!k3F#!YH05irpt_m1|fuwHMk0N8CDvzt_h@R&?73ub6@h6J*!#Nq4)1!qWUY#y$ zN12C_#onU1Fi${}$MFRoA3D4_4HiGC`!MgQ-Vu;PGA3J6ECud)(dk0};zqH0V);55 z$3^0EpOx4NFMnALl%@1GLa;UjB;aw|rogiiZPjZ@{r&({1Grq?*yvKd;E$eBMYR z9*VGIwSTk2gjAb;Sim2c=;ao)3{1h!g!@#?h<3@QDa=~!mQwdyisWbh$p@p@_|t~n z>)KMsfMGgjwTuWW_jK$1G&}Cr0_+xKz>c!DZlhWo$u&HPnW1&i?WU-71Q*J{CFhgg z0ub*Pcv10et@8W?2m+9c^{;3Dip~$R{oo9Ql}7eX!{(wfX&qUcuT@&18V6VqBL)N1 zU$&5}JtTDzcg48qZ#vG8Cu5<{y+?3*^njKLME)#Jq!4Z?Kpfa9PY>0rDjf){67T1| zI<+oY-8j=KR!lL{^E=&%t3TOu?=Woa@!MJPJL#`~K{8}4$-h6sZovO>AEr+Bxuadk z5nMrizgyMxQ~R6K(0;9EuLxl*UkmoA2nUL&y?)K|9`^UUzEkxzHH#G3w+(hY5q93q zq6gKq-ur)P8tgyLJ9bR^S`rAn)DOXek2}<#y3K!{@4V&rPW6x!a^|U3)1^k}JQp zYCoh21~k0IS#RrGqZX!qEZkBdxU&{7sd-Q~NbJ7RlRVybYCu+%mp%jjIXN`;S30EB z`9|rDYwoW<(UKi=jQ@2TCfiPygsGs5@_!4SJv#r!Y=2Wk=MROJ`35{FPfl+vG)>SS zBcW#j#JqWX3wwOQd{FWib7_|FaXIM1%k(gvDXM*G2{2jXASYtW>fH5*$aqw8Tu;yB zE(@Wy$&-OH{5be^5Hg*59Yp-=qW;!<$Y>e3uzWE=J2r_lG=BRsC#=*E~~E27FV zyYFELbYoF&l~mqF5bzqcE&X=;1}GiBkzY_yDEQa#6(?!^>1MtQcr32o4;CBPvAq7~ zczVP^T!d}HyE1xLex5{}*;ZSB)&?3e;{}0y$YdZ`-%fq80cTmp7_&kzhSY}z-?g_( z0)b4!(SecPJ)y-Mocp^-TYlW*MGGEGZv*J{$J9j2ocR*mx#$;r_rq z*W{}?-5d)Q<$_e2XF_G%A)Y&jK7Tz0L0^(fBKlecq#T6qt}Z9g^TFEs-i3~Rn*CRr z@LPai z-kOEsl|yCM);#zQDmqiBr$?z?#km~~FTk76MCG)jT3{Q#PEJm*+ZS8R9=D%P)Ul+{ zRF*m$UsG0#H&bW%%7nN^f+#0Yp&7d zG+Mb$F}QlJvaT%7UJolhOhd!|fhPoae^8}RG|~^egVs)8bpJ&0_OziIG}@WzUu+m6 zhUY`ia27EXqhq>GpR+JDv_tVk_f+7?j|jb!R7*IbZQ6Dwsc#{8cjCWT0KD$E43+Kv zZ*PBkf1LSbjwd5WDmM@5=AUdj7??@NiO_i4ys}~=o%{WrEM;z#XL$HEY8L|RSeW1)1K9zn8{lAQ}X z!NI|kA7-!5Jn1s1tPsp{(H_=Hd4TBw7mOt*XqaHr^=J8piV6`M@jP5zjT=Yt$0TmM zeq^mr*U(qgf69K*RW{y5SK(=hwz7}-;W5-&+fBq)4EaGFXJKiA=#Gpzq@0YI#C1Ca zzon16+60@*KbKB<%-0<#&uafYwzpCv>Z_K(kKPVqH7-r9OvwU*cBErv%$d1xGR)a% z`99dlc5@P=2hUJO#M00R7CedsdK-OiO{z$yLfM?GhO{(61bFAgpm*X!Qm^*{V&xA> zYjmhui+Z@mxTD!prQm&pZ~)~eTtRi~pSsno@Q^?;-%^7>D`c} z5G7uB5CyfiW*1198V4HaJk@J3ZIUsLP>f|BsLzakFGftf1Eew(wvY%^o#h#=oJ;ccjsWhIxLE$g`=Ctx)-0Y~eMMsEeV{{Xqoup-D_fgS zI7){rqu5ggOuFUb9M3*HvAqZFCni-PA$%ezxM)c+z9?hQjsN4xlQYD5t~~Yn;YjuC z*Yzg{$Jsy$I=|9S*Ei6Q?cz8q#zEVu%x^avsUQozzyN-tWQMY( z)=pnrxhm-Y2rbh9XLqQ3r3zG=T<@4m8z0DY1p&p>QFf6^~^c_R6(?$ z``$+jdg^UO*@$+9-NXS?9kKTQslrhy|8 zlEy6$0y(8XTrAvY)XzZV?%v6&0jQVXmu#oN@N10qY*EqAWJ^OosaC5~BZ*Bx8jV@# zpbZj1O_Hjt5p)VpcSfw7C0J1=CE|F6(`ZGZL-gsrZBqDdOZl+{*%@N)wFGsRiuv$2jT)R z@W|}HfB%pn?IGh+X`DUXZ$@&=*JjT09>rN%U+Zu!H8(~8BLo(%q~ZtoPs(adr>}X8 z;;ZweC99uQ+UT8;3iv4wfmB+3df%1dbs$Ia(uus;tK}9x+hG3(Ek!Ebq<$?`O3P26 zLgdaNn1kM1kJdO6mNZLXCLG}{YgW>A8k%Y1@B{H);!1dx%`{_FyUY(6>+&VMT)8Z^ ziA5$0(5uhUp5k`9p2JuUqHz3p6V)6%UUG~j7u1r3F`gVpjMnrVKrlczT^Zyw9{Mal zG^C+ginoDm$d|v>;p4Lc205LXz@NB8=tWUck=}hwv);RbWDi39wW-w%G~iM{4zCAm zb1uQy)@NrkvUCyox9vx6FcFfr&LsEll)5*+>K^Rf0!Z&ivvdr2N5%Jeeq`iPIarv{ znvh8t5$v_IvXT-k`^}28hX>i_@btDA1OfoIktqz-*vE#();g>xI-BB)VU#sVO4{wp z31Zo#(7}LRenwKN&b0bEOP{*1N!)KyI9&P$X|ObvoZv@CgJLVSwf61~qSCn7Hl*gG zOt$Gtnv}u)Mt=E4`{>hxPm}%j+yF;{(zBT0kyrjKW=?i#Xl;ZUF=8`9KUY!eFPxDB zpn`jV;#AQKfqHv;2OLSPm~?Z;>5)9$BF_lyv#mn0{+f(>|NecMC!*cV$;&JEcA*si z8tmBT@J)Xqf(Tws<99ybLtXfHL-XjPXqiCukPLh(p~!$PX5;777s!?sf z7e2h@fwD&b+2noK0t?|5PzUDJ1SV9i->Iyy4ae+C)zv4Fd6D>mN7(u+S|ibu#Cn3> z0R|0o|C4`;n%V&aDW573lg@gW*BB_Qa*QKF|^S~Y-)1Sjq?UC`(I`OTQNa9Y9(!bNvp(Z zne<+>$Gtd1;unXJZT;df=835`?>H*E8CHA=WE(b(v*sK^Nmf3nX72~3B5#9;x#-zK zKOF#Ngv|%spNBQ?fB>r5cFgbh{l(!@EKjiqi#cf5_mUZVjC3kGBdCJ3ya z`>{f!6{-2KU>H1?&J7R3<@|e#=stF8+LnipuWvGIVQqp2C`&P7OJb*emxs{Z$w`f? zPt}W4362<3Qc^Ok@lX|&;fa5tK0 zh)E-Y#dqB`TAy8bkdUj#%CI+CoYH6!7_I8#>U3BVDx)qzU+m z#ODlR>-E2u|G*ZemxB|C2YyAv-EE^`9UL|q4Ku+|F-SxBrzS~;^`pS@>T12yOgT1w zIpUWu{wO#aYlpW9LgdVLa`zbegxK$) zb4JNOkJn|Ytn15*2mNO&C{MIPNB5{oPdFrDUvyCM=je>pNHr-D)R=n@3i@b*1y|2y z>PzAhU~JF2x7L14t#XI-WhV^r8FY)or%o#HwI>th|KyplD!#C}wf%@_96XOP~P=7kMk_C#k4T*MA@t!O4D>f7N zdQle|Nu%{eS50?_8dQ^iZ<&CQQ1R<6h{Sa|Xt;m%8Fyw?w>K0Tp(kS^S19lC_tC{s zEDY)h`ivQ_kLe0kgGxNzIniz?yH~GX>Fuga?CrTlZkR^B zU>n5eSjp7VQhxz9NsdSx|AjOE3%Hg_0Y$ehzk*X&Z+1{&j^G2A2k%j8RM<4A-%;|p zJm&m!Ux=Pf2;@G&$-YMUm;(ZONPPf-%z3b{4&(>gkg! zz(6oMTkIb>{Ww6JFV_{F#A)TO!Zu38d=A3({v>ITepJKpxNVD8Qf5Ur@jk=~%03(% zN#;x{QyWx&`KVm&4yj7+jmN}LzE7_%V7G)~x5L2xX?muPKPQZzqQOIiz@tCUh`P{& zTTQ5T6$V_2M}{@b$$|ZN&#i!}g7*=V(h^pdmumvC(uy(I!Us=X$E1PV30-iAtumhc zbT*0A2gadxfN4XUj_0+Yu5ML=<9qA46mmI09tE*_CjnSxl zVf)3Z%c7LNop6QW$DvPMWu^9M^&c-b7k{<2Utkz6>pD@^OsjXLea6PdG!4@uZbZjg zYj{4wPGx0XCu8a2&UEd4T+S^{1Xi?-qdM=<;}3B7w+>`^@ZFm2{-HL$0Hqip58Rrf z&`{hrf#3k^#s~fjoqFRDtLLU2&R-ox@uPYFU~^jPjj`!d{F|kL)=t5JjQ~m}C}lGq zVgvvmDf%te<;Oj7$)n>mWx|t~u&yoDd^Jq4m}f~0ov7WP zk~etyyc(4ojSP`V2cW+VsT!E=FeM`HtvySD-Hs$qdR#sMLu9s_sX6)$uBYU-+o;$` z3(H_aR6uyBEQ=;D)4)p;ae7aMg1FhpnoMdlIX2DZHZQo`b8VH#kO@r%h*pj(cr#4U z=;61NxuBDKBg=SyfCmY^`y>t~jEK;yG5q61n!6Z!=2^p|n+U^=3}h2CxBj4=$bzWX zWhcQpo?UhXP-|IsHbMd7KMhEjCYR}^XzN;8Q~KyxsX{u=0#5#Le0g{6@b?cP_&JY= zwO5+*C3>EDhdW5 z9`9TB*y=;?|EHKdTvx8`HU>z8BXB`X0J4+cj+Hm12gdIKG4!Xa7ZwY!@b`B!QAxNE z=?|mYK+M{dBSfRUy)8YFsBDxxcv&-Ae&-V8xWCy3-0VC0&MH3hWxMA6cn&RH8SmVY z25N}Wg9-pr3v6WBG(R@DJRxS2v+?$>KHAT75X+JTE`Z!Ncc=-@h&$HMd*Wy_rX)Vd z9EsFTV)0o5>+s)`lZI3*)(h7X<(>XzUvG`Bc*Yj9`iqHng%d2>h#CA_nl6QTcLLrH z@N^Uz?{+zsE$+=`KvCwv6Ov{{p{^fn-&((`+e!Ic_!)t-kptS#3%l_12IvOy$@DCB z^{9uc&ud)ELMhqL zk`!_OC_dU~;PM^ytHoOuodr4z@B<>7&9`r@=j$eM3k|w{qYvleL>$sGH2Y{{NUESQ|It;0-trdMv z_m`g-D)qZSLq9f9ognU)kJ!GY*7-fK8UV+RmmqH09{{VDrR*9(14-S#5IOT4xm*@k zpow#2wh9%>4Ohh#Hs`UUtutR_tM3~u|L!0ztF2AetKi0del7Q4#LeZsE(2k)5D{_2 zY^pL&C<{I=UuH?I`UC+10c=4Q)?q5vEvi9i}9ly!iw?-1S>#4y2n*$ z*UoKE!5(Uf_3#JZS}N@3u19;Sj3S!Dpm=iO>DQ_yPXJ;lafj|3{YtY(@%0TK3AmfO z%ssxPxmyX~EC5=E@{F8-$#Yj4PIFvc@kb zm=PiG3*HBe$NCZk6T~8wtKTD4kL(whY6+nqA)z(zBI?>biyL&P1WVEaqlva>($V%%2s^#4ZR9as~mGTtC5gSD8X@wX6 zzO`Oe4oEpU(dzV9+<5NKHxxSPGEg_@5^t7I-A4?TOihG8{PadS-fOJZHPX{=EswaF zuLs=)%f-rCzT-^#a<7?>rCsa6aU>wI|9a`)iGw<3_yL}bO>M3_j`A}#>T+TGv&Rmt zkd6wq4xgi7d0}MZQcW|tWR21AO02J9nyUIpG!Y;m@D@$U2P`(?$jau)$?;?Cli!V$ zxmCCi{1fcwUO-fy(A%+g|6HWK969$XBCcMC9e_*NLY4fY`#q2%^37IFgByX$>W8;$ z22*r{9;8$L*F%J$(F5w2y}v)xXS?kHafyyLD|?-JFG6%kulGP^ajH~3ay2?X`iOqS z8YRxR{`aPY9yn2rV-7oqB7?;gi{XM4XC5M)qTAv^LLvHxP{vT1_9Z&W9zkj5pfe4kXIQFPyZ$kDwHfa#q$CjBy z9oZr)vbXGmP}yXakrj>=LUsth=h6G~{XHH%{MY?D_j<1Dx}Ntc+zO~&JBO?;cEQZ4 z#$?td~o z;Of2OqvQ+sN?panuWjzb4BSX>;w9>tGE-c?EjZlRr~3=5TPZo*RBAcU@n5lOmdbX`((8_&vNd!mhY6fZFov^_v(;5s`KtuU@I6n!{Ezvyhpo%F4s! zr2XBadfy{~or=@k)FGjFHL7eW**WybFKKSu&cHF zfmMNaeOKfu?bgl|=(=+qhd2|{`^CmbfASs6dFFfWj7s?#Z<;QyZRS2(#N4`LO_ovD zKlaiI`vtVs9 z%Rx-^pImqcD7&FJe`cz*1&ebV**-hQznh)nlV?H~{z{oP>94_J+js~OsX*0CrNiJ(C{t}l z>Zoq9Dw?sxm{S;2p|>FD0nA5wiGoyyE<80ZK-@>`frc(}`1iMop$Q)~k)GSGP!q;4EUjVToTy z1f(IMWW;Pwm4v~L{t6~|@o_`tV_l80sZPe+JcA$APv_Awce8U{O(WB&G06E|CS>~O zVt2iH&kL!t1fav+6(F@XG`_TBK0gaZXb4jt@6N+7fJ}`0s6Q?rUmJxobaiv1b_TmW znz;&lS7!SbedS5S&!@{vOPgdz1gE;@H;`plAZyinjRF93t84|Doa7m&g;Z8m>1P=x8x8HnVD3m~Ke~V+bfHjEhn~DQGf8v13-h>2 ze9b<1L>h0K`R>(fIu@269c=e8a4~ezhbmm{;vJ!yU3cvJ5ew}H61y^PUk-0gl$<^Q zq6qp(*M3b;kF~0gG9Qu+AWh64`HA3X^?S*gD}=dN4Ovyne3mch*TicUJX)4)agR~& zE(T#8n|HdCFyRc#l@p|%-I7%3zML25)a6ayLVk zCS?2lF`igrQ?wxkzpiRh5!afh$A?>cVDH^Kev~?4L)RULtBfjJCB*h;e>|vWDs&pw z=;5KyX*Vz3zQo|9HFgZQAP}Z$a4n&x4xzO!e6yLJRg#2%N1O7_oyRZjKMed|Uw~(C z(Qk^>j{(}n3o{!g4`z#a2=Z!~csF{E3^#1I7Zw(*_&a!3@&X@MR@UIOljHhS67O=< zh>F&WivAcGdE&dhvZj8~_{sM4iU+vD_>>>lPPyv=p`(o_Un@J&kQq-F8QTQ12$FPU zUO`3L$#gcO#%QrI2{W$Z$QQze941Tr9Tx;~V2`l2{`_&k6m>3>JP@P|Rkr=V(Wu zio4FNVfb(>QFlKO5Febn@{g54M^0Y#%g-kTYyRxcI$aB+)`?W^oOAD!+2imMj1q#6 z$^lErV8fBV7jbL-WXz264q`|#YNw02E%#02Ey-^qMG-U4gk~NW5ajR<*dCH9^b*Rb zhd_Ak+?lsm|5A8NFIp?S9rUCOYPI-f{Qdsd%UU zsY1%i?v56lZH(!tRnd14-T_s{%WL#zNT_*ofO?&noy)^zhh9g{qO9~ES+8aY5Ta^G zQd!4osRUH^*fS&M&l2xm7&o((VPh#zAjsJxhyrXs&ng^t!ApkkYuJkzBC$9JkJ#XI zQJ79`wT>xvJJDpK__-)2jB3}|Uji0cBt&FOI2=>ed4#|H_xk#~8{YK2uTc6Vw*9&0 z`h@v@Wlsyp9rXF#I6h^Lm}h-^++g!J$~y}5no%xv1r>F5rn73LozLHM+KIdCRy}4dfv27@NF7adBpGQp_?8_k3FZIza*V*bwu80!bZ;UVX|m?`W=n+X zOfhBL;$O-j$N03?LHg^Z9C{&NN)t4*$vzR_a|qJmV{nX}vROWz-JV&=SM9lZZqADk z4S5q8C0`lH8&O~hgSgvTmVR;9<4P+3(mv;LgItuE#}z%Ui(GPZa{B6+ZW+;-63&m1 zz5}O>GWUeRw}t*IMx07%mv3WjlR52ikuj*I!hmQ)ZgtTs{=`X_K1Q6XZo&QH#x{pC z6|cPutD4jKZ-aE@qB@_P_9?H)xyQ*{RiGe4>WAkSERyK(_-A~`qXpw+Vm(%SfADZ&Vs}8O_$FTY9DDjaNx80ye zq^8T^7$Z;w+(L&JwTVmg@_I&BR_yJsSiCSk1^dmhV2)r?(yCu1&ZrQMfwO1@Q7vZpI# zLV0PXrX>6(Li!S{CpX?9I-UB^>fR9L{gpB*6DFVZ<$(wWhj_u*j%fcxEQ)M%1r1tzvAsGPQ@%#13p|} zyetG0U*hL(kN{@WC~k2obBvEMhcTLN$fthHz}fhS6NlMB+EJpp4m9+>^~=|m)(CUG zyLf`SIbMtkUYmgFry)HlVLg>A6r4ImueXb(M{vJJX$jh7uyW$^G{JM990>p1-Iscs z>HLT24?z{}K~f9?7oxfFb_=8~h z?IDhu+Y6@@_zt?LW-lf&x6_D7Nv-P8jo1q2``-MV&Hoyi&s_Tv zNueK&BAX?1`yIO&zy5X^b0!mK^(l8)VQ#}SV*M>ASfb@f(d<3XPpLu1O6uu&FIL0& zTtP{17HJ#Q# z4IB_lQC*kpqzd@eRdcu?fH%r#P7vX)a?w0U_>uGHYpDWL+~p|6QU&m}DSCIJ5V1X$ zoREwGQPEV7Qvbm2*KpBgA}|?gmbFb5bXiFzjss*0(5UXkIb6tv59+SM28sHAru!P0 zY$kjPZz@&04feOlQYrBReUXBV>;PLaAvI9u95Dz1-yQR5V1?M!-T<)pq1P%@`8nY@ zJC+h5datpnKTp*jXTEvcgi~oyG38O2+E$;F*o~K{{Kna~z3=8x@41Mc*h;2Y_T2jg z^d<*~)#c@`N4NI#{qq=J73lp8B$i1-Jv(CZd|nY*!FlLie$ZMI(o2VF;(=1$M0(qo zXYymCjpc%5uzzf1cMSHIVW%1!?f)p1cDBv-)Ig@h=N#O zRDHf?LD-*y^uS-3rvx21bSWB5oO^p!{*8dZa#7Yjt+ABwui3c6ozXi!c`vvwAHGp# zZTHKy;8dp%`_ZP2mMpr@fvMFGlz~n{r{H>8VQ{j2>g5@$oRkok=e|(sEV_KT)IzX3 zDQ_8Hp8T^xH+T(8eD(2`X_uY+0}{wAr2GkgdEACb0=L(t)UOX z0dqdX$l!}N(wx1mp6O7=St7|`*I>aC(y&(A6&Gh?U6t~@!|U^r{o&1)bS&BIq>PC= z1Ivw-$TOD4?icg|yUM~WW6uVaQ)Jcdf7Vqhwk7!@uAM^Wo(Qxwgi_h|sh2hoW+ps#o>O)3C&GZFs+0^I(5(Z=@q& zva;%%_*)w<4W8zUjQ75d)nR8BagF=T8t`En+rqjGcovn%@cl9mg#^T zka;fz#F^dQ-QJ1kM7mNGB<8O(MdK}W!Z>v0{)`P)5gmt{ZVeEcL&j0OmdCxN z@H@swe^b)b9OB{2N2^ugzK4}o^hM3;6`@d2b>*jlR-f`UxCchH&c*=O6g}sPM<6Hx z`=X2B%)X9_RE{cJ;VlY7?b3(8MMf^Zts2l`Sjy2;`ayj$gizvEvikTPTh*<#55&wT z`-cp5;-F^tX+h@}xc%f)(|YF9rAAn_Mn}{3##1SLy7Xa(Hxo$MN5*o=na~RB2t+cz zN|4IV8-rSl=`IXIQK8??sL1}?+bnj{$-Bda=pFK_?`vyE_b14S*gyYawOdN_`t1?;NsJi+krl$O{a4`?mhvoCaXQmjhr4RedQZ>taxRs|f z^x06LKUK<0HsyMdGT`fkKZ(FEB0br}sziYd@XnW8aw&%ZJQsbb`}EW6Q3_k;m1VbH zuzr639vT6^-jz7=D6e?cG+S?gGIoAtpZ6ywx2tu3X6mO-6>pU|bq<@GkEgJf{% zGQ>e#ShKrTi)>c*88YnTErFrq(+*s5gN5QI-#K*XBrg-^Vl^@S_XT4yx7?xku{_{F zap&L1bC=4@-hi1$F5Y_R+J8shBpPCt0>NYNHeQ(f^0(-w>XKJykOl$pJA%m=5|Y-O z`Qlwbg6`RYx^|7IdH4yf{I&GsRbdGUQ?W~Tt9&&nfKu$LYH8I^A6)7tR1X-MNeFRV!g2%wA^?DhFfGbU z9nwyh*Co*ZBEJn7jdDuwff^@$>9{J@D?`i%Af#`E=v5@df$M-$JRHt3RJXe6(gl_ey~EUhpBkUC&0k)&x$08d84t2a+ivM<-_F ziL+a(i&MJNjf(i~`DrYwYj}gEN}bY~l)~mV9A%g9txO8zAaKU|&uyMXFqYy&6E0#= zwtPN9ku+FP7HB_(B^`t~(EfOU7)PSD#3S;*-1p)sjK{DCnHD$Fc3;XZIXXJN z7i^EDnw+H`YOANTKPM1#04P5&vvyN}5G46y;qP0=!sZ7hZUGA|0eyuGpG@!2WMTA? zIiKT65m$FxMo*c>j5p@{ma=(7%H<8*OzcW43`1&Ei-@So9v`YD;7sJNV#?BlmB@eA zt$B>?9lGtF_{Y|ZmVXV*1zsk$m>Cmlzq0PombikDT zEV2&-eWaUmYCy?pKQ zMrRA2mk`Anxo{8o81BAZ)Gj=?*0g7EhkVnQ)h4yL)cXfGg{`fv-CfUHttTuA5Gv$B ze)R1xQo-9rw`a8TiGP!my&ISt*l>&})kFsy?|JVY0@npdasV{?xVj|mKVc{szeqit z&PqPjQAQ_#kT!r5p_^;}SIF>A-^02u_mQ4Ad6(FZtrq(Wq(dq*b8i|q{gAX^cRlaB z#XAg-Z7&P6b(1G0B^B60&uWrifH2l)CGtDdlosgxo$}cUlb2{|Ef%MKRIuLj>kV48dUa zG?8S$#!4{OizAjWxL_DUhhf1?!0=Kl4SVHBH5#9=6}ecZ{Q;zr)GN$&LPQ`icIco! z5%ZRXQb)I`y3{OruLKUbCfpkd9kUxyjaF&Se9(IiH6_OwP|+9K2QhDrutK9zp)D&A z?8v&}Y6d|<0y1KTvfQF^7D4KlHU~Er&r2HFifSKrbVxq=%XmP~4RG!*lPA(FDoJ(~~8lYlDvRCiYi;r?wbTNi8>Y^QfeL`-BC~ zGxYr_WKd1kB|tO*w&w$WHH;p0@&7i?05*=k6PU!UMid_hbj|3(gnKc>iEo|f8TB?l zCck|<7ds$NPpWKnkAEMkUO>jTNAr!7v`CcCn^?0_%-=f;k1~S2BLjOEg?#rNR|5nq zc#l zpXqH^rOSxhmxlMzt>%2Yz#fSW-FHkc5l_Mh=R6Qi9;{NiE^M)g*N*}1m*>a#e*{=F z-b8l&eBKmfw+`iLgtYO$4?X`no`yvhk3C!&$TZp?l=lH=2qEjwx=D`#^4JGao{N6bx1!^3Tm59^%`Ix21#!KO$a!EuG0A z%*%hg*AHaV|1>VMev(kc#eWBwEG7Ia8?*aBqoHo#wYLkxmQ=%|LzD2N@lP^&G}@&+ zfxSK4S*oH2wIrcycixi|R|9_T#z{c!w_PO|&k%Ik_%yIlv_@fs6`6K7bDOhOyLd*Q ze7L2oO|t_({x`}b@=R7D2gc?=G*O2W;co?Nr4K(p5;lG2v3K59(RyAD5(cMu0T|QL z1$p$x3&N>#5gF_>mnrv2;025b&CjaZpEz_tLk4mJT~=u7*QEG>9s9vrB7QH7z2(v>Ovk&C&QD)Ufh(xLq)Rx|E+V*1FlSgkw_eKkZ$t7HCMr} z`GC6%6PoG@+3n!+`c@m8aI}-tx+eSm=D3_^yH`^6GJ7WA1{&QYbKl>mJm2E#v(o<* z$lL$MjZVV~M-_w^=?8+fg)78X`Ta3|nIdZJp%1o;V(qgUYWGX|7tiE3&`dbde;;5% z;Y7;(YhI6bEWYL2x&~mDCsdN3UUzF5L7Cjz|KZj;)7=Ko-$LBx3)%oxrxkc?tY-4s zc`CF_n^AK%Q_&LGo7DLz9erUZoRr_;M)sQ>6O|6RR9JK;92R zBvQc?NH7!lGg*r^@D@D@s7@Np@B0dTq)w#C!W((&Y%yVBE56I~NhcCY7Agn7$K-Zi z9s`}`K1hk~37C3=ZgR`U_L0Wupp0Al0VTp;`1q60A5zlj#vuc>S}}^QD$YRcCC>I%y$Ox6S7**2Kq_Ik9-k9_YmU@*VJ2jaLki zM*K{Az$lQv$KSRK%?$dcU6`D33|3Of)m*h=_Qc1iM9Ui&?BsEKk+N+yV@@GD9a-9i ztIO+S9Q*}s18@G3)z(13_xJNC2%4%sk65|h(($PBI@6s)k6^^xGZA^T%*mv}Rs7c2 zK4g-l%Iq)#b?a*k_AT1{_^aT??0oyouh_pz8bL`jkv2 zQlpZ+zX!kz7%TMx5@4Je*7liA*4Y)X-D7<4*18OYRL&S2PEo+v%-&E*X)xETh^nw2 zsh>op#XyBVm~JDMRvW=oBd#i~dl*pNH^vQiyA7qWZaAvA{*~()kmk}$YPiJhRO{Z+ z4_DCQs>zC3hWn}wF}tjm$&$YE@-ieb0InVC1YeYkx}cEfq8?R|8(RS6on*$!?%X&CHDWc&|b%&}J#Sv+;H84JtMlQXZp{ebYot zr$+pUIX!*>fR9-d6&!N$rOnQLDgrBnKVHgsp?~URr1eTahHW616W4za6?wzPLcafw zZAmNbm8bN^=teUC`-}F-qOreECj7?t7FL)3rmQy19a{el@35hmr4&6I zwT(v&kJXA1j@8$HytbG= z+#MqNgl&GH#X^5EagvB6XJ z`zuQg&(PJyW2+$baS6IjeKEkp>Y?|CTOHXr0FrBklJ!8QlONE@Dt`cg;qXzz&S_Wu zKt+=!PW6ow2x$r?^bN*E#{fm`(YvBgug!h~304*NOidQjgvsJ$FL3d8jB^Cyspa=od8C*Z>kgcKN(F7lr8&DR z091rMm8NVy73nBH6I=KW&Lhk!_r+CGC{Q4t@qNj^Vru)6i$b!KRb{-KcI7Tm4m3IK z)2mJ5#H9$|iT97YiXrfraaoy}lb^+{s{F|(x0tPE>#k#*Gl>z5zr z=^on6rKVG%bN65uTFsVjp%bZ_tDg`NNVvH2s=SAotg5Elu1%&Ykmf~Gbr=a=XL3GF zG>I`Pkc~cXuOTi*W9i=yC2)ctdO0ApJJl=Q`PMh8_QuTR;M(OBzrv%+t96;(!nJjSe06%NIsmwtl83GO?QvX;q7HR@)LdTZzu z0IrTC9z2r9`96Y`ft3}sySosuv<~uLbYjMwI<+~qDfMqq%>P1s&ck{Z*}be?hHzJG z4LfGGkX;dp4OJGZZS%Z>kY0l0mWsDm$fqUSzeL-uomi?c!?sz+n@2bgD#FJs<$YwN z1Ru{9Cb8zc;9_gnhz$H$w7@e&hCOf(I`nnbdmU-~X;*in)Wak;^s20b$r6Ntl9h|n z@RX4#95-HhG&xd)$IR;#TYHV3x2}91SH_?$Sf+PS*Jd6ixj{?*sG^of5ovEnZW{S0 z9rKOvYsPV_@}8cavOl9!JY;p4Q9rhQeW;uO>?oXfd!#PwV0Zlhh&(_CJkCXGVIEjL zlfmH^yn&oi$QycQp9~KM0!;eynFa)zEOof3(87Et4kkUR{Jko~WTD=5->yFu_zx`w z$zrZN*}vC#9y-GK5a3f)eFK4!hX?j=kR)PFmsU^;@)B^Ju-hryW;<)+2US*g;^#!f z2oY8wPCrkkE@Ah-z5r0cCyp|?VunWhHOFCeymg-+Z&f5PTQ>dG6IPu5_|u2%&Zy2u zo$Uf$!XR~X;oPA5<6;Z)yI}Vdx2K z;inJpap2z;A6;iF!aCjw;k3^KCDLr{YY?q>t<<#QVxFBq^n$|nhD$C6H@08QG+@-m zqe8ve&Xb;l)9D~Q`+{ft zCET6bJhCIBg_|c*NnL}_?=25GR0bbXZ^}{!opaSal3c%?<|S(2x%WT1%A|~>DWPfd({mRgtQM3Eee0VYe%j=^E%38aX>16 z^_d+p!T(+z^48m6p6CWv%KZ`dD{8%LEmX0B_ZcblFSg={YqT4)czItW@LFA;M&oz1 z{*M`v1S&{<5aa->XO~wu6pE+TDK(m-AJu0$n!W@{p&z8$*1XL0rHs&zjsS|{nmo%<7!`A zuOa-Yfuead_rq@~svux?x-FNp!>N-UYPXPu8mJl2{-mwoH?^ER&7ZsF|G5tLAy2B~ zu7J>?gVy}IqY9nRaGlo9qy5>hO{q3-@Gx@%v_r#>c5*;pCU#wkLbaSz<-Z@R0)s^$ zwHzLXbIMUX4KDvmFg)ZT1AR_xxNr}M&YtG&Y;@g`fHu1Ng@o030&C}C=SMbmDrjz= zDha}IKkUv#4KjZchm+mWtvxpTVN8L|Pf2f{a7d0{XDoHQonM$V?8<-l22EkS#QS(f zlZ6zV<5+AF=(p!VgY;OomQdtk_F&hn7{dP(=(Gy8Fl3{QPqDBqj)oSESey{7d*mHGG=xzDoC?0uF=1>TUu-v!X0Za#Pgjt5IJ#hz>OxRI2)G*6u>P znAkP5y>W_p@pFh&;LLsWL$5Zt%1{Uvs{Z;)c6?h&8)^xF5`hZ{y?9;f+i7H`*fy?P1NjT~s#_}gr3 z-@!C6B2--Ov68)Fr_q3#JndC->eB%#0)HJ%@^f&>s8y-W*M>Sm6{3QXxeic3p+b|n z{(?uDii?x2;ocDub=lZlTsbJnjc3|-Lm(8vH(@(rEh^~QUB(NOP~#6v^*~kDnguJ- z22gm^bb=4cHR{60x(9E^Bq$d#sckmg z(_fvuT(ESjmrAMm;IG{t$^^gid=i_bwV-yK#)%`F_$-5m}`FKh87576CPMoNWJnd}82#-d#4g)>oYv{1r0j`IEnU>K%@X3Xj zVt68I{nETc)zR({o{8&h#xd>J;8X6_(LaEeh|@{nk5~%LE$Y>lTdUdw$tn2XF`VCM zIki3G#cb-alAQrt!CNDz5mwI?X`zkI&SBZ+OD|iN^2;x6>e7qSk7FHSWffP*vo#rC z26_rNh9gyDPm3cbIkqvH`m}0UI6O4JBs2>6EU*mTsAm(3aP_bTs|hbYte_eyf&L@V z^aLvI$uD)D?#CmGOzp$)h0S-M()8$!5;|_ zLC}#0YnFG8Hr+zd3MHP@gu6d)=5x$3o+a)LM&a{dqz$N9fkK<8tZv zD%jm4fa3imN5I<7r~4h`}4g9EP5)l*c>W+eL=gB|1hT*x}w76BQ-$ZPlwJ|lAdV$db- z#h0H;VMQ}Ff(en>?r-5bD#2gpuR@_+9#bGs0ezdVux)j zafc>U+wus){&#t0-@bhVxqb74E*Gz=gT1bXd9Avtu$)cGd>bwZ#%OMobLcpzxJJf) zh0^PXk*Jlu>z!ERyfI)w{It0;?=9&*cM8!9?ZG~B=Dw9dQR=HVk~N6lx-KJc!j|)b z8QSPbH-d-&WT!}zwHNwvdRraUuphuRC7^u zdHh`0QsY4%)1gDSY<%|1k3^TAb{>{_(68(lSIZySr6XLb#5b!?AX4pNjcJrtK4x~L zpI2+tuQe(7->0vYVF*du<`fIBpO3pqs88E+xmUl?b{t^jYK!qfd#2^hO&2?x$PypI zq$sb`3E(>WzV`t6k++IF*6WtzaUZQnh`6&qlqpp*BK!%!$PPNLHkgJc=jU^C{x?A$ zm>?Y>RKHrbL*aqboeku+>>1BLr+-GYn}4ky5TFSiQErBupznP4%v(z<(-DO#NYbsX z-{v#f5%B^J39*znVUFk)(QGPV8j76`e`)0gIAygAzCjr8CmR)j^T zfV}C$t+N7V__9O9m~l88;Lxc+i~0BjjHpskC8#bgy%&7F*k#uBgyY}j(n*I8-YhZ{ z)?BY3 zhs2tJtj7cp5rni86I%Kj24~d&k;j-T^S@ao08_0-g`T%itiq4w*UF09K9B$RJco?& zulwSkfR*x~L|9n3&4(qvJv7VjCjDH@->??en8~owlFEW#JUjZLSyRUVAJ{s;@RN*qNUy&qG2r!0P@r3gYU=ZEY-~if zcMjV=3P$uR(-*NOJoO*6xQUI9jt;m!GdX#0^JupIyHesDTdA33$hX;gMPc=r6;}@r zc5Z_d0KK183XB7~XO6GY@ooiYD*9C)kP%&ezx?Pd<>+?9NicW?Dp>#GYT0;kI=}@+OiCR0(H_ z77awKy%;$wV9M5{V5&*&gXf;FbrYQtL<=DhG>>qod$)3(#IrQUQEEd3Hp?kXEdTCN z3%D0zc*QH#65q%yl)@7`S}HdV#Zpe+lu4QwW{N%itsJ{&f6#Iona;)ftXw;5K^@Q8fdW;OYKPQ))SSEk^~-dn+_Y%Y5NWz@2M-$?Z69;1 zc`{qhbB%>7@}nr~S1S7w*UnhZa(OuC6y4)gCjy(j0_Fr-q!jVAPutjkw&QFU%knC) z=fqjPNfTzw0xo=OsgZ8@B$sUv(dJyadx=3mjY;Qcx9a9TkldOpJVBvuP=JUg2`XNQ zae#JhL2aqYtj-l>w&--xo;mj`C;d#}Ym9ILU|%mDiPJ+rfLax!s>R!+OT>FTQ-VKK z?-s7~o6-%|kJPZK3)oouBrz0PFhThSNqWF)z&fgSWgxZ1B2ns6zch!baS# zWqo;_ki<$NX7D8{Y3#0<2oEO|B9It4+*ftz@PO!o2c0^;z4-P46<1@z_usB0}{~ljBtp~vx2l+O>(2B2gf>`Ls?nY0;VZ~qYZhr68|Dwhg zNns z&});Ck%j&=iZt(!e7}F?XG-$}Kz_9U4(%ORJNNV{cte2kRKGPo0v; zt94OUQ0yYPA#|G^G_6-Avks28%))-n6#7yD+=h@g0ZYz8gBDd@$%Y;)kYMn>`*QW&vjDNt#ukI8GsHkneLwA%YW4CbVaqyO(H#A&{EeCMOm za-Tfs!QPSSgz$$cx=`l!?qOQXk7rM%BMe1M?AM6u_xFldHN~mojEMp#wH1Ql=s?=1 z-!KDzN0pleZunRe>KG9sK7JMYaW*xL`;K;9+GEk=nkjwFW}z`PYyeotC~pRaUtmmB zxZ2Gf3FqGv7sQg?UtL+Li5sRG*qGQQLqG!(ag%B%><7QUTU!v_Z?@J1XI&DSxoj0g zII9qqPu#XU0lYHa2Q=6dnuC+`prudbt_)`@Gj82&R!y`C zkjW1;e44k zlMCHPoZLPuWr%VogitfaAPLFRNhhz#^H~DwpqvQf#y=CdcWAq;qHS|p&JomskLh`x z@g{CC5KxnT2_K-j@dLuF2u7$;IhaQdhtVV-qEb3>Tko6pR(PGbbbq3Nhxt~E{B*ya9kNK#y0Cn;{%&!yP#F_RJ2Z{ofOF?}>W} zb6bLga39aw0O+NMWhoK#09xpIxx8<`ndEJ3;w7mNh>qQseWDD3I;}P1M^(vkx>j%h z{f5->LQ=zDrB5P&kFke6QO?r-u`!oKvw38_5{18NkT&Uim*FMrGIgNg9yqrTG!FYK zAD@79Y+xc2rU=9qUr^Yua8-EiZFd1j3&=kCe!WmNJr=!Rh6XKJEToF6%%tN`zk*gy z1J|bJ2TA`52Fv@a>yV$8>-|`ei|9uxX_Yrp_1 zxP0H(Yjsrn`E?6B0;5R4LM|{ETtlrIJq&e0L;|Lm^#mG&;?6$m#&n#QMK$+S3e{)`|ltBw_h0Ule{nI*D8Y1|i|DEy(f6DR?i zNS5M|sqs4r1OnfKRP&rX+9m9G(X6AyJ2*bL0^;Q#HZnS@vi|wh8i9X;@cv3LtVf7> zx1?Ep1D-))|L<2YftjPGLI0$tLYuy0Dk60a3_q2y>S%ECXA-K`WcoJ3|EX~z+rCq^ z2fkCmngp=1jN?=K@rTd_9_rJ)1Ydsf-R#7ST((aHFt#yaYFxQU&T&+<9+hf+o&djcYpV~DydHNn!--n znC*l4{KQ&GJQ~+|U^7q?$Sv+x(;7SeGShvXil?VFo6PxM zZb-hIAn1SBHkR9*`2BzLE=oRLeQKDuLhcHp`ar|yINSvftRF23jOQ0kvydwP41|IR z^7^+w7ZhiE?mVzQ|H4`6N$%wFQ1~@?nT$WW{-nDt9Ve{e=pL{^HbZp|+5i_Sr}W_A zWsO4jrRAE{HrezI7HD&OJjh53e80gaY0|I0g0SQ4+&o`lQ#S}chq}iS)Kd05 z*pwq^Ad}=nb86P29$(vNiu~ui^i%d=6_MwuHx=@%vXH#eP9XfhFQ3FH`988@z=q^Y z@*chn=;|W-2$4w@PwpymX%V10%omM405nFdjObMHJ*?PZDivbl;x79s{@SMsfj{ru zsi-7x;zRSjcrdwUDGjxts)Y70r&!THwf0o4Ftq7lEoU1@M}|7iok87?AE_n%qMW%_ z-fei5xpw@#K2kQ$wUg(WiyG(QIz%~$RFE4;UmQDRW0c9q?|sT6-ei?q^RV^AR)UF{ zqI@(ACs-(z5(`5MbhR>=)RDYBq$zHm#D%O|b|W^HZ(eL>JwQ}v#`V=gT8?qi`p(Ff;qOb+*3{IBHD{b6NA4!ryF(T)G3Do*Tu zS#z+AO<$g2s1Zw~{9x{e&X)L}_irTZjkRAd_D^)~^dClhd5d~pk)qP)Nin)w&y}y3 zbeaQ!xDD*0rpYa-YVvZ<=Q9u7)1JTbv8_|rre);HAK;t}4LW=Oo|N$r@?d_NR0r*M z;Je>oJAk^!SmX7g{M$&b?yrLOy^P!_OOgg5xf}w7HpF*KYkMgL#70yyP9-{hQPz@` zciA{dBf#j@eZ(F;nrtb$C>#B8c%nh<=Y!q;2A_rla&! zhBaA69xwOb38$CvJ93Vm86N5+OVRMnBXR$^(XNrAes}wc+4Gqze8)JlH1h6IG?`4k zwj!?^+oKQPKlogS9aTMiAKPN$U1 zE7*&E>|d}wcP@l7>pQE>K^zV9k4>jxg%X@n_|lv%*S3?4o4(!IR$ zt-aH+&biTCfgqsIxsI^txZRd?dA0!O}#+$n`=#oGpA73+Tw zdMZlxeI$1meyo}Lcy4URF}$7F@3P(6{3*ZT@FxiW(hmWIAtjy%8nOX;@)0J#PnK3TaLgq<(v~XXVdK57A1o%8>b)ey?dO*jUqST;7c_U#?6&sgdy234zC- zLsUDc5%++e>VNXXA=`iFlV{4=nT%mI6R_Z{Nq2ZH^dphoT+%kWJb7et(Tyixg(-No zmpMTFjITsf?1Fky;u0Lq!d$EuGn(Yces*a#*dcCdZeVe!<~ai7mJ!rCQI*g77121niY%3U~CwIytelS zQV!RuJullsd7}l~06a+}&DS~0*A};J^$HMa{F%2ADG+9E{R@;-#P|XeS(OQ|>6H_G zO)qnGLo&0B@?52i8%9C*Q!_`sPD&gmz9)+p-?d$ke9c`7_&5+9*#?ZOYRZ#;hx#pE$8^ z+2j*KEB491Iy{d?Oz##h`86;%`!xRg*Kb8VQTy}9Vr@MlX)%Vn~Y0*}Z5jK45wT>*U* zKOGIPdC=yq(EO}>?=X>1T{ZcsqR(n`ZMs#GCzd9K>vxgoihE<$Pouxtem!>^o;=x1 z6Z9Sm60L$W$a*9@3-$^QMZ;a+oC77D+M<}Vnnp?RjuRt7NlpfZK%9Yl{gMNdt^=10 z5~m8y&eNwwsK0zCi=;eFoS80eQekdwcb@UBKfW{W9()zVP9rIs!OwN}VXl~EP(HUR zt6`3hT<>}=xRodWY*(Fx#FMpbKX1}n?L}!tbwWf2M1{z?EvfM{2ITrznUVMzi%{ng zUTgby|JF7hKt2f%DUS_ys-$yX)~~2tP6*8(RHRe9m859mfDI`pe^PM2YcwbgTcm^5 z2)~Qs${ajAi9nP>3YU@19u`In)==JLh?kdl#P4|`;k$!FK2rxq4$|JQGe(z;(bXn3 z-w{sE(GFr#QVta1qu1r*%4h?8=xO98t5bL`w63k8ql!l}p5RXjoM*aBoc(7<89ilF zZt9AXiG`KTncq+=g`xwaMDfuAly<=>D)b%>{c$_N*hcu^-wev3@1y9Gae>6HnJIq> zIj_@FG@(yoU7v}GVm`!uR&$}vE!ufY8=3%*NGE?N2t82$jxzap!{qjOa&v&U0T4%V za7PU_DepM`w;hbFpO?F?n%kVSwS%d=54JAp53@fFA*zk+J*gj`*s3aG*olQQ(C4@5 zEhSUD=7zo0n9#5Zd*16hcE8*M;0^3L-!0gNuq#23-16dw|Gk&;{`eZ*41nR2d1z;R z!cXtvkKFtGq7BE+*;2vtni;~o@89rov|M}{0^l3TZw03cqw4Aq=3TeLwS(G`@219a z8g}uRe6a5up8PS^GI#N`Fn<$v3^T-Q+92UdJt#1kP?I4gxi&`vRxBaWWXb9o@aoB+ zyWS=|gA%%xRPiAAk^hdc{Zi0$dtZ)H%yMU9RYghdwqmn9abw|-@n>(J*=iPqG$)t< zUfH_C)fJ!1a7y*hwl@<8*v@#FF;z-QBi{%CwZ2y_d)9H?vG?ka+hit5Cxb@6TIuBv zq%u8-RSo3`CahLs!f)(*5b$+5CbG?_Gk4R6!*z$}=prIDtFj~|ME))LC7J!uzrED; zLTpuB-?oS#RT6|Zbup84-X{}vC=)MUj*#B#sDisR(0Q-jkKJE{w(uKhXT=)+;7d=Ttzqi z?*i5MV84VY<2HJKLI|r|0yYZOHYJk&yraPkv%fQL5Z?CGO~rt$H>eckv%dGLUqW>$lk&sTbT*@ zT}RL7`}?2wx!?EuzOV7RUf1hd+^!2lL$vn!>mSEaFWz%wfBFsSpj7mD@|khcuQzsJY%_T4#`tb_$SjAZ2u z+;GwY>_JGun+0ucrAzJVo)6pyNlwGk=xe!RYuq}6n4&)1dtPhDGzHO%x2vvZot*Cp z{cs&3qR&YU*xAhe{%I-naJNhiw}sDsmwTw0T@q*bDj2UmVIt+134iLiRe~AEhOTx& zDN`qDQ#WtEWmR}xU#3?UDa+A=l=fHH{oqj|BzL76>_f~(QKMRVGHaV;)88t=85qFU01fL#U z5X9+rc4Bm2*&iVgXiz$7Pt;<#tRvW%3Bv`yY3*lKx`1aF=N$2zX1iXR7u84wO~LlRMA82X)Bm8)13>?a%Pz@k1-)!$xY>{t*Z0?qF1;4JzVS zOz5((yL2hADxzaAKEF}zvasqTehq=hfyytIUx(mcf3`18RQ#v(u(#gtGrQyH%`f09?e0RAE7Ot? zf?!5TL;l24How`?RPxo;v#u$=);4)$2IFGM*O4`0;XIP!mroN2^s5wGJ=_-W-8oYxP*W%-$<~1tW2ev#kXtcpM}c=<6#g;-RCGHXK%u_%L2z z>-tQMYTZ8nw}c-&TKT<{my^)=8=j4t6ntG9-~RZLXAW-Pd84HM@>@Cmvc*>ZE}UJl zCv(A-OiqD?|=`Z zUl5V^@Xp$9QJ#W;HKyUf<6sujErrr>Pes$mlTQ!`KP*^7LC)4$vj1LWi=z3shX{Vj z3?2WBMVcCzQ)UGp>;mfZ`l#H>UWf13m37QOtl0fTv=PNO56;5T(M}}gK-2zDm=u=; zr1^(BlW!EFAmsQrI&9T~fF9w;;`LPYj67&xRod`1j}>yN*SvL(?O<)!_(p35hEkr| zT>FB-B*!4qE_*tYD7416RWPNS0VzGw)6*04o~m@qvHFppIV8AWRLY7!J-PvDboZTc zkH*MYx++&|gN@10BF#nd-n{zDwV2)+7@^rcA>c4Q{Ks4r%+{Y@f2LyJn9HoFe>Yd) zM11&g1!-(d>P?SWfa<>GNu!6PUj2|YEi2V`(W__MY=zcEUGmo%umsfuwM4?y%B?Sl zwiKOh?wPilin-Jw!}OlAv=1?RI;z*{=kw$@%1;XbdjVp$gI_-%+Z8_#x1sk5Tdp2= zYrV_=mw%gs)rO~H0kAlO<&KWEW^ET?{4+Tm#Feu5lGqp|A}&YlV_{)4(YN>k`GCLXs!^l3L(O{FVy#POCS@$8QRn4{>{3)uZ_SNz;xGBJeZ` zM4+?u?Z1=U{+8_U=MuB0TGl5$xbObXX*wz0PcEw9Ctn(rd!;MJ`?dr|;}}SPXK&Yx zy5n;IJNA9kw}+d4r0bUpHDe6|ft7|T@V{EASBc{-QoEm|E4!(I#-|Kf*tf43=4J%@ zN=Yj93xDSw^?dH&*sKeel|6ka4=UXO&mg3$RN+}9-yp&N=klk@w-aONai%9Z13NXE zmk|iK(C##?qzR|~=j*wo&idyU8O&#ra%&+Iqsa*$@Tk@*L`Z6eO_n+wUWQ&LD!T0p zZZZBOq$?=x*i!VyZ){CZZ2+GT{%M<0ri3yohzq15?f(4$NBkL(d;X}n?C_$GH)4(L zKZ#RvDt_oHAG39JaaqthGdlG1=g-WVv0=vtrgq&AT9EC%+63*LePkVA|7{+-xs0$T zUiVBpdJ#kZ`|RHxh{;Bu`RmQzYA$2OA0TA*9!7sLZ3f7ai0TJcs!EfXLV1hR&OYOA zND@gnSCRbVsR>!V^Dc@$QU?Vht|J3)=rkg0z9e~0+!}MGo7$6x*yxAPc3KG{ZfR|e zx4rA|z^l|Kn}B0YV5SkE)b4uW9`hSTA5PA4~y-36GpK$cQ7c9-n ziTgpQzuT(0y;VL--B(&Apx*BYa59gBEDT#}O&vwtht{p9KZ_P`VPOXj`P-E3y5$=zv*K7Y!ZjVYS70M(sD;`%^FSGC3cMMOG6VmQ}1&!k!`<-3F9p-yEcB6Sbnli!XwW6TxD1Sd27Y- zUSw2M{6|{~>rN;C_KcU>+9>rgTg~tS-Hw{^AL(ZNBIDDG_=omBsofJ#ol8XCM`@}A z<9S}{ahb2}+Rckite$PCHxU$G@0{wOt9E7^_PnUB*8UUhS5sx3Uv_tC^$8)w@#mz| z|6YBr?=*^Zg^bLzG2Mm3xqF+Va&w%mU?qCUGfSds4Dz|U2+uyO+^vo{>98;KGv@k; zE?~O!J2b;(HOU@mG?6-_Tz{q@c?;L`e>7qJ*r>m>$ zlL9m&aW!MYF}+N51g~^oAHp{`IN|K1M!v$)Fm>==@p7GRK9`MVb%8Xel|bGb?_KM$ z0se#w>l>zIJhszwdx90!cWhfo1#$#a-)usJn#7w_?@~wuylGsoQ08+ggyh@P;6)Xa zT71qZg`JW4S-Kg2|~Xn7&ZDg@PGU9kFtt{&{cM_15KJ* zSaeq_V|fweI8_tH12!ex#TWBFm2j&Ukv`37Xm9oTC|27@F(Vz>0Pr8qXkhk3AbcOC zO7u!Qv-}j{=LOlgHw^Ap$(pwJAo(f`6J$umjj#Uf3w$kR-kRNO1coDK2_=%hmM85U1kIteISK17DyVGi_%vEBZq^^m=qB^8u|OldsgRQywv4i zJibxFDHPPfUTCs0WoQ6az0z%1&~G&cs`q6>L3k6@3BBC{Eke=PHcn%IPYFp6N)GbG zau)uB%4;_z5Yl=Oj-*E;mj0ndLGDc#EBs6Kt6E6tT|HH#(aU5z0G#bezR4Un3@W9l zbX}*Vv)dh&Y)U;e4S7NkJn=m?qY0oV(wTV(MOOoiM{hB?(uJ!0nS`VBcfA_0UZwoR zHXQ75?;&nl8X`mU;a#)2X!4N+_<@SlYkn1hjeXX!iig|HWgAB`Oui+@3Rir|Kg#!D zbdwYN>+plbf*gyz8<3)3FsE^0F%RK2R0mVq6(*(;fDjcyQ+tV=&~G}rf*VSi?O1N? zS$Zn!;9_*mB==z3C0pyvy7Z|4TjT7FNYGj{qS`1s*&k{CGh@2?3VpKO+#GST0Lb!8 zb#r~k@A04$=15j|bf-t7JzBskkep@dc>eAGec|VOzjagDv|` z^Oi|ocz|Hfihd(Ha|?i_-^b_zcg79y>JYXJ1vLo%z`^qd;L|3uEc-dCS`4gBg9_gP9ZO#i@hl zLXomP(HhH3UC#ta(pHYI?m_SdiFG<-<8w%{e?NDtNyo1bZ(-}jxCcU&g&wY;{#kZ} zR}L>BSCKz~z-RM&_1)B;gRm;hOzfp40POu_Yo;c2iXXb}yVqvQbi8}A!4T9?qVx{Q zHndgHO~+TF^U_^+V?B#cTYj$aJzwXPJsytpmV*u2i=O%ib(Kons8j0eC*=F!cA#LBm(tcPVDh~nXn=q3wj~1ah(|ej81U|DXE+NYF$A? z0vhXP#QqH7M*@kUWDaMkoR%IwCH&aUYELC15mqpBj*rIV@+;F%--b^q#b%rxRTQ+E zx&eZ%P2aNMno+5)<)F{QNnZm1`IOS&?D17Yds)yzn==ciA#O$6Rt+ zsT}tup8tt%)6l8_fyll;6YrW?UiW^Nnbs9ZRC$FCdOzqJqOU-T3p->OM9GY*B@)Lz z-6nLA3j4BL7RsFXGO|E5a6DzLbJO>37UPwwcl$k1PCtcG*|ax*jm!r$`!p{gG9c0j zu65B4?8Z#}n%IvzsaxM(eDihb=;%E}J!H*ceR$rDqkkX{0!RWQflH5kyiWN4#1!aC zyFa^EH?S?c)upa)8lbgA9qQv)e5O2h)0RIovG66w_)G#!@0&)tLX0Z|n9_H;lmuMp zB{v7Ib>^O>l~l%UJbPNK;B+y*(EW|n_u|hqm-)%}PZBk}clI|$7RWD#%R{?vtlCew z4EVhmU87$DCzWi}Bjwy>^$L2N#CAKo1_S?d=ofN3F~UjF4K|@Sea|8s%lJgs5evZN zk~zKU1Z+gYlE065s-7DEVV5<=aU6{3N4XD-%@ukX{v2)g9NuK{3T00=@2OY0AYzbQ zGh1JJYcng?gi#KEVK({8=PCKQab7vbzza|la0jgKH*b4mzG$K`akW@TobI_#;hOoH zo9A0vvLxH?Q)iiQjg5cM>)2G=^ZZsWY_Z!$MnC8Ji<@-dp`9)1BO#@db)4z4n<5|$ zhY4Akr0!^#*~k9OIIl4)eHstpC_tQd)*C{Ci`HM+2-712l^K)``jk*;}YAA#jM zIr15}XUP~^>BYU4m#Bf?)rrZ4FeF$pRRP-gaBt3jaL+rPel zu6_Vt595)u;3S@;nlty11KL@6_{kGphjhC85C{qL`R-fN2eOSdZZ=c+v?#bvfs6!H zp~Th6S82H0L%-A?sRh=5sH}cb5;LQ2fSwYUQa>_CITTE|Cxx;0Y75(j_gpMaiEI4KnaUFE)<0b)9B9cLBy# zfQ8RWq-mA$jC_OZ!#3`^YDnq0T-)sHrb)l5{H07-TFUsm3z)U18cChq7-3M$*)J?G zoI@Z4aa_6(H>)HFJwn37me}BB(&stZne5N7DEjpFdqu7YnNaA-%vjeXbmh`pqrW!q zwLmc8wC$*7IQP5Jy6}(~;r9i;8{V9;A(>7Kt=w};57m#fRo}(JxCVouKv;dlPa&!5 zeV`#?!!+ueaIO5I?BTLnK-z-#?7d#b8xR)x-f}mfZ!!gvLkTUa(G+(Qa8JZgt=!0# zifU9ky%amI{dp{VQ8e25C0ADF|B*hyI!66teFp9O*<+4=op_3;h^W4F-c1YD*VW&W z4a?)6^Jum%yf6q^4s|GA5Sz{|g^V_z|5m8+cZD6nMt;-8Xjki0|EdyGHaly+4625` zi7el6`A?<46N3*=%TzvNi?ipOtP6V)cnB;I$}cf^GZOx{s&s0Wzpv`@GF$B1RdMsU zyK0&sD|sNGa=E01zvnGrSY|sUdMD`uxHoM)(xh)vNC%@si+W>IJ$u~=oxcAC{IxF} zif^1@I7LzTnva-ikTRY!WM>FVg3Kvis6(L0G4p{m@r6zQtzj2+p5QRF>iAan(ATuI zG^K~vr5kOPj&RuZ8Y3(fN}N>>cd4_L{k>H1YJ{zS>~E6Qhg%=7AFgY}-zL2)M02%xudMBY(dyFKw|IxOuB^7h zT@px47#h-HI7cp5{@oh`@@z810zn{1=!F{vh~$FhgMQlS^1t>6$r?Wd(#-fJX(gLH z5yDiL!B@kq=Pq(k)e1ZO>}^ZSo2#+Mew&ctj+|YxVBGlnMuBwO5fC{feUE&suC~qN zk66c5>V&~5+eQJ~UXB+kA zR&CnR>d%j+%`;SI!z-<=Eo@e@JKP#-*_S`?J6+X6k;s^CJL;-H@Zq-Ai?NGnaq+m= zKHJ0&xT%tT_j}?o-og>JN_>{DkOc+tEON z?lS*&eMaE2bb**hS(`>eO-+j=4rWexRpO2=HJWn@X-Rr<1`!7E8A+l^swM6S$}^Be z!^xq;ifPe|AoIIa;F*b-MpevM!J}br9d3S%1aceskgh9FWUMePNH%9~=^f*Vhp+o~ zjmX|@C@)KhuXxQai$GJzV)N9p!G}WNQwrfOGfY|%la` z!%1&>LzZS$egmNaP=yi z_9(-U90Y& zKT{upYE$cF6ze!T(|pKB0*oT^W)FiIA`iGEI=={(7=(kv}RW@m0xLe@~jl-0{m=sJQ$>afbHNLtNGaXE9Q%2b+R( zDb9Ocvtd(dml4tia&riH7unNy`39;_mRy6LmSD?}9e7u`?AHei+4*$2`DYWG?3$6^ z)Rat)PYM;0>khWBTx}Fv?TjX5MaSAi>h>(Iif z#NHLQAzYE+gYP-_&3u#W?9+4X7%W6y#hOKH@F81lf&tAJyqYALe*NEjZ(!2zYty2- zzyh=}ox^&MQ=PMn`eIN*u;#06dtW!mPbcTxGrRndm`?uE;&_u04~}r5OW*ZUSDQzQoCKi>1bn}f ztt~-<(`)7DDSlPfGdmY2|5L9C1x?Yymud}`8&*_Niu^uNQ;?MciwjCr`)lUeVOGCi z@^<|mUv#Kj4MQ_X`EG~+qhF2%g=l`mSqj4~sjxF&Z(V#5CiW2T?@Fb>-#8}mz8ZEi zf!Uf&cYH|FBY0S7>7J5~O>9l_$|_|TN3=+I}BDf8e^&ZX^`FspP&qoWVN@{Zx&_}GTM6GL^$;-`grmc#bV~nBnn0m z&`*r@F$$OJ6)|s;NoGf21jPH~qU+3n+k!n-=;~e=w&mD9c&~Qv>Ufz&*JkBhU_&f3 zb)xX1EMfKS(fDV|55$kyImGE;dd~3Yjo+uGC4_GK<2=O~wQ3U#722}V*%OF*XZKrX zZ`EuaVDq{Q&_GWGL~JByuOdu)Bq*T6yvfO;^@_~K&REnurC*xY(`RP}yGw_H+_ZH) zNWRM_pYDqET^aQd42Y0U0VT=K_UYY*LR+gkmlIo~?cq`4G zG@@i=)i%JCUgu2Y%E{Ex&B)RzMym>gLM*bz{UhM;D~}_}U)=skpR(;ZR?{M!w0cVt z-(2hUI^f@#NC0Tj3i;oKG4Ag#tq``_ifqSS^=D=>qc<%g#cQNm34GmQ$U$M6Kad-c zU#B@S8B_fsLe<{u^w>TVak!J+AxD^J`rD?CWqLIuG=t&Z)7>9;9&C1fyH?Q zC&=7PHLd%qM6MS(B?chx5)E&_9V*wb!4|AU>}}QyUE2+Ar4vfNgh5 zcJeedsob?cJPq*NPOq;DFGPU9rtlx>WT}lL#RIML> zpn&l4`w#7>Ml_-ybS5o@tRF-`928XF&s((@h2uf$?$Q3n!te-P08_rzPb zZxe4Z#uNM}AIupL7|b?a5j)?{+A$ZL^&iHRaijmGx(WGo6-$)O%vhQ4|#$u z)k?rOZ}0ScmQr5sIlsn^kh>~b>X|^2uD-!Yv%)ekiEqAZBH<%p$Z8)DR2RML;qBpJ zNZ<1nGRJzcCQN5=8Lh6lK#QtPBK&XlFDX8p|GRovc|d}H z>fI}H0Q*dtRpP~~J_%rrqRW}X4U2@6!1N0%!OiI?mh!WAKWaml$#y5##vDG;D7$O zwCX1EgHLB1cU0(#*W$r}j=(90aAWUegPIoQ+5Ww7BG3N}!UHOu4{u-f^Rzm3?&m-N z$k2(Rm9CtV-v@!;t|pa1sYR2Rvg|y5{aQaODki?NvU2Z$<9F7vazQ*K&vxBmyO`m8 zQ+qy?IEX7bb=dXeA(k$H@m;5B9V!Un2@exvCin+s*&!1b2!}RPbt9Cf)dGiGJ>uTj z*{LelK}PEea*cNz*7NyZ0BR`|&<#lj#Qv=b0JrtwkO#e94ZO<;hnQe`b@^0^4_Jlkz2<)Q3n1=SHSVYq{`;@UYl7WctigN*Ib~Bd^e2 z{N+(mQ8teeh&W|9Nf-2xM7z(;a4iA^8uAQ%lol#|TKNHrrOq5#A`RDBqI-?CV%msF zw@vPv072-HqgVlY;sy89jyVAOvOa&SNtj+3pc*kRWrSVK%S0d~p{7}$@*)@^R}3X$ zvL(=#wd87-Vb!mXg&<}{vXPG*`%FK@?*8P5YbZRR-nX@mjg0{T?je#ABsqqLhTzh+ zIsdfi$DJmfmZ?Q9PK0zX+@`fB?eZuVJ&RYS=WgM09wH}-j`$6zC{ZX&iPnhIwUT-r z3_b#~k?wW%pAXUtm7BRqM0f1IM!@Mg;Jr4%+Ti8mV?s~NRdoBZ_Qn66X(s3cgg2YzbONk3hPmkasJbutcv2Px)F*H4|VjP@-prU?z*? zJ!cP;9!SM$^~G=BHZpm(rwXCKf+=xrwLu9pv?bX7dGhRmaP=eeI!Ko)>l1$tf+K*L zuZX=HA1M4nbY-w~15_JauNrGWf}!tTzRI=O(NfvQs0lMcX>)nc;jwsOGaoK5_;orl%F8THT6j2^zplPSCg#aZjygD543ry#l!Re1xJx zM*3>q&?h)s^?snZIvDr@EYKdV4rYAKO7nEH1Aj*VyQ=y|4fQHlqIWHB`9P}Hku_c! z-Ma2*F!h~1>D6Ud028{U?nX;!$)w8C;;oU0?k(A{uI_X{0NDI6ckX-)`}>a1 z#>U1F`TU{YxWO3pw9=q@igh-|CMLM+(a<1{g)?gW=4<|{B2rHSv9;_4rA=PgoMTef zbD1oq%v<4BkVcXmv~8YwRon>fLPXY>U7U1XIh&4vrKn+wRVF*ABXr{Gzq=ld`31)j zKI6i)aGH~``oFPj<7zIcc}i|DKDUs}iZE^s_K zy9UIq3w19{`4iozJ@@}ySW5y~oV`1J5GcvH+>xodV^t?IZ4^Co^7A=zr?8t()Zer@ zt?Ip8$GUm#X)BK1^QS)HuF#+5ABZwum1-Hf&;2BzT~=*gCg)b$mD5lX0&1f-mxh#! zDf=&3K`@u*Z{Ki!*`uH{le|*8^mhT6i}0ptT!#}b6T+PAuI&~vT%?`4`?qTGXD14p zck(ay3>j;PWig6fm{m@fG~c}~A#}=^ND%YW^O)g-1HsHa*WXVuK)yFW4e<+o7Jq`O zSp$*FSgZ!kc}3a#xC%%zmLpk*S{L65_*2Il5fj3w3Y);vMEmi1dm^j{gF=4cH+zAw z@c@_m#1Rd4d+Sb966A?qLxVvBiX-mmA<&S7qXvS(i18H^0rOykBxRA9{}K0ZuZd~f zdY^Kp{U^sVV2x5P!Bsiigm=^X;|B|ui4^mDh2vA!m_tZ})wG;n!iGTNV%zj}c-5s@ zv|SxW?=%wD$-dzeJ%hFuA55XWFR9T5jT<<=1K>j)cV8UvCM6G9RK6iWWX=Fli$YpJ zKb*LFOJ%v}TRe-7Q3G+nv1QjLwataiZo`R->JbG`iSzV${nC~5TP3fwx&TL_)!{K! z*032FO9#HLg4&Zt)0;b>1eBLK0h1j@cOIEeMNVN2l!QOn)Bruxg#NIs;-Y#9aNuSy zK)o5bY;g+qu?6g(yi$g==F<%;MWg(wo$~NLsKZ{IC2%2*8{+w*sj=OqCKA`GvQzbb zWBnifcF$Fdd+)_xpob_WjAQ%!%#U5a1C92OOa5H`UuFFoz zfB%8-cEOc(K@QYQ>g+*lmFyJ(?7g>-9AwnZBYDrOlnTZB(QUsKxKvTRQ3!O!qk)ee zjT>gOgDJl6_Y2TzEL;FxaJY*V=faPz$4zuyB_DB22#F5vS|PLWDiI+;NY8-tJ2#MG zPe@r*ksqt1vY1(R?(!acA0D50WnMNX8JL`Z#Qum57&DeuH0jZAL@hhluR7%eL&(^{ z_1nZkeG5Rk;?IDt!_W_AaOG&JKp26W9e?KBGpK}N=Pj(5D9#m!6h%;`ADJ136?=T? zv4i13Rg^0^YXsxE`Qh#ZbR<)l zu-z6w>V_V1Pfbb?SpqF!#MRx*%L?EL!_51&@CF?AHgWe~MMk|lGE?$(lOJQUgs*Bn|$QR)Z1f6mT@C;QtHMWZtae+_CT7IyH5%j zGoktw4y(TP(4&{%{&dyYL0I)&ST#MU0<2w90ybO z>~PPm8-r^?C38o6L6^p)emzLjApB%-N4I$C?|z4b#b;|J3F=lZ001AeI=aak;6F5Ai9GcyDYE2t`397r` z!XLtr1H@ULT22r%H^9=x4*U^3XYDf%4J39@9AJBRKUIf;#K4|Sh;n1#+SBqN>VsR& zdi2vd%9tG=cY`H}I$X9Dky7sH#p*Ovf@=4Q%sbqgvv6xJ>-*oDyHqx2%ggrPS`m&D z?ACmytP0i~NF?UFgr2mIxNTg^@AKPQlh1O9rLcOI4-n?k@O&Vjf*{K;Kkg@azLB$* z>A}zkr>l3mF}k=9X$T*3HvRz(E&$yM@4!FM1*fF%47k8>&F>y(-fBoh;4KmX93XR1 zvwj&hvFY$pZ-)PwQiDiw$X`Z9np=r*?d-#5 z7*{&{`BT?=&OGi|As|R`&MwXd5gCXwRr%Y?>Lrj2S+^3b9}7XmiF>_hU|Khl+&Mq+ zHOKr$w`EV+`tPBQlJKJQ6D{L~{bHUOX{QF{j>Cg5!_`m%f@C%>B{;m?+}hq6T1NL1V{FdLY_mc=iOB~3 z(s6^;-TFr!PbybteiBPRGq7l9?9XA@7+cjhIOc_m*zrp2as&$`b-$8Q7n}^}0pUJ@ z!&XmK&RIGTOmJGek-@%;p;qEmkDhUDD26UG+}34jPIN23yl#%+3cL0e`iK-tbCt_= z*X^tCOlIgXc=rPnt4LxJ*hZtj&#NkXT&2Q|HA=w>G zy5nb7SL_FyGerFXRub`jRT5gI?tRO>Za1U1kfrnyO|_vN5J*kzITE4d!Nq|15RE%f zJl|`fo}z`VAyPF386CLyUs;u7al7-ng^Eh)oPWC=)dqCSzuxJey1!r?u3O~^n{xF`(0s4$7^S9>X%(fh375iYrW_zk}7t;BUF6`Az*;Lf9W@ouwLkiDl# z-*s|5Q#DJVtO$uw%h;HK{eI7xM2!gQ8t8W^gpH~!qzAvtK@sOuZlNQDJnT^hxyENh}F5|o_CzS=*BQ|{E&vnOt zrsG~3N(nzfs4$j>2D+eFP__UJw+7ug!4)`$>*lr`Nuw&nZaxcAd3*l7$A!P>*ei40 zHHcbyr+qo-%vVEM7n$2lqT8(RcGH4iBoGW;=NKG{`-ddRR)X>AbDN9SCSkFSFw~9k zu(wl-R<3n9q#gs^9nrnxZ$yd0T1vniZBp{l+{WQ`q3%S`E+WrL#++1_29b;K0__zNWKivstOSiT^*qWsx-G|siXL8DJw3)!*a;LnR$|)` znlZFB5eR5LLHsn=igHO_OdX07e<`7*ets)K*= zBpKe0_m86rh5Zd5ew*~&?xh0Uyh$kbhH$(8?*zOY$7jhoAc$Xze`1MquaBryIKfN7 zoAdVezQ(uuU7)v8Od33Rol+KjMAgrA!RgIjAXh-hWT8a~$J#7Vz>?2L*3>)WWD`6eK%)}K6EfEX4vBHMb(;CI(Q)%Uq{H63k0hgM{Wz^^ zW(8Gr{INezu3tjKaQ9h`r?P5lpkto)MDSwxODaLmk=QrLggf>X<}1*IKlIt`wxpz; z*m7D%Mw@}L2h4zd&b4|C%CD1v5K$QAJAPqgYK3{V7mv+5@H>b`@!k91#r=0b68<3} zV427U;3ya%xaCgoZafymzBT9$Ln&elVY;9y2N7pN>@WI~T)S zOHyn#}i*8kq%B%s(R-wgn!=xl;aN71v7dg|td%G|D9L5vo`W0+V^ErGYlBH6&}F}zfJ4eAK{%W_ z0??ShyA8tu2%LErprpCh&6=PGwY3JsdH!CbpfTHvKYp*UUmD5zn9qI7I(;3ar&$c$ z2JOOI=ODfL@xu|il>S6#sZ2K|_{t-<&B^&kVpELjrX-}4Wyv&pVTm`RFGE3coDKNF?fKhCNd9{`tylNl1GI7@A zIH(%QuiHXtP($Z%_nZ0!zckBGJVo}wuEUa6s;p#=K+ic%%0$q>nI+i$qVrJ$m`@L( z!L1+4xv#=AUNiw7-?eS*h9~MQxz>~d`5Cx}PN8G8B z;MV+fT^{|~JV5j2YhwiV0F{glzbzW&q1b9i%O_MBZ_A*DW6^z|SojU?%H6)ZP+aCv z=pai1QzMh0z2x8f2FCxqP-Ku+rgTEk|FPsq7if9pyTIITW7UvJv-Ln6LRrt7p}2v( za1%5Jp&VD0_&^Jlg{2N{K*dIYU=Nb_B1AHK8GS~Cw?_rbLTsd>gvKFn zn1IQ6wu{^O2!t&Fz0q1DaN6d=-js9KF$?7Aw#2uh5>r*l|7SNko$9_kGh%l*kL%lr zn9|_34`3KppL+Q20cgS&M!vC0(r*DVQjsq~FadS(*<+QWp~422stMrkNJYW8xhG&f zLtT>b&~A?8f8R%1eiG5~_k742wmS-IabeW?9*R{6HF~$g`8Bmq zzn!<7R+|%HGET1qvS%cpvFQw=JRUa5Y>KuO+;U_>B38C>`97sSgMz7(pd>ErDuFM6 z6o|H)aNY{bOxt2g_~xbf#o}TBG0E4cn=VM(LgcbcZ<$?Fin~f|Zod(Q_XksWf#PU#bVy=oPgWsbu2GOCU=N93RTa zGJ231nrOh&m_{Hhapsx$<1@r3NsD*QPR#PR9A(Iu?gs&c{c$=_IkuA6PqV^UN;sHy zCueSaHQQokafTt{-oWw>H17;73oWvg)ZWJ02V=3=u)TFbY*W`ws@ee|7at$S^>XDV zlfCn&?;sBEz#GVS`VQUv9WQTL=TL>ilq&HTRF>Ct@~cGdU4zituL1^^fzIZ84khjl z6J38kof?qShfDxO)!TYMPoYCwrg}Q2iqYJB`hjJMOtRi7;CDOs(#K=K2drVgt*mrj z#A}zykDAdfoAZCK_$)HyF~D^0!FImYl;)(FaBe>$zsh!Fx)%Bs680}zE2~z}fd#XE zeEWLDX3j#Hvgy;cgyuln*wN{;!&W;_WC^xzcQB@EdoX_wN(ToeQI+^CE{A#jTEGA> z$UJo@t5~!w-`EVDn1B?-os+V~J5u|mWkfkO9|}>|Uh?3Rnz0ag3~fpUwn2&F?7s;>O;^>~QWr}Bgt$OP zy!vcL(G%NN?XN@qgcp4Uz&ek=;B0B5}u(33n{Z zdEf{B=~&VJrcQzSrD))gAF>*pIw3ZydlVJLbC+Aul*2CeLB`I!^<>NIu!g$n_5u- z6$Ivi5q=NL7Mn-jLx%b#Vc_tq*g9kB!AflV0$XP^QUAQP2JY>?CF9xe-BlyKPzbaoobBNvG!zk7{|Ge$|e;vpX10ed&5kJ zkX8{ZGS)(CGlU}4sB8rATJi6*P7eq?@w#B#S-B|OLyd~I=* zW2=oMTB%q=)l8b*Ws6?1l~RE=6r}8R!FJU3ONx(I95xyM;lHPc|E*924N&JF_@!F@ z#`-Y`%B?pHW(T!?{)B% z(kNrk=A$1HLy10sfs8=)2qq)=?#w39k8O=!zv^}i0YVoH(r;rXwYeI?FtR@0*+F?_ zUxK}}ABO^waD;>XMrMpVFLP|mbg41wcF7aPoWfGwL2yN476h` zngU-+K=aJHRVZG&K2{x{{BkzT+2-KS_4vXeb;zo27b=+JzthB~ejnKzXGHVVOtn?m z+H~PgZQ>|xB5SCu6M1}xq>zsQA8NfCdEk5pbcJeNx`z`kjwGMJBsoWQ&T`RSlK+E( zw`dP~Is<~l-e+vYUS;Jz-xGc`9YTG$N30$FLiL*uhv%Eg-qK%es;%=)j9n+R#gP3w z!Hl2TJjzgFmPHVS6GsBhe)K)#h)Lb!+r34(IjaAm%oP{cuf&9*f%~`{x|%<|9ayBn z@;)v8h_hYVJ~unSj%TUHC%9xise0D6|nG=(W1QPsEhEfVh8Cd(+dynxY`{T9h(!p=gyF6zItM5 z-)NEn9{yxg;mub7&Fx;#QiXRO&!1vXhfQs_w4cH#03{Y^RrY9DMA_~$Pjg_zvbV;zRKPB zjRnE3rId$?augnSg_0f#hQdxOef#WG2f9^?++>3LP?&*aY1}JHmt+IFyK$8nl=ZAV z??qyFG&4x{^lrnTi{Tf#2WPebNoep)OgeeIMrCoF0maBxrG|%yURw#o5fpqrM+y`gOIi zfH|FyQ#K>N)=CMdG=Y3u*9qYTF}#Y!(vtjJa}6PR3D4}SGW}?o}LKF zo$KOZhdB*z9S?=) zM>7i)gkNu7`~;w7w)^`tqiWHhi&>dwpVnfBs94xu>BwdWKH6&z$^ z;Zi?S?c2X3d9$c}LI6!?V!d&8iwgZFgmHCJ3)S#hn{g!pFm zE~xF83leU1C!d@FT9)WpsT)g!5K?pGHnyD&d1JGF(@t0Kt%#}#%zO~_x&u+kBM-~w zI+mduP~$@&Xu*Dd&>lw|Y3x;)b2>DQW`tlFm(io^1 z2XnC?jf$dN^~QrzHT>jDtCM#Qv@r1xhH~Wwk~oELK*pZeDZ-{Ye}-Ns9NL!fImiLJ z7J{?407Z72ZOPiBRrqu1nw+`4n`!FWe9q|A=4`lEq>T>6(*bQ^$n5hq8L`pXX8pO014;E{zMSzO}5@4Fpk>g%Xmw|zg z<>x~m)t1|GEoY8<750j`5Kf5#Bmbi|^PtM5^IHJ2$iaWWlM#J9zyZr;C1(fiJuXNAD_zFTBQsTI#`nz0H*46dUxOhSVu#nVq&@F?>ogJ!G&d;A; zTDQ^dsu>Pada^x@Yg^NPEvcv6{b(~~0+fe}Hf>p)w0mozJteZK&BLIU<_c~BjVM=F zJ!RYMm9Q>uamu^*9Y@fq5X!}rP>gL11h#0!+_(jxP*(-_c+ig zts0vVal0D3kF8^HKgg^BEXzy|XqNc}M&RI04U{0pAJjT6WzKzGH1)%t;o2*Qc0#i7 zTs_q6xMLG`79Ivh5#IlV&aD z4Y%?1>JmSv8{UQKesXhD;qSj6>)t>Q38(zLI&VXC`UFLFZhMXt>ibtHL%Z4*O%boq zTE#faa^F%M8S0L{yhV1T-m|r@gbcRqBxVwaCxj!lBRSU=Sb|O;d-7g|Xjf3ztjLqWDsKXpk;P_>~vFBvzix2W1(RKMTfv?a17BqOV=j4MJ)R`x}>2-)-6Gh}s$)A6h-Z}Ej-a^L);DH>?`L2COfIRoz!+R7pT+<=A)ac7Q} zL%^MrLT|iz0;oKB1~Q@1_qKNR?C4;yL2>A)-MC7T3WdEl8uH@7)bN@z8Q z@$W+GLB2^6C}jly2ndf#3g-Y+Pv>V}Q5_;{hdxDZ7i>^=YZ;Qo58%m9yL@dZEkr=k zW&bJq)ss@RQ=N|1$`GL^-S5(PDMTs^z^|k8kr7}Z82E5=|Z@nq>r~i%)52pN%edif^)>{j!5(D%ACC@x!E9Lge5xh7Z*`94* z1oafss?A@jYg%Ky8~!0bn}RYz$@EYOR0H^R$d9y7*U-mAu~GwpaT{co-y&(}P}hM$ zVCIwwOke&s?;IgqUTZaNvi0uVvsly+)Bv;9(?l3AF$j`$#3?U{V` zgteir0vC&0&@`M^q^R|bQOiUhH_RnD_7Gt^)x(wfO1didy-uBXHY9Zric+m#vd33llwHAth zIdSJ@MgHC^+%R_|0sydn2wo-sGiQ_N0|MFu{jG5R@ZrbXhyQ+5WK1`UhWqU@d_dIX zqO1j7Zyw(@igr~y4|^`hf(j-NnO1&v!U$aBLJutILYmfSQ>V5McGmok4|jr}({Lbp93GaUR$`X3+>bG7Fi982Ia^P50yjW1RH`-BjA%HFfE}xtTgf!7~7D4d(_=V{? zTO5JIM~Tf|Uw>P^*KfWUwa#7$_!0#rx;shuPV7Qm>DqxuR426DYYA1Y((I*yc61R} z)~4!e`6|`w8{!;UP^n}8VBb7z>Z!`&z-!6O>@gSy*AZIXS(}pbJ3`vNWUlFnlgHW2J#rb(7TPlS(DPX{ zhXBOMBQ{=EyHZ16l3d@U)-YPif4oP+%0shGwa2M#eLVS5z#R;3)6L)~|4eK?pA!Ku zo4md6b=)``=SP9|R(!7Bl2270mmua501?V%P|cp;a$k7!(tw1R1XC0qUHm5o!}n&| zxc~yM<=E_1t0ZNF zc4T~uNO5%%tf-70;hDVDHnMJWLx}N5CxE*_TgRnV!Id~CR3#mt!(HM0cp9m_o8xnM z^ZIt#{DiLKAoy9#dH^{eT9^Nh!Nm;(Sj2^Lg+VF?^JCxD3xd)?|QL>pav zhbbQk;02Q=-R#6pfPkF!_s?Oxw4yb<>6A+084Wg(e!kauykLR+{Z8up5Kdl-odM*7(iGywJa82P1{3e%Clf8^qSo=M#fZ^~ zT1?YO{b_BB;7{D!sYqvcI;G5R1G2y0uN1Y^qyPytgtPEL~31pQXnYFdC%pfe+mU zN(8h851{t;7TLZOEejlpiP{78iWw05^BI1Mm$}>Qf9p2J3jmI&V{iP0!eL2b*mYvt z>uU2mr8W?;3uyL1Z^R2buGv!sjgS7j+Y^`XRZl(Z`7kjC$9AYan zF-)~v-<~iRnVf9#?d9>20W!CoaiY0D{(*%bj_PNIyY>$)o4-G`Y>vv@_HGCruN3p? z0gr+S3#y!o$|@z!ar3F}f$?&UU8x}O*yiFSaP72(d`5y&%=bwiDXY@< zUC$GHoFMpcn@WrDeI+&^RVzA(XX)KH%}Ip~MQGVVF&Iuo-QR___&iDH0gP1&Z<5kc z<;Ktg!b}sWWHA3f+#T2nqoS_NPJWUhA+5hT8xO|fEkpn<#~sjq8Wq)&qbOZfNnbPS zfsQukDBi1ae_sUAg)1!KM>c5PJ1}+*BP9YOH58^u;0)T(adkRar|z$Z&Xr>f-9YR& zZg!!kdREV1>aAlPw{i>PCGYZ$t(!DW3*(%3LAR%D_DXwY%T#sJtl(IZe}*fca9u-9 zBXBNI+@&#Y497@i6SlTMx(5=3>PTiIDlvqIOKkrYqVJO)ki34u@iNx*w zDg2#JElWt8vlw-foPo{@4E9dThH15wK%&U{8ADPDxKZbagKE{|HBEvnK~l@B+tcr8 zt50fe87ranqj!(j(Elk!Q5COS?O5k?(})#!!drbgw(3^%K!^bb!x!~odlyyOs(F0D4Fic#oHNm}B4()fz3 zN@v6kTZ*GJ&%!?5jlqnXiSIInJftgq_~XL#DR{I$C5EQD8n`zaE*WBNZ@qqmmTddQ zts*MoM4H!w_5JrIyq8NJP}4O)6|$bB^`Q`}pmrgeHFM_Y#kM`R@q@skWH*PGYzmOj zziBJaA31TjyD<$N;O!-yD*_l@@%afPi*dQweTesLx`P3l@+{2YQAJIou)dT$D~5I) zDPkKu+y#TJ()VE}s^T1eLpp%<_x2-z{x*?{_36CcqiRpy2)T*_GoSY2np6`|Py@)V zPdISV^ltXY4f)pL8Hm0APsb zh{15YsA4hA?9+78r*Z^k3BZGHv7!0{DwHF-3!gDB8a4e6_qW?``r*O{t0>zJ=)7!d ziE!?ESFmQ@SCb%J1w3()RRLbXYO6sE-;Dt(ubgouUKM5N0c08wH?Ud~79w7}EjdmW{@xnidKU^o4#eXmCI$-x1-B2%};hAawR9jkhg z_?{LRDwBNEvCsMgdeMOVM^gP1kaPd`oXb7$9piHTJ?48cHv=kY-y_lae*T2{f>LD< zq7|6FslB6PfD8$kRR^}Q=xh4 z*kC|}N5BZ0b>CbXEd$x>cSJO6Yad!qCy(y0UWG{NBWnz%)@J+G2AAKF060k9o4 zc3W^hM1a$i2z9uD(FM|R)fcKod5%6T@g=I>fr>99- zO`atSSb`dZC+1IlxPDi47I*I;^R|+*!6!&|$UkLUCG&(oD_{GO<#N*SnkR;li*|>d zEWLtH0kihW(-b($VgB)t33m{m&q8(^3`VAFj!Sn!O)c2Jn3lI!K&NL_i)ZDimv6e)s%Ydtx(CApizjM@t~9 z|JacTkp$W@@I?n*$%o@&$HBuHt>5k0?92A|LVm`7tA%(0e_UvHniEPjxl;L+c*%|S zjhCO+qs>;Rp&dOQv1C)pyEus_Ap$L1UV{ajOUj=?m3{jObD5Ct78 zSUUg00ZQ%8Vi;{3ZI)6VPn!^5y03j#P3T&O{+)L z*uXofEI-WhtkDn`mj_NK!To}-{SypPa-lZ%b0j#Iq5Y<@c$LB%vCz?Z^x-kV&2z4g zn|fu;EN>BVqr+msORnIq8DguVAqdBtXH|#fRs7t>N}B`>XzH)m ziPciQIU+Pi?^IXv5!I`2w-$|Z0R#f#F zo+nd=j3+^J@fC|vB*EiN9Z7DAoq-nS)QLrL(CNI%*X#1}+V@R1*H6OuUKO~6HIso( z&?w>tnzB7$f?e`zf)%7Dh}=#Bwb|a~sSH5^255Otm?EWLq12MaNRoEXIJ{$r(4=W? zla}Ivu+AcufeS#p>gmL8(0@Q=Aq_^ieb+YiX&3=Fy@b$bTXlrrsctjLBL0$#WDw$m z&igwSvi8)IgD%hciXS-uX)>48wWf#TS$`SRJxydrc5Rs-IuG&`U_wevk*}UYi+nNtTtOF31WhZn z7WE2L?+mHbE@2kQ2c-~U*PY`XtqX{|zHAUd+(_|FYc3a0t{Hbu)^Ap*NuUHn zuBK3AVyzrj93mBZofmBO4DIKXU>8cFHBu0136`LlWvB#$aLk)*M*5rzYA}v}BK38& zk|s-O|GuYMfsm$Vr5e;KNP?kiP%S~PcS7Aj;zuIbp>*ZZoz=joY0OylgFu9Q$x_`p zvRaj)_&Iv8TiCKZQ)Jk-ub*T_+2|5KNu&@re;J8UnGUV0$(TS=^_t~5nExg~E+_eX z?bR`*l)r`6(h!t@9%T8Z4itQ;UpSbokt2f0K&arOJTe6n;mQLVdM@yjB?l~>mRR0}6Qu7Mbj5%FM?Mj(L2;&JLb93a8uQDTUam_G4 z^m~B^5*<=^819^q#hegDjwlIs!^6ds?It9+Ryc1{B$-EBFAzIL&-v(pSA~HO0ldhw zG-sPOh+^Zfd6E#sst>h%1GUV2oK~bBO_nbKnq8A;B7G+qIo%k;ZYyhpAcmw+|102e zQ+!hXVK2F3k6n3S3wP_A7ih~2fZOnN0X~_-%rFbdi2}pxG4Sp8V_ibZ)9{z~)AWx1 zI#1r3hJSsjJ%R?#SeR^FXyAv}?d0+#k=77r8~zY+O2Xr@Sr)9?d7`~cXQ$GU$;;7e zlanD-U`Uw1%!fPMY|LbGZLQP0k4Yl+Ab223`~f@^)oDKJtvi|w{WAV&=qC`m_f`gM z37n)EJoD8Jj5+%Az$FO4deqm@nkk=)9{Q~ z;*JC*F8Et$Rl^)R^2lWhl-KQQ=7yeUnlYI5hJ{t7#_}s|$&L__aDj#CQ#i@Kz31rn zZzEKkbsY^6q*+BIL{Rz0Cfi?z5LZ>izOd#W@a}S-&_f6Ip{|Q=Z;)ZZHR$YR-qw{P zm?VX0u#|eK=5pVVV0u^d1+!KqlLd|v%o04`5^vAT%E3lE;yYEhbEYf?Ld%n;7|gjq z6?Ven-{D)sb5FA~4Q5_J+qetx!9Bs#+1c6ntEnB~A82>7k6TmnX%wgiu7-1Z-OdsD zd2R>qgv-Ub>TiQC((k}qCR{h2oraXBr~KUS9Xl+D%0GfuMzr^Y@XmT+mxwxR@h>8$ zVk4m!>blC41PKAlHxdkv?hcLji}OC>+WW_QD(gRrL)aNKqep9!hPhM4Z*;Y4UjD+! zM_&plI{j3h@LyavfgSWo$;1A-OKRbt3%Su?JDhrXG4QHP4>^#4X12vEL0#iue`m4n zGaD2c+5}|2Jlk!V&Ur%!Qq3}vVowNEuLz9z0bZWe465=a6Qi3a%2D)L5anaO2%Uo9 z{d?FN#>tiq;Y~;CRC^i8DR-@dU8N}N<LPsZ=;rnR%Q zemXC85P<%uf3neneu_{S|Ao>A0QQO*YIJz|W01!dZiirLFk4LZ#OS_T(Y$HC{RP}c zv@;qLFr}{wONB}j!*WjgozNe%r!0XtsoP}S+(akQ#0bw$pc$9E()ngKIfYm(P)5>V z)HUG1xm^Yfq2G0H^AhM?6$^kB#tb-#T37=MNNyr&> z4GnGU474p^qn%1{pZ4y6^01rj`3 z49jE&p=N1cHwOIj+fHcJG+G1~jMWTp_l$O2zMLg%mPt}RJDx9T>rFqXuYJ2BSTU?s9=&K!rilz-CxjSZ5=)%({DwcKrIWiN6giC#Y;kYW%EBaiL#u>J zkDP_kXMt#^^zFYhM#0ITY@>SM}hU+#h; z$z%VHU;Z)Av!0bQ+8Z!%uN?dL1ABOVlf^r?ok(ih=Dl_W;1T|HA4-ye;JOG~h7|qh z?gw%Nf;vknD%C~#YNy_VG=qk?gEV`Z)JJ~Xch-^5_GIw`Ep6409}~bLm_;FwR6=s- zZywF<i%rc z!~l5GjEz68J6Wy`(_JBRm;86v$_p?95xzxqv*|W?V-dy)<#x6tLC~Nmu2f8GE2|3* ziu*oobPLrJ%HB>CXm2q3p*cD9%e;IlRhWK~Gn-1NCg?X71N9?@C^3F9qIDsqt8S-0 z@4|PI@fTi{M=Wcj9^(&&{^of!Y6h=>=Fd;2c?7|rbD0JWa;P88O_sg*%YRJe0do*8 zU#R2dkF9z)az!D$G^xK^!ohm)2Iw{j$%0Fe@f7{lJ_fTr)+%B7TkCw+( zYo;`m3p0cm={5b}82A0Gmug1ln6RFpc1&^F|xp#aJ{k_0k}1*tpqK;i%caT{AI(Rw>`RU*jB1cpsDy$jkiC!-B>^@qt12P2nX! zU#r&C(9Z{Q1K8Fvrx6b(ZAl+C%eYO~k&8bG!GGu0EXyH@^|J!`LmoO=1tAEA4Iko0 zJC8M6_PaY1Yx|g44+;9dv(eIaT0pb8n0@~81>>n+JIINMI_yN3E`66vZl$azf)d+i zRKXC>0g4*d45Q|ZpV{$sN8^?a9aU6F{d*zaxZmgnXP_CcF7Ix?RUX>jw{OfJIqjZZ z`h%Z@C+kzR*_7y1OX~3+R>uQ#c66r&E4u#iy8%%Qui%n5WKkADg6XUeH?Ik}9|p7{U?ss|Eb2Uw)UFo4 zBz0-(Ql+Yb7+`%rZ&A?l@lKa9-*O|fwen7Banw9)hq%KDF5kz7O=s8A7S$VMxP561 zNu#HMNql<5wtC2-KLsT7)W37jZwv|Pz5+930^J12Ir%nW6_V8~@2j<*e7(my5~Tio zhkGMmHFW7&TT`dyJG)t04^jxhUeNJWg?e=MfKrTqcbc-B%-@KH-cXKyC%jhfx%Otd zK#LZ3Q)>iHO>s##Xrd;1?4WtSS3;LG(A8!ZK;q+NARhf&hr?_>r%gFc`8?XW5%27* zl{*a^17>iJ)C$Yi468MOap?X5PuuqtowsSAS3fD#%b+|!zm2PVs&TQoo{8@Q0q!p71O;65)*J zA90oaZd}aMj?Xk)iL`}QQew%D+j-g|MAS^mOQ*DxDM=xOj3xLfrh7~5QUh-8j5Q96Nay$D;>XQ3bpkx znRon6akvvavn3YWT^3B&kqD%KbXE?5;#$abTy1L6a|UUy#{^D| zj-)2Tb{@7`YQe9)Y}7mJc0nZHM8p!D#BUlvyylk@G$qjV!sX~9sX-=Bt~@T|v)h5Sk185xBV^{3SNJi_w6yhW&Y& zfNAm9c@8$XQ+YJxx|II(EN#qLIn$+Po|%8bk3c{Fe-LC4Ao-Z*i(`W{KPj_?u#n1C zF1jbaOuX+TBOE_)w5-ZJ*;)#(bx@JjzA&}aEILEI%GC7DYot+EoFn@>IT+=H$O zbgL8)>M&#pDP7uc55zdmWOYjD^|+9S0NkKKRdL4gLKv?vbAm3pi=qoV2Fda zKFC4_+zlMUexgE5Xb@gL8!}(wOw^)rX*AftMb?f|K-l>>U~4^9w-5I+p9O z=(`7c0BQgb7LvI*;yMktwo{-V5(3`mDCHKI{2c=}UWzN$cg2~a$fORjV@P>sTkY@H z#Qsf4MpOhxjL=I^_9lS=IA1~J1oDTPgy!R9y6jp)LX4xooErl*a?f9RTKV9qOK_5C z_whoau7`4cv@f0D1IzWNh&_t`p%<8?tJ!;Z6P%(PoDD{=-b6~h{&Pd>Ffppxcf%pI zf0z8y$L!{1pRn()6WHZZev+lEnuBMK8*zMTD)~JJO;W-?Ja%=7y7x-g@V-?N9YAVj znn8rxo1%%TkGL?eZh6~%=qt*0@%F$WcFuWzby~dkc+DzhwTgp&@71a+v2#-)v0Cz@ z2G}l#Cn@~jNMQ@!(PQ_POw;f6_f-y(`djN)o1LFYR*f-khFAY=T)X5+wh&x{1BcMx zU>QSm!u!!9cF%|A$b&HS;{6Xj6h4?g z?A{c$@7=RWmEH{wO}=6rGer&8Mg2H~ybDq8%w-0WA_>24 zOWz)pB_R9JZ2YmpBv@?V$3NsVjSEMQZpCG^=!S97ff4@brRA@^FWEK7?;`7Kx zt>L}30B?!XNQHJEw{w4&iGH1DK@BrIQqc+KSQ;;gyvU(@_WBtb(yg8Y2R$tM!=ff? zgevq#h%xV*+ZT4yy|*!-q{zbs_$&cN7=S0xpSw^=WNPRd#W#N+8{V67UNYwS9mt0V zL1w0mfIu#^fmrInvuocl_xpW@Dqq=x5Ed-vb*nnM#a6q+AO1oydLFZgSGkn75;0xy z7&74@#~v*6(snLkF6r*4FW(%^4EBUX-4led!o$-fQr<6QUF8J6ls@>G% za$^eznFg=tyyrGpp+Beya0V97qrowB&B1)r&1b$Wd0O{+WEvpN?yaK(c;rwofg`!= z@5eKswl{c=-0n-%rxzEGIWDuH$}W>p-F_K*!d;?oK(cNy;ceKJ=H!IHp0&rK)acY+ zEm`9GK~L*plUXS4s>?T}dBhF|gp>oOoAQyZzKr|}(s#kkqmpCZo?CMgZ$+VCLvmWn$QirU8zWsvGoYwKNVX4QcBLlwq zLr=+!3FU4aLj;eB^*xe6@t?3Va&)!~-qgJiW8waVpG3P6$mL93==djeN>S@PW&#t6 zkyv~}MtcVdY&qDak+Y382l3mnOY~+S^OOzVEai|LXscB2d*Z36D|+JbAR7C z-1h2q+rLMG-F$K8ml9asa$&#$sJ3HUjNE-pC@k`Z2u>NAlRid)+x}!H7ECI1rQ~8Y z8i#^1#4WM%3<+0mV&;+OMMLs89ld*@+!lXdhysMnb`Z#FR7UAi5I#jP9V4VUf>e;RFiSOiMufY2)RWo2AR%-9Ir3X?@END|B!_@SR|8R8 ziC_PBZI6Q{GOmbuV@LtCjDwg!vdCklB=cd~pfzH<(?;ZGdY~{nMCkv6LZ;_iN>TD()2uSe;Yg>}yLf z5DUSV^~=_6!Fw$KwQgx*MC^<}DQ*dL(@MTm^CG7Afqr)O6EBciH7xIiEX`a7m;I0G zDV@!X0CHi}m0*q*1Dit3-d45eRJ7xDCXOK?g%^%#8$fcNl5%H`6}E5DI=#+#b*%QuAsXxZTzKo}UxK(?o?~H}dwD zcgGTJA*0Rwvo}J1d@{^D{zZQNLjoIII1&I z3-tNKKfyksFTS+@`HwyG^6Msy4)yNogAb`Kb?cyt0tb@b5CTAIMQ()#%6WuW7%2}j zW57+BwEzz4i$cXA@@XAc*3-LZH+xl28p1pbxFBMn3N_{1vI6mzXv3>9@EBTV0afzT zp=L6|#54MQr}#u3Y1E6VCxo4)&p~mw44rt2z!**{ZL@0WS61h47m2R|57$=|()L1u z_Mkkj>9a-VLwcUmML$k3<_4j}(~Y@H+zB;y+@i9SyQ)P%Rt2nKBu`ht6$DVT`Ofpu)pvTKgUIws zK%ku)A?Xdiu>nI-yL$^ii2G8=CJf%E4G94b+Gg(WWtm32&Ok~ zi`P1h(C)UQt|=O2sd)=dwIxTC+%*Sc8p=`A^0~FLz<~sPlChzI?rDAV1}g6tzD}rS zDu#kQy-nvg({x-pvAcn`Hj$rKMs#mB3EhmAZJ!1XLzD3fA;tx_g&~#!!p?b(*2=YJ zkIeptC9Z1akur0?(R3GyoL&Hta~z2%5MB&&ZH%XDd-jtDxU@26@dZ7G1D_h-d%)C3 zDA7Et^beGW@Q!pLpN(h*LF|qJcV{Ua3NzT78(Fb=e_Gz5G z6THv8mYW_Po>M90#;O<8njp#7CUj3>e65dH^ua9NgVXFyl)SqNP%tz4!h2E5qG&%Z zX$c509y?4>f`(nr@tr=3kZk(BK2a6}Yhb&=sZXY~#PJG)WZ+BWe9`N<9-+CFB)=HN zLA>5*<{k*W54UbWmM>s=w-p#M^+?_rwCWNG zEl;>!;?ZtK9+&Sj^>b(O#{_~w*;d3{2UfjCB5K|IhS2FDXuUU)gZsSc7=3hyF63dy z8O{kKVc)>(hVfI^sk;6|k9CJG!6V;1l}$@H8CtqB&q@)ej-tEZ39sH%p&a~U+^-6t zN>F59!4X}su2N-#lKD&fuLOQErrU2avJLq?ch-S7=wR5<`bc$C%$|Dlbdh67fg^IjByQ(ju$^D+E)E|WxDNaYQ8F=tPuC(s6c8V#>5kLirMZe{Hv z7Mo*!*8V@pyzEOvcntZpccEl&3l=6NVgeUet2SVh<*IDFh9ztnJe!(+Om(H+A_3>h z(;dF}DM$tkd&qL8=bUaS5Nzqkxu;B|O>w)!@;ILB&mSECaJ4CJqFaO81K(X`dMKzG zEc}4|q&Z+@@d@Ax#B<>1m3}=zpZ`5Q>`LDSc3wMTzDrVyd>|C0Z@rQCg6rl>;MN3R z$74cbAz)V34-0(g_1og$B1QbfY6ZlsD6t?XqA4st$)+RKEk`wWp;H1>i)+2BIYJo# zVzemYwlnNM?^2wETdHFo$%wr`j=84GF>uQN%Cz3O$VceyO8a;+i?of#Dcy06RV%cTm7(U?%@a)>z$Ivm~CqP_jF;l>}K7=t$R%Lh^h2e0OI@U zgFe7?D2k)v>;Qh-g0Co?Ks@E3u$G^KqKjk(Stxe@#*{nf^)iPF=aYMEFiXX*#6onv z^kAOYu+|Sb)#Nbobd}L1*YfMkn)SjeAK)ewn>$Y~J|U)d`nd{^N3fqrJ=k+fG_iomKB=B3uCQQR^^oALwlkgjIDu7*w0YHRn7s?K=l^fojlpMz%nNqDCjk ztUWO%`YU$Gt*lZt#_+VQD7#I>+lq14Ps~3q=f1n77L?A4g6Pri-ljl*WI-QG!SX3* z6k^dmno_~qnIa*h87s`HqOC&l z%S>F3@SbJ_QA!E?rI3{lFVuR8l*6-<99 zI7~lfvVt*pe#Ms5u-X=6GFYUPww~-qY+Qobm+kpBtK|zv8 z8ETiIk4tqz`ITRNrN31aP|&VLg(~qQ_^h+NMz5VT&OC2b^x!HslkN;#|4!rILh0$F zF8s8+0WIHvAlO7*<^ssS;0pxgDta78bFeLS7!a``-1hP?s-DxY>fI&vW+DSf*#=ta zqU>F1$5B^<4>iTikLI`b9O11mjj;UivVi|WdUqzPFiUmuBkt`epJ&>OhrW_EvqwVw z6My60spQWtIlN^*c9H`(Jw6!vrR0HnK33Bqeo@W;h&O9GnT|H=57=gd*%#$`<9OIk z_bJgW9w=bz!E>#t(uu#>bJ}6{wpDcvRda(?Q*CPuiNCZi;5Q)X)qC$M+IKJ12it7H zQ`U?-dbJjEMZfXLz21Z_M47n89>YVy^T)32^**Xe;^YDo3}ziW=T?+hn4@ka@{4go zd3j31jO}cJ^kEEU%$Isd|FUauZZ}P8My27u<-^g8JS%pqKW6bOx;%V>B-pO}D+rfI ze-hF)--GaG=}D44OnRFFw>KzA{Wmu6rT&0ue}EnoAH9D;@AC5m%fsoCW1&_r6Whc5 zTTHj9rv8EF4yF90SaiKQ8uQ2%hS$DS{)gI$@8M>)pf-V9JTqUG8bfpz5?s<4;?U^C zGaY@f_OZC1xJkZU-wz(mgT4a8S2tL!^hAlK77ipoi~Sb4ADybrf@0}Z%P5Ew`XAov za?u}i7RE1?$g35qXTh08ugenN8wMNri4J?1nFgodBlnJ-L!Gk9O#91z_ZnHaLu0a-_ijeB(P8nQj|j%?zV{)> z(Y{koW@X&L7ts-KZRPF%1HKSZ?~VKKWPjJKdNsbJFS0)v_%^>KqrHSW$LDrn2u;dt}L*>EADTq63!!<_@SMr=Rt% z^ZdPtW~AUd+`c-yLm`g-ZF4G5xf3%(G+%WvuD{x2@){0rK|=30j2Rfd(WGq6A!*KZ zQSUPegi_9cDq&w$w#vNrOnOM+B3`S^&o{vUQxG~Hy|qh^{IB?@dMey zwRq%Qb6$|PJ~~=PR+`i)qP2~Qjh*v6$zuxde>sYfF9oc){2V(0XP2cYZ1#ZChbB18 ze`1ynZG;w#QRA*br#YtYVp2B?K>ZnaID}NwN$;I66rLX?+kXh)H^yW z_JTMbz8rQ|I_=R05T@O#!e^O5yvzcUu3pIzhZv9jrC`_%q5ShI=&JHi&WY0t*mJ1& zlULPQB3al9+B8eY3bh~n@i&-ZLMv?{KF=lniZ(WTRYGRVxi0kMZ;%!!dJlcS7|Yk> z>qcbA-(L{rDfmpj&DtRgtLJ2ar+wB5 zU3VP+I*=G7^9|>NBsFv};ftw{25N@yALqnhgmSdb7Vdv%sX!D7;A#z;BJv_Yrl1UJ zJdf}tTSNo(!X_neecE|^>yOKQfa@N%Q=PaVwX{$=vqjsZEao+AkcSl{`N6B~BHjSAj-)fEttB zjk^3bCJ-bng<>^_-rDu`pPRlFCv*aaOfU5{i6Ti@0@_QXUg`>)8!(x3m$$@(s>d42 zfkA6mF<-^wopOoUXLD2f1(v6?+oD&KxbDxXOm1Lae2`SS1h|07y=AM}w^K87zZ3&f zt?eaGtchOR8((41c19Ofw*>QBn+|SNCV*E5@fpQUYeqI_lJih(wkFuieL~7pZ!|?` z$WM)%OfSXO&(##I)NZ1<$6mBa-JtTTeBRryg_S~&itTI$6z*%*^j_fsnpNNbAZ9qc z9C;&CjlEGbz?zB%tu&Al-gZ&WeMrzweeLxM6z*;l@#pLcZ*?_Dnkx^q8v=e2 zg*Np#nJq^qy;EMUca87HOeDt-3iSBnVQ1Wm9&_?03#yYz{Ph49@~= ze!8ZICZ50@=n5+-i*6hURmZCZ(lH>LIq4UjS@Ac~@Ln|#Cjs@vt2IH~WH4<2^7}!b zgA?|A5zs=WeOn8X4gBjhK+^3KJptfWPyQs3SjH>&X}F zuY6)&OfGG{8~vm(22+dsX)^xT;1Nqb@@L5W~#@{;j6TkkB9#i zPZmlO`B68<9W<%NF*CIbEUuR}CsWF7F$){I-hYN7E6DY1<#=LB;PW&A6DtSplo>+Q&Nbv9mbdyIly+V;GtN;-SJ8u$2x8}#i0y_ZK^)A3X%ll8wYSh?h? z9Gv&Kv6tKTOslpJ8A;i(_{B~$fw_!PNMV_Y@Z%EUL8|wPztktENv?cuKL%gDkshbaOd_UaD#gA z(D(6jjX~za_Gy8^P#W}ElVUaspea^xFy&ck@Q@nDRU9~0BzB#&go(X&r_|JEveX=Q zHsU6IT@)*i`-haN$Qt7(DgCxyf?|kEhjSfpor<&JUOQULYHgDS!edYvP*7(t=q>0882+Eh5l)7Ay0i9v&yL8sde%W?uWyLEIkiwa1XW}qjOPX4!^ZfcyI7ql5Xk|DJ{IRk`3kH;1D`|uLvIEjv%uz zJ5?&Bn{=mzV7XQ=0-Dk|(c(o}>TLoa!8qB(r(P@n3)FSA*JZ{Sz*A^gbSwth#<)44 zOx+$GxritI5qRnef~Da)9W-gW?w-R)U!GS4Rl^G(P39s{By$B!yg`}&ZHdz^<@P+C zq+>osCT+eFfs{cYH_Vi7G;}}8{GA2QsaXYk2PjA-lb_FmM!V1qpiU? zsoejTZy9|fQd(J#odzc5y2!>`W+K5|rQS9WZaPoDh(8$y2D^~=>8#=EvH}kO`3-mE z*ETw`W&B)dukq<`V!gz+h4Zj|cC@!mR+u=y*egC{+2~pCf1d9~T_+e$vG%L?J0i2m zDkaS|^GYn{_yb{2#c$x{8M8zdhD!0HtU zM{-y0s$BX^p#>_2Rv`YjnuZ-&&Fx_arFc_}s%GSmSN%nW;x zQG>7y+G1k#X2)XxfBZ=LZ(m-Kkx@_MjTTzxwF}JXvvthqgU77SMR(M5Q?N<7=3b}# z&3~;D@ACYtsMb`n_h^~lx5l%Xqzbrs`a;4ch1N8IGe12hXsK>r@|3Px@Of5FkZpvbC) zb4KFk_?L%==dJ#?K@0OFOTI+2>%Y`LDNtN&_?$=G`Zc@ZAhalHLDr78|GkYiEAsI8bs8`<T9a-O{vU7tm4xG5Mlktr z4$+k+9oUF%A1uV(ldvT{UhbP<@GkekyWL50Hl_M?Ef#ar@mKyacJw?1Dg{i2PX7neN|7;H<+I?sc}noVBtoXx@BhQq_o^N}B)Qn1B30VqFhj;JK1r^mM0P7k;C4k` zynW61-1?QLLqaX{vGE!a3b!; z4wF&8)-+QtfZK8(V>qxhTI2}%zxJ;DAIdK5-_txOAuVcX(1c`UD>BNKq7ccDM_H3> z$qZ$W>B$n0C@I;75@RWqC`-d+8P&vCBTX4(scc!Y>phxrdp_^y^Zp0#{5a=6*SXHM zU*B^tNY|v=TqR|u4`aUJ@Y+O%483G_ow!Hn;R3EANw;y;icRU-WwCc@BWH;Dkzj`O zh_hJe!O#d|{Z@-${Je@yNX3e+qrP;Qv{lTXmmx ztA+LE)kH#D^Z|EkE5N5umw&X5@%nP`uH=31sh<|UO4bk{@mn?2zqc`V2Fd07N2~Y} z-;PgoQFQ-Y4Dp^%96SXa+1I{AvHuHVj4VAe)gLg@Gpt-o8>XJe@62-YE0C?QTcN6Y#3x#~xsc4zD+ z#V-4io)_cb9bxEsK6PCLuY-||HFeL)D@JmC_lfh`(@)QkTRt`YUGlz=QxieF`xg|O zP7Zt-{!kmf{mw@%+Iqtt_d(aF?=3z=N_d`rRsz{4u>2tNZWgD|P{smBq<@h~#_On{ zX((ypojr_ZH)9FCMmm-CJnYlYwD_$sW3*qj1Y1?h!wuB=z8gc&2EHItTO`}5$+P#n z!XGkE=wrg%lE0cAtU-09zcmdP4n}iISchXObn%xHWhK|{*7**VocX-;H0JY5_Hyj0 zrFxNm9_w*G)2`+>y{H{FaFm9g&COhr3oS%D(8(vlIC6|}w-;z;#(8GGyHvFDbd=)mA_E6r&nS7n{QC8-4RF7fgDsHEYH}v1vDfJj$i4rK|TG$07y<4GH<5vg~j3ow7I>dD8^R!Z*2 z=eHTzZrC|C`C1qG_rNc!19z5FzSaZ>ErT31eWNZW1@X~xq=}wy)jDWF7L}Rj6MQ2U zDP04`9CQJSahb_>AF_RL@M7Ah>uplgBUjtwYl;V@gDl*lnc)!Ra#FS&f>8Snj~x1A zc^CW+OkHH#KA4Zu+Es1B90m9DsmuLS>#>|rhYxg1SPD7fxiw(i_*`z{?;ee$PV@*9 zNY`(>e`3y!zq_XAhb*h1qEVfKlML_tb9EZwn&}Rv98c2qV;x>dLG|`|&$?|$98J5? zS^cMexXBdtYm;xOM%XIL6d+5ROy!0<;)T-3WjGxm6j9`a&$E57XkOJO3$itEANBr# zimuU0>u-WdE8-kex1Cn}=IApckL)_QZ#p*ic*|FBgpzdBkN1Ups&Kv&rNV#YPI_`V zt>*K^m-Wvo3yq8LvsHqcb0ev&T3$QjP3S*WFdKyZAID;T4pE@NFzJGzD%_F*_Y#`W;ZsUTRZIJYerlKK!kqfH zYQz{mzU0u_UjKLL{k7a2I;N_NpZazfb$;Y?SwV`E6qDMkm5UtnjxV|YRe7Z4gkI`Z z;%kn*P$6DKOhOo_3K*y(=e7vb(oQ{n5a$<5C87zZL?+ zR^oi38Tk6D?d_Ty%>8W`t=mWK<2i(&j3V!6kIKK$7=}F!JGWUd`+iKy$A!1xINoMf zAf>WfXol@u?iq_vHQMB-7%)+mk#`jHms2-~K+fU$HPGabI1fM5iRw?E&cvu_r7p%4 zVeREaxkV<#hiw(P*N;qaFk*dFV8pw`g$us|(Uv?g@DE)3h2jS#?AJQ_2;kHV!H0J7 zJu^@GUb9M^lGbtKZ`}Kdp$}g?vJ&!!Z=_}CdT-d`#6rtwjbC9VZ!1{JM6!=c6N4Y# z$X5z|OLy7D;jQzQ`GM}qY|vKD3VqXL{wTXBRB31QEs**l*cB6Y+4hI#zu)ak0F=JI z{kpeG-*WneDxHbg&?#1KSwa5mH!@%2NYnF+Nf>Se7?+T5=q|)^KeG4;n`n7?*GtQh zZgQw=I6j#|y&#lm3BvWA+Fadr@wg?0C*!Yl!h~O877hI0$og1sm0f<65wvYxgvxK> zv7H%~j=F~RS8^pST;=1E$Gr3Ic+dx-E4ONX?gLS8Hf&K`axV_a6|!sk8s4REv=0P< zB{G74wzsB`xiI#qeEcBwWj-Ys+v>&HZ^B(ZRb0I;hLRk~7jtM+oyXT-^1oe-cb=7L*={}pY#wRiD?5oDFBQHvSEFPXW>IQfgGL+U z*KDyIF{msb*2To*qUX)tP~*Oq4Spq8R_f<)mQ~HM!N;3>UlVwW6B&$^jzumg>;)8&%rsNOUl-3yJg%QVt!U%dApT0I-R(%6(ATsLk>>%CGPJQwFv#s`4e_U zWnxD0rAh{cwJ7zv3S;g8BhA0+a8%?SbMH{WhM`59?IgQnJ%h|Ha}5p$?Ba_rQ>29& z9qou?m#L7%uu_9f4|Ti|y5v!`|{;?h43Co-fo0=<$#yt%4k&_AkI+1v5QH(|N>>5NC z%<2qZIlkNCf(cLAE_jI}rGgY+O4X^RrkJ|;8U%;~Tp0+QP0se-aBk*v?$J93M7*n! zjK>d{Z-;X1eAq?#gCAP29@NVahu1x{#q&}`S6W$t$Ko3|^1y-c#^oTVw$#W^xnzC! zup$dXDT?i$w{q|gwK>a?9Le$hgw1Z3br=DiFK)K&3FgH!Udh?+3hkQA>3QnluM8B$L0ZZa&L_0e4)T|xIW;mLzFFOW5e-gT|V!2u|m zb?v#DNRGkkqzC1A!RTvOKPK}77vcmTNI4n&Ye`go_+Z}-K*=4*kh8rQ`iKRa68)jz zMfMssSOo@7e%LXoEI!@NWd2rZctxv^T3fzU@FeA{8c`t@dqDmDvgUUS~CT&Mz^?RW)s+f<~@Kv;H9ATY?FgAOh3Ds z!4GzW*pk+B-Wf|+3$O7sny$!OduY_CGE9a@!vNHS^Q*>E3&;LM`_E6+L{RatF`m<> zsEVZN@oljTY|N~bBxN33@ePAhfkyama(G=#mi?3+_4x1&4i%qD)i>(gB?b4%PG9u4jl4iyD10#PQ|}a^v}OEAUgl)L(wS6#vq*T0!C3<*!-XSaiaJ#ZUeZ~4 zJG8be`T$3Ym4Ua@wO}^sm^{j3tGrVPMP8Z7-eSb`%u^2JpUL7s<41ApL?d&IR&+q% z&!W_bZs8l2*Q$D4rE5eAg{>!5|C<;+1LtZT?pi#lYD5~nxnftT`r)Vhz{dw;5hh?I z+&WlqQ3)5%K02XgwzhkT-(J%YyRdPKImSwDr;uwH%*_$3s=T|bt4Vkk-Jk|Byh_wK z{9OHH zZ7RYSng6u50}QCa1N-unao8}2D_C?+1HY4059tGJDGfQMwP(%H=r`AK>{Qs~WGx-d zQm1kW3H(~A8;QCp{~4e-=L&y8NVZxhxgSA;o6S}{B;fIn)7{V7lTPtigfxk6>y>W&K`4m0R@u z4ejol=e>yXx3vN)P`tMyAKLGH4W7Ky?~s{!zjo%m_*;}cy}C*qD2Y;UCL;?RG}Y|2 z!L~r7&JA>9I_|O80ESmh(*b~``;)Xk9DB9Wjy=XyVTvsyc)f=XRZ^C9PxceUTL8wx2qHPZd)I8WfE(ymd(mGUti z97v~&E1o3}*vDq)+pK@BT^W$qj?SH#Pn7;od}9nvm_=b3pP&HzB){vxoQ2EE@fbs`NL`xD(!ZEYYB za}*Y<>Cq`waJl!DoZqC_yweDya$uga+~$__8Pq-)Std!ImtfHq&^qEo;)m-WwpA>@ zM{M$Ao+l3?k-OoPOM8O8*ZwfUf_UjWZLyM3cp(-M1E+SHS8fk`{tu#^Bhf&2bnu56 zw{r-=eLXI*9rZd6y`A{Io3sy(e`8{GANKPV+z<1LR*~ocz3L=^CTcS>UA~@MqSErw zDcRw|cbz|?BYMT>n{kA4mDThM*&UxlO8TFKES!j(t{J=;%y)>lEg@beuShBjAn}s~ zs0~)IKh^1FVqTByk(i%>REe4L!EVy#Lhk*w;F(MBMBky(HY72ly8JjZl${C-B;)#4 zZ**@DuBMw|K1HACZb zA2@*mr93yZfWap3)b?YvBcsa#&kCpDL!tm6xXLft_k6ABwz|>cmQ#Uyk(#UgYMF!| z9DYCj;GhcKm#i6xBTcVPdXas;RxWzx)-o=d7T^4Q8yksVsVH(h$piC?+DsoQ7wx!z z|5dpdvgWrGy`y3IsDMU+X|R<|+VnM)Pv6Z-I~C_!w7=7A1K*f>_DaYi+`DX>@}24Z ztMznF-7_*XI=kSSgb>?nb-sh=F3<-q#{!MS{pqQXiyuNJD%=}9A=0(SpgDIP#)b)l zm-d2lmCdFYy8j;?e_p+4*Vm~8PrLOSn{#VW+b^i@JE2bs-3yc0^?u@2fk#Sv&s-y$ z_EcQaIYz})=|qIb^GJr0FxZO@T*SHRGn!6FoK-)Ls^e3rBLG=R!am=4linif$nqD9 z>lTyDSlhS*_Q!hb_Ts)Ha*@R93+uHW|8go>I1K{S!u6F>fV5SC(HydFi=HrjD(7F6 z;xqw3j0RZhvt+=(5)cR=k4~3M2(4yEX!v_pG{ccKbqLj-fpR)( zB^%~ojip@-O+CPka$+wFJjkPMOHYy|yxWTQF!~2tE6|{_UQ8m4THoa#Gln(NcoiIo zIR~VCp9;JIlzNQFd`1wTTIT6hOpTr*qOktiD z@oB^bwM~}LDK$5eUpoW9(Zb<>T`($nGUT3=;7x`g3w%FLy1E#AkLJ-Wwt-0o+)k@nmSe^+HOnrEw3rw`*J{UDiC`A{2qAK)b=sND`njpv#T(zTWOwgScRu@B5Yka)YAR>wenie z;jy%CxDH4S*UH;cT#%0vViSH7xqu&pi*mLGaTXh!xE=%Yf)-kL{i+vUGB;A8C&U{w zm6k&GcBFP~rGb`z=iWX}8ufd6x=WR|#f$EGnUS*cY7khSmU(4RBD5n1d@|(vuogIMGEa z0y&ttA`A$CJLbhEmoH3cDlyI;#p<@N(z1P#8;cE7Ho1)wa)4k-&8U2`s8iPIxW&KP z=0QW}Tx}|2!jY&uFyRn+`aOx%xAeXwf)S2%6^;&U=OUtK;SLeD=ITm;oh4g$cSELd zX#?@N^?t`!AySiIdhXX%K#3JDoI0$hw-&q~U_$dNK+0AtY%|McoLp3VdQ-rT)J;Mp zSy;ko`e2FpIRX?6CuGRvO+e~5VtV{*#Fz=ZGgni)g1~Wv_v|wU8=Bb&&o3Gg2)7|4 zDOZu~M40Es^jFTsUB^a5X~5SM7=^PM&=A}nlMZPfEX_7Aovw_U6C^dmlawo_i&;UH zas%3nevh?y*nh)ogTwZplH0i0_%fyir(OVp!|f0lIQ0JmAhQ17B6$t!%-@K|%?3oQ SMgJe*&rsj=NP(WiKmP;T{H?VB literal 0 HcmV?d00001 diff --git a/docs/logos/virustotal.png b/docs/logos/virustotal.png new file mode 100644 index 0000000000000000000000000000000000000000..935c5ccfa622e4edece541d0b968632d7abb7673 GIT binary patch literal 2776 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 b9|ZpgU7#~zcxju?00000NkvXXu0mjf%P)ys literal 0 HcmV?d00001 diff --git a/docs/logos/vulners.png b/docs/logos/vulners.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9bab4c2e8f8855ae31e585895ee07caf77a29d GIT binary patch literal 3942 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 P@4rtR7H?XMagF;wFD66L literal 0 HcmV?d00001 diff --git a/docs/logos/wikidata.png b/docs/logos/wikidata.png new file mode 100644 index 0000000000000000000000000000000000000000..0ffb4b155f81948503c5f3496f08c02e753e4774 GIT binary patch literal 4385 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 literal 0 HcmV?d00001 diff --git a/docs/logos/xforce.png b/docs/logos/xforce.png new file mode 100644 index 0000000000000000000000000000000000000000..96db659beef4fe6cf1322e15e7f60093f6684d03 GIT binary patch literal 8534 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 literal 0 HcmV?d00001 diff --git a/docs/logos/yara.png b/docs/logos/yara.png new file mode 100644 index 0000000000000000000000000000000000000000..c74c314a0a7980b3c6adc028a9860aa6287fafa8 GIT binary patch literal 62135 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 literal 0 HcmV?d00001 diff --git a/docs/logos/yeti.png b/docs/logos/yeti.png new file mode 100644 index 0000000000000000000000000000000000000000..46b77da03276ec116a72ba63767a330ee255ff18 GIT binary patch literal 316869 zcmeFacT`m87dASHiTn}^NhAV-U~GW&A|1xqkRnKzj+8-qlU`;LqeO}*Rk~883rHQx z7^OF*4;>Lkdhg84eb1TE=s?!G|J=3i`aaIek_p3k&wii1_p_h9&tZ6QLs{<7kH>yQ zAP|S-uU%F{AQ(juh@Wo%Z$J2sAxHcO0&xN%fBAO}_t@!v!EgS#!GObc|M}Z@Z@)j{ ze(`&SfIpQER=tkuN z0R^!~E4!hxM=QIbvPUbspt46RyMXe4HLd7~)q8(>767rAGrNSxUe4?S%KvFOgXt;V z2S3{IJE`l4&5aYgJ?6mkUynt+`0GC&vB3TEUyo}j{@3#odl%U)+VN17(j^c12~6 zR(649k5+a8<^TV*lIKkKEoAtg+u0mFPcOi)zu3s$jh-*S`22G3M$cy`zId@WwEhB& zPcQd|)}N60^6MV0e2K=V*L$?`35hSi?$OGZXi#78(aJ8M{GWC&Y_~1$Ies@({tv4s z^ll=ZpPvQTWxsntunQ=A*}oeod(XP=iprj-*aen7TG<7Z|LeAB2kcEpMTp8W`Ju`|?VAP;6b1&4K^{e;{3<-PI|>baP%BbD-UO6p8m&YhzQ94*DonOIsIP`#VGyqU%&Bm_J{v^!Y1^)|N8YQ`9J^b zah<*G?0E;V7i@^V+}UF`#2yvwQ2}C)3J`l#utx=m|Kq6OT&oPF>oD|loNlL|A-W(t zm}?g-jKl(MYo3ui=d_PbZEw4&_-_am;Ae&y_OAW%3NVo6Zp=3+1EWNrmetBk&e?sW_1E0;7X)YA0rO=vS(#zze@55 zNx+r){w%3%YU%@{dG(NTwfAFu*0sglyd}KN1YH|5lt5{ba8l+({{*OG$!o{zj{me+BeJZW&f&F*2ya16pdoc8>aGzauKG&#%63)bJUN<@c6qNtrj(Re0-%;Sw}yarsE!G(J zpDDeY`}O;I*ZYpQ-|@rV*jVtpwlS28RWF-;l8QtzMLVn9FK!UHV|hPDq*Q*=Xf+yd z6Mx0gkwu1|KcBO>SalgYm0w<$SW<$mYEJCgu0(!Ed!2GWYQN`uwOiW~>r+;#&_2`t za_i23tP55J*&kmxBYWNLnoztKpZAR##}XnMKZ92N&PS9#|B1a?#1xOe!O=0k%xXUK zQbho#{&YT%n@$A18bjs~dB?|OV%#tk-_5_W!kYHlC6xJurw*je*v}OY{AP=-s+b98 zt{v%D|D)TCbyMWE0YXL_xzV3^(_CjZpA+ne-AvW4Kv%jc-`jyj)=0W8zsFpZf3V4& zc2nX#e#%0nqp$K~@QoA|x;3enTbevw++*ItQWZEWP zMK+hGONY-@hXKpeV4xLX5D_4!!&d}0lh5e}UdW^DQR1{$Do0V8Vw_akjEZHic6y(- zWwdrWHZnaX(y~lDJqBRlhoV9iW99bPu`3il^Xuah`BQ&zt|B*{w!tL4b8$3_F*x5)w!vwEbE-2*KTEbTu|NJ6FYWsFEEE(@*t*r_RVs8! zx29JrXd+cQ_0z13&L)l_<_dFi+ppKO@aOCJ#;#0;+Gr)1RcxP*=^V|9WVaBFN!Yn2 z;RI#I!|v~Rt+P^Lz>sj$AjK+2t+QLAYbb5zFu{-xr}um+xK!e}v-4(OF#D6{0z>I0 zs|C)Ol{7pLve9#elQFZkfRn#Pn3mo!LqU|REVtNvR-f)0pHbS7=NXaV5wGqOp5gJ> zk+nsJ9<%mJJlQG-IKsnYeJPktHv$XHMnPt;j6xeISQlv=do3LFJq;Yg$TJkv=bk%$ zR4?Rr%F1=h0RQDUS>-ro#G5y{&w3!dpGMn3u{SotkCf#1*X(KxF3^!}K@r6nGgS(7 zd?HpBlTH^b1@2g!k;0Og;(qbNAonCXhX^-hh`;F@B3s1|6XNL*Ro8~PC1Ux2BhT`q z#rXp?wcMU9&5Xts#QOfyjOHq^V8G z0fUd*lVjxm1pWqF(ac(W4zdxo0_@~>$|LbCl?E5nE;lGr4Ktzm-CMVvG7<H z#Hg?E)J|IVlJ3k}BIdPjV=wj2KGOE9+WzPb$ZkNo-gW5%-yM>8OlO)riogtgAoZ8W z{5O>BzzpfM&pJP^Y|itIP)0b<4*SM*t@8NId){7qokwtJQYkIcHS38MiotlHVChZ%XSN7ag zKWkNe^Fqv40jM`1vlwkG=mFQI465x6K9q9Feox}lMn zFxv`ldv6|1cpckqk`aNf_8 zS>r(rAAh&vV#r2{jr2nfCGa*H6vc298%^;q4!;lP3Rq#*rj?`RzLbrZM@Fw|uBO=o z|DcSBMu*cHmwkL@br3kO)QMF~yULb;nB36Q1$gPHu`~!rw*@17c2yH_zEDhp#}2RC zbHKTe!`ibtJ+Exc92J9dF^k_hE2pL6N5ncJX!Maf(MNe@ZG*H~721Ebg}*C-@T!_U z-vAv2XdP9!{;^4s)=Rz;6t@pbT*tOP+Z5dz9hyBg{<nH+Ob^hTcU^c6AiBMOw8+~+XWx%Jz8@+v2)5~X86M-N+6Uj!Zt6e&2ag$>n~A@N^}{{pX8;d1q#h#am=M7v%bO zTcC%q1>$S^D1JkQ6g95AUueQeJog|Rn>R8>U)}1h$bN~XZ=1DCYwx?R78dtC;zn80 z@4|9HD61g1kkdzwFy@PU@dhk)7l^yb1UR>%5`_$$XrtYMjR}?%!|7c9j+?b~mM%qL z#gtBL!sw_LUI&3l`^Vio7G)va+%j&@u5nff=_~=QwT16&-Vn@++|%YY6k`m;1x30PE@;VxPl0hP)+X3P3_A?<@$2V3(1^MNGT=c z3%JQBI(G{rz0Sy|^efQ-Iou&giE|54)wA}7pPmI^V^16KdeSw5(jCZVU1et$phJlN zzW=qdRkl=m;p}Na2inhm_ZHm`-+Wo`xH>w@N+MxA=5G0$=mVn=32kUL@r1^IrVDwR z3|bqu5A7q+7=dFqr;q}<&7ngj(+fG%LVPK?);=?rc1;ypBDmhT=X!;Y*vjgFbe%n2 zOXPUvqm&Ioz6jYH#cvlD_dl8iV-ZwqdfcUzu*Kn@Ho}(5Sz~VT4Prj*;QfIPT{kuB z0r|zPeFU-ma`#ih?c8S=XAhpr<*< zHwcHT%fT!Y?EMY1udgc-5Had&ti=$=28_e(zXt2VW8pGfZ2Qmi-x6jHb zRSwiQKH8+ZltgK*`BLM7&|kuojK?bh%jx7()5Z%#*7PIB?af>!?&&|#<&^rF z#=!M3O4P?*tbP4jgkG%u_Rw{3?#Oc^2s-b?S1&?!r=ZBhdu!D9PlsnU4b`>%6U5Uj z6RBXHKYf{Ix#246ei@j+ex=J3t`d?&=+U7h$BOCG2*i4mKLa%h#QYej6m0a=|1j#W!w|4Pu&MSiFq<%mk zl*1eaAs+xrqjxoGY`PcD!{1-mwjGqk=gkE;vq71r1b@r8rgkmfT&`u^DW7 zF;Xeh898cl6LMI@+&I<|fh?2@PQQ716&yhq+n;|i(9 z?FVMKx=F39(n;JVO4i7Xof7rvRDp!-)%}wY`Hae%PM=#>8&TS_O2^l9w=&45vCP2+d<_*52^5m%STbU z=C%_lS^O1Y2igyq6KJFj?g2He=mP_OkM@hPWc7V=w`+^}AQp-agv#%#fpEDRXduQ_ zwL)piSNUiqCD(lQz2^?YZXBcRQGS1t;jtNdDC3FqVt}6-K}sPMG?K5S6^DY|>v@R@ zJKs9P9bnY5+18yezGf4mu!G>{J1Dzs$p)f;E}Om$tOjb#6+u2I4aA>q)&@;?3^pmx zG%Kkzn|qKHb&N<>TH{q=4R6eLST=u|8I}nx;dW?#x|ua+fETC>c<|^0j!T5eRh@#D zy1KAV6#6&oMx*+Me;9>TqxhugX##^y3f?0ws#_`}6@-%RQU#PsP;IoRbLb(v_j@M_ z#f{w~6cjD1bwyN$0J_+Ty6G*LF2qAgK5xoGh>MgS^#*Vn(5VV%;r!slqNViQ5$kqrYPzO2v?qIj^z@$Jozq8&IRjh6l~tuD-O> zlms)%LYn@G*RWeB3dg}hRSBQ4uNj6#NEfxEwm>9^P6<&yy=s z%dn;6gFfDcW}$gOimM)UQd~u>nPELH*3bgt+TFz8B-Yi98>H~;9LW^W`jf(x$o!(^ za3y7ZPFkm9oLgWDbx7Ra`rD&$!){ZK4)(aT%N0Qdioo$+b~x8~K+IRnj?}57tP~kX zGmFGYP$1$oK)=0~?ZMGm(>HOv6E;R%u%>!`t)`hQ+IXPV!gMS=i?{sAZc!Y2go2D3 z>!IlM^F!AQHw?>&6;R+Hl*=6j*Fo%AIi1Z^G^(#zY}AR~x_B=9!49X3zoxLHN;42` z!1m6X84;U4~Irh=&js4aOafK+a6F^*2;cj6tyzsZ|*j6<}?iM#Dl5S1Bv8VG}u> zdio&h>KylC4tfaHVuUy&sG~O8My;+ZD^1NdWQH8;L=K@1 znUmJ*4V)!4!QR~nMb0q&XXfwkBRXm^R)r`w8nrI|!>FFF6t=_bToig;F9^CSCvhA7 z$ZFIzI?fA}H&Brf>kKucx2&4o)U7LH($k|Ljt&~r&KGy9*lCdf#iBGdkV<811x8hI zcUR*AYvIy{SZBTe+Sird&U|fHYaAsC;#iF@+xrw_TI5cI{-P8%@5DjX^T7Ah=LcJi zd$^=PxMDb-LTyM@)Jz4s{-6E={7v68EZjz|AKu)-TYiNPDD@Pnjv;?=cYmV0q?{2{ z3{^8INpb3G$=9&haFAYWYb3$U1N`G{liWJ-Xj%D`9W`5l!a&zT0t0SM0zDyWm*%@3 zlgtzu2kPR52UnAlG-8SYJGb1MsMgmddGclZa)WBSb6Z>##}oQ*xp8|16{}kh)I%yA zYIr!_Em)&4C*f9d(9L*zMxgHPr%zU2&k3 z5puqD9)dU}-2TJ+Wv3l5OQYb79}WaUNX@o9uA-)o`JfccJr4UM7N854s||u_byyexzi7Nx zXfs1RZ5_ZrzSx^djbvKRAW_;o@exo0Grjn|=!%`*`hJot2)39+rW8mnOev%IvOq!< zJAp8aijU@&I`s9vFhi6C<>*+L7uW(6hAasuJynGxS=x~}>Iq5fY+{0$?MSu0q1XAw zrB;sgu(-)f_&buU^Dd)aZR_PAn6^seg!=Cf!pNRd|ol*<+@YrxlrythRF%ir`V`07H{p zNA9f^HzB_L6pug943wkla?mm0Z*E-8$tsTqe3(z`@fK+~Zsx;+YHHI(2b=APk)TtB zYbZuN%}t~6?m%~bg`2RoBL7%a(42+uxDzx2`s%QVfZJSm1y8xc=`M6s#bzHQP$6o^ zsN3rwq$}#bDl|&&@4RzBW3a1pMCs`b2$QpYxI0 zRpAr$_#Mb9AEzKI5mZ}?w=a*0yDQc%)yog@9%6kT=uV)Zo2dZ2>B-eCTA5H9)d&q_ zzB*!$QP@FvlD)gYh^*<#QY^%}3L}dk{RJcfT-9fqS`C{!3+Kk$78~Ww6KRtXbEFwY zWt(}|G+I9>SrO-5LhSZn8C!WV@r|Igwxj`PJc&2&)o|%G(+30zLATj376mWAt#iA>to> z&gY{R3C*1=b7r8+(l~cyhqei$XvgiJf!1WxGE%7^-U>;ahW-ZRFqhR@QTt$T%W}sM zp`q94Lqo3{tcYpumtC-=5ZxR@H7Afo9yfhXRU{E%e!_$tx*zvxE0xQI(q0pOQ57Zd z^zF;N;M6T3fsS#u7nn9HCfVcDi9)Yciz#OOwJ{_2)(+A+fJ+FIn{N4K>lZ;sMqBe$ z?!l?kk_}oouOK~q?odk!6D8W~yj5P|>y}(=+1$AMd4eLZo)>Xu@TUe7hN?$H25w&@PNdfV(e@aC+ZR-VI)DVTT%nkg^li#k<{w-g{T))4bHmy?I@?Y;2AirN;CaCq{HtSF zMFaY0JZKECtX9HyD5fo-_9%8-Zqo;uMFI+pEaXzVyPuW+1UVR@>;our6um3h*{A zqyq|sRDROrlmr_aB~ctsg28y__zYOt%w?g`!*$e8=Lyyj8rpw(I4Hvm_>`gct`^(z z?UT@ukd2*cgu*AEf|0(H?Wi1>^_c+Hxb@`%AR?G4d6G7H`)yNFZ)<_ud?wKP6fDxT zGM7$dx7=-N)^7p1+6vm%bd9q+0<`4>oUYQp0=XfbRS`e1sV5J{Ku~cSZu+>owm7nC z1ZV>VC__M7t15~~l&1M+J4IPQbs&i--H$$1*oEaf7zNh?L9nLx@<;o{7n=q824usW ztcvId{-!jw4M!l13xUh2Tu!Ts@!LWwX0J?r3M)d*yQfiJQplF1UKS4&k*+j<)9UP5 zR@%Xltdv*;Sk*o2b70!xxge|vy`VjT&R->|IJ*%0JWw-UQL#Wa(>mivN~-7Gb}L>q zCUaOGALN#TN)~2FnAN4A&`lUyDCTTVlqxM-9ZWDoFr^Y&~KkG|m9k^Qi z#7r0**EkNQKu@TbkSj!k;%rZdTA4G4q%w_W8D@anBb>zzC^NE&XhAcm!E$JTxOkAP z<7!n^m(poJjt{D8TJG?s6<@d?D6xRN`x{Jh1tubF&@HspDSKvGm&rbcnLzgYOYqp# zqLck_j8WgZDxVVX&W)X*Z0x)HO_1MO4!oxMy&)XB8deqPzbF@8YIp(FoG*@fKR9FO z^S~flygVkmB4%RQjiOziUM9=hRBDqo`Eq?5Y0rx_g)er(x>umwqltD=`+z+5N zLb8cgLF}zZz6Hh=I|4iYBpjCneK649!se#5_i<4?dc;PW4bV0LFSTB*uS-P553DzW zG3O46LcKrL!bL&J`)Ja_38_M{0&TPuV0)=nn{7_@P{tiqBc75_1SQa>1DP7DMewD> zVywyNf@4u;u0^pUw{~}B48)M~v}ih(wOWHI8v_Q*?k>@dV*xWI&^(q!ovfbHp z56?hv{CnVZhQ|dUS^+~nl=U3SD%*&Ii=xSfW7pSiEe+fiTWZ>*cXFBGS4&rlpuIM= zhi!Q>sLBi6<@~lh^q)s?Fr1NKd+BUXsKraHUx~+V4;54{uV|bLrxg#FRvZ*dIA%xb z+veEK_UW!61%F2hpFKJ)A!+wvw#&$3>wT*eanZ=!XChPnU<|}G{~kC?c<3=4#sZQq zz49@rx5CtB2!Ue<`x?7TM-~f4<&GVQBwIurjpv6Z-d`Tnduy?3kh|&Z$8W7zK*KVq zi9ujg#$K!m%nfcKb>gcY^XqRIfp%OMn!|p1%yYoZE^ZFypcR{X_+GL+=zb}?n2!P; z_1F?4OHC;nH9JR=-+s=5UD}515Tnf#@5O(NSJCln)W z@Lk68XYlzpp)ZbBT)cSgcG0tJz8+U_nWe?1TaU*hHh@Rs;8WT1wW!st)L?MU2l|9t3h3;oNV~M zEp)*S`&lUVKXy%vdaxPnY`s}Kq0!t1bI*%YS+-4Mn;(b9p3!YBcDy4jz8yT05(lS0Q{;fc`QHN< z0nZAC`E&u?^B=(7*_d;2u#=J%d=_+3k#-;IOsnEJ4x@!+WUz{Iv}c<_J>)RoO@myE zRtpmaQL#iF zH5W<%A?BWT8rIK$m{4ja@~E(F++p)t$G6Gd1Sr&II z!V!olzU5L8Uo1zmV8gFzD6{$Sd96ts(uT0;dDw#Dl!m75R$(EZv%r;<5X7wAy5+&i zNLLwsDwwFH%t|tIU76*j<-8bps(@L$?cs9rQYbmBrr{u02Qu9b z|E0oHwBhdOk~2yzL>^Ohq!PA3mAU|Zm*}{Y>9SP1%pD<>;~TH12bSC?pi$@-2PZs? zz~u^bmpmSMfNs!ruDkp-=pRXXt29wri&kFQtUaar53`z`q57eY{8=SSNu)MJP`85!yn<9jaa z&J+fAwV0tuYRYULe8IBYO0>3@P#zwW($#bklGthwyiVqvS@oQNCMgKxBYFn8gxYDyG|Rrp;`ZX5f5Tr-qtntNk)(w>n)Bh!h{}hBTG`l~oSZftXzhOw z2NlZY1C`Ul^;X0{{x{#r(4yMUa=R!(SbV`Mb-b0(@ve33Sw*b^ZT1?#Gn}5E!IgzX z93`ik?@`SceOWFU#eJ85eE1Z5gL-YeqJ8V&j?H(&S1&3AOn>lte9Ly*1xn}|$7HIR zqeh&@Bkji5N04>z_OZ)rYrE01pZgHZetl}#_NL3kTIPg}ZjCrss`Yf1h228Z9+JXK zk&7L9$cEQmDq*znt--PXqFEyj#SU0F0c0fs>hcA`*Q^QN@6|N z!f8*Jf;Cf*Xhe6akjR4WF>ccob@*(O0U*Q1C@{A$^^=Vlr9;N&%*MB={);>G%0Umd zUe7SIFydW0yO|Z~;^){Kj(jQA9C$tMy3dHN^6@R3)j6+x+Q=`rfVdmOo7J$q9Uj9=$zeYTe2H`Y1^xsh?122J!{MuyONx8F_`cDK*kgux0M(IX-n9R$gxRCeF9X%Brwv2HSI zJFZ;=UHeA=Vz0)24#WDkhRc+E!(6wne3x)Q5gk$an!R!1F1w1hn+h%0x&99-R2Kx} zl(_*_I%kr!K8LGu`;-P0uFcc$S7Il(yxDwT34qmI??*z z0p4)s^Ne%q&Wu88UNSQ+S1Bxku}#A3DwEe0)A>o#|Am?@jG99$Z|-$-hxg$;*-Bv) zfAgQ8?4$jn?X=LhB}M$oUazj}N8G zcaS$|J?uQhX=WN7d71~tj0bi>aT;+LZA4~}aL5f(pQQlTv_#sM%v^q*g; zwgy+$)tw2ap1X}*8NZlwhw#Pe)buL_YD-K4z(E>4ITaWAZGh4C@^mCtg?Xj)|8-x>BJV)hr&H>x_%TvzK;UJsH0G9KNmL=KiyW z%?-Uu)P2u})J(ebt&*>79wzxJOOqZzYK*3&7>C01(eg~7$ANV3K%t}0X;MNJF`J(; zX$D$?Ceh8MrUm}-XLP|4w5K1ToSpT1Tge%cQCSI%`bo&vWtjxxRy+?)O}KCiu17}s zFGQY@9%$$1<=vEohb)+jU1HY`u4klfLdAR2{P@@BtDjxsK2sXkX(RFm=>V#_(T1h?})F$ThWgQ}+>Vr9M z43cPHv0?pHpz26rQ&nTowCSBqOE;teZFVk8ftOO3aVM zN-sv;alGG!d^|fxg|Ijr07y&R zKJp$1U;E=HHX4~@-FZRbqmq!jk))>Z>(I1<7b1_+w&Gj&VcE{nkO(gKt$`#s+uc4o zd#qe$v3P190>;fCPsK^k2;ce;@j1o_je0GIwxb`h6dB$x6k`UhYp|#osQ} zcJldvhLiC>vVsivfi@PN%#4p&#PNdS2KeeA2+Ur z*Kd~c@CA?KM~xZ=Wr8CQe;wF8d1Z=_E#y{EV{#6bKY0*U90=b)LR<)eB-OEXtD4l- z)Qnh)EdOkF*jqga;%gy5032Y>iBnE%KL_7(K_FrjfCv?J5e;Ze@>pGuT*T$<5Wmx$ z11Vs3Y@B9Yq_wzOH-vI{uSpGz`NKye{hag2t!hT=9#s53T@`aYrT7l`pJ_8l$S{#> zZC*xD*%BA=)+(1!(=%j|^DZH6OEzY9mX0=)Y`h?je~MA=Y`8WPq|}9u{v3FEElvN7 z@#J3rfFDK2`p~oS(roudwhI)=m^hS+&)G;i!zM5lqT+;$gIe^q;Q;0s*_ez;s+9g@ zGNPx*6G9l*qG}E%lcx&B)HG+>1mU+|$Y{ht{h6tUNGmJZgsrEriY9w;MeT4TyZ(u? zmgv4;6$g5X8u(riVwmmbO}3VMB&3QDNr4t8+cX#_8@Ga>DP~smndVh1>W}nv0nYAc zBKtMv9)ue5WbD=-w0%|IpO8*2k(1Qq2KIt}LYuP_yGc(OfRYFbp6Md)Wt}HDyUb6)2xU+i`!hl|mKAU?U_k>N`|QD7%77)c z5yKqM&X8n|k&LNXbdQ%=NSU4-(5BHF#)^}aOJ2cN#Iu+VT?aaxijeUUFnw*RCLvot z&jdbS6T=G+P5ZxB%nU6RpT9VHK%2_Rh^mVPg(23jhg#l#SX2MZw4cw^Q?Q=^|I^c( zq14f8p1fMNa0Gs@XE{TutJU0cMN8IUyAe;sCDB&;qQ7R_Kri+}^SmB+spz&CbG)=| z6FlWX6g^4_f1uCm{@cpu0{;1eMSl&#r~S&yLq9g&gG|Qj@==DHi2gr-(h;kvj47?T z03mTuntkdJu(H{8YFQgK1#Epko-*WG}riCS9`SKoyCfE{(aK zj)l_A=2y^J0~TslYAXMgnx-#&vcPyijodAyN|vV$zw7Cg@cX_Xh=rL6Es?!SooIuo z{iu-*+InSEa}h`a#>WrP7J1P_P_>*toRJYX(mNHEMHcxa;t(aZD8`|dhRr*&4)3|~ z#e@Ya&3!T$5p&TEc1{*do9iIQTdS$WKh0`ARZuE4Z*q1L$wkHQ(|IqrVB*I#-!5{L z**8jlqUDuMRev`wq**~T!DHM>9%XYIV2(gL#<&p(Wy?DKCwmjPsjJ(3TLA6{c(@3$ zi!X#rzg)XX3-3vodvU0|LH)Y$SN2T8l&awS%G3EbP%YyhY^qS%?USJhhIcUSir&T7 ztQ-uiiq-O}pc?w(2Te^WP#4>8vemcORy`TqiR>&3gzWU~xQuWxrvgI!v!&kvp3s@i z9m8`}#`>{ObJMV&gArWEF=~(oHy^%2jRBmkjy>Op$zh;(w{&P@U@H-hfiP$yOInC* zx5^EtG`xtSrx{ij^IdCgH<_D3!+K3+Er*tY)?iFsBQiqs!2O~14kYLysIsHyJ!%|0 zo?I9)V=c1+Kct^Rhe3llni;-Z5EKPPrRR>UID;D) z@t_bqqzqn)N`XA)$yOfUr{aCa%T-2~hBSwBKEe#PrT`dhDrpGZEwKCquulOr03{kV zZnqiJ0*w6!>Tvtoz>G0+zhNDaEL5$6IsP1P*jzYLReyUXFj)Jm@ehVK7j{d(ZTnKB zu=|u3bf*TM6(evDwV<0tz|s%+Bj^x=iY*1Yug*pEKZXg+q4Q1hbAW-`Y8U`I$tI7 zC;Z_Xj~7TJ4PcLVq9=YWG=^psOJIrBuPB>I(J zZt~~ShbTD!tS^rWUx|`--VO#$7?x%vh2x)q<7Q626F6GQ?x9aNmFiy1fO~-Bi#Y9q zGFbyEW}hxQ90_Sn<92HxXI(z%F(-HwPzeMlQ&1!rskjdvwfRpWH6}itg{XQ8hfR5C zN_d_=`BG6aenyicsZba+0-aAJa7P#CFM*q|kZl-Sb4L#m zDEt>E&1e$D*blm^h)Zp=%Kb1oZ)5>t8|sS=`87KLrlxWL!~4x^Ah&s?$|#i+}qucv-nOQw+Q5-OtG%479SB;00yJ#>6=7p7ffi_8pV za2Y4lZFZnJZEmp>KgtP93+YP&35`II#Jt?tP;Lf8XtGa>jm6n0B~-prQB-~9Pv8Fa z7vlW)=yQes2mCpgE%YkvBlR*(3Qw4%+sH0HUvVqKFr%0oKGI>)*t%DHlgpkJCJEL{I#<@m}&)`4TzMfxlQ z6?AH8kR|^frhh|h7&5_sr*?BjtTt!gS{m5?cjv{#-lPO^j@8 zh^Uvd6=L9N@=1!W`ec!D7`F-#rnnyG7q$jAcpnP}e`2~if(a48$p7H3-{F)N=qE9P z&l#|X``P0vwoG3&bzjlZ(VRT-X$knNaacntkhI3roZ$-Z%GL&ZUM`6Ou1>1U4^??c z+*(Vct}}J5cKjxGX7l5OR4h#bGNnLFA#mEiy0WKZbEU^+nDjSiO3OFK2;TGXuXrKq zT~=8CKChP>RMcV%jQsMzsMbNGe>W#>?wWMjSebZ79+%6Hh<#aLm_Obe$GEjRqex*U zQ$yLIBU8mg+a2Gdz9z^0${v$o&8x)^bK>&yR;J!1%qhfui#zc|%FWQMF+Y!tBXz(P z;lkxGh3eY_UiQnY#~(<%dhS>CG=#vlasHb> zRbLc5%q|&1+5S53)?p+oh!m4s?JP-&* z453IZ|}ekLU2Na=yI4E;fuY1m#1z}F!nnoS6q`CHxzjBnHccXrR35Su9GJv zv64q35dv)*8X7f!mGyES^?x@6KHo6TK=mAR2gqqA{gj^4xyp|dG7QcZmFM!K{5yXC zYJJ@Qpqqx6BSnN^ev{h4Ik|KVuoK)*R+e@T{{B0sCFji<#6h_zrL(A}CqFxnH+d}D z&c@!3?PYRtae3T07Qe6_A0L0));4ISuekQ%OyB6c^VUg)E^>c5fh2f0bD_`l-GGfhCmc5?(&T)6hR$`$G!T2=Td7ylp zjF)M1*OZBB`#r%NPhHwP{tlW);R4!>K0dsjJ@of#%W)7F*8r>%Cr|!(&-?u^2(^X? zbJLB*v4wo{LcX|9^@OUbp`dYX{CR6s`9z{v^*#GC0XFyHKT0;nV@yH5>~r-7o6gJ1 ztvbcl=W5y%v(kI}xxo_}k;XI*WvxR$L|L21i!ZCpJp-Y2I;7q#(L+o9^5w9Tp(Xn< z45>=-zvOy%a*y^qw*+l&ZvHN#eKz!gaI3ViR<`c1YeVFM^;YXDCOUdn)(&Sdi3$Av zo(bBfee+ z$D|$|qxXJ=v7AqfJUGe8&Ck;2Y#|gSzBOI&zC%5-dZl~lr?r0P)<^N|fVu9Rt8VdG zyJC;_YKmKJs5A3hwUGIAHTbKs84R&tpWC{2o=fWhC8ZzT9DQl2QkBqr3|#QQcykP+ zed+r9o4&o4kL#0tW^&V+8RvZ0u%;7jDGROSt%M}-VM#ARLK}O0BDx^(H(`!$iVGG422 zpTuFp9#8)fm=FvbjzeYr|-SP)+j{yS5wcEP;b3Ug8IG{ z5IC#!JRpF-QrvK1F;cFGCq|OMT)7cs|K_^bKp0e8jlnN&qTgiUl>&* zNN4uhV|ndL7HR+^of-t(;y7uU_C{rPD;MH9X9VWfX`_!1T>9+&CE8m9YBtAqfCi7U zTQdqQjBI)w6_;1sl9j(PW{Q?JZ)l$jW=G22`T?=ea<;#8p~bCI_$bfKN0MU_10IAp z#~GJyQ0tiTpslw@@&^~R%1S9q&AbF*6Hp(T_C~Cdw9)}So6AA{Tus-2o1EL+AGa;N zub2r%bzJ$vZQvH}MTjZg?}OU?e!-wvF7FBKH%%iW^70mV>uROGrsnoL@^-?4A9~&I zaWhJtAe}bnO^9EA&sgKUGFYQbH0m5f87Jnwnn;!XJuArbr`SkL9(sL$}T#1k_k1%FeL$t)|@USWbPOHNW=9S8xa%h3;z%%cq#w z3^=Py%WU76`~`8pbYZmiin)2G{Xow3oBMD9;f-VORY)I#N6VK;!ya;Wes^oxhgh|Z zd|Vg~RD;BRtp(V^V`;pG*&@qdGqWWyHC3l}WgGkpqKC28rQ1O4+C2pBS~s3}ISap; zkoSB8{A!N15>2~)5WXpNIj@J2#clAIoTMlaU&h}(&$VBV>pOqGQ&r3G=soY>RDVX) zS`U_cI8LNQ)&w#OtEH7ct=L+vA#WNb{2f0C5zTAmD;`&P^jw{?#76^fmO5QgvU+mo zVy#!Rwc(Mf^=kh2d9`dTPcI^jUrtORk69NFG99p}kUiVgqDX5IdFx?YKq1Lbytv99P9P?9_BCRcS!Jmyj}Zl z{mqci$==>xpaT!Gj9S;$`j2s&j4@lhSsY8d!WYT%!qlPwzh1CL)bU<_js96?U|^rC zKHxhpKma~d-6k!|ONn{D9<&AJZ%Du}y)N@yt%i6VWHN}LtB-mYMiU%|mMz->?H_bL zbm$O_Qd^3mdKzme$s6rG*`DBUfOSn#{^nXvUY=mfO_!^&d5eKJ^WEivh`Q^RlOD9N zT3o>^yH?tIs8<4kQGKcrn2nu#I6JuSUE8{UotaR2z*ixJ`5oeV<3KB^vh$*|+bD(~ zDv#~;+&df$+-!^E>m3~tFI+ymGeaK z82-`-61!c+=;!O#3+^v(^P@K!M+r!>$2LejrnaST5vN*@(6I+rl9B|`UDhXK(y!5a z3x0av^ljzqDt}(D*@v94sQb3_Av)ssrHS?}_^wQK&oci>b^b83sHu8)t8{+)L* z?|ZFtuLCg`h&VogeGe6qka01&oQ&USC`RCaP~{K&IYsR^(YdlyhhNG>K%r}=-&|tR z-`(FI0$CztS`%0@o!^+4p3ddc;E2b%+3WkPbgJ?&06BcnzpU&B$Ape)lfHrkcL3^W1@4ILX(@;znJk%-TVF5gieV>t;<8Sh= z`YZy&*ah@fZIREJ@m6W%+0M8yT6J^*Dh5|e;|DM0`PMeSYj-;h)NaycbMvu+K_r^A z4fGb>eISsG8c~h!Ljs0=VJsgxbjpfH>}29io*E0}79OZk;0=d=P|eXB%b1Oj6vb28 zD@_N!4LTigl-EBp%U6DTT@DGU@4%mcE7*oSyp~tkgC;_?LGSbxO8cRjfKi>k-5r0k zYBZvbu?$d#fWL-J?b8j=P5^J74grC4mwnq9qJEc#0H-BhvD$qgLnaSm7|s9rt4w_3 zLyF@haF}IU{L#>}DhhET!=#VFB+gm#L~CMI6+hUWz{RjchQ2jlr00??l+ZuBjePz2 zwZlkfnQL}JpuGC?H@|OI z`GWOc?WzdLeZx=2oJwz&7~kTNS_u<(!RJ4bu~0TEz<21}wQBglwJ@n&b91lJ_rmxm0p?JKH963GccYUyE;-w#V@YHHTJuU0g{*K^d?bMOb0 zE{$In)r*j{uB#Y1WFI)^L-ulfIeHtgsPSJC9eILXwnQf$D-ZRs$j)RMPZ^$u27^fo zT&}ZZ`RRT)qsgBTSM&TAE!ahXc*-+d2ytJ2C+Ao4KVuu+Jf|z$8+2r8r&9gNFvgUm zBpF#^y2=$5d;3WS%#f<8D)WJ(O~IimvJw%zdPfh8^Z&j0BRN?sJTtJgfKYQPSQctT znf{P0bE`G&t7Hg>8DtF)KSC?$`2Sq_9&|v78iBlCl}A9!8e8@qMwKt7S(Z?%6+O$5T zI`2brs7ZZDsL5=s#HrP9f4(&0huplSzhvKiSw%$!aumbIM)sgWJ^R3W*X{p)FiN0x z)Wf?_O8uOJ9Achw>;ENgKn2p9fpsY1){Q)7VT&42o!&p-@HY6C>2|3;pX@RL&6bvX z^D!_8G#)aJ-3D%;KGi(p0tz#+Ish0`?bs&IQJtl8{c*kY+S*I$^fatgPU-l8h1cvv z0Vul~7y^9qo~>jG+HYsht5rKz}ob9L%*EVEcBD8`sb+Id3kC9AbC&x?fW2!#az-^3F*S=IalIm&2k7lubl?Ei4TvYi)pWJIpMvMgWIQ+NtFyQ=cen}?r?P)EQfnfG#^ z4D}!#;QIQ`z9l3`nf^FjjAV;(^%3^JatVVtSi!itDGU<)|KaOBprX9C_u(-{xrv1& zHj0Q51r?@ ze|_&-cikilUe3GEK6^j=+2uq?m7OWH>XW{78I!24s;as@riNtm6~x>B3$SbPFthA) zoc*Z-tfu|rF<234G2B=IeqdO6cvc?VfZZ%Y@wLlm8NJ39wa3akq`h& zlXH2D?Pc08voonOGDMz@nwYqU7$W~0KD{FEHfINNQz!pE%b9VF2JJ}h%Yc?vwz{}S zl}~0>+<8u2L#wLVB=Jbz^CXCkzdIl@_|s$eJOA^=T#0X2&wN6Uov6B@rWOg>Jz(2- zVKF3r`?SMeUVr2Ko(N$N*QQtj4q{6*E3!vDcEmv6Zv4l&;kS<#H?Uhp>tm1TlR=>n zbCGK@eIWPMSo00d8__flb=`*QJN}pSf&7mCZp&M`n?9I}qd|AxmuF{l-_F)x1drL` z{n!5t>|G{HcmmdNYZbv48k3d9?yT*s*FI>xQ1ps`@eT&`d@o9flh_o=3@lJUiQV|S znVx*M@Wv!%W>q9qirbK%MNXM?X{k6;Y00cICoGU_vRq~^3Zv;vwC1rAmAd13)z2UO zv^e1O?rmW$XvoD&mmo-DZ6DEF+w2CV6IIUf7?_4QXFZ55r2ZAGX}T-R4@(}$KBc;l ztFM5p1j+)LBRh5$Bc1hjHVCjbh1}PZe?*9STGK=qC($nM*9JZkh3WS8 zh-k%BCKjb^MX)#Z%iwWFmWG`on8K&)YuW zcCyQ=^4#X81n2=ie@ZOyH*F_W%v;3Cxar5(5ya9|_g>1?c+x^{ zH#KaI5=v9`8sRm&DccmmClF=Q>>H`1#AiWl0ulQ5_WqF8F1iaQInPzB4Hkd&o=(il zk^3G2HN$4KPtXKxR+0I92yEVi|(# zlR=DMJzjj&Sc&&Rs-dCepsV&_g$)3O3+1I{fi~|YL+amY4{df8Po-z&xt8|v!e z;z7T@Z*4uHzu6W(;x@FUci68Qq0C2jhl1r!>CXgg)>al+8Uk%NYHg!TR*fjO5%nmuB8+#Ea5PF5pid-sOKBumfP>BM+AHLeRpZtxM10 zRBe>dD#?D~>A z?iV?UKqMpv`~QFAZ|IGz$Gg=NuDpe_8`i+&gR1eFS=eB2w75-c4>8g2EG0~|tkK{9 z8DGb1t)rylGFE%H_2p&Q(Wcp=fulwJwhB}G8IFKUO3lgfJExjl^CC_4F5q)MTz|*8-Nd=F zdEe>mN@<6^{{QQ-6rP%zdWlQ;m1%0)@TRP+VrCB3wb*^>MLl219orY7;YrHIe`-{E zdgx#WR&wu*c!T<2>VePv8Id{)T7$oY9-#%x_*7&^PCmT}iJz^-cW>iU4({?A=^E@> zd>Ox0BZA}eT*bHC1>3(H4r+O4XJ>V-3|Sq_>T_{py!%$)P#|SJi1LK$6P{;)P6BJ! zDq6q?5bPz+^KOTT;3Wvv1v|QB#B`)xt^uo(rpma-aklq}{zilPrxckTGi2@VB$TZU zha?j7c>;BeJ!lLtLnqY&=iW?X(00U1tg^ZY0=O(cI}0-0EP=-6@~r`i3hZg<4X&em zU;k*}3>>Ph`*x1>iS`r~l~{fQYupAAr3zF{@qa;PA<@y@N-^R(^U5J+6uGerONw0| zT$s*Xl0U%r;M2R*vpH8|8yW5|48KLc1WjAT-D|B-Ua4e*)uuXDYZnFoMkOU043daC zp}c;*b^gfRc0%8$>sx387GAC_uU@gS(Z8jphD#l9iI?HgBSn!$3j3^?hxxreCIRn6 z-n1c$L)HOgdJ#CpV&cB;cT#KpA>w-i6*OHmI|6e8dV7b;l_GdQiWG5l)cmGuOv;{b6ND=>Q zDB$xG?-Mg3qwV&y#!xYcHRvSteX)IVkC+hN+TMZO;S?RO##O z4d1r=Wl9Q1Ho3|4Q#ifU3-QN%=|D$7XxHJN@iZzbDm6PhP{+Zc_#zNL4 zF+W4%$DNId+1aN!G8qKx7dIGJw>F*#q0Wzw@7g;$TmhFrAP~+T-q#B3%+EjT4h#Te zbO_rO^JK|)sZLD|GSDugwk4^VnNM`G#nbIN`K-5#K{%e97t~|@9tf!ns*^gdyFga2 zqod=JQgcWVe8f%cHQv(z-ai%gRUUB~aOiH&d5XatFT2af%B)q%L^3TGX79Y9Osj!Z z81-9MxD3;D(ZFG-{(*Q3@6}T||E@AyNLaYWZIBeV-egL?gYm_9`#?&yCX{tc!=F`# z+o8dWlat47io{gflJ$(|63F7xCHpn|%V3Y)rCBRf2D&>tS*p)o!R5%fZf%}A6~}ao z=Q5UJGdC^nDtPMDCJ712V{^Uoget|VLP{#Qb~g+1p9-LxNWG4GpQzQ(1X0Po3xFj4!WDKi|;E`SQFvFcXSl~N~bcV9I_nX^{T>?ff2 zQ!j3eh_FrZotOKx>maN2@uERj3y7ngUKSPcAdr#@+GW@{SH=ceBF2yw+JGhzmG64} z*49}j(`B`FZFyXRx|I^IDR?iIX)Ekz;k|(#CW{lg0tU6;GnhB3NL=79+s*?mLv;ZE zd+jtdxZX88-@jL~1O>F6L zHW)A7v#aw%G6uEhA+Z#sc8G*39$*L#s3^G6K zt&qgIn}D*f28tgFC@H}$Ywu|s~*m4At$uRM`c zn#`WPJ|PD@mZu;j4d|9XU>=#ROm!}j*D7Qh8X93QcomQMRXb0F(^s=N_5U0sxp@_g zg%_XM{70Xc*Ju1T1X_aXjA#OV{1YnefGKdW4mu!#I|@Z7;DZ=$(H&%YayR#bIjtMq%=G*2;mFNR*AcokGVk1aSJB$uy7SxPk>W&6=$ zWQNS4>OXRF@e9xDjXtSRMpZ_Hay*n^JG`Glb;J5%5cas!kcYZuUm-&FnA+3|JGsn0 zPdhGa+}VbPblUU!1PwGE{vIk>8b83LZBUbg{_@(pIF7w5>!xuoCho&KtWU6;LzKfn z23&91v+z6U(WjkxH*BU}g*d>9s*4uWgyOBavQNOT-T2~>hA&S{^fCrnQEVZmw)?*% zsMj6p>G69rjo(3)FOU*`))d&q^2jr=Gecdjx%k0@6`5@aI9CsDZeZe+)YOdK*Lk>6 z@)pRAi@$G>-6a=Dbe{n31r}IzBg|`n`46~pKW*?`q~XpCG*B90;S?%ep|Y;~F;~+I z3LLHy>^7lpq8m#pT70VFehPeu_h<~JQW$`O`*NZ>(7t|f#-3e;&s=Y%pAVR)3~#k| zb;ZGH_1e`16(cA5fI5h?doX&Qoi;+b(};}3gLBn|QbPe82c;s!zsEf9t1xwfh!P4k z*0B}5SaSJ#U*%5UI)yw(3D~_wzaPH%)G2nQxWlYvOAQdXL7@r$CyCw%f}YDGthE(u z;}v=GqN-z#>kfXi6{F6Vh_y%Mcwty0#!^sYXiXT3tvh4pDiaC$;ond1nWP&-RH(MEGJl&Cg*S&p2 zH?q{o6I6!VnMGwhcXK14EyC-2-)b^cg#8K$*Z|+92mfc=QANbUch?|C-Lo_M0XvEk zLA*0fF=7J1nG3%f=i=n_Q_Hx08DO{Mc7{*lEv^HT8xLD&w@EEQYvpTF5XHnn+Thn) zs;Y;8PYt4Db?0?;b3-QN+4bBHtaN?C@7^ui`2*?k)q}U8{#{A*cLyEhj^EP;bc*p# zg4}rZRA)v=j2k4ObB$V`JFlzL%K;<(e6PVWsz(5OIq=})<6~FYL*!$3U;GYYsla^f z{ESAviPD>b0)+QYCfrSvIarwE_rr*ZoN@I!P1=K(3uSkm4<_B@6P_&>f*(ZHaaFey zu0J8Q$jJ0;qzEfhiN_hsfuG&toKI=e@#b}QDm@9(@w^=4fZ}${Rm*-jgAgCr5W2cP z6u3DdNcqe8u%!p79=eJQ-4GcS&`A2E7~%<9Uf$w*mmFJElMsmLeglo^xw*h@+?>M= zJ-xWhU&AweJ1Z$$H?*~x!4)5>zRRb%k9VmFKt6eDgf&Raj)*w+h_irXhTQ5EPC*oJ z7zDXTQ1(B4lYT#Lsn2?-Mo3Pr`cImVeug^Lp-%4B`FAzCLrp+vZ8{`jGlMfINx}2b07B;1)2M10PLi}Y*s14k0vRE*FY+K zB)ro7tZ()2Q!snwmvf;%K1j9F_0Nf9ENOU3D*)=4`N|}Xrdn?neLvvj;9Ici?PT3S{{Rky2YxBO*irw!ek_a}m^zk2*3LA(nScaw`~xD%-TvcgUqdFUHc)6<4y z4WVfQakp>ZKH3;|!A}ipESjT5YCl%_sB-M8x&+};`KDST)7)_@f4`j!2+u%i=FLk>YDMeBVRw>F-ZJR&K}-EIod03<0!Su`)QQ) z*m;aoKT>>zkzF~4fd|{un3$J$O4z#pr^mnl>hR06_fT9g;>#(`G#=+>{X+c~@QVh2 zrlmJjPlaa&t_B8vD0i`=s@}QFd(2(@&;2=ZC=zHy#N@X>{Pw+u4Rhkm+VTf?B<$?!D-_zzw;UM3}-3FFa+frHEUp+A*+<{#fYchCU|-~|%Em$s09R^g3GvJ9H| zq4R9F>E`kz$}=SqoPSeIQ4S#KJ<#h=%JhR>m$QMy;b{XerHJdtY)U6yt`F16Ff=Ml zi$VARMxEg?(igysxerEaMDGt@M3R4gwmM<;z!lK0uO0>g6j2&J2T;VI5vr!PxCMtg zO(0O7J^JYeX}p#b$cohTbl(fwg;%gx>=f7V_sGEb4Z7dZah*)cof!>DEH9UYy4pk? z?r^xlO-uxI+z>b}bf&KUo%(Ge*U*Rhd3@;e<{_2uyfdxOiokILA17Ff5M}Xm1h;CJ z;QC9JJ$XVuKK>p4pePF8vz>xrK>!Btk^uXW_E>h*%FR zn-3BursYk&CMK2-O(mbmUX9q*XJDwjtI+?VS2nIJBWEfjy=+dvPT%VXOS_4QIenIR zl}lH~jzkXCJ@HN5lp7_*H~Dc$NBwL_#N1c194Hi$l9Eai&?_h`EbK4GVo!KZB)oC5 zAN`P<7#S6HK6cOcv(?o=l;PY67;<*(?kxcXSW>le3^Cl0^fK+LQj>nNUe0;pRqq5BZ{se6|#o_=fd$=SeP& z4)C}ng-Yl&U$fbEohu#*e7R}UNrDA`%<%Qvcj?!HzspL{z54FVZ1rQOxP z(X=#;1+=RxH=<*kchhslRP75;QktBdZSFhaqFpNDV0!;P?=c=duGl?(SH_+LP=I-kO=4 z6CiSkfpCQra-eR&4#AWVyam6wc-UGcg`QLdSvAy(QcO4>YF_A6$;KJh|7DcHziO53 z>wUVXofKGhK27pEkov>s$UbzdSLn4AX7#lV4CsoFMQP&PT~HO1lQw6T_8eHUR(beDo0KCg=$uP5;9PVxoqLiHW*ty|vOd#%>)uJJmw#fhf8Y z&L?xqW(x(2-i%sOdK8tELX{u6BxqUH1+qvip}I~=9{}ZkxA~S=<27-DLPDX+yS*%4 z!aw(WZq2#?aN-vfyoK<>baLFokB=tr=^A#x?)>+7x#T=QJzqMmGN>v)R)OZlWqWH` zvGc5W2+AgMKtC-0WxmNu)b__M%4_>8KZk^ ztMO7t0q*O+I?M&c-mf`l`^TXUE59ztkI$P9lsY5{_%bmvHV^I0c9TL=;u?VZex{Xm zTl@##iMhduXqytDqCr~)SEtqFwA?f}3{5}iL+)g0A~DG1?%kKD!>L<7sqGm{^kAfM ztTs)D8a@M+(`)cft@Iq9a61()7YNNdUYBQwwxcORkeo1>^cNdh8f$dfoUCjalG$tE05WAgMK=1t6NmNNPB&{-m^;AGqlo;?tt}FyWqEuKvY=Unc!!%=!X~xJ z*vRZa=6_m^zkEEN6IK3c{4`b2b6j-Ah?|}jiOX-0rD!M^yM^8EYh$!)`|#l&Zll>| zY%(RDP!#7OJYr~=6f!K7CVVU3m_(cztl%i>cUJ)8(Eg!A111y_19~klu)1vPz0p6^q#z(=CYG7 z#IkNjH!m92k^)TQ>P6yQ*lPn%C{^h3#O{%~QIHT77uVcV>15;T=9KI-PO!Is1EVV8 z;?3cNM=nE@EnJL*Q#N%cev_3|a2#Cso3t!T_|km#k5ZOf0($du$QSK!azQ*`<>qAr6P`|fGm4T9W1PS zaZ*yzZm{Psly`ew9!mqAWu+{#8XFnCp{_t;hmE>2LS2o`~P4sK|4hq56vu06DEf|}*Bb8Ea;X9l+wz&g?P33{R$P`u== zmfZaK=8}h|3O=w6S74LnSUm(4#KT`GYreiBS8KcQ{_SybXI`J6oAj=*BH>z2Oo zJH`$Fy0653@+P-#`HRWO$+k$+O;b}j!2NOAkl??&;cI_EJ1n$O-DoU5R1>2Au1wt! zgc(e~!`Nwn6CZ~vYbc)}2l)pCgaIuu%yiF6GZ>cmJh>*2c8R+K(6kB9DDp#7gn%Sh zoKz^WzmZ&03$iW@48RT1bL8BX688;TZoTps3gI{rXK6{vn2#Sn`uqDE-Mc4RRVB-K zf{{@7{ysZ9M~>mnN@s6xRAAuhnnQ2mFXJ_XJJTW<$*4@$8+8TM< z%*I9~NlVF1TRT0}9EEIFsmTQeLSR_U%*^Cf4GnuGB-&dCgFy`Tn zs?PN%7>r&4R2iRV-5#d19c#EwwLE!*Lgu{uab2@iartlWNgUHWv>QXre3-CX%#kR7 z0v%E}XltAsxuoBn)SRSxHZ?6xj8i?cso@AGat>UgK=V4S4wcJLW*<>5=x;8C-^`H+ z+lzU9-QPdHUV%e8Y>*ktcc3$wW>Nr`?E(3`lyMd(wVN(~*#j>p!@wZ@LNR*3R}op8{lMViFRlgIIOWsJ6>8#!j@PXUC@9O8+vH z?;n4r@eWxpJ3?sdh*-zk(~jwUz^Yyu!%#u%0x9q~D8fPwl1JYF**i`y8jMFVL-jHJ zrluz9oY?F?>eCt-+*7&kXJm#lPYE0{tP<;&Kd)<}`cNu`p-8fLp;yaFRDD?)vE3qfHQ zX;pzL&0HhxUlPBiW_0wCa~Hc~x%9i9IQe5!lQNotnEjA!x8u^+g1c~_(;FSu*Qr3c z@gdv=l!5KSa6*SU6-_%Is9`4<7YhGB5Zr4j?cj^f&c0fin8_aGR`5bdiLsZ_%B7T*8ryYVSc38G?dc;ojzUVQ(a! zek-vF6VF1CNndwsKCO4f12>W?4HK=NZl?s5tND5hgcgwyhD>30eWV1=9#QaK`Mkg z)`ZJ7)cg#J+q8#VvFGIjkBdcVSrwwW>N)Sng4xV$G(!u+)M#Hlj9%TXn^G z?!zSY)x!Le&$k9$^(UdHdw44CgbuY+A(^MrYI_yREHw2BrLp114M{eb~6e+yKe(Z7Eub7L! zvBburb4*>eoCfahWmEuVIaGLoLwOkx9Vd$3oEae?*uS5pA&-z{W^T#zZN?n`9ZCfj zTL-RTrN`+i)xbuao%wrXpUY^l+|9IGRBtU)1BHinl$|wG;B&-UyTieYpapLqF4(l+ zD|gVix{bxm@*d5wDg1ZHvlnwK$5O5lbP)Q-;E(eP3x`25GNdYm(8hSh|8+C%Rauz? zz4U?sa)-D>9*it37l3!btMF<^H;jE`)9fh_IM7L?wR$I!ur0Cy!7Rsa-319497KDi z>okDA0lxZt=QW@^V|-4ypPjbRh(A=T%pgpMiKsF$;jlFx)wu0Ad##{X<6GL(YY&=6 za$iZee91j9c0&=pHc+e&E4;ST*J>ZF-+#ZGe};0{I~LYJqyy87m(vXQ%cIZ`~C zzn5n;yydoVBIbH#XK5vkSg2x?z25X=@6#xeuk_#$Mi@>NxPm9jb6cB3rv=YR|L%Y?FllSJ|tyjA8Em!EQgpQEK~RC_O?YL%YmG*{14=05t$ged&OazhE zz8;5bY9fRYzQbsAcwbR@RbnPD-rGeJ`5RCNQR*DYFGwqQ{=~)@U3?vh+;nQ?nl;cL zp!{IS-$P%ywspxFdT6W!SQw1M9ilp%J($<`bWeyyt%j)qU{`}*{Oa*?L0P|rsLttv z8;s@kD11w0EJ6LOI-Rs`4+W&v^jDAF+kx@SS-&nd>^ z(kNPPYkTtsFv8al3He`$z`Li#+&5L>=Me1_kpj*k&wZo8atKEq&2&FNjX51aB|&@6 zMPYEkTjUk&?sB9+WMmvSTyFXLUWaNUe&He4d_Tmifi#D;30;ir)%|L|f85Snq66e8(#;9(4eeFPYf}xh0H_DWE(Q(n8bxTj<(yN~*{b z0)1}=pfM?k@!DfmC>+{YC6||Hq0W@9M1y}KMv%(qG;F*zwR=gixdzx_UtJHGjQGT~ zTj#0z{(EU@n8^^%!)4SeXf)YM#MseM*pv__kB9{j(8=Z|WutpDmu@@FUQ24bPGfh( z&}`xb-vj$un}XZ1aqph|gt@<>Q(}9juh6>jfJi@5Cd}E)gx+V&*2TX9vX#992D!w{-#cP*LGBkw8cC7U>Vo&Q4-1cNeRws-hk(|EFnrOfkF8bX&UC6D_7Y3YurPC+AB^>3^<1YLAp$kq zgxFTt02dqgPrpO6TE<8XvQ1w-O}`=S2{$%3In8t2jjLUN4dm^$XKpE!)1^In@D?)n z5hLU~{oBEEC+aU04L(1k5N={`e_B>n7A>5Z^)WXDAd`Y=9~D1+_38*iw68LqmR9F^ zSSVL(Qn=BvKKd}eE-*v9rcuPq<340IWN`k4~j*wmh05Wp+hAkf&>Di z7}9l9InzR$p}3-cQkdlO@T1AWj#y$?m=4bUOh`yb5(z%#As~dHR~d#dEFml`@LPls zh??WJzh5~nL5kF2a!mt<;dNb%xP!QjCn>tUr$>|eCAE-;Y-?{1fyP$>8|+pe2||Bq z2$$uv^jh%47tP_;mP;5fv9vfXghe)<&;CC!!*S%v)^j0d7u(t0@`3<%Hv!0=kHH`N zU20>gr(w@aFw?+0PY#p_z}N;A&(&EQmH9vxO#mt2^7iKJPu9x`Cwz~I5HMef)M1p4 z3e}Zpzi!3-t<$`ChlX-*Vj15X*9>gVx!7G8uDjrgDP$+CNVJt7;TM0vol)w@9(s*tc;1g@Tr3z&(*?GX9WnQ*5P9lwu#+wB zBaz3QCzEC-W~q>oi~m5tfu2GS?Lw=e)kj+p*V>NO1s|8PJq?7Fy#CPB7->890!=`v z00o{4Wpo?KuGLufeuxc-#;uWLA>WR68WhN&wOGPP&t`&N(9X-vgEE+c*rt_=^dNXy4q>=547Pe~e4q$HYZCeV8lMoV$+|5&Q zEA=quXb$j%Di)1PmO36zG_Lzcq}iwClTB-uK0OUGay7|>(}kB=`gG))3H9 zjRr;0P}R`Y)ml-dC1B&DSqp^z(9|<-Nhyhua1%D&YDoeXXq>Pz4opp2bC<7B`1=nX z5kSe9R5u*aEO1rp%GQmBh6UrD(iP1jYY#B#xS8(FIj6YBccY_1nR_svF{+n+~9J{ ziRjqKW`JDW2Xq?n_=_l6v)Gn2Kj5@@H(RIVc|rmwBO~L5>*NN+0Zz7M+h3S&fP`GW zef@K;X|1p$oa!c>Q)-$ecP}IBWZW30Td=lWBQR8Kp0fv2Zd*(66uzLO(B4^6Lc3OU zf1k!E(69&NH|@P^VdVWTIMRVEGI2Q`vlb;#|AllPQ*HvPha_`5OK;^+yn05niLBz{~dXSom`;K|R^VP0Z z*8aJPnXAv=ym|8qNEfTDEVKC;MQsZUtxBxf{5=&@H#rcuaeW&BnBMXlm61?@Bre2A z)9h(z#-P9?=8J4H%T{PN`|1whW0lI%z!Ty z4ODIrlUcVU=((3dyo_(OU7hK1Cw{g=5Q)W8qJdV#U~o3(uA+3x(vezLv@W0<-D9rt ziaY3db89{pMJdBaHtJxFZ{NP99<9T?e0;$vxXn(4VCWfH=3Cx|V8c2rkRE;Y6xUF{ zbyQ&tgLfB_77haq%S16eW{>1bhiW7PP#C)~+lQ2szqz{nwJ7i*UYAWiuP^xX`tTV` z)jXbjbO%qIh2Mb~d$pux$6@k&%y6yfe_#96AIEe*Ltk;p#6s02ZGKTv2}amK2U#a5 z(g}~{-D#aBRJFMui#P-ylmddKeD5)id-m{Gj>PZ3ev?Kj^*e6lblWbBa_|d3KzAMC zEgYBYg5Brr;?YOIf*|eVnP>kUkmVh!Egx0m2@C5eWdHin*$n`}AXwCMHOCGjI|$mm zGKjhK*t5WKQfJf^*AU{QqCu~x5%dgCxE)V;cu2+QuK8=4Q=yJdu*Ubw`s=P#jvh8z zO$exgAoq2)FK;@5-CjgY4tkN9i6a++Q;|JSX_s^v(X(C_76ua+mE$P3Xiec+K+Qsy z5xB;Ur!CCPEREf`)fLI*g(|?+IAsU;BpsEVogJ5{43$vusd@>E^$LI%p3d|yXWvRc zK&$dUBJq7EEIt@tl_C>L4JS4J)Y8_@2YM2UOpKx8MYGUS6Y5$Rq;=G-ysGwj6m;%sCu3>H9 zn1cQ$634Jm@%@c5GaKF56;2zJANuOSTOd;6=wDg@%T}b~(k4HGc=3|mgM-0yN&`K` zcVq#3ft~I)o$W2qthCnc?d?+-hwpfOv2%LGeRwzP)huBY@;bxxs>)|!L}Sg|(PWw} zD&LE=<{^rE>^HF{mY>kHa)T3Q_blrUOxx7efR7p&h@G38v+M^)%8UY@7X*Ns2EiLs zsw!i^ZgPQ!>g-wRuv;HZ$+IBkyvn!IrSb22XOO(`F`{c5`wy~k!!I=5fwYs+bYT_> zMqFK8+XgDmiDc@>o68p1Gl2|@?%MKWHxno~z&;fFny*Yk(6>0#vu$B!twkI7sH36y zTql9Ii6tvw_2D-nWPAH0@{Fg6mVJ2_w2Q2o!?LvV9GiQomt8FwN-e%S1PP0qNdD)e zqfXR63{f#rZ^?O;(2G*+Up-#xXha{^PqK*~VqFwS? z?Y)o^{N~leM-WsX^*1$LI=Jj12{Z$W6)aM?2ya5b|6n*Nd}$m@K8EBsJ>g8zPbx5WDHXS-#-#tf8{dc!HJlGq z=@8CD4isOi|0ZiFTWB>97F*_M41IPzC5CcH%|E|b1dI~QgOW)?8F3`M71s+sDr8MZ zn~j1u!aTGjp9<>YAg1Mq#}PIfhmcJ!zea_WR&J|vJt0zMYerj2B1uU}C5Xks=%^QH zU7$>^Q7U69?<1>x9lt!|j06fvJS`?>Et=Wq3x|+vahU+h^9va_d?fXDM$hXzvXIF~ zRO-x7B@fluz}x>y<%oCYA95$6+~dXHMnb}E*E=}!4cmF(h@rgKSI=-Qbw8VA+#}2M zsH2xXQQZ}avr)MMEIyiWCYCyT+koIaSJpCS7$l>I4#IBaXY1|s89h zN)m#Ug!K*-XrPfdC_b%lTT6xsr_`HSn&gl1=rm!sD~1$4Ta^elg3e~yo5IYxsIe`o zyZdj&3v5Uf8!rK@sKz4>ZSof&l%X&gvieTcWn)R?Ow9@?Ie}klayc|IvQbIdnK!yO zfyUnh+X$!4%t|jfiG@m|{r6_fItMcNk`FQ|c8p9?$UYn`fDj!BU>m?9Auv+TXlHZf zvn=!g-7ZnKeJIaHYFXy@V#p<~R>D5YJDRK38{J?@Zql4~R#Y%Re7Nt?P<_cm8#oDG zms0?wi9qAB+uD31xxy{qr7;X0bs#4(yf#vs59vpH;G%h|MQayGMCC4yR%CUvRAHJs zT86jKvX6^MI`YeH$!McxKkf<(Tb}EWlyX}$nvbjKDKFtbg&9CQLivdFM!gE)svRo% zdV(QVG#(WZM3)W)zk7P+8|5G(XTCD6m|rF-Eh11nyaM$&Jt5pw!x&hZy{BX-$<5S67gmUM`3|Zgg4yRe_5p@Q~qw z-^fIxgDP$NrR`$^qVDK3n=}hH#Am`TPvYP1-Wb4A;MRgj zG|#%p5XCPso0nFt$=&}q^nZO1>ioRKOaRspbf`$UX&=>)7;8i3Ju+6J(#gz1!~}Ws zBo>HZxAmbDA~GTZl|gY~R8?gW`!Q3x7=ANNnC6NJjTh9F0}hmyQ^tx@)4)ygs4fWt zUt~rgG1YJ19te>T;sg;z4b|`QLmRO}D7~tqR%MuC`>B7tJ)cabarJ)aUeE|O6BBko znjt_~!)|+tp_1U9JYxmNu1WRvflT7bovF9rb@hJ^V|< zJqIzwKfvfJdz?B1RB|}n28RUE-yXsu;hGOXXJ%p`IF$1?Rn8c_WE-h1%fYR(`R0xe zG~(G{mxSYLKGKgfvtJcb;VCVH71&9SZih;&hw1akdKZ4P=;dd!A#aqT1q+1t{L)K& zFU)r>OggENaM|~A*8P2N zl-h|g^`pFEO3EQ(Ee^U{$L8JKhTqHb$BRjxz`i9FS?G3~>gI?b)mJ=+RP(r~^ERhg zx6^A-AOFbYWFibIP}9u)9AqBhylvEzmlP>okwgV73%_iS$dC=CS0z{*>n6~AX@ln$ zf>S*n6Fj!0rFiAWWicA$nv5=*z5XH1PNHpqqynyS`1ur64nk>KKB_L!z?~Aw)CvW= z7E0Y`?muc-v67W*Tb1F6X9IHj)Rik+dE@U*?b-_{d}^IK-x@Q6YshEpSvhc`g`9}h z1%tyKRmdn{+o`5*TrcF8?_Ry6lfNFtrJKh^A~s(Dauz(^ci6?A79#4uYP%)5mspXJd6mDF+jLL!SxJ5v4KRx6 zh`L6H!QblW+0h`ZIRHfS3QrohS2?jcOxND&@Hr6Ty@KK-dd~@2=q>VkQ1#n`ua*SU zWf6*~`B0zVXSdx{1e_)Q@&gz=wB3;7E=otwBm@A`tA6f%Lbl}kAYHx_TyhF=8l~YI zF@5zyFL~5V<)1M4FtG=_?1%K=r8t(XBfXqJ&m;gy+e>~16`VmW{dMIyaYSDZOH46K z#u4V^sD$Z%?@~n9gBSqkwrbjvPj=W}6Laoq{GncVFf zIZw8o9S;;&<5CWp#@8rzZ(lVo}vwFKu3%e|beWBw1=}=nt6jF7)XN0-hwmxhzH7Ni0rTAAUAzFifdq}@|1D6fp z=YIWxg9nLhtQ%KxJ6SfLGfH~i56NWrQ4#6qawl9~p@`V8?OsRz)_Z*;=TTJ1_toPi zk0#mZ+)Z(FO4;hbqKMhh1S+0cH&iI7KKuw;Um5kU@TH#)8KGDgFq%HT+9jrw?iStqN7R zKVl98=N>mRkS~%`ytAqpEnPuPX)Z`ft^)fwG4C$8d-o%>bZ*~$J92GZy>XFN>a;q( zK-KZljyfD0HuPaa9OTHa_ZP)O(T?-P?#ao;5_Ff^NNZi)eKM(*Vh4k1R9*>dp=(0! z-(V5lOxnLc7R7X5J-i>08Ym3c)pOWwZlgWpwYGOW(X@5KUH_oH<7fGjAFFbxjP0;G zpVi;#%R&FG__X;-@XXXEsl!|rE&8j6T@Y-?{ovSniHIr=N;a~v5>hE{OQWyQB2d#h(KN^X3=E1q5xW1-bvd5&vg< z%xQ}-tG??=y;@MO&YphAG>#A)LJg7GV}Ngygg|(5db+XM!dh81zf2o`_x?F|Qamn_ zLK5+mN>QffXRhC>;ENh0SCzcnA>Img`r*I70LJMUx^KE%aYvQ|4rhEyYbpX2KUlQH zN%i17++f;F2zan?_;RpgiBJ;)^R;e~7bqK5`{{$I0y%c&3Xjnn;TIcrw`mob7eS%M z>qaS$#{Q`V$e=eJf2(3_^d<*BUC|j@IyRQVDeOv6&Gd0|T2)PrdPi-U2!UD#r_H^k!20~Z&dX2e&nR@&4OYdg*iaJSxbT{Fm={=LiIFqC1ripwbLt^W zOTEq%|EK+5`2wuuPg7VwB#`{t5DuX!}br~J}D3NF|%1umi8 zi&4B*8^qc&5`;Yi$D9D3{@(@jB0_DOXhXhDh^OArWuOD-L2L-i8(uUNlbl}iZD|9( z7!{f8{ehf@+wwm7M0D{Ydsc98usbPws7U~-B{rwCTcFGA^RkO?=X8=%u$vqkSjse3 zDeE>m?YzJGckShuwB=^8v!Ojr+33I@Gc$T4)55xKlh(NxS-ltU?WS(wmPD{2kmj1s z){Z0+%{~WOI-5QmlwT>cA@S5iCQNeqAqhKSl&lgT+9Qxn6Xx?;Q(vCYde3O>W93x} z+yxCybx9r5E6936LxQ@1(_lZBb}4Fvfx{@F5XMzsp*^ppnm#jxJz1cY1^*rY=YzSw zA2vl-aAmcRe>On>>Lo)s+EKszqoYG(5S{^#fPW#x%lpj6eTTVcW1GOGpL>c#WITeD z5}Q_#Bm|hc8OERsNJ>6`q#KKhDDp8FcCRah6$j$dYNwfbl-{@f9tQoW4VLHq2JTVM z&`$N~0Q3c8EHV!ygQQmPLFO$kv^%Q_<}g!l@WL0Pk+S`cee@=z4`^9#p`YT!OE>Ae3j{p4lF@dU6u!+F-%^AeHcEmSr1nyCr1$fA_-|LEa(x#JE`9 z_~}Ps(VUT2Ag0+ zAoR92FT6I4hmMc7zV6VHeE905f36n$qFWblAoL+2>ij8VQf$o~?Z_zrHDb1-R}l%0 zJOdO)*9)oZhjw*!QK?N{Zb1=|aa7ABwPvXlYBV(H@#U!aO1QzE*yx84ld08?|L8CL zKf3hU3p-*tkApb|w;>8C{u6oNok-KAI(@0GDao}m(ig^yK8y?oQV<=RB-CBvJwL(*yQ9XyOcIr;I&V3G@YI7QXQANi7+i;%Kz zO_U>zhNuu5^~tt`7^&zIJE9Sk8lsX2%wNS<>~GrPRXL1p_ElkwSM8{uPn%(ay{| zDojk^7>y>MMWu1u^Z~Apjvnlfs-%(>Fkav7rK8Jt>&`|X&1IW2XneFjBvQ=q3YyiA zR*F7~Z{IQQCK%=veOaBmVNSP<+FSvD>51Kr55G;<^Eb-z|6I)YMS2EJ$V_6p9RA%Q zgX0tP^Wa(CmO^vf&tSJYE0xxA=U%1f8T+!!bVcavv;?}CQIDpZswU`NbE#8tRX;*FNMD%4I%bLpEGU+XvU ztfp-PCoA^;i#NfGc0(N!y~l*CX7T+yR1nHg6crV13p1d=8ef>4pI0$8HDx+b`F1xZ zL_JG7=54TmCht6L*-$vDflPkY+G_xK^_F?TTaW>~TQW;*-gUgpwq5CSF^AU=30YYe zkmH~y57Q@;3{0UBNf(a7@N-6nsrqHJd;zzbmsI)vCzf#3pPu~JmDLmEMjZyY_zvc? z+QHQ^E`5|mKbKBmVO8OW4gQ`4S_6h{#v;|vj+GEVos8(sqC?%00Q*cf-)Pb}CGN;% zxF(agD{#e~GsSHU)z;L&Eas)I_?@2q2jkS@8hA0>AjLf28xgcasM<)#(r)h9Wty_*JMO|^cflATR7eHGs!i<2=m!Px9g2O=_W}5b6FK2p71W=t8m^tn!+*`xQ*3y## zecUt=!u?jT2nG$J?{|`7%HC_jF<_|e)zT(4RxUTXRCDSf5C}`oN>9(ToXqR57@J$B z-w%ytfHeXTJUCXpfg^B5IH@KJ710!K7NaaQ@0sP8p-9ht^yoG}Y6yG6}%toG$2}YS9pmdmcNq#qTs&{`tHctEq(=D};~DU2sal z8l0p%XrGLNF?e;o>()Wzxu$9}D>GVA-vGa5aC2IG@scY606B=-2Tphp%q%V<_qQ0k zDkxBq!AW@q3k6i#npw89YR@7W0n>`mvFGV2AwMc9_fU$8N~ZB3&OK<^X0es`dFe_k zHK?yPX^M$-DksHmd}JkmL{u4&NMKWlMMX$M(D}*Ml>j_<6Y1XNj7}c`QG51%#DUMM z^slgojR8F1UkPe4H;{a!L$$0@k?s+6+-3`)oY5!Gyz{dO#IIdfQ@fq15v&v~4135y zZEO7=W)vRSzh<=grYBO$@CHrX8;&@ZkTzT*HWZkLYo>s0uBxfIfOm+7g|nE&ck59X z?fekcaYI5>r^wdWakf7cN5)YF(y&1$*f&-D+Md!(6AvsrM{3Qj&y@t;R0MQlsV1IC$^r2K9z+(fWXmV5RKv_ z4#cFJ)7(G4@SM7pj7-we13qNQfGenNf>#;Md7}4NNXXR5MPW2#Zuym>yJ8^yKwRz9 z58k0$9fx_T=tSy03vS&9AlM~8oaWRx%cHGy0h$*sq1+!Ba{+1KZY8B=mn!DLXZq`p z<6AN#^FOBvkKJ%{b3+r30s{kQoaaiQoeu%pbsYCHYkhyDAC!Voi!A@$OxS4ZZa$b8 z?Y5ojw?oO(2L^AA_bm;sm2*G=*)=tx&q*fkhj8NWR{MfwWD)Bfh&B9-$8kA!J9Ks% z<-m1B{d3#qm$wgJhWG{l>U|$pbSsGL@EqO8{?}_r29JBt<9O8d?Hs7vZ?GT1Nv8o9 z)7xD7!Q=66(z|!>Mk2vwXnBY}Vl&M%7!05>-Fk;1o=|iy=)E2%vz`VKCbGeM3W|!x zt>`76iEMueN=hpDT&d4n0~6HKEqiR8u3Yg(`B6cpz`uY^X~$nz(b6Uw-|qXH#^dlr zfX87k_ZYy&Lac!#@<&&Wems3SWp~MH?-zz`Pr)0-mMrKhiH3SJl!^X=?A_(YHxHV; zEmw=|l1!v-`Mc@q9&pqdf@6#eE#Sby1_I+-nVS4_T7u%X+|DPS#9f-F5 z{`-qAu(6~;J;7&P*%8WXTHyd)mzuR4Og4_2&dA89!YAo=Kj1qRXt@^%+3kUdNL0Z| z0-d(2!ZVP;@yo(5K>G*RJqdO32C4}2JaGIC6AJ~5z9=WVbv~y3+qZ8UQBLYXuysPA zHIzZAcd-5XQg}k65xUCtxS6$Q_5Tz0Oo{Lyk5pjqP(o^47SSAW=6(>SGPHdCS;Wci znq2GA4dSM}4*B=c@}RjthGA_SSSuF+He#wmZP#b*>&c=TfW&@TJq|{)FL^36P2v?z zPzMQiiS8bcF_Gn^x4_T9LN7|Z0)KQ)+S@{l)aJMUp8X%y5h6l}@TH`rpilOTy1F_f zT23TW=>JbuyqFS;_D>a47q8d-y*5sP6gn@xa_g3Hrpb!7Ww&2f;Qe~1r$}pR6(%NH zLM560_$A|+6$rB+_Z5P(Vf-`71GRTvELo+H>R$f)j4Ar9z;iNgv{=Fg)T z7tzJ8_u56GGSwTY^sYDb=ij%sW?Ntd1qIXkat5LC#a*DDpxzoy{-DbC=C?Tsq?-2s zUV<+|`g2cA7E%5n-5M!n6^jA|MMW-h6M{DRt1jC@q zIHH}{509{C#XlofmD$Fs>-30KfB%lLZrwCO4;dK3) z3djaZwo7 zL9_MX6{t|YMEZHx3lAV%50wro>r)g&j_$=$K15PV$_5L8TxJ6=A1WKlp>h zw5~1&@Bul)v7yuCE>q-7kVuX+VUR8u3WF`fE)}o$Z344@FZI-oZ(ET6da}qfvB1Jl zeMq2r84`NW**E8P1w-;FJC{KXE9nBJG{JGvk3JzKce+A2udfw3P|^K9pK;P04zkjW zl?&ZgGlL33`kD##a_{m6X-Ut1o1DS30OPpqdrZtKp}+YC_vY(BRbDmJ_gl>l)zOJO z`UuR+p~r1mNR&?rD&kdXRNm_S3PN5G4z>fnVbu}hE)kM3qyKKD-*(RG5K!C*}|+@I@(H+h4j!D0s2 z2CDL7x5`S6r(5~;tbomO(O_|K915ece}>w6r~_S>aQ;5%avH4ljdM3wAPF5lGpHJ~ znjV`sKsAs+`2Kep3)VDqbl2OIRjeRF^vlxmgd#=o`EfM(i#%Ju>_fedarJ;Y=L^VI zSwJG;j+GTMqmg$Le-5TkKnu^@d@$-OA_^QVVZZ}OHT+rLyR_0^*3AoCB<1w~_W~tk zc9r@`isT)1IuCxNn}G-!LH9i<&Ch32&oY%UHdZI0Q&&z-v#t(g2z>mQF_1H8^HzaW zn0`KCA6eOD1JubTSes-t{QLBvztG*9(h1DnlMU}g={0sQjgYau7DbdIc zql+s3-8-Jtl@|=ULZ3wJA5u`tIniL80WDF4d?aJw$T-RyM#K{u z$uGOqRBS~D_@i9O4ULVtgP_NTBq>dbf*&dkO_%__J1pMHfNd$SBo++`fNsV!1{y@Afn3 ze!+hBK5}6dJ_B9e;X+)q2fuz8JZ2*^Ea(up)+11gJ`|TAO@#tih$5(Q=kWQIlC!WpIf z(0k8&tbd{m7U=V=GSnoMV*U60pq)TA@>Sm{<$gSzoIsh|wm2{n^A|oX=&vmw2o`mE zv_X-3k~1*&Up zB$205NDZ~QlUHs81E=IaLLU67F*Hk^hPzGf795V^mO~a*lis3 zVf~YTaI1~I{zt8CSUac~p%9%Bfrq`u!wkYG<9*QpoGtd%6h-G#i8zK^FhzUga4tk8 z$hft)MgshvV!*9-@$?!FwZ=GuNb%3C7U=Zp4{Nm=y_QTZd^ z8vYe{0}(=oj-LhgjY&-gZQOjR=nzWV{@S$<@>mCEwX&bXuxk{eJ0JhZ=`3SR!Elg+ z`1aFEyG@P{0*u>g`{Tt%xSXRuIp0*TYqs93;s76Y26`xSvPr3TJ`8!NhAv+(#M> zAqc)`Dp9q71$rS=Os)qKUz#~VF%L-mJ@GR`F~ND3H~zm@<9zVI**obE+TBjOa3MQ=dDW)3XaNnGyZ=x%0+r+}zEoi~De0Zw7NUk<#5UdpZE7SmI zbvmy*oMAaCnN*vN)GpqO8yem|=*qt^cNZDTvKxl7^r1oWgZ-XMS#J}JP?+bJC4B_q z0oiX+n#01EL4WENNOVavtczYUdDpup%o)q_fR;BrQU5+Z2>Ha!hrv!po*GEwVT0304o4^()9zaL%`zzOJ+~n< zv)zwhy88L(UiPKbj}3P@=7bv!NnOw#197Z`ti zdQX2aKoQsS`#SMV&*WCcLG%R8Hg)8mH(MU&(}N!G8~TKr5h?cm=9Dj!t2I(qFfIbg zd467gOI}T;!T>$5iS1`?zEzjd(fCN(Ff7mP_X$H<$G-`AIkI3_%901*k$)8~N9j)s z4w74-@C2g#j#0=W60M-C!1ov`fXk)(9{nE`Md_P5}$h;=Ot!EQSn z%vbqIrP~Ie@kGB~EYZ ze7?^9fA&#x+?=}lBpUhh8uqFb!ZHA{gjS9oTOOMxvA zn$cpgRm160(FuQAD67J(kS$#2Ev}LPS=#)*3&OM_PV6w}%XLp*w18Ew2yuR)H?dI_ z`j(@^ql4Y?nzS7a)JWqNB`!(Dq^EO1mr;%Y9;Dw1aJsEzHM`Oef5b0@Xa)#R2PRN)9(PWvn9CruJ$3eMvIWK%Ub5Kw@xV8&Qz2de`%(t}*1lN~Si7Yi?1W{;Xz3*9GglDYVIR$kQ z5omGy%i{0_*wS-gbl8D2*CFB-dU)IP#elM=_N>x;`x$7442$Ej2GoM%3<=ST{|pu# z0+$c8n8tYT=$|&H<6q9me)!1*&FA@VxmuiMI9%71n(tgZ@(DQ_%6b=u~Ks-Xr67KUPyjyx}qL(-2 zlDm6mQ}y_rd$dYr5Cc%Izzt4ym-U!y!w76@z5s2UFt|?aG+fr^6quFK05G7=mx;;A zJ{hA;l0f%kkMvcQD_%F;fY!=uWSRPSJ^2Yy^7DbOaLgAK;` zULzpSW=j4@;>Ix^I(+y}Knd8Ty)R+hdW@eaOC(Q19gXb92_X{>=7XafamuQuk^B^s7@a z>x{e1?Z9YE`ivSx2hljVBh0VKqm@ti4l7Zi8Gpa5QVwvNg!$imcf^5$=toUGf;a+u z8yfyv8#kAr#(-tebcQjqGL9tqTve5sm8HP>3;n`MQo{41HEa?tVWfEtJi|E)oc~m& zqS>J0f8T&rRv7_q2}}vJEgfF>MW>^GNh^&X^)t=BSAK4TmV3fF?D~9gprY-dNli2o z2w=5)vb?s;H=m8{^?W+%!&-@2EdR1f-#AK0sE-cJv!?kZU@_F~ZnxHO3sXdIOFd?E zJOW%H2F2l%d0Z3OYrfe!rMotWv&R~mYIs7gJNLd$rrxig#NnS^6}Y(_&nH?o*2(kn zZR6S9D(?XBuJV6f@}Xv%ivyv?`7TlZ7@tZ0g)Tx~5p9N2EIMHbR`b2Lsd%+GrODun z#yYz!g%asX9zO=+!7~dut_sz0o7`_W9*YR}msLs)=bwMRz~EqsM?_}==zQrr1&^#B z6gU}wtTNgZPlKIMey2-_E+IhjT`~07N5U=UjmAk|GIo)}fov^kgzPVi8asXXut{=g zd-@mNSl=Bw4-%Dc;s(EVmzgJsp`+OYNeP7SFls|R>w!nYoYID@#JfXB1#eo@mP63; z9b)Z);Q686Rq`n?#}FdN<~*s-`AoC|}W~uJ!rq ze_6^^0sdMB<|!6Z^9iahbAc8E-nYzm=tK)meWTq) zurk_DK;!~5*Y*$!VElo|$_u5&aH~SUQsKpJf(IY%M zI_Vx<&+g|~cz!FHJVzFh^R>y~&lVqMToC^#_@`Es4RqV9JI;a>q|&rg*ifm|s%aX> zRW&TGp(0Z>O%1Y#Wx$*WlX`vg!tUL2CEoY9pUEE5nPft{7CXX_Dq}R_1IZG-K+WS6 zVzbxtM>{8duSN-iEP>^%Zen6W_$p3On)v!647b1xwwBjB^!0bG0oVPqT>sv}Jf{i* zWyjnnp#L3g{V-p~pGMF$lm~UU4&qJb+<3I~?>s#Jf~5_m!B)4+)uZPpzTv0oo=hgFzg0d%h0$97gU`62loo`1b$Rv?MC0K655IZu05S(6TI06!qc8 zMjjG{Yck|sgemE-NwHJRc^^1>!22=aEQHwUv3^SdKzUP=$}AQ(JrY%6UB?gK8A0W- z|1O=QNY)m!SM6Sts{5aLs_ zE0e+EbxtD&oY=OsZLo#8VhfdX3;Me7X^9rF!=Z<%9#Ep~C1Y5;vf6H2B=j%SU=hRW7M*LelFF6f8n6ZW!o-?B3#Dy#{GzKLaE zK2Qc~JwoFEVfAP;AKi))Wj2{gbiS8_PyYh1^!2ee=XPk;?H~%E4 zV!K%n_xQJLTlAOYA6sQ=grYsiJl*;;032w54DDs(f%l6seoow=60)RZtYtQMy@w7G z14=@Sn#zi z8Y>JB$SOt?;Np{$(R@Hy`8!6NQoOG1qbmDMAw~xc3vMEke)2h7PEzUfOXeSOF!BTa z+|MN`zx5M*)5(~62c=H>x!;6?v(p@?38!Qr_W6~`@O2(lQJJ`pOa@nvH!$Q7yiru0 zOu2n9M45Ex@fs(5E$?%L&>Y{U<|RQ2y55LGAPc*HfA~%MotQz^%Cv0gQQ0??8PMR`+$e-%w>3#(3*Lj5YG~WrT^V6a3Z{*9tHkC&MnB^tw~8DiNT! z&8#>K^~*XiO@$mg`Q61Gt`+2ZnEz->9-F8|tq2Kkq6{=ZHwZQ$0fOT{v^j}nb+`Cu zCu9JP7;jg?jBi+=EkaCO%;+#R-3T&*Qtx2a~m_etgRr1x`g-&4o;Wo|q+g4-qOKUel?I^iiEU18P!<(9#9TqF& zfbR?WVx@!8lqXo!jL;Lb&kZb1oSHWjI3TpD^@lc&D}|!Wx8j+&Rihk@)I>gsV42pg!)X1W`xjO=0Va=V>{Y1jIl5- z7EZ^nI7*xZDTz1Dxz1ok5({L31IW-2iM!hGoAnAmiGymAE) zWKZ*5K*Ok0phev^t4&1ICodZ52jiehR+nb_;>0>nfT@O#g&3oJ5_GLs>GG~^v^;Yv z5cKT}t2Z;W3M{lHfLhD@tq^Kz$uv>tmNr3350`G8>{=IK>7Ff zRBnR^GpDwg+%=J1g--&sgV zNSxdK>=Cx~W97DcG?QloCSiP|=t~yfeO+@0rl>b0Db*JmU-AQ$gly1#kn7&3BQ4N! zq66A7DrjpXyzcJqAGdH#u6y6M4f8?k2mEgh_R~^zV&=kdXRC@)iHEYfogF#~Ow^^r z?`{qY3hGHIm~YD_uGf~7Bqzfuy1Mg&d8&}`3fSq_Wp-tY(9E|G|Gb9F>T_8>#Eij8 zf;j6~DR<}#F;4Mdt=uFzfAF4&KWO_`t+)GK9t*ggdoT zK{vNr@In2$w3xuyq9mc=g|V9;dS2+=$#dSjx^IK}7LNoW25 z);kDNo=*nxchJ^}2@dX;H6_@;#V19Z4#qk2!NM>>GS?d^nVGzztKTWgVnfY*S*@O- zKor3DhUP}nU@N=KpB&+@=t5BA=3(_6`Rmq;Ulo&1K922ojz7Z2Iw|97=&pzFz@Kft zoOBMl1g2X+;_RmXWbxS3#H$FBiq7NwU_hEC=#ij@ED9b#IqoD4_REfY=pZ{S2*c8^ zNGCX-44_cjGLSXrtf)h`0k$iDX_ITT8lmla@AqdXJ>CUsA!0ipUcW|fk!Fj=JpZzK z=(c|UsMW`nmAcNAbo5|dXg-V^@3WPHnQa@g54uIB6teNYS7*4x<^>&NrQRvt0EzBj z8k`=^nPjhre12Q}Wm7b;Tk1i$$Kpa?_G|AHZ-(#0pM9lw2j#F@fbUyEMMY&pZMs^$ z>`%*Hovy^z^_JkQ22-f1N$SG?AM+gQB@LJ^J+RH+q!pt9qOvRKb6JF^V)=)im>BlJ z+7fbS;zAz`Q~`IxCe`Mfs;1mMhKdz7<+3zDkgT#EdF^e7!Lt=-T3N-~u^yyzIs-K0 zFK;3v1Nyj+5X)C^VdEq5_Ap?L5{h+vAl%t9SCta~>LLg+ovTU8H#s!~X{&t#x9NGU zCuql7Md0ajze%l#(Rs)tZQ?HHysTsaT5j|1YLdW?04E=e+H?}s=dMMPjk3!F?9s^w z2HSTGMb#X#){$-W;C=whOy}kO;Km~hoi5s}1@|^FtLtH_R=vOyaSAbNRV`}-e1pCM zaXpbLI(hi@HiTyO+|S+6xU(bTS|%q<6HJxKxqQ@tV$Bb*AV_Ww50Y1m$z_^}6U6N1 z?=q&u#-8t59pKyQXU6}{&F?4}+n{mCI)iJQo=81|gt?XNY_V7w{%Zmvwlh`(RUWmD z(3Kr(lQy3mbAH2iS}hY>@#6$PDhOhZKk3IFT}CeB6Ti?g^rJy10ZFx6V}>x-p-c2?oFgzb>t(pvWu+z)u>Z zOhe+^y0+X?qHDvo5`c6zw|7G(A<4_n@dqQJ5Ym$plZ=7h@PAwVSe&P(5k=0`UzXi2 zh<=p5NGI#8YfQh02&(uRmFCffu9fnjHV!mM4HiDgqQ2CJfG49UUR~M;2af++k%dB1 zsu^MBUzV#X0(Nu)ElWP`HwDncAcyQ0oL!{HaDCh+Zl$(DsCS{8*h(5Pjvn@{F`cXC zU>JPQFAu}4(x9z*fc^tpLKg_^{9^}pf^m4pL8Fz;d0e(jehHZO(K`SjQ3UG!C;S{5GR6m+%8K9Mh zhQxatqX>hdJu@86FKfzWD`+K}n8&lv+d5tVFDkI@`41@2L$Use{7hwsEh&T1Toh>| zw>jD~m3lac!Nn`HAPLj~n4dAQKL+RQycM*bI>UN=r}v-#y`8dU7Zbq@)A_nmSNxr0eh#@q%rXh`3IFjw-JgY!|>69FLFfZN!aZ zZ9x`bH+9CIq;bzoyPn77(eNi6FUQ2I%Fp26%lluCq91d-jJ_7A@PlpP3_Z@gE_(C& zD79cK&!aB zm;n~Y{d;$gBQJ{BO1+p@z@1AZdI7|0G1QW^6)54~LQq%78#)SGv^?Y3K}`y)H9r$Q znxlbcx5C1|MPt#jiH}$MMv_z!EnCEZcZJ`2;L28c9fbP8cyltziclGNmXXe@U{rI` zGaw*f^CSIle{OJV$pk%9xX^h5EGV=u4gQ9uYIL<*q=3#hWPrFSSG?o5Tpfnrm)3zQ zBCk;1u2&nfN9P+@*HFlm)%O@AUQ-itpX*c!DUEqfbanpEXFZHq{qrcf18HNO_JiRs zDpxjMsq;Qa$X2!khGG1|Uecrd^W*W#H@7`XG40;(9FqG3clW-d6e2we+P{Y&&A!Rl z`KO(n44ju#*yOzbs0R-d^mw6RATE}{_)z4H^S)CO6~RA0Ew@z;;NL1EkDIpLaPfj} z{6k(~9ZF>gaTC?dIy0K)F(lGRTTl?!`=gR6CTrp0Y}km0Wx}dwkt$3? zowJ@(P}Qb_!S?V6LpodbDgDeU&pTWOCGYQCs{3}?N@M@iRLI6Z>AV=V*c<7>X(Iv> z8}@aBUbEXLxW4U7Wa_q{qdyW+oH}6lzzHglh__Ky^BB}!-q;|wDNhI+9fxs^s?i$G z{e)@lI5k#Dureq7J5!gftgYujl&xlGXYd^Vm{|(2ozv{oD!7BYuFu;ycXZG#I8S#i zPGhxwi&pZAyuO(ucY^nY&+pdx+t!{035_mqN-ac;us9OHn?+3~m|I8*F-OvNvI?B6 zMo1#VRW-w|yf>S0$;=}aI?uTa7ZnkuQ9c`V*jlTc?4Qn2<1lkZ4%`4un>%QZWL-l8 z_nE;+FAX-T(C$ouHnyTOP=Hrk2BnM;PsRsXeq133^r!OwLC1jb&}Vj%H(G*0CO=^5|QQ@Yv$RM_Vj#>kD$O{ zRftzqs|@qG_o`TLVmD?A=|{Z;@r}1{{C8sy(&s?m2<(0)7k6-n&QA3VOTGO5Qrb;U z4D*K|u&{HXiwoWOm~{BG3)GH#ett$#22%rjajA|1Hey*q%eC`TkiG#^UVRpqP~_#$ zHMjVCuVJI}67LjG5V&^eunGx%rLT|6l(YthCrQws804x6nDrjtUv5cB69DE4) z-)!3_yN+||S8XCE^P0q@B-E&i(2!L`{~25tR?acdld>hp%0PI1u@48%qoMI}9{^)g zSZtqr7$1P!#bjDjcj(Vzho(;d0H-?zBsXD=I>X|VO~ESqWeXU}5VQx`Sz$^|kvt?p zKOIZlYq3I~B_$fT8HSk3MUI&cNX>BQUeOwPW%aGSofZwObDV>+&;D$CfT=;e}aFq5`8aqxdb35U)rm5O&Q&4hQUwlz8NZ1S_aI{IM0C1bsm2F|Ed5%y*(|5QvUr4{QEn zuNo9zZ%TN+2S5st$I`bnShle80Gg)}U~*Vla}mL3alpUZn^DSF;`kj1yLxD_Ex1K! zs;W{!hP)TpXLj?!1~3ITGR_D?&9F?Kt7}uA=+1g;+rdLiGFJsI%vJ(DI${zN zN32D-D$~?pXcww_!`aqG3=Izp)HY%`Yz_q0AO;wTtJ;>1KuOxg!ym=ILjnb22tOA? zZw^FnKbau(7!23;pk(R=VV9s(lLWm}_|2!Tz*q>8^=5E$?_)2d21jF^aEyRaqH)cV zJ(!bTB>%3O_u5K<*dF{33$ShPhNxZ(*yh8-|E&aSRws=boH`rvPY#d$6bIhPVuH*q zb8a>qzp23dD&{%+H5C3pWkWhf1O6n(yyESs^qJ@sOJ+EPK^ph1F}Bl06hZq+d1V~ zqKiJny2hRP;QnF|Er{2_?Fp{Vr#RhyPqhqPJ=QyxH-1d#G|z@@;s;etYduGTm&;)$ zxd^)NmYC~ipp5B+mg=+3OB=Td+kYUPi{qx2V4;ZHtrCQr&KP*DckZw&NOO-*qW8VP zQ?!`K_9{9vm+mQazz|Kie8e7fYV40R_b)6jYS)sQi+EC3h2B{nCwsC)OLjCtVmo<6D#*GqG6e zH^Ggi>EU$N^S|^@r!IR#+Gp`+KVdqTnPwMCXlO$qV&U zTJ(f%@!xPL95}d8vd-uSo)#b~uz``Vfn1M~{jL^K@+!Xf=bl)6n$`Wty-?N>P#DCS zOzkuGL_t-Ej_2ugsxKEvp;UFYm6Fk^3q0=(<7qtyN*^2E7p0Z)Ayd#6qI>EnQ1M!0 zf1qW8(qm4RN=u8mM%A*`-qsfA&p8sN0EN^?rF`i;pxZ1HVU8)ny^MhvXXm^yF(m3N z3?^2>fddLEb4j-C&C1OZuqo6VBm$;wQlC62D^G!miP1RWsd4+5&)m#bcLDzI>7+>A zT|N0i-{v}*1ATU4IC4?ckO`n-&if@AqIHTXD? z_f?f`@!TNPHpu%!ue{vD@V3{;uQ+60_MMvMq~}$Y)7E?OLC-5$I5SL{Lt+n>eoP>H zQKS=fDK7x;sI7&WKXO(+iYa+?x@h8V#L7n$@D+ARE>PnO_q1c5M z1!iR}f%LthFG(qd%i?Ek=hQ!q#6N1Z97$K#mjds=d-Xit#Ay}W=!r?}P7co36;BA? zJm?|C;=p$9KqlQkfF0>yTV6oI=j+s0a~Q+Pj1pl5cby8>xb0E8{K?RW+TCqA>WiLa z)ecamNy%&_V<*-)9VA`CE*y^@d?+(Jt5WvWoXwi%d5e1Ya+9HpW_DW zRSnO_;@L;Zb}*gS(G}qRnsIkoJUzGKev@v-;KStfm-Q-HB2Vc!sMOPvUrZgqszU=| zt0L_MQL$Hz;WHD;IPp=9Hw#Q+co4&W?IWafc z%3d>(xgZ3+#Ipa{`_%FyZ*A$k57uJ5Q5+X#e0jvkiOSU|13U$b(~(XBDXlqNLc1_( zJ8JfeoZw3T+`7f5CV$xI%$byS=l0OO3U*R9`>&h}4icniFPtXcGr-9AL#0GtY^bRx zDj+`UdNDRu&3A&Q9_LiA_AsMXqTu^g3?}|A4^O|LafFw3xKf>(s%LOcNRYO98JBYC zKnXtkMBMCcWuH3cOl zO1=(rahu)vmr2PN%9d*qS_<#8Hhrv-l);68KN|D?&{KCqqaeQtICIl5uhylIpwQIv znwO(aJ$_jm<&Kb3>z8v8K#PpWL>Au`QVxYK=zeWEhsZ#fD+(lf)Y~ zyD<_H#h-~w-xptNFTF-$z-BN0W&EW8tW)#7hqlt-k1B@DQvRa(fE+`!6CQ-}WxJdr zf%68d9!C?efwi{)Gn;V+lU<7j+A9W}0s=2!uVf68R=mkZF`nfDju4_6@Jz=Pl-I2{&qAQTwEM4Z7QXYTdQ5X2Bplgpk@1xA>(kV6Z zFd9SOU;%QLsJp8jv|Wc5Iv3tSYVKp`ElZUSsSCe7`CO)JIWAMzku3`JrBmlwa&#thkP+c!Y-bY*>m}xzcbQP!OzR+cF0$+|lC$u(w&#`Z`ER9QT*ZQYCo8s6@ zY%_n(Q8R@4xL8b;k3o-r&q0Zc_#?ET!iO0t58fpEkmfk5-t9}J#nC|aUKaQ#S12~d zc17pGL<9%)ti@;q_+|zpW=grscQS+L-58xtFw`yx6fVAFFGYoCKqjaD5U8-|9kWG; z$yPqw;3!O-y>7GnZF@!>myyxl))V->>GsB6oK}f#|6CP_5WEccxk=T^harS@Yiu#t z%zz1l?^a~FR1BS~8E4z9$iE*A^1S+K z;XwRup92R7FDP8jiq3wgfPj%WknxAA-BOVr9>ZLShXdbEPF=Ct`PSI*y+=~&{n{GL z?VyORnz7%m&yC@tf5aUfD!4W8F9Iz;H5F|E$9PWC98b;4Jz|;cRs7yzcuETvYB0 zGUzP3FdtnXHof)4bJMKvx;+L*_pWQYGCo^Lr`+6tD+^Q<>+A{Vp9vrP4a1*GTx1|( zp_y0=e8^x%rjuYwCnxo&U~HNa#PwL}Iye~eQfWMrntY^iYBe=G0zN@2ioTw;g);W_ zUUtMmm4@bHt<;giui;}p7`{_1#xaqnah>X%Fcyj)l40(N<2AkSGtV;zThf1Uk5}uF zGb<3-#)`k}OW48s;yYmw`(WA*=qpS$M*}>!t21`X!*S_KnDv0%Hbsqed+tnAYCjsX zzo3=UUvNDwc_#dKLkH88T=igf%~3Rtwhy&{{g|17L|f&L;?|;aS#%yweg`C4E%qjA zV3kZBbk;?L?|6Smq=3G4&-0NlQR~bOSAJHe2SA#Z>$zS%Da>uJ;NaHm$wKzBa(^bY zhi8aBt>)xGt)LIasH7B{p0+VL;gLLA7BiG~E`G0>V;^nb;}r(vB0x8CV!xjl1J=I` zR0rm`iMfuTY$RQ6jq5{^g7DTo_`Tn|$rA76&{@oSJO+N*Sa0@1=uT~?cuZ}{;*SLQ z=WIhPHiq!jq3949*+EXS93$hK7S#iFErk}WMhA8QbiDYbjiWW_<$#YW1zp!*|?= z8{w98(?_gDTCOZVerLezT`coR@2>HM_Six&`*EUhWdeDE;6*Hr9sCR;>Qd1Kdb}WQ zFg+?fO_z#+KyfKp7NK2gyGwLsR!hZJeHPQ%iFd|Y3PsRH{*pYe0X7rNMsq2_rF_OZ9&XeACiV~Ae;bPOtjU9YLt3sQ=-yTv4Ql}O7UFfuaM zC9ba#o{AOl@tU>1gn*95ju^@^?7iL+BsH&%3ZV}lel%|_8Pzj;SUG7fG$bY_>9i2p zH#!Ghj^hKj{>2MdUV|^%`~(s~qMmne74=5|UY)8w64s>ew$5gNOU@QdGUce1aO{e_9`Sw1jwe&;2Nq}Ye zBQ)W57bKaqDnM$gy|NVO9ik)y>5(#c_erUI^8OH|YApet69%#?>O7k}c@Dic@#kph z9C**i${HBJUL59I4f^~e7bP4g9l9%Jcd!(<%@4Qa=$!>NB7wbI`h9KX2*-FnwY1s$ zL3)0ola`!;pL%6s(l56ycMPgtJi>;EB;JXp7ZEs~mx=O0K*hr?;QUYw|tV({@> z|ISdVO`Ow~O8EFZob3G>(8-x5)P8f}N~EJvRW=5t*d<73o#8C>*eDIu%wor&C>6u< z)U)X1j7x}}rGZrVNTjlSaKV7-N^XRcn@?2R?5vGG)0GedXKuQBrFFKS1xY^;x$Ysc z4z$1zEid<2R3(mRmoTi=4fZmz=c8ThM7uDf^GcZ?M!3*buTHJ#5a=EsH$iqkah?lD z_Y#`2@_9}=4t-k81MGwZec+$>dYL$R?az?TCPI|=C|A9+|J&U0;c)=#0SX4T*oUcR z6*aEhPR}$9e`=i{&{*fg_0L!_Uyp=(;HeK|BxlkOCeg#FM_2xI#l=1rK%q==IELR2t-VhQ)7jKJn?QuQll%utD z^i?&k%Ep4Ux@)lmWBYZ2$2yyX!!h^KExwEN)-(8dQ{W?4drxUlk_gy{xNYRn3Fg`AoR*N+)0q*J}dyj%Rk)0E1phjBwgr9Yymn z#l+j1HU!|pwH#&N7(WWIbT*d+)H9&pm=^**`VcKGEnNy_h1#Xzw(EbamT0eD+rM9s z`9Nd5ntKcGKKI?w0R&huxBm{&1vBe14b1C}GSW=9GU!-%w}Sk3buBGHNaVgnV8d}* z8G+eoI;VUwP&wAgCf*ZslD<*j=4NyAT}S46XRw@tmqX#)HrAoTNcgvXDVEcHFf9SU z`u;kYkR)Me(M&FOlsK*JETU!K|9b4KPVmuv{n`36*FW;mq7=%-I{;~s;Gr3%0=#mz zBt#clhF>D|Kw7doLV4WAlK<>oyi8 zfu|;B#?lD^kXsgv8IZ4TvQG7qbDX9m1lKzAq5;w9Wbj{GtT;uj1%a1(qGh~mOT5HR zf*qqQQsCwr^)h+*f%_b7Xgb%a5`f>UiwWQVg)Xi{7{P?UMosU+S$f_NiQhy8K-r9b z!bi~5OUT$@@F32Jtv;isWvB$Ju%&6PudZq1ct1opHonpw45*7wzMvO}Dc6E71caVQ zF>3OIbnd0Gu^@+ggk|T6ML-1@uWz>5r29%W^8`C-udab;_&`%Ui;;gA}E-(4GeEht5sXg^sd56%nh($H531--Pm| zvHjN@>)V03HBRR(EIBF_EFYw}$Mo~wR^^aYjbCi2zI$G-Ew{X#zE88akY=Z&tW2m z34*yHaCxhj`uQ6Hhx`s5WHLX<`!a|KfM!bAA0n=2q^`t3%a?V};EHEGyIg5-ea$F< zN7B0J1=O^U--5(r@)o`fVkaRRm9H;_qU%`X+L%G#_h$^g!wCsMPG_KFd8x|ic@j#z z{SHj-mX2|uV^c)PPZ{m)StCb*z`B-(S7hd_50o3(4*eQ187+A#&90QGF;v ze32|*`CIllplhZYuSzKAw|aD0h)i(~sVvN`s=*K=9x+wVxRu?cZzSz({W!qSK?{)S zjQ^-HVpyLI4-YRkWfdKBSuSBOom}slEQU-{s_y0aEZs*&EJ6p|-9i4?JUHnS5~llamHob=;UK0|?(6IG!tBAi#WvNVV!a(+Wi? z#J0K&A3Uh4+2NW91&zJRL<)2kY;8EE-MY@7CViDt4}_{mJIOfN?EWBOGdb#g^>p4& zOS)eX`&1(G;@nOQTq&aJX9i(#r7<)(*k_X1vqD&7a1=8dHHxt{Gs~ZFYc7GA&WF@9 zAC%WTN&JxDaHdUtfOPaMH#JQzWSY_V49dRuuxvd-HYJvnknDjFiyulPBlws(GOk0n z^z#*ZE_uJX?l*9YaIYRU^<8dj0_fnnFC-$wZ!q$t2Lh}|uPZQ1%#MwEOBJo$1fciZ zs*7X>&4~~XN_KD9-R8(X7RQZv#@JOIAA^h3$WoFE$gGwacWS7wsYw z!yC|M3FM`l^~Io()ZxX=w%HHa4z!tIzSl#C+&(b5jVv5x!Hn@WTX(m1qN7 zIgs8Yd$lpteUTgQ|JK8RdjgC3?!FBydhZf zx{hgVlIKUjay#~*IVBtnkhQC;=%f0&*V~J{>*`*NoyEknr0zfIS=|XSeio2OcK2b*|pVGUH~w4V4dR`Je~q(y&%tDZ3AJH1%l zu__TpKLKv zV3NeUv1AHt2C7$1ihuc#%ahem5@2Ei@Vs~E`#ON0jpaH60C~@mNaT8zLGOfICp~SG*%x3;Pd+g* z`qcdbs=s00AACYqZ?XIX94BvcjMR-ker$q64UCV=V)X2K^mea|Ty>dWBu)9hVuPPu z$^qkCI{b;D^y+x z?0fegRv?{((!O`C{345Lq>Dh6REtY|M0k_(-!h$)b@Ex@mVh0+-uu+ugtjz#=;Z~S z7bByzB%;t>8d2?~>RR5X0NT(W^X5!-wOny)6cci_uvI8IJ>ldtIOIRlh&^=T_Pf&9 zwwBxi5s>n94$*)dHm{=xb-7w?2#zYlI{%6Aj@sMhWw%8c4d(#In$*yil3~&OY{HYIc1`jG!3<*gmaxts`Rc%votTT=V^vp$9Ud@)xekt| zlQPvA;FUZxJ~8ec&37{4YMh*Gad7>*>`#Bsdq>{|aB$~ncq);JAvMqT30x+&P=-#M zws{#Q|6Rr$1R6Fk10}<-AMA2*>41!}x~8TG(74C+9+~p*mW)Isl)Z`cWpLCuV>w`u z57!+Yk(dG$Zu?JyYy`-5MPim>p=7KBUBid#kbUW;y^^5~ek#uo7UL4!4J3JkIdu5x z)#9cDSOw;LftaK_xL9h`>Z;FJd(8;uog^!;3ZB`Cxz&G z$$ho!c0uX#Q?+JJ|zdxRrI_@1p!?&*J1ePK-SN*f z)S-_Akbe2=KTm-^i51Nc)6f`U+hqeS6rI4`2VMm1FW+Asns7yhHk|)tpFa~)f7b-f zd#-%U%)DoSPc)#WfSjp*tHa04&wc#J4P^u!hh66TSNhtFQ>#HFsf;QU7t$$#gl~2u zp?5vq$=0EPuK{j?>VxrQNWAqPCY7P`vgH_!nv|cPooy$(gi#sqe>|xNDA{YatvR2U z)YHr0%C(lSJSVIn5P*1vP3P8v#L>N7y5s>}^W&;z1q)rYwk{(RLt4$@K>0~EUx&Cj zdAN|oF#ki2fz~s4_$jCdh}C)c0K@vfR|JwcBd8s_F_Fuf?IPbxZ2!bHG@_s8!Y-5c=?i2t^iOsBsB>pfM>>-V^*)5u4JoK>k# z)y4oKbsG7F9M9?xmXdZ5KWXj)k~b&TK&GM5{^{P^iQx`{(M<-gSRVd(KKRo<(wVdP zMjn4N-3rUeu^fX){%~%yby;55+QiuY_}^vb_SLoWB9AK=@C{(1X_kS>EWZnNM2TEk z9VDqF<7OLBhj>p_HumC+PyF-&o@jh6@1x{2w*jfD*wA6RCBW7x4iwaUi=x>`IBB6l0LHp5($zn-R_vRbxBKM5@>*c&bl&k0I_+H zG)P+b5eS6D3(m~cTj&o#EC~)Db+keOHXx>BQ4oE*8)|?~6x1Y7i6v-g5Yvg*t*mZ! zKq(E>`f7VZwjsEo@SYhTI4BL=4kBvN_zLfdzQ^a!l3^t$)zD<`v-ft0@gu?L8Uufp zAJNFhL`x^bvW+}mFpiwTN3q{w+7 zck(?Ze43E8u5e9ZuP{65?J!VN5S{$Zocu$n`{}`E!W{n|KKaN1#ob7VWJcp7Z#4;` znV;}{>OL3l4<6uSEKNuI0@O`CQl0xR684#`Jq2@E%|d^$EXL&r(jxd>bMzCnvaZ~D z4xn*dBNfzDz3KA~geW=r(oG8^F^1NAt=-j+6D{G?tE%OYxTd-f*`$OT+pYjOcx=ok zA+Vf0zZU2VB4_Q1E3ZdJMm+OGAF6h&CFEf>7m#ySO+jmd_=f}v&SPpubK=~vKwCg_ zV{P?^d3Znq^u*bW8TleLy|oKS8!^+*7V>RxbixWFvnLauDx^pb!Dt&wcFZ z8^W3)@aR1ILkGZ^A;bYqnm+&TSn)w+h}vKcfz~p~p6h^c7Cp_N#1r5ze zpD&p$&`gQpdu{jmfYyxF(rFwUBmX4@vp5M!YWaQiF6<|lXUO}&)d>z` zOahovrvTIS{6%uLT=68Ky%^y2#I6YxeO0rOI=CQ}6Q=nS_nF(HL;tSFzGo*s5%=e3 zx5W(Yl}5yIz~7*3(LG|!cQrI$l5nVe0QnBYdnOBQi&b%A^b9L4Wzosi97i#Y2|(*r zH9kn%g*B5b<0uea7ar}uAfBizbJ}M9At=o>me*%|MMVD#Lz|<%|HsU1Ot~RygK!$# zx5>3GdIeQg&^^au;Fgbi^^*=i<@v@5q>jLN6{ui+#9>;vJtLSJx(gZf3bT^O-nJH6$#C;FqSr5%r!#Vj4x|}v-n-76)#|}`ySUv9J{yu& za~(P_EVh)1o+K&Uk&z0xcs*cgv0QvWB46}&{7Xo2QvUe#+k>zZkC3N6 z`}Yj%48lqgu@H`)dHhnkg7&B-1MvLKX5e|D9X zaVca2){H(Kbi+DUonuvwBSoa*ZYxeD0;hwkXIf_G8}!XQLx$lV;J6VY>&b6xZ!Ttnp@`_ak3$YKc(6aP z${tuf6+Je62T%~{UIl=WFOULt@?UCP6Vpwk)ZyIq;oJq6?Oa|RUlpO++(7((kaZO* zY$XX%WoZ||#q$Bq)NUcK8!+v$cPW`iO{&vLFpTvH_|%Q>YEJEae~_=+(TXmg_&6JU zYv9)I@eB>7_4tG%DWjUCN!(**=oP+qBQnR<^`t*DZUf z2ZYsg2AY6Q`V8o^@BXAXVif9ud^d3D{ofi*ztX9RAniXWMqEO@GN3d>6o5@iJPPfB zbO~$j!9NTW6#$KL;ZX|D`~8&(kVaAiar6@(-pihhbbp+_;XWn3{8lM|X`I$cM{eNG z?B7N59009483S*J)!49$!OtlBH^t_FzyZORZ3xaN)as(lX~F6LxcUmPD6{YXL5y8d zu?Uf{5Jd!$&Os4yMM6S41Oz0c9BCMrFDk7fAdRr3QX(LYQX(xwryw;1H$nv)L z8GbMS9>@b9$$^o@`~C2PuDfi@dVP5Um%j}&*ztZKD^5zrT&3PY&XC625mA9!o~~RpBpz1usUbs#K)Rb zUr>NPxWmJNv^7381;*dEwVR(ISAb&0UOaeT@O`glAG&t9+`F*aS?1|^)DIPevP>HH zVObNuf`P@9i?Dd!;gWs4QF?t*tF`Okq>unO;i}0AoarkfjJIP+4nzfo?T1UmYg9_+ ze8}i<{pTZ~HRZdk`drjEyvh(x8Fvczp6L_(%@os8h8-bsns0rOvxE|(Swe}s0)$Ik zKC9m0!eaLPC|rvAGV(M*X&-pLz0!5Icj@+eclPx_idL64n+-*=oL?V|356R9aq&?s zB8MSVB)^nAE0jQhncg&AFq2HpoDkJT_wC|+Q=dw$j%`rm}= zD)Eu zQZD4lXl=MbBfs9l` zz1e5gX^RZ8lfMq?;K)K9N-}$5WU}Fnq*%QDVP=3q*>oPLt!6b5eVi6|$qvpoKmdl( z>^L+>5N+u#5k*?@2o|)V3l51+qvH_oaTU!hDo}a>=xXj#sYRC7G|Aor810uAvPI12 zoS#x3vB`=sFYUmGOf7pXFULb72dWzS8u;!p9=BZ~(ce){*V@)bhd52hSR=STb`dfA zGo$oLWY?EUN$oBb?~}Iyr{DEw)>{y#&x(}Kf`lO+w)0K@#;2Rx*lVNlY=6mIwNNQ9 zya}$kkl!S~pnH_2iw>iqXl!ikMpSjI8E~x;14m=nawBn7SZu?DteMf`l830xk^vg* zI>!GbG1m^dnkTHl-`#bXPqb@N-hQc66_nH8x|ltQeX3IH1euH)^#34wiJ+?=|EAYH zUv*VPJ7ScaM`>PxW{dZN>+63icliobIg#MP6}m&^Dr62mg=xOwSeG*JtUhVBp2w3n|F>pqS;1{iJVYRnQ%}UX}SN9hJiZ{MEm_{ z(&{<-FJ$NX_EI``*^abI;H5qcT%j6Bd0}s5BBNOXe)-jj@nPy)_N2Y)fS&?hz$vR_ zqw#PDS7cY0inu$1^(b!zZ;ZazLVCEVs=gQHjkX8Ut<&ddJsmvZt;OKjK=dJFkE0)8 zc*F^0OU3Mxt8+@S(CGrWy6*c{NR;6dqFO6gbc>qe_P1{h;E zl4JeXTuzGsP>lMF?ALCR&y|v*-Oaz_Apbto?jEZycNn#@H6&=gzu;=MJzk^bX#xU# z2NRC)pz|2ZGOh_+88O%bgOlRqef65dFa?#m(CkTS96!tzS6Do=HaW}}yZQhwN|~a) zb-p{U42vxnkys|!-c(o%curI~$7u98F>75r_H2_?92jgB))BbA@cOfC@F$S75E z3YIk`Xl)&kw^Rt0HWy;VyO4dKN67&1f7xG_75dh%UEfY;XI(-dOR;Ztbv4ZV?g7}( zg8w-G9{5V}2sfLZX`RRd8GEi|1IEWnUH)b1%i!zno{dc6zg5gobqL@myBo>xbaD4c zVQs=nFdrG_4*!+&raci7e55`R^05ZRDGnFuei7*A{}|s{;@TI=nd_n(!Lh z=%`OLKpx8I=>8)ERe8>Xv1`qdhRSs?IZ7dli9d_R)HR;q(~W>Kyk=1bSeMX-;3rLF zn@v7Xt_w(n_@K}AW`pq5F3g1%0JewP4K_nSf|z6{;4gh(^fU|PFd6SnbE3X5&;agGH%*iic2Kaa-8F<9Sev9+pq77}l z0A(Wdb;7nak5b+&?x5vj@Ol8R()Aye9blvCU(Il=%KY%`2vowHAoGqPBOgxclvJu( zG?m-i=;Xuc39xbM$;lmKkBN3ae@MOTT}7EVden}gueuCXLQsFC7@0%34g)rXNx^4v zD(t5rXRdE|G?Zd@K==A=@v`F(IbDTD-!$eC;RRB*A9oGWC))9hEoiTJN~( zT=T!v8$PVB@}jD!#7}4KrH#zi@~_=zxpcF!fbYzi;HX~g*@EB==dl>qvE7&d(!Bik zPt!l-PiR_N=H&9Ux3{h9*Ex{>2sZ3}$6oNpqfI@tLnNvqJ26dY?2l-d!kB@vWBrJ_ zdN6*s<53k3sfI<`pGk^%_PdJ_jhaQJz>h(wA8dS0_yvt(1mFt3rb=Vr)KjiEh!My` z(Nf1!d}Yupl`n4M0q&&=2W&>x&Ig4aI{_bXlVposS>Z6+EL?=UB!*YU>J3pL&? zh+zP~t9VtxCeTvwJ}_P=Bv+h(Tn!Tzmz#LlI-Qk~=HQ`hH)lsTVry(*-fd|$3?Wv< zS#a<0I=Vf}m7?O)nO_7PNEV#2K_3drfQX3e*e3PvhI_28c?Q=(#3;`*XfrabWn}7M zsQQXH%?8KN9q68ctvtf9=9i+~Us4ftqIpVJddG&J&iw)r$sdE%ur|XhW;EEpkfh%7 z3Zet*Q4J~UMH_+UePQuXervZL2jT+(UaWx+$5Oz5oJ!YWd~B9U6pIHJZU-g{5BZpT zOIusCD0PIQjy${eyy8=kG~0V1%i?W38=v~-BE*2RjT#eUYO$nyvpz}@Ohs1Qw@+44 z5)$F?ZN#<6+p=TtfXzU8S@1Y1*@wB4k9lDsWSiXpR{j@69-;qB4F`)A zqfT&Z6}?qO?#W3MeQ@i^6-{2p$1cAH(rYv@0=;uo_l_&vVaNM*=af7XrLy20c;Oeh zu94V?FYGA8;fOm^!X;J-hZE0tI4{Ps9zw?;GOM`Bqr8jEZR{PnxKgL%(Wkn!@52& zPiLH_qW`%uhQ-dfEk?uN8a)5*Ei;4c5;_;n<_%qu1Ji79+f)E2J@CbR)*Swbd*f+o z<8=Q_gVC}Q_dkl{&x3zmhdH^*%iR9^WeZdg3Co6mBivQ(oAq#n*IBSwQ(pK0-p4)T zKI`cTT=$5+HCb5f-RV>B(5h*edT)X73AA;;2#Q<><_D=hBAaFi>~1^=Y?+zxf64&; z#*Yde?>m{n84QjUTlVBZ(xw2403%dhh=TXRv!7u&WSzlIMNeqWx!k`Rm`{G$t4Owh zxzr=@of!HDL*q{V0rhZX5ya!RO=q}Fs=nlXa2cKlfjRPoHn5st!u$WdQIOaDvgs%{ zS?jBj&7KkJN1~#y<9CQGDnXWi;r(1&Bm0?w3LV|%RiL*Ilj3em!rb>_SV6 z*K{I{HGeFu=yq+ z&Zw@HsC{@aURzrSzynuHP)#S_PnE;G22p6|v*Jp`_C8mKJyqtjwqE^^iWHm>y#*3u z*CJc}s~6x;^wlO>TuD;^msRrnclb^}+OBqM zOPrt?41fPVud>gk7?DGZR~58GKfhagd=JbuRZi^}Y4@evPz6@=A&LA9uvgwD}{&gb&*i-rNPtEVuZrkqMT*fOqodg~G z7S|wqM|(=L^6(Ic20nD>T(kM3`)OXG$t%A6K}$<+y|xQqV5^1J_PD5WNGU{#N*+q6 za6lqPd5C{QY{VU)z~a|c@QwV5=~^XcQ3(||fIZUMFvxOi#I;es!^EgNI%@QKtWT2_ zaobvC#i?W;4w}U^2{j}(;rW2(Ps7nt*L9ODr(VAs8Nz<}I6YCJse`N-LNFN6l9sM6 zFoi3rp~X~W`84QXJX6kIFdQfbUs|r}ugL6MFr*3RkKeU_=F*S99189(q`^LbQhZ
{f_UTSmZKV|3x(2@{sbdOW^Yz*Qd*dT;n)EQE*)``n_|6Xl-6P=~# z%M+bHE*KmH-hT2Pa`|y_`%h8qbSp=4yzL#Zx`dl@X7aj@!Lck?Nabm8j7Qd&_sM0C zm+EcrA9NdmWpRYv@aJ+!V89T(zIDT6&u-AXS>J#r%Tu3mcf#O{hM{wESW?$8KKc~-QLMR{>oOP8?= zG#ay#+EKQZL1wFhLPc^S8u1GLHM0s%iMxwNA84EKYbsm{Ri7&<*5tjT*-6frlB-81 zdfsu)E1I-auH9cGQAJcVuZ9b|x^Vutd3tt}2bDFdlLD)C?YQ7SA3RhS=2)}2JOGYG zQ%b)7Pn0}z8%V~=aEBG{FuX_Rp2J|296U@k$d*Jwfqr=9&N9ALTr@1VI_bDZQX}4E zZO`pwMSMhOj{7-qpOi!;%t94tH&p~vu+mUhOpMsy{VCW3Is1jcE4+O*)!g4yxTz|908AAyyn*ZA<*oG$97a|| zWK5AV@o)U)Fu`_d>ZZfQxRuZ3eQnUgwEIRzl7XyD|IvIXhavNK$BhU#ap{0vL#lOh z+&l;x?H>`2mFHZde9QbZkn8-kWDYo3uJMh}jVKnS5%n|`ZH$dZCbbn=I}xmNvUBgd z0@${V@Z`Du_t|{895T7LMWOsEdeOIy&ol7DQrC(%r)Qt$Y5>PEl{gJ_e?b;-zK9bO zmXVvwj^1MKG~{zGGznG&f3}r7iQ7TAxjdf-Svc5U!p(tp_0%JA#CKdqnN9!NIR@bB zxSpXKK>NF(og}s{YQGcpZ z@B$*XBvLyHYK~a5T(lc*xS(n#1>v9Ip@h@FThq`h4krp|jJ+r%qEfA{;~)1VGzilW zN{+~J7+J&v!xlKQM9#28Zj9z-Um5HZ>Nt;Rwl2Cuk^|J3MYD%VN97I#BCp@IQQY=? zf&W%S`Nd6%maoKfrvhx6kSE#RGYqal@0yf7gY3g(MGQV^**C20l>W~l28bkLu7t{L zthkyD^K4BH->UUjML!~ytDvNW{;FR@^zlHS2~{Ms^!y(ZP=II(!G)%$0t7=Tg=9+< zM?{s^%2LFSzy09AsXikR>cd|}NFbLQp)DupDo&26@n)AK)cwmgJXwQgJtoyms^LB+ zpgd=jl9G@m=M%-gy8s7Q{`Y@L1>dF)%*er~SyQ4nLo}q0kFTO$QFvvfsL#`n89%(wjg##Ya~Qn|w$Dj6CARf&(&X44P4d1VLe%9CnRY9mta|2@mJ43d4E|E3!sjCsV{o zdBG(ZJD3lK3=%!ub@e=Kuu0U2ou4f#EF328*Qim4W@`1x3}2i^x?e7ke*q(jx^C`L znr3OS*e&O2W{HRVqhk_r$MI`I60VX-rcE-AV`Sbgr5rO?Xns>jfDqqpc2+UD5ijFt zY@h_I25nRisndca3J7Vp<;U3QbNWCcykygK*(mM9WMMGvbO+DNGt`ee8onK89dEj73+5(let>yNg37mN| zfT(>3?;Y58pvH3GL+wFsg*)U#{=U|}=vbgi^Gmad6Tw8UonpZ*{#U+#{>kMRr zFFsr<6eDLN&F>M#P$gVlg7d@`0B*Dn<>EGmqjOeU=+d-l`m)fL7kihM#15n zoSa*nAw~}$3WD+*Sy*tMO+IUEZ_k;;L7FI2Qc$QOd?#Roim1y~lo|UNIx;==zT00! zJQguV9vRF}mVzqNc{G9S+#=r7GV_W9(+zn`$@??2klCr{o2^5rw7nsC_6mr*9AM0l zcgsgGQqAvCq+sJ*#{;VGQQgnty;7|aD3j>sL%Uha?Ou$`X3Qr6cH2W8dXDZJTeF)U za2IJyW~0quQyu0Wjcr7P+z>f?w%XXpNPMWbKqh4;hF*oMsq%B>Yt0gS2cX`-Cm-v* zb;(?@b)0QHfK7bOgt$+WUuY@af9U{iQ+&39KLZ?u&wmC}URDx^X?Ckl4yxhvx!#Sp3-B#%k-fN)lgq!LP>X9@BVPp73_C`Mh-Avl(QYxOtvRJWH<1`(v1dZ^4)AMZA$BK$hTzfgdu1}T2Uuo7gY z_#{G03oDz`4>&KWYcK1x+(u}g7&R?j5Zif+Gcp#`cJPZyh%Rxbq0cyx7^vhXx)%_m_P?tdZwM0qHSAT+O( zrkEfKqvn_WbB)&79(`+&wEny?asw@5*k?0AV}ohr>#5zKaLsBrcTonLpRz4a+N#&o8j_~0hi-BIpB?y9yX?OEM&s;; zqE%1c#d+ua2#i!oMEHfu@Abjkj=RF}Ttk8#cD2Tc zQfIunp#$VMPUNM0DeG=}rBZgbS?5{TVGWN(jrccj#DHS+2Ol_N%1OYw zjmTIm;Tj402DBms`#xMQEbIYgsPMv(5(>ca~fD%pQz@W8Foe8lW2mo~4M} ziBVMpZd=!x#rR9dGbJQKF0NTZme#!T1z5^=G~@N><~1s3Nn5j3xDGw!Emupz-tZ$7pG=J!b{2v{^5>bgP<`-<@Q;RIOx8PR4!%#>!tn5S~(K;W`l zC<*1m6>RQj=AGGAPkM9tt#mU4RlW8~Pf7hnwGJt>bm%%LxXmm} zGC20y$-zmSIQ8x`IZQ_>&2-D=+HYh5)+mMcqjJ>}{`6{yYG3E9)O1 ziYCfa{$iw3R2f%cynedw3rYr3izfnXe2?3FI0*ugPFigU&h~VCZIOu;8CgIV)x$Ea z&is)QkFZbRPCQ17-LU?ag}*=vFZ+XP;!# zj25LzvoNxfRAdhSkHi{Yoqa&94gF|+6u1G5!pQ3>YRr`tGi1*2@4I1jCmtY|Z{ z;(qDDFa0aeAr4r$#a2HY`b@!cw-A~>nm&ZS1j$~Fx$wBHE0 z_SRY%i|<6LQA0mp-6`28bpo!a`HD$8n*ac^`Bi`_fE9~AcI&5Ed`Zb^FbMq7ud_e? zf2p^6Sd(0DaRImmaUgVzw}A#yrk)rU)}&t$OcoTu zPDfZ48OtaErCv%zSGbCJwkQ9;DkvpwYs8Y``&K3JTQ-!YFmdOK) zfq=F0zn7*tuchjukkPS1;X;B#xT|=ofx8ayP2H64s9UCRTv^Ca9A6y~?KO*0x+oDk+<*u1ys^GSi6B~d$ z6a=tw_fT*`_Kond%p$@7#-wqR3oou<692X@c)CU9DS6MzOYFDG3;(|4_D5-qOf0DK zqHt$g-Ew%K*V7Y<5~3(ej5H7pegCbNFY%vQXxl0OdRfB?jQ)=%(Xfkt2BchrfTGz_ zF{s1vd(Wi?^Xf2D?7>GCZv<4p7ej`$9zc%FK@(7ot*GwmVbr|MAOAzy@vD zLRY;k6B>flprQz{-ysuqlzsH+YW%L8hG#~+@D?3y6{0SRpdvDYa zvf(ux0^Mvj+iheuG#tSnnQP`aR6wonELjG3vt76rnwWuy%WvZ#6-wDCK56TLT5j6t z+-3r=*s#9NuO(DLaGSif)ufGGPoF~LsrFj~3G7@%M=^W^e@H=>{YHZUvyXj2spMpgus|&O zIXt`J{Ze*Lh|~As&2sOx;^w*rHm!7X>=28+`E~E?%|m416V%X(=O55GOF(!O$Y&5s zDPE@?J09%^a2UexC=Wj~6zAiam|zSi6^2RM)m09$Xh2jI_qX=i8iWL$pLL1;$s!Ny z$v}70ebWp99CT&s03Ni`JG*h;s{b83QiCX?d!n+*fS;i{$fJ+n&e2P_c~^HhzM;BD ztSEdFCNtaJ2)iNxg$XpR=wEDWKU`wZGEXvXteomavSDsM+q=|=2490?R_)sC^mZ~L zT_^hQV!?vAz$TapS;Ltbg=T89mTmTwvE=tX)Ir}b4Bt=55wIG8(m0o(16)awf|y(5H4Nt(zvR|MSf(8#%B=DF1 zTLe1juH%Xl6lUz@L&L@kD2<>zOc3`Q-U6C`Z(cxKl`pQkNwRK@SG0V!aNBEo7t%&!EmN7bQMXjxISjSy4`b?w++}06AGJ>?lD+VSboOD=EtnNGZ~ygiH`6 zWN8^T<zqpS}Z`Dnn%)5fx<;W{|4Mk;?Ex){b$kh?BYpJ%r zcZnR@+V-h@=0=;ci}wt3_!5QP41e=T754Tlnn%6up7dhkv@^Os@XnNx^pF{h!t$|T zS7spZ;;wxS#t5a#DaNfi>F}qR9N>BU7)(tQnR|HVYT|@&vp)7-_n&q|GFUZ{a zw5gAga%Tc{gN6;*#QO_J4hl?10sOSvn)+`L9scoXyU?J>aVEzP`!Q+XA_9&N z>&*fbPaW~4b6j`hM++b9eb2|u?Y);CxxsBZssjqdRVY;aZ9f`%C)Yo81f!chmpXil z>tghijUAYVk-^gEuOcrZ$4As{XM!%4a8a+b1feWWK-d~$rdfS|#X-u}Ko-^XSE7pV z^EqUeq$+Cv@8-Yb8Uk0$T4ltJ`*K&z)=&^W57ZC{F)!kFNVOGjEoKT?9KbYP30053 zv>k=qsJbCu>IkJMH9eA)4RL40O+bR*78OFzj+#uWrjM7G_iqL$Qvh=A_W?J>Swp_K zAqymoT1nAt5oC!=#GVYTJcr4q8sFo{IXeBNd(F(|wx}Z#3XLl{*!7$gwa|XAy;LW1 zUuSRHEfT{h>IcPVr!DymD3GhSIa=CmObbS#N(X^UgZC6;qkO-; z?$RvD}&-?0u`VGC%|f%4BE>#YLwcZNjeMBDn)$p>}O*| zF`9)pM!FcI#i3k-VY&f>^MWMiufNZC{73Oo(!3*S_*(tVFcmZ1Y*cl(M1C61(8TIJ z^OKlY5IHFyL7Ao7&~WTiH@_Z3$i7T?#o@bmk|mk{=8a)UYcDBS|9ne)iaTBi`lJpW z8da&rU>SZXQN&e1@(m}LSh0*+w^5w6f27}aHsGR89)u%F_TPQ7g)a$5i4KeO6j+|! zYKyLejR!U6csL#5lew|%Fjsz>x}~7L^A)EpE`44hkVqE_!U=0F#z79IYWf zP)HQk2()n@aU%N5@P05m3yt_NkA)q+fZ!Eflw=GEXX#?d5xd#ENSN?MsI;7MQ!okP z+WM(PBBY35bmJ$w7J!=es9v-sD%*%Re6Mr^(18_#6gZ+Zt}b7uIzjvOPJK zhg~8}Rv2X;Hdy`i?Ht|lNm0hZaNwkrm@8jLwSP?L|H2Ed*4G~+K}!oHVpUsx72rbB zZojqiTkLp{+!*(0aiBXAth*7^FrU!+|CjWebApSgyUnRovqC@(V9f{TFRrfSla|8B zx$9p3kYG8EA)if1KTC0Se-%-k>{{ypIgN<xO38Xdd1>ya$!3bP0osv<9!|7H#xGL?7*LD=EGxsB3vCwi*hY2NT~tfe)ZO1c-G8 z-_cbcxMp&HX$QXQM__*0>Fpq+_8k}K&yiHVv{861%E&NMSDzec0QP<7kDmF%a$^W6 zWn!TE2M6RyK;l#asWpaB@~IQmcrXmOt@;O1STX3(fI}%KejZWLXnrbaGaaDY&&JKv zTB^tD@~_9SB<~3$7OJlprccn_&TQk^(*ri8wQDi>^#|MgXK}J^8x^!H{a}a9O|e@o zRhcw7$PG!dE-bL>((s4v=_g6`LfQ_tATFb!p3cY=)jFZTOX*Zo2U4p;8hU{6dF>`Z z4IWgfs;gDiZp&)8pZ1rODrZ6h7?!9R;Y+Cq8`h$bQps&7xaDg%*z$-k07iKH7@r^< zQ^$?oDDf!f$0RFr!s)|;wjEtG~PNzQ9Bt++$M+==E+mHDTv@a@**n?W5vbGqf49S(( zv{lf|20>Ko>PN>I|A|x;qJP?Y3vDvFJo&8ro3sNjznVw8LH=+J!_fC^AEu*J1endv zE;%=+R7qp7@(IS;DCh4rUPmF5E@A5C`9Nl7ux9FQWo>aHes4StaY)UNWsQT&W@cpm zEj@mTcIU1WS%oy`^|$83YG8IpH_{>5Cu2rqL6Bvp_{@6RTz+>0!WBpinAX?JVvGMV z2)nE0w&_=6BEJ{5(hk{9VM?1Ox1$M0Br7!Q=f2f>~anm63&u^S%=?4-5q=LIWU`R=pS{IP+7OOQ3JEOx%1KtqU?!~RvH zZ0Q7E5nfREv@aL|zq?u*sF}+bos(CO#CJ+e0DhScq5}2{{%lXVECZ>oV^SVN7+m&K zzU=6QP%&mq?!zUhnL4|1;baxu$Hb0MLgv?=8*^$ml??iqg?mWf+@OfBm3RujmTR=? zyRuB$$~SK47C=DC31L@FvWB+V7Lg|tNi{wzf3_U04 z^4Y1v-d-BbV#0_s*mx{N4g;u&oYe$)3OcRO!uULo`Jh%_5q0vxN(H!$iG^Wr#=rqB z$k)WH{gl#)TZJO}*{w~R&4*k706+#o2!VFES1}UE@su-sAU3{!tgH( zOKV^d98zuRhtBd{5nmn4aH6=Ymj|2)-xOdura#6Lf}cw~$+YvB_j0fseQ9|;P6VbC zRdHZfCq9p%5!X_E=lrLYz&!r&U$PQ1xnT@(k$Iy-E5w)Y-+u=LI$mt8QWLJFK_kWX zV{QR@Eq__u?gT{6Tw1dpO+_$2IsXhD<;l&bS%f| zXU}lcgaAy$uyLDkQseYHx+|-)cos=M*?nWPecuvJAHQAG`FP zX1X`G9sg-G{Bx4eSIMjU|1_Sp!ZjfAHvkntvWa><*zY0KV^oNY`6WUXqCY{h#$(g6 z$(nEgc4TeIYgVbcveJQV<{0=PG16S`siRa}3c$lvcCvq-Jn9Eu$SV#tApl?eB4RJp zyhhF}E^W<5;Ce#{xy8x`wOG;jA>$)C6QjAkEqFBMuF1k_WA5|2G0Fc?VH!+VeMi7< zxrswbr0AqKDqXDdwWjjD=-KK7=VE}0M;NIPw}r_geoNW|>qQ*K_C_8p`m~0r&P_!F zERLmXfN)@x86MXhNCLC!B(G(5Ju(?XcyZ7)dPlD(_aF26Tc7bf7a9# zGCW&0;=*LE59l-+&|9?tgO5RSpY{Ii^?nu3cNo+v^N3uHv6TroQ zR9z1>OBBxgO-&jcH~87nn_qO0Bgpv@eRDDDL*|R!y15NeUB6HHL<~a+!Umi%GyxaF z{Kir2;>Dhnp1^+pgR=~A-wLU#Xj!;mcCBGvfo_81PUa-&J2(>D&4qK~k z=Ioo*k!+ZjKX{MFqW{P^s*Gw+lCs+E{N|G%@%J4E(V?dz;;@BT{U z)>@wIcQiB24Ib?>8F#G^E@GHqZiX=G$M0h*qCko8c-9V zS&%07-od;A0ujjO?h4qaRNW#CUhI+?w^qrSZZS8>swwMElbx~Me0+Moeb8DA&Xe-| z&;#qjpvKuyd3_5Fl1yO=zj>AwF1^@&+r^Ni_^1$IE4Q&Z$kXWm`S#7oZF;tv68lpn zD>hU*#?&`WSh_8|0m-zoP&A-6d|fpE1-MMTXk`Q^mzXd_b&=iGOaBCdHr*ac#1U$!8)QP4fhrgjNHO`@+5s8}(a1O?XSUMiLy>Phr#t5vN4# zMr|xI0k!)exW~|c=o9mgQt2ra#3d=l-FVxR#l;jU&Ut;hD=(3U3{j95GEk#;qnw86 z$0a6Ay|$xF*WtEI4;-xUx)GP>nIyA$u)i4nW+<#KS+T*I97f;Ogqq?-mR&s8v9vHD-7|AfmNHzynGLv5l!5kRA%l5@k+~1G zx(&)KE`h+}MS^Qh<1L2)<>j(fQ0UU^=mYSb^S+Lf=gYo%)MkL5tT<$4I*j<$Kai04^P zM0RxS)O;Ed5iy()j%lNgKQjOptc0PC8w*(m}s8((&A8rRtZ{bX!xyAge6S;|M zzMXURhU8->ugBx5SO|VhVEiOM=2Zx~5w5@V4#W&!=m=zi%)Qtbq6rooK~1!B+!Rkx zuC?Y@#^|eZZ_8jg($keI>1;{RPPi4|PfMz!l~XlV1xWIh#_3frURC~sdof&AB~9eL z$#I$fs@XfrcV1t!LtPe*YR_`uwfk28HG*TXm2o0JPQw*la#@QCL(@On5D8@H{SfCq zeacbhaq7zmfv)XzEKijIsm+`sxu0N=^4t{P@L&2x&tiQz%Iq%JT2gcIA1@TDT*v;{ zg44W|iGJnS5=sx9Zh_T#!TiUc3nwE3G|OI}#_gtoT7+ObZhiC0bXRvPDhE&={21Kz zTsdUyoxm%hiYnSP+Hy5tSDInCY?qZZm>$>D(!tqgHOi11EQIg`$a;EGuE*pkbIWaX zlwDu%Urx1&^=)~c`p|vSWYm0oZuAlH~IscUO*J!J}q3<{C)uT=%HUug=FfmT_bhj7Fdh zvU$AFB$LXIijn_{a?ZoPujYCt?<3f9KXyt8n6L9~-r_72f>{OR$M7W3XKcXb5zLRF z{;k0EVfKz^jxLJrx+HP^`Jq+eO-bbf0}X}78wTy+dg_p&2i zgVu-gzn@uuu9gFX{$XXv4-lI2;&UOUMrS<9WmP{^I<2NTaObt)-Q$H12*5`NU*vCxr-B}ufn+#8&kBw zF|oOuUh)M!KMx;LjBoOID7^a#w9}tD6|c)(BeXS;09JC>vN^{OEa5`m|tV zZe@UiEe2qEHy&&Ewv#$j@14<5r^1m{{BTB`Y;ppe;^-H4ZFDt3;z#7`3l9qTZ`aneR-wt@%`EtkUJ`qOa)2gX_7N5+p zVu!t?DNe;L7Dg)2V)+=W!o7v)S8~flm<0DxZFvgy+e#NNrrV(Mufu(pq=N-M!({7B zm^k7s?EVhAPDig9OAEF;qLBE}XF(IA&D~{eDHmH?6FYO^PR6g!7z_`9tUn}FTMIr1 zk^KyfqF`je6Sghox4H$FaeIHb=ZV`vw$Sj3k*6wlYmQ>MN}GgAWBj7U&Z?M+X9m~I z&-KQjzHyo_J#dc*u{p!Bmq#6ECGYy6zl-Z`6^?&3%xJnWv86Btv{j8T)Bo{R3>P{6 zC(HGq3|Qwvd-Z#8NNJ`gPBbQjn3$fijV@O?UW=^Ou#r&v1L(83pj}M?m;*&~PXHMKz zg*6_}O9vAYDCdNmE!)^K{JucrYL!eFIWxAM5yT;8Quo5eTUjc{T7a+uacH zJbijDBni|Logde^$&Sn*n4Es%a`;W+(ZThj^R3yIJzx(b_yuqKV%Pksz~|v#mTu+h zS~(X!6E(hFy4p5;OS`jZ60j%fl=Gp9l?SSp~YPk1N9;KOoM~h$3`OMoGoQu0qN(&qt9b+ zCJ$!Xcurq?nRelrp?>iK%dEdbq#(E~yvXwl%zhK$s6qqAhf`+ilK+hW;8m;cUW5?v z+4Zx*J{N?T_>=R*^BslfjUi$Bbz-k}d5ub4D>zzV+?1FBHTsj04S+DODZkY#0^{>T zd}*55H~SVXSAA|vi_wNbERpXzIE+g{r7Kk}oq0HMT(#D5rdLnna|w4nwj#6h zH!4PvJlM0L6CCkOo3 z)0U0rug)u?=G^Jbu2&D6^6;9pG?ZNa zd|)GJ3g`75#NB;H0~M0dlR^*j%ve8-S{i9SA(~PwB;=5s>z6}5!7Oz*j|N*~vB@30s3w0kc`aUdsr-{0C;e%UWmWg*b!hT0q&aU%8=kb+1}2DXRBl6)9G`j~;>R3k zOO~qxfc6d~nKMl-!sq!0Lh@lTZyYZrB|{a}P!YDoO3&uDUg??cZg7!OGS;(pD}Rvp z1yP(q`xWlK+dJ&pq$luxDU~pT(z9DtPe?K*$K71_(WnE{VSfz7R=9hHhG#v-^4H?c zTcJlGZm4v{`}s;^Fn}X;EfA(I&Du5mIk;+aIecZ1nzs6j-))4^`Z6_=u^d}jXkqNk zcK~Bj?~@S_-O~K*ujr5B#D0^?m~Q(GTkhR!VBfbFg|VgQ61*CHoSEFQ@j^S>O~!5L z2wPBvP}DRLltJ(rq zv|l85T2NLbEDu9T8sP#Bf~9J?w2Or$w|s(XeCaO0dd#vG&(m`KvxF@ZW-?gU27yFt z8J~>wQQB;rI7hDx~4Sji3%Qxx- zm?#K9&giw}B(RC~!Sc6xe3k-70Uza6RZZ+HNys~Z|K&_m_Q09~8;-)oyA5=U^?H12 z_IcLzaXI6L2mm_qe2lCS{uO&L{6hJN}$wE;SB&9FZnX_l;^ZW`r7 z(!leDk-~NM^TE`m$Y&`Me)K}sX?0N8xKwjF{OL@??uOKhB|2;WT`jUb0HZEgj(?e! zhi_lt1}}|f8IYrfWDG>_A;u8wrt+;wdU;i?IFgpszAqe*10yD^<2heLoqbn+I>?>0 zDWn8omu9oJj`mOm+t&4MKw%-22U+WGPqrLQ&HAs;r3)BY!f!->q!n>_ zz$v*pt5oyzfe5&CAedj-7<)W?0cDE3JP&QyetNJD?z^3-&ob+=Oa>blZU@@?f2T#& z`Bx!GZ~sIG=O}wN7}SlKSo+0WBKPiO=+?QSU3A;4iQ_!R|3oz8IF^;K3RQSsX`taO z8gqX%pOEHfKe-`7xj|{bzb+C=R;JAT~?0aO;*icR^bjS1B+(>*HGmAJVvIhHb z9np3@*7?YrEeN9eHgsydo$BYMKo`n(*76ZUFWRiZI!fzB0s*WT{4h&XA@*0Y5vPq- zBk=v?WeltgVLqpM^_l}#lWC%dk4Nsm`A!`^A`8|78^!$#WYDi+pK8)d5S`x#xXX! zosb@!!2EUXidu1oI)g!>a3~HH)P0@rFWY{1_|3}-%Yn`*?jHl=t&F{2IF|&oHus#4 zT%6`n3kH37+>}-xRwmBmxyHfzb0=h=l0A6=H8!MnvK6Q=tMxImnwRugc&4T3c1^1Sw+3`6ei@ZLg43B^s@PotNNT#B@6 ztMRQ@whIiH#c$nVC0wklKTbcl{*lh37CGGnw#_hftAoTGfF+BJ#WyQc&xH|}N!W5L>)sE%=++l<)(e-T$d=deb|6b_jUfrrx|9z~i3-{CU%@)m zKgxI$3ay{Mwa`LZUfP2E4dsd2^CnRF$z%KVQ=go6Vsd8_dED=bueHb}fMvq%wGEY( zOBxz~olQ6v<;~-9=ZxfX*EjMH(|nrg3!bYT5T{dBU38Z)b+Wy@G|K`}fifLhQZ=P> z8PnKhd*2h~Wm=Q&Ng!DDJ~IuEGc6lr7;dj z#dk|hyVeTu_`rC;7IO;=Nc5t-^h&62EfrsFTkSP_GQ1GW2Te8@LOzSw*&!$g2lMiN z3$VUc**YKzJREVHCOKWe@BJj+{V!LD@P#?NeYRdj*+>6@NjZSvO|=_(R3Z6yTIWBT zsAwqvr5EW>P}O1P{Iw9}O)x~!=R=Z>&v+ttRi7GgT&OyM&7D6Y5>-9M%sbkl!#XMf zBA_S3L0h&bzOYxggUW9@o64W`7#@iBt^I4(XRGBowJ~zHxZP6fn%PD&8&i8c5r0cm z&g)*#b_^!xMU%pIgKF ztkj1?ELzpHxzQwNX=w?eKJ)%1rOJum$Bk)S8l~c>DO~EPU#dKu_-K<5TT>MWN!sA1 z!ZAM5ohHdPfK=ivdLIlc%oP^RKvxiE%)|+$pvn?1u8{DQM~(OQ0`Rf7U@%@Ld+6%2 zw5nL%;s?`T(TFk)c`=P-YwcjVFxoIT7vw1pb{Fl?otiu_MQY{ft)462&r5s2_UNrd zX8Knrd)l1vmrrFs>-`maE~ z=sI$1k@?m2=qtOXdqobFtt`|G zcV zDBPgW@>-W+n#R_YlLW)#qK@YWz36rbD5~zOfkOWa%8i{8uHAh@fRwaHUwS zJj43HV5$tl!g;nn`8a_%lYN=Yz5{f_8lEF2;)~1uWA*J)1J{_vq9CkRR!2icKg?Ah zhvO>OI%XHdgi)4Jj6DZpC^?q6^uUIAGrHWl+cwug+5(xUC}E=L$?g4-N{4H?I1`il z3L^|5w4-z>m)yUX_c1?LnFe}sO2i<)xFmPBT7IrpDJHNC!7ym5;KDnb0h5hS9Dy~D zsDo2g(;6Y8gvNmsQ6N}ok~K@7JB3M;yAzK+n+yOR2$8l;6GZzdA85F>k6z%mQi%TO zJYH(y4FBm>dd8t&S`P%>LCPF}N%|i>fNFuht3FT%>?dt4%Lz{EXs6I6D;_m6>15Qs zc!B=()(<|fIoGltn58#D5P|P8o1U}zKHTBCXtIwMk^r?tXw);Z|Kur#&uQr|WjsR~y~48|eV$QNGg7 z_FB=OKJZ$$IrCvWF$_>fKr;KCYQzTa6;oT(_oJ&-=5Xu0t;qnojEghuNjI*gTlsdDJ&fj1Q08gX9_?UZ1qFA?)e$4 zR2e)4vM=ZczqDsfDTv}5N4p?A+ghRBGwg_MV^}S|1=k}D@0bj1f*Svb$_QTtk+u?vEv>pC6ATA7KeX^v(Vs zRaY4hW!kj|S)vz6iR)bFI_XIT*Eq`mVTawT@9$S;=odyPh=-r&DJVB%be*p= zz4WdIZ)(-fQT`(lnN6iKnUM+1%ww&=qQb8pu>^INRKE|DKA7(6U$r}Yf%oqHjERNu zSw%{?Sr5MRNI^spZRDZ=Z{9Pb&|-hbv8BoqNzMznqlFPFk!~*%t!bQqEV2PZ%bP1i z&xe7~vi#UB{U#omc2v;|HjwZsn!-Uc(tKG8Jjw4#q!`0z)_?Y3W(*&t3Wf%f0rDlZ zvG%5v)B{}90p4zJ!!jMM7dccT-e?!-AOsUJ2dIQu&LdNf>O%HVd*0OcaW=?$|4=Z$5yo6>Zr#lFYgH2L zfMjEIc^z)UzZM-bWKqG6Onc%wL~d-29gVqnLZUdJ2MpH_?RTAb1$^E|k?1 zfZT>1#@ukt%z^imlx*i2bOV;g(9uvoNb%6UF18(&IytsCm@eS%Dg>=sD8`zc{s5lL0@<*u3BGAw8ZG@DW}(}MA4ZQ z%g$PwyGSVta4)pT26SnoJPY!VFpT&_j;bv7LE%WS+@y`O=~M`oP@qr9`VV)_7RpK3 zQi?M#i4>ouq+Fi_UX~t%fa7g=r)RFS7)|tlgNBj|A0}i4tM`(-92dKiaQ?ZoiBk~| z0m(SFu^i(E0+b;*`WkB?D8;4Q&OZX!BSwRa78RW-dz}*Ir&`(BvB^PkfYVsO;nJ69 zuccwv^iA?sPgDbgI zQ5hY*<{D7S6QhgUiBV_>W`3WDv?#5phl+Z-;Wc19{x}>$?O{0dl}!2P>q+ zVnw1ACBz)khU7L@WM_X}xcFjp3OQ;Mx`7aGyl7x+F*6VT)MjQzE^ zZ6m0B1$mrLfkSgERNoX$>px}Fy7}{7xvx#7;u(X zl{ut;ZUi(@+Sc|+z(wMewqNvq`xoEE+(E;?Rv-&S!KL<)=ys4b$T zZRUr!6r}mO-vOgTw-;cX`nKHCtK4dv@ruGg4xr=JiHG#USGKW_K0^l{4r2%T|Eesy z0g%ws@x3KbHD_ACfB#bizcq>5nhcb_SD*i^MQ{K8f<7pO=GiX|B3dV!m8%oR#%6zN z?(8)-O6i-~v4H}vo`D%#qGkZSWhEEpLTe@fM2}b$@5;wSdW&!Ezu58>XYz@{-`A+z z$k|Y}1+<9`Jn%)TQ^}62Pz{)7)wiDdp*+uEm>v`tko3B7VwH6eFjeKE%-k{|7^Q&0 zO>=r6@%x@9@VjlcC-dw+MkIrr$$b@MRp}=)R_B0ZlJMoB!Fer$x+llOByT^9(%0iNbWa{Iv4yT|tE+11b2r_G(FeC1G6oUG4Y|0w9XS;OiYetkb*54Lv@(&z{w*pQ z>xp`A0r(%m1Eg{a&JV27snGp2$d}vaI?j;FT^46_V`)+{Qk=A3iS-+)V3|DQ?s17v zXM~P_r0{A^%~R{bV!GAi^AWi(P}o=cO(~O~SypjvO}5taSlM}o_U`4SyU>N0>%ABl z%XP9=&Di|8H{sGlDDb>J*A!JdK=YaD%^T2`10ayK!r^p-skVnxVId!4ji7Y@ywml? z+$eT#=Op^6nb|G!MS7$(did3fK>mR?;e{ms7z+EhO&P=V>M+x}d|XE6%pO|zvS6vD zoi^U=&b@l9vY>OZpEQ71#`~NRkYF}g*OB?^ul4xCJeh7?aO7l$KGXdbM%=|Bq8G=U zxS5EFrCLotJ3hS*3}b)vLMQ<2Y0go6<~~R(8&q;Q5yXAvrfhTosO7-CR>WW3HibqS zII`P0PTMb`PeHFYM}scgmrhTwGF<58%KRu05r}RjI>^-Q{&n;l=0W>5?IH6v1pi>f z)GJHbdo`;;ZlX04=nG0LimBJHe?iRQ3UK zhSg*Q5<^9U>vH#+!M-!QdmSpvjT=V0N~vclVCnknR5|{N`;g2bC>Na3;inr*1BQlI zY=8-1F>qs^YUMMLnaok00OtR<91)(c<+;Li~JZ!$dEq5$Fqn0ocdJ&s8S^w?987|89hx`0r^fotT{P2vh0{{`&v#((ee91}1^%69$+c9?GjVLSh*mGHSFlNtIiL6h~SIS;M4k zW$wz#37zCDT9yN1goLEog7u$AX|IGRRF%-iyq3_-njr}_eh3|qLLJ;6DL{d;{QchP z84TU~X%V&cg2~eOjq2bijZBy!WMi+4EiK<9%RqiRdNxA#o~bDx9o-dmb?&Zy#i*89 z_H42|XLA<=xL`^qj}FptG>dT{oqg8ua)`I%K#^}^`aoRY8fbIdF^DfKUU>6H728Xb z*;ky}o@Sc-NRV8dpH3+x8GDn0;$eWz`BMj-Z#myx`9d){nM^}_v*G)nTvAOwT-=&| z!NGd6a%$|eFPD}XA!AUyvstr`|2{Y8%`6>&=mCUB(}Bj_H)C_|{u3zWuq9Dq>mgGP z+aIFnB!se3A*=`NHtbDIc5=~Wj+#$sij1+TDcS!gU*zco1yU2avhzvD&oC296seZD zYq4p}yfB|{NdPtKboU0m`pzG+r^%!lgrdt0@ff?}`XLWPeTHSz2QiQ81}EtiE(QR4 zlS-aIqUljLQTi>V0a{B&uVqF~oN=!a-&l;1jX8F|h{MFs!Nbb-yuyyyr6NjZGTdxU z4eJ9*;&0dhr0uWBQdOVkWc(kIbWsxtAh#Rnwx|Cv`esTyktapPqGZwXXzv)vo%UMMzNL#X-#D679$5QkIbT3`4=)-sV{x<{+}r-ge@hN@Hg3RN0=MadZ`C#4C39!7EL z-YObw)g>w0*FZ@^fDi%GU3;=7c$o0eWR;YFt_G}{Gz~d+vOL48y18`s{nS&|tBydZ zI$S$gDkQTA@A{MgI7KZR0^}nx2I09u`HuxP`z?T9^J3-``qpTWNE_Jl-p%#f*qFiI zR8H@!EEdfdJD!t9Z)pNbDJJ*lPlr2ziJi>h2Yt+sXFeM;Yj38Yt9zA{KxQW3Z9ylL znGsyZ`TIvCNQ*fp5fjA`ApJBSAzap~v0iA&v(2odNoUtm0n%ui2GCf6=S%9UT$8N< zyqu#Y2YFV+#lJ%E&nE&13nM&v$kIa+phgGjGc)kVX20)fJZVJtX$1)-aTFEtH_&_7 zXz}uG-3Tn`?mTO~%gXr2ZEE*<(H8xlj1(wN=2}$fKW4Kqm5uqh2546UE}xz;TxtnI zVsB>hd&Fs_tU0AumiN6~kP^4w451}RfaQ>_=%Y?xdz4XMd$}yvIEB1CL3?vsc-e=a zgs9CdEjCE=o8!9{gn(1ahQPS&{9~XAGt(oRcfKhA9FK|JK;(vFLkzU^V~b=sG|uH# z&qC1>#xv$>FvPU@o#}WPI%6iX^+U327}Rl&t?5lCo8!JNFq-8Djo>3?^zXaa!gUVc zuYk}Nh5e^wcsGF!#>{|-hS1>9KtnT6NE0}t!G_PhxU?NhQKj~ONUO+ zOXs@i`aR*-m0+ZAV}kkY=)0(Rp~E7(&-~z2V=kCu__72>@V>vsF#)_)dKBZ+T?&!%bbCeq!BHjhes( zBpuGw8MzpdHO6Ag9^$<%akRfc|epcc=!2UTiPK%vsYLqi)?t8zp^G}PGSOCyyQBS@1} z0$*9WOq0-^L|DGW6+r8yAkva9Q$`|>)=wk36~bVeD<0jP*g{fjK+o7ry;Vk@*Vk}p!-Pn})4WUTB~ zC_De{mbD59sX@4p3nQgfwqAVAdIaN(&^FP029vLbAh;iA7~YALL3{yp310}I6q7-P zvqJ9!%swPAD(11O_&?vZBqKG-*{Si-;AVe0KwgN`0-LqQ-vC7@Ki(+}{_pzY0HEfHX?S{*I=*Bs8aJ1ER;byoUoP zpc=2eZ{p#uv}JVQD#`ZT_Uvy(laXP$ZxB-r5H;A82^T?=KVZqZCX}=ol053J6GsF}9%jLUf-&_#OPo)<+QQ4ZFX-oN4mGaO5kYgy(hK(8=g7 zAP`VknE#sJ{>pJy0Sb&nRKe!W^<*VlZ-u$_qWl|`_U%Q4&v$pn>Kt8%GzSZQFS^^0 zeppeX*z96rVyrtvHvxmYD)ov5@C`_;Zj-if8vBQ7djM0R{SOxx+hNBA(A8&y5V)RI zdmvUQX}M}vlvVG3lov^w1?K?^b+UZ?v7D;Uxy(JefN6v@k%B2R85IWgNdmdr2&HJ$ zcuE?2ZU{N7(NHl$b@EXwgxEl9+1;z`D?~HvBZv0E0x5_5`f86M=yReAPeYuyc~ZG%-{m!87%D?UX9xr02qqDQ`3Kl*!}SC<^{ko7imt2z zh$%qAWN8!Ql9N?s^PIOtfF@?X*TDpkM60t$kUk2o?>w-el5PWY7{-`fL1G_m7%&I_ zGB-;A9eCyskTPTqbp{K0*>?87^N-Rg0{co@%c=t#`(mYhpGsz8x(}G&M6*-L{F*^f zo_=oJT;J2Tv;NNxV?VUN62)^M^N*Ly*O2BnY(y8qQK4qd{)hk0jSkP%RtSDAa#EZB zO~CSi$;IK~)mgVO2mFxerazIy*-J#nF5M=!c}4T)_05atp~*zQScWF&8m6=_J@?Jv>wie}E)tLG73=qX&_M z8K-jnUdQA!6AE@EsCAB#r0p{4=+*_Vel`2HB6|Ii9UysJ#STOS>bST8Pgr{@ByRYu zme%NBEE?(>Yg|_ApzM$pAH2Z-YUKC)<;A%_WEDEVB^jS2Xo^(UlRZSK3WvN*Li%z; zr#tcREI;U#mupPqn`?o!kgvW;T|u%7s%81_T6!E;#}Tp1U!Td}XsTubY7CKt`A~t8 z!m#rKNE}{@cu+=Xq=0mt=1%y;h*}R&jexm)wo-xlR%tb^)RBN{Tj>--JU zVkR_^W@RQTJI3n;|K$8!FKOsq5(O%xT1L;C*|=D6dYxwng@q;(PB8gI3n!vJNEsR` zNEJOoeB=iMP7!{p5K16^>o%MwrybRPK9sxYzYzdo<_9)$cfBhLX5D|n}(OL-Q$mkU3Z_QQ>qfx?eg8z@c`d-ZhL)b%zFqfI7W*QD=LtP<4UQ|JrUmD0t%;aP492+Vwf(k?9qUl2pYUmfu z3QRFnaaG!Nc7{XDhC@_6UXiO!Ehpzr9&8Ttwy1hc=1+Mx;=G}=lrIaBq4p%Ffye1L;5G& z8xy4I@&|XhOZntopfbavm$ASK{B8WPrpH9{n2kil}qg{A>-4 zNpnkEzce?O95tr0%B}@xER+t09M-|QKfBq=(YR#{7E7WIx|n=+#oUmB30=M2HwZLQ zp3fpg#HpJC+rc(d@i<~U=Kn6YZfL(aiwkl(u^A}U6Z85Ar*Wk4nhAP(bnIJOFbY{z zv=IXL0MT8*C*)HA)zEob$~KLKLE%;0Hy5om*`@hK6L0n~hvar$ zDlNhO*=?eT%}>CIqeRiQ?{9htIlCZ*CdJt=(`7eWX;H^f`Af}|lw2xEvnN$o-`IsH zK1d;&E1`qGA{QB!6FU9UC>2-?PPPA@IJXRc(8C@RLBmt2NYRS3>+A5jxb0RWzrXL? zix$=LGbsX&OsS`v8ViEvNhZjtGh1LY2)(R?-z<%zjED1ISt zelu0Rxsug>*Ly0WF>p^3qT93jwi`xw{M}=NW0eQ3wg)vp!AJALX%2^rYA6iYbg)+XypVu3=Q@LLgh=AA#!o(rXu~%xH0S{crXvUUlLURIlqqf zULeTat^p}K-Y{AeHr3=Y6vZ_KJHuepu-JFLqIC;!)L%w_fB??#Y#%MFjkGlL(}B6Y zH~dOQC^4y9KcB*^I*V0Z-Ie#xV(3@>Q-6PF9rrEJ6;WNom_4=Tdti%{Gf|;Sos-~< zkfRk`F-R}ASP9691=`04Huuz{7h`q#3F##-@Qd`z9^93&cTnfOMbDre2L`+FnXSy?U{5HtcN?3xHB@cx;Qz5V8yO7|dVzim1~n8h zm%3^Jj4=TZ%HSHuU#?mT5Y{tT`4cS9e82K9%OhOr!FKCCmg)mH$!j3W8HCmd=P$RW z{}Co;84xw8}SP{B4{Nn)weN{$Xg%nr25x8t7+xnwP)$=CpgM7tPY$E%(=5 zpc?5K>5hc`v>93&flK&mA!o(UGx|nVrTF56`oB3G^#J(lt-pa#>-(7(clK zf1`%Q60o1SM|ShpyS^@Bew#BNn4i7RJm6Y3DYsGe1Ek%+ITkss%^-;-;%tP_q6^Ui zsCY5JC?kc4p0tj4?qGk9upKDQ`M&%dewNG=?X3Ec6HqidTA*Sb23-meCRZx zC;4ZNDO?G{*W%XysY?3k?fC> zd}%-rzmd_|?7u-qdnAQ{thI&6g$qay693JAkfLD2Ghnb$#a@f6iEk;fQND4uolk&anY|0a@_g92b{}f^t zrg5<@@Sfn9dC{g|eA3RmzQ|7^vrog@xgTi`V?Dqfz*67J#m4zk$431J>F|gDJS~qF zArPS(y++UJ&FQx7;p&ov<&TFS@HDl**t@T zz}iv0W9eaJsp*^^*Y;1IyFN@lJf~Wd#|#E|C|#ci@q?qgqr26>R5C(dbgLci9uiAX zS#Ky`Zja?aVhJwY&OJ0e19(3oh==u)9%euJ&qbVsi`dwD9%(V~d<9K>7eE3?B`GzP zAJ&-FRnTB1N(}vi!lyO(6SGwWme;3xH7b-?K75LdvcZjRR-mGJclc>|E$;;guaEz8 z$JTRdRc;#wjWAiQsi2-H=h<<9YeoWA)``PV{7SLrD3#kjQ1H2*c5VsNKFL;|{4we7 zaAakE%p(greD|KOHpac;d|4gfK@y?Of12GyZk+vNeH($Mi zgzLj8i|R5~5)w^R`=CZm*9Q#q{Mh&`*?_}pzZvYw6}`=6EnxH2K&QN?&?A47)_3xV ztyQH^*fVCk&;st_!xa)_qF%y`d39Fz58(*=p96E@k%yvCgjXR!0$A&5HMX!sUVa2P zrt7U3+h2C9qaOu3U^4oBKo8=>XHzy58YK>??U!Ca*b!!KySVVNjo(2s#C)gxU5lja z_}zUF>b%X)zWsgP0yq=L7EVVhoiI$9CA)>fzB%Lm0~$YCz(Js}!E*zYNE-9xUV14_ z2WZzL{;u{17#Fl<=NJX8!;ic!z$|}#22eL`4vP5XohF3_^UV8CmCGif;TiI*-=QBg z;d-{l*hNCX`lmrlZw}luPmR%Wf!>159220|K>NoX;<;s0xfqEnBO~m=o4;Sij8El7 zz<=Q$l)^Mbe!#4+mT9PtDzX^*us{}#$_n?|?Eo@9mGwYx&Uf7Q1S=hb4W(^{QdQ;eA@+_)sg_?6%$o(4h228DwHc*@1 z*DvTY5A-skKJ*R_4Nf>z1pEPB6p>w3`y1HrN(0WYw)8Q_dxYm_h|1Jtz2!f~xkwJ0}Jkhru{0-DlZST(m zV{pFN&%5i9a%MWKXIR1Wf;($cy(8UpF9ACUa$p9t?3`uQP@=JhPzfQ0HQw%4LFdNK1|ruB>+B5=TIGg8#ocsTma zQ|Pvm2qB|u@C$qo{aFBjelRO@-+^5fQi#rwF z*F;ymg;y#emNaPJ?gDCUZ41m?ly@0KW&xY#l^aLL$q^uVz8OG%-$ImbHUcofyb`2G-QX*z7GRG3;NIacmWJtre_?wq zd5vQww_WSy_+ebDu0O_pW|Gli0|;a7MaA@m76wZJ;+P4<?7sFilE1P3Oc?7Yk6rgN8#*7Q))N8zE$>S0?B@ z8K1m+_b%?oEK`8%sM0f49~>9*K6|q*Wnv`AR7*ZiUh;kQS~xMc!?s)MXMnIvQf5n@ z(RyK_qboXp#;_@F$7(hF#a&NzJ4hny7c5=fkcC;4J6=Ju9iIr$kWz?63KuP*Ez^2^ zu|OO~Cwb_*n3etmUi*m)0-YF=pBv5$23>L`cFFRWg4^3&D<|ct|0-}^m4m~+`p(jRFZ~Qp_Zk;k z5R8*&7;bJ?oN;7CyZhJ&JHo@4a1$)_fUGR*&5HzRXhBbAJoTV9=$oq7WbklDdO3c5 zv`|0ih6GLoeiF6{kH>GZjBUNLCR2U&$eQax10-j)E#H^94CL;W+*xaVZqnYc&JR)& zml7O?2Ph#MOXo>b+OE8_Ak{myr6euS$X|$3^xfIrMI?g|M2g#N5GlGDX**iny3R5K zZQ=P#rTP4z6coTn!6i^B1`)tO!oL3hbLK&J08ArJ@#Sbg=GlYo>7hNCq91!B!>0{m zhulkh^?;y`A9LPO2lg7VkWf@o`oPc&wR{K5*IWxEeOEESnERJj!okTSi9O+lOW1bhLxND zoMMtp2hhO(_(>8{YPbJ79nKCd^`1Rndwc104t7==+ZlynT+fW0Tr04IIpPaIESsWC z^PUQl0CRkT`ww_CN##CcRo9Sdf9!je?0+~eB|k_e#M)|Lt$38}X83dqoA)rTRoAhy{>uwcUWn^LA4`eWfP zR{imU0~kjruKZh=|uw-x~QwFsy)=yrXPT$`tO2xY{;iYy;fNlg=6udRZHfU zfx%VGh!KmA_>@jCV#`4kYV#7dN@Dh8AY=1qN^T81pZPLimNJiSaWwKM$RQ!q;diNy zZ9>97>LwtXAT`VaM_?pw>oIK80wd4jbE4zI0oT`*sGu-)PZ=q7GaRpEF(hnVU%!UWUPZ5l3lBJK z;r<((Y3j!clF%Xo`%ijLi2Zos*f#d#8pNQ^|ra*GicWuy;K+3o#N{dqE>x5!~i-#`bVN)u%j6)}sN zDq;MBj%>1g0y#~gg&7dKz)PfkUbE%mFQG9v7sHc$ZGqvCQ_aBwHdD=S@w=g+y&ysQ zw$!dWrN7$EWwCPg3j}S_NG)e|d+$_VPE`wMjfmI}jg`QIg|UNOp!^!t%i;`>{Oz&z zcU)KLQZ|qaYV$SAjI?-5ru3~7tS!EX3Mkj`U;U?=9WcZ6y99*k@am@#=X`%f$EPF! z7%u!aB+3!P;{uU8#wS_?{WGPPhtcToJpn^}hwkd`rqd|4ht*yaT&=&?T82X(y=d0j^gzWrLm!UDW1iE_yF+6X zaeLU*D`7mRe$RaFYy#Mb716ZMM-BG`%?-yi41aYs%wt7E|4>Tl-1R`pP)mDf@Rq-~ z$%6TdD@a8~r@33Kpj}kBL$IXBe!tDS?Rb4u#zo&x3O_TPuotP z-hAC1{5j)ppg$s1dHBW4mvWzl3rINP=E4$y&Y)h?*!q;cRrU~)(yNW6zRBq-AE=rPNjEd!6U`?ENhUN3nr_Nt&x1=6}DgN{a)F-k^c~SxGDbnv4k2SV5g*QAu zax(u>dVN=t^yGJFGl{9$@@<}t(rapGw60t4Ya#>f8R6W@{1kDfvI(Ch>kg3ZmIh@n zF67}p+i3$|~o42p%N^YfW~KTV(9ns(fX zFq#O4;Spo_m@)6yOwI!Mtw8(@awai`_jGRJ<5ioL{Pv6eke_=(q!Ej-AU@psAMTZ3 zScGmWW(8y{t2}2pwA9QL#@DL8B^GD!&*(mR1VgA^?qy5>kFELlag@wDVFJW%M8`c2 zqtoYlzx>1^b)aJzJtl0SrnZGXMJn1>&(zr~aE+jwVbH7vasAOwcDjB;Nw>vz0C2muhy7y}<76}ZgTEk3?(tHY$;PrP+ z2^kp}%*lw-SWZ=P8;3SK<({;=fFd_YUqN8q`6#zXcP9iCz`b`9ERHb@-5#mEs z3!l|v4_%{H=C$b%oGMu66Tr8)JeA; z5Zt>qL%=2DFcGfJFLdB-C}tE*=XoM$q#^^XntlAi!!h!`&V}c{){S}+`jR2-4rr{N zA{0U|DJ_>y27u=M2|rl6t*vifsUn1jm47{g!x4YXZJ|?OQJDuOjMi?_U(0$f8It+t z54J{r`n-v@QV-MgNp@eTzXjJAY5MAsQDtHXi+nxO`v-covy-qZhI?&edvfm{m>v`q zLWXqF{rkse{%yY#o}^JXp;H1Lg9-T(RO?{N1%|;^^_(WpCQW4tkxZV@6WRQUlz4xA z^M2jw@g(nOni4hDkTO675OW;r_czBZTN%zp#Bc?W7UkU5kdKk@zj0x&HAhmetql4I z0$-hAlnOh$EYK*d^KL>Yc!_5eUtEHW)S}g&2~q?`BerrbeH;5b z*7N1d2d(e@hWZjsbDjt0aC8`{MGjf4_$=o@&D{VywOw|DN;J;$>TLV@#0lsg?e7=# z+Lth=9jM^Pe3Fcci}RHR8HMWg6JtJ{?l@nhPqMzO%hq(Y$Ya5+hDv35u;{uDspnz@ zMjl*X6Fe`+<+*gE{=*p4X1%=;i=}1FsY*JmMG(o@{J#ufKIlE%otG045FH2o4y}_p zTR-n{lsS3KQ6}-b^dChb(EnM9o$mY(qP@_q!(Sv}!<@F4XCDrlABsu7UfW6xcZNX@2A^%hus^uOqMHAJA22Mi$uE#0bb5`WqXET1e0)SaNCG@UYys2e8jm_8I^0+w71 zT=&wF(XNFe3K{!}?=XD4x6_+C1q#g>x56^5-4mheHy(Cc2Zmuk9k})W0diUJKh7N7 z7F!$WXhbw*>uo#4Yi{Y7HU$tIoZ5SFdQY>=C#(-|&~5*Qn(tc^kM)aq9=8x;4)wJ8 z<$?uKKx8R(?~{wopm~ojebZXI5O}80vj5q~A~o{>_urslyU) z=sHyg{4t`+=0(33nrWEHB$E9%;WTRkX_9?9W1x*81aF)p(eSza#W;T(s2F;ot=#oE z3{$GylkomA?1(qM<{~Y11(}McO4T9m!Hb_#z+Z)NQuwW2CRbMca?QS0YextBZil&v zg%79eH($t!%8$KAVM7KIVH`(%HRH}VRb@A`yNzVz0Fc+KGx*cQ2-43V2946t93+67Id?HIwzu zZC6OII|Zw{Bc)qCU0%!hg%L8__ZkC!N{@4y5hInFe3%{rf|ur>V349c%e>oy)W zAEEk4xH)_PM*Lc{rx0}Ro3sM(h}r^W4h}Iq$c68Y!L0O~wJkTO{I1@;K(nszY6gKT zXP%pj>0w#<)8Mz!Pj^8e|5FRYlfWXZ@KEVVkpQx6v z-9zW1I9DFTx~brCyw)19HmOS>rm&QQ@TM2p3unT3lPXpC#0%$Tnvn8Wl7K}-8v7v@9L@to+Zj?)6cFz!AQ^ad#J@-*gW1bPbpxQ_p zVHF<}H0F3M=TL=%<^11Q0~m!bcIqYweUm-$1Dtr{TzBsN^_A@uSCOBc zvq{Ni&!||5n%}}xd^rKkQ%H{1u?aX;)ifw>J)^Az6}wOQOVt^ikx{OA`3>kXoG;)$ zx<60e^JK<{DzkEF2!)j&Lz%!dAz#8cw|0lo2%+PS$CLFSjr&1|Z~!WUV}u{S$zbg< zfq9|yyhhJ3P#SEE63r=fgkP%fjKD>i-}}4f!lP_?Zqe1j?@meGlO+acR#!&|&Y06@ zV?D(1`yN|o5ZRBWyJtktA8d@_hXkyCNW7!g+1{Uqq0^0)Za;`km4BDG(Ar+L5v7kp z8FV3oNLHsn=}0y7qv;Ma-~f3d#CHdno~7boUa5kJ7*cII{5*w_H1^M@7QDB5pdNuz zq=Xu(2%-l*8`IdD&`aejg}X#5AIEDv+AJRjRrOjKv*G^pLnS2u9g|n>FIA;eHm5Pa zCez0jq{a!rR3u==mVr6*)cHEvMNyGE93zxu7%gaf9pB=y&56qv-+D6aaNvgH#5dHu zsljK~_&~@}xma_sTro!FMeJp&`MX4RBs(2wcF&IiBnb~fZKt=WA*F4giq=6!Lus*p zy1*fSmQal;q=y+hhu?>CD0`u5#`RcX<}wsTA;wLBW`Q9nFy-o5C!9M39?&$R8h$oq zbaDXT-n?qn81L3rhJTgQylrnlwbHJNU6Zqh7T-z zjL^&90+?d%!_f^}xf#v>Hs8-^x!`StS77$gj8=Y6b0{(m~P?~8U-*GSi7>oWwFARux^N1E(syyW>r4ml> z{{VA&wG5PbQK-xmb$`c+TF2qN1&v3kwQs>dH+dXnQl|5S8dy2H&Hq+v{BoedaRZsY z`Rj+Fcs*U`QRCExz8saubVNBF*QLdi|d}JBwXsIW5%t7Gf%z z$_#Lgn8kH|jHE(f$w8R_U=2!0wg1B@1{J!lse4ccsm<-@DP))@(?UPDRF$>HG*yt{?pR9L8Qr!RCWpIB@f!$Y{7Wiq{?lS~ zlqL$bZn?S_y(ZFJNpKS!gYUf-5|bOI?F~8-_AT&7`bD*aRTnryhCR~ zx8_x<>G<)3xiFKOh zXy5jGs1U$F7x=Oa!AotGLe?H)UX#R=_%9Mv)#m?5utO@6wUM{wWqJuNxYXFIZh-#j zYlN1u2ue~%UI0Y~g2~vE)M`YXX@i66lMXew3TP7MhaSXGUH8%37Y#mx-I8bEc{FGo zdjLD9{uLYTYr0|oPkTI(*--B}VTZz$_Df#m_|Dr>qJlq=@sgLkflUi*f+KWqXm0)! zz^*jXg7zY)rPl|uT-VE)+GEQ%olFTJlnwp*vdXS837$Lj#a7T8d{R3X@=^ff3L<7#ZQWhLC)ehdPWZ4U*3^i@Mi^)(2+%#uCb&?{ z|DfK`j|uDPl-dO`6)s6dJ%Wq|E#M4dg#df}*GiL2u(7656f|@L+@vdqv9oXF_c-tf zG|edkMcfakNg*1%Y#O_t2Q}MOV65BbAR_{gkxk8LR3s(~0u9YijZI}j`rtcB^!hl{ z!Rro2W3v!Si$!8=EP&)Lo51;pj7%k+ss_>t(#k0dnH?0# zQN8sCbUaK9G|)zx<+=Sf_-=C|^J{-i{=YtZmkHQ@*(EEQT5ZvQp5rJOSfuN|Uktn% z1I4HIT;$6RUACe7b(`{%$(pc9_vHdQfJ5e}2H_JzUw~MCrmY=D1wtllNG`f;OP_CU z1;zJInS)%N^x5W6nj23T5ZY3a2z4M#t^XLAvznkHEgV@Q0v(R1+4BXQDe6a$uY*(2@o2qCK7u0 zKlrrA+-!_cg1DvfPX`sH)2Fe^4Q1F8$hQNKa*o>1?_<$^$LsndxJ5;o#CH$@^!V$o z@4vu601A4=s15%`q*)}QM3tj{?~^PN45BAR&g5H+XACl)9?Q$*1eqR)H6@)knr8Lw zo&VFOO4bZl-}8?-gbJjJhCr$MJ+(jmA5R$FUD>`oCuXxv~Y!MVBZ{sXra9iz{i_?^EgoE?MLfS^x_((e87Ly;Hl5_}TX^7sb0Yve}7 z0w?x7DdLbnle_}QQX2m;VUSVdHL2jwaC)s@yM+pRb;tJ4EX|0(vTei^>OO`_2;3^6 zl2S$FRz1x7K+_=xCd})xqBcSu1o!ykT%T57FwFmRAkZnB)0kXWl;8O@a^>p+J2cjD z*cRoO_t_gc&aj@*u5SgDC{?0@Yy5g(TA>3E!-0yhM_4*@K=8q_LOr}6nT3;|e7l0C z1K(ffakR95pm2GP^2fPO6A#}j6UNZdb3SPcdcgUq1|t; z{1n|Gi1KW-fm#P7Xa;4P^%7*{uPw(0=m{*P@k9paJx%2=V)REI=@Qw(wV-~p&ytT( z*f;=%w+2;e&H=w11cx6Nm#V@Eu+`;(F6iQ%9+>uieQ|*(p%-B^G{(L;9F`4lpGZrK zX*+i^}V65q~~;?#vIQz2s=;cyF@`1*v{S78e2WEGSfSHWu}1g$W&3CH5ul0kR4A z(m^%7c~3}EhkQdBkJP+rTXQu)#%C!g_{WA}wxeIhlT2LSnA7Eq#~lZzUBknAdrO45 zEa>N8xfSb3>{kMoEjqf0bOmQ-t|w~ZDw$BmY_I+L-#*pI{eH+R77s&66^}{UK8J>I zw$}HTJ%VTQ>!S;YYiHIAzYTL0IH%NN2Uf$bYi+Q7=={U&>xR3g?>yKqU4>YQ7}!0) zGJtLfqcp0aB59Nwcw9BIo5gVQb)d6&#fAMPo!B=62ro)8#PGVCC8~%u&eA6#0Z~>B zdft;J^>Nz)CE?{XA+4XMYTtfg;9bkCUi>SP`rQ5j${4L8o)6@?4Ii73KJi~)=QvxK z#2y;E_ktpEsi~k7L?(YX{l+YFf|F0(% zE)NFb3NM!eUjCu+RuA@g?Sri@@mSx8=XX8SHa9(7xHH^2`l11rM#!+9I;GnnL&!Fw zS9Z>0dsaGWqFM_5)WU)bzbY=evMFBqm)=vZ3)Fj^$4vT0t6-9YZrQ18i1zfPVCk6c zrTm2>G7mHC&S}jeK&3U`F(X``9Ow%FwMI`8$P>@qYDWrCu)yFm9s;A7%@Gh2IL{V& zSL+7nlL;m~9&BjnH>~#nV3H8jSNgdj{A^SW5X7bJ9MFLI*TG~zZ|Q>#pk7~@$i=Ub za-ru^cz>7}ri^IPq-lj|*{f*+$$@a*4TAcyut+C-QwY~Wl>+xI01k3Q!Po08Y%G7D zzb~FePCePFuT6Zk#-LcZk7?t2w@~x7Fi&H{kn8Gm54NEZk!=KN#*+lfgwF0BEGaX%+26uQ-Q7htoaIaa)DUIEW4ZUvV2gv@05L&b z>OOUCb{za`>Lc&NvFL0AwTjSRLxYg$i8#L08{Y)H>whd2=<2(CjarE)2*W?>sPDSd z9S8i=tIAxlq?jb&CXXGgL(IeW(H3w-0^|2%OMg)&dwE6GahavExlmwM8UU5Ve`T*} zRu6GP5AF)Nl+$>u=>$SIL~D2?OeKT0Q6M}+2H)vNt(=a53@Brf*X{x{jk5;50jw@b z00{HS9{9CFmeseP?U^ z8}@xF#J6*l1?fDcC&5vV?biVJ+=^&-1N1XI!_Xqb6jfE)EqNjZ-K02>)QwPOQ+bri z`wpl}_&o)WbH1eb(QieO(8U9iac<1P9l~xWP@#2BjwlIcIwsbJIZ7VzZ}$-&f-dD4 z=&RZDAu!!H*1zdJ2Dk$FwEs&Y?g1_J&y+`6e!pDZ{bKWqDz@p)67LjMDzB2SdlOHp=&Q9Vzq9r+0dJr~ zA38C>{GR~f$3cO^thLS9dd#eNPft%+d#~F-d2Xorxs$(zcm>@aV36S6?U%D>2^txG zN=(Gyc=m0p!D_hH^~(i;P0R9c2h6yqXmnZrMqU0}SN3GzxxezR%4FB&o2eBWe160< zU$HzW&i%ADKYRJfW48rIv4c-f9C}*3%gY1CR`!vna0T+Ls|7(!zUtWsF(K4!e+Ppz zt=Y-UvzhjREh4?`d^%<}B6W7+TP_{m_=Igi^44xm1vL1~=9xTJSR5Duu2XDZi_S8d zaou|U8*b|hbxunA_fuzFp`L|7#5@XPBA!o@ODqW6z)W3W#$>n6<|3UHe@-lZzxVDz z`~7&)rNI)Rot*-?nlahydSg$$W(vbXnktu%($shiV1oB%NXf4g$M0vUm)*km)a2B`mo+Ti~dck z|IFO#S*V#UckH<%kEQ#oCUH2esTI+6W|={iNcsomak$kse`F|ohlAsv+P;H z1c(0lsc2ItN*qhscTm^<+FYs`{oSA&ZZXXlrg!3*2EMJuHeI0~>nBSt>2;olf*1o8 z?ncPxxA0%Pc2ZOn9eCGgQq5~Wh*vaF^Dg%Y3YW-7Jh83N2|0yhubpkpkVys}C_1WQMz}J#!q_h8b&p z2VpXwZ8tA8b2c5j#KCJIvn9`xv06ngLPgEMYp5<8?d??-y|W$*GbCH6hN~VV(eRNd zcfL6-kz%w0n2 z$a&xC5;p=McwJ4MgtmGchTf}F_b!O`!j%XEF7Trlwx*bZ-+USaHzRoH5u?L};Src; zWJe@y^HXce9OCM(A7K*2DbFH(4#k8#i#*G?kybVkdxSgokl=r zd>DVb`nei$`pZ0TI^;{6m=v0eLQo=pGDG?M7$Mj4k|y+9Y0#&XGO2C zz4HimyAf1fn|tm={rYs_1OPr(-!i;_W-d+h+FP+2Dui6A4_;$^q|HSZIe=G6!F2~W zesjMTz{ceKb%&iuus=|~bPVA9wnK#n^t*E&y32cgS>LB@G$p0!ipdy@M*i85?QAZ~ zm}r-F6cnfkIj)-PIJ{sW#;SNV%bS6N!wluF9e-+=CXxSHDAEM( zkcMopmaJ|Pvuhq$;uC}3T?Q|RU%g7vUx5Qsq+EyD6G$;De(KMWYA~_)d(w+|S|_o9 ztm7pe{oAg+A8qi4FY7 zte9rQxyOu-BBjYAkD{$2l{2WEx2UPLw7Pb-I=^m9Y&Gm_%@m=`f~4|~ z;dhPiACx~vRlIZpB3-K+0zXzaaP~san{q%Ecb|0d2;brzzuwTr(lZ%1QW!m`i+)}L zca6$FMgO>3q*BcHvh7KTEoGccGC7=v$Lu!Wfu^(m=(auM8nuJ+VdW^N^lX3a20pR9+@sB|4dF!UiOuk49JMp8)qo< z&bxqH0~2OG+-nxFtz0ebPrS=}&2$VseRATl7 zQ-TYa?9AeKb#oikg~1E?)7DUK3(9=|@_Qj7gVec+wbk++hwGKThT|WSEat-|=Eya& z!Gc}N-U$ARqCbx3V{&$eQW2tCO~#uQ&I0s4A$jkFA|nIs?Vw1GOkYb&Bt+<-PzU5Y zLZ#_M>;&vB3y$S&y?gi0uFj!{GI?7+*|hBiCVuyb3n3=ERZt=9de zvp4%WXN!sXOZ$$p*KSG3`0YNpk>>2Qb1z5a<5+LyTtjzOOy|cR@1)tSRcSE1cp-SP z1RuVr!~L#8CtNWe(y^aM0lnrbd_*Y3R(q$t@B54#^;%rbp`F8*all3ELyAe0uhmfT z1OD$s+S=0EpcixBVQ}gdtL)92g4gF?F3i>R<_Z=rG)8Z>w*;Q0a$WnrKCsHVGt^vVkf5bV6f3k#?_b5ab(j@$05z4u6w0vX_+Wgf%Q}= zik^PAUW?5E6r?qcVxy;d()q>XBBMZR()p|-UUG?&fr9;(I{P22{CI`^w)ll3Ylu#> zfzvr7x53e<9G#dz2J&5xx^`*3S8Z^hd)6|D{_Qk-BoIYt{>e%sPB`;RC z9&Ub@-Mj@~0rx=VO!=$h*OccN7Evb36fQa?%tP01tnHm6z_uKM)4=ST@F^=GZ<+z3oT_D**z+_sw&LbyJ7bVX(b_C!3TH39L~$B-$!Y+( z7zLwKZv>a{qx(U`YPvn4g7uQe8HD7sIy(xC9&hILZck;e^!WEK>bsG*+6vHP$}hDS zz?YL@3~^UZgwiWNV@*z4+eu}GmCo)jPdVXsiU`@%;LiutQTrbdn(-v~)#WN`dL>fv zi8bov9cn0J;%kOmhPjZ~SiJ8zHv>)CMwuV8*OjMDJ5zBV#&Qx~_TxcEHTo83w?pX#cim#w%3RhhC$%u`b0y(nHoxl>Y zR=vDfyi`>4ZoT(1Pi2?!m0$s9Fq`|IlYg$tvR-F_z>nEu#~B1@dY9jT(?ygXYitH* z4sYB1#T+hOUwF+VY=cYx6l||``T8Q0k7O9+yuMvCR_dh<;Dh`uJ{4MS^==M)Z8~EW z3%4Y@b{d!le4JWZBLH>-Lgi>2b=5XV-Q+7X6g;$-!Tp zdb-o!A5)yMUHJ9oyNsoR8wQ~b+S=?t_Uq5Yt0tuBv2MMvzCKM%x$HBq(LiBVFSV#B z>Fbw6V{l9U*7pYIY^pWKONBFTHn(M42ERQMSuU5~Yz`5l(v^rdG5VSGvgwd{XW`iG zS94=zdJpyMOThBLjSolG%xNWx-t{RJ?U}E<@17Q~z-?^hKtV1BjkSShf@?#x?UB>| z@Mz-foIpLpae5&-SyAh!6}?#&#igr}FxzfGlm)hECQ-J?p&(FO6p-$>%uf0*LFxTX=?r2(Ix+QMhCL-_O`IlsT^94yCXhFZv zQk=>&s|!32GL${Fo}xJ~w{G2%&19N}VO>f^wXgH>^STZWVC>ii7K;bb>sz;19Kw^u z0)(OyMK=2~Ry!dEP}um>#6(92dWv>s7E6&{Yz=t*Fvm~Gh23`OhpOYEScs1`E$M)Y zdWzuj?t<&<>&iPB5JFs$^zkW4DJo*%<}PUx#HUr)`Cj;D$rmb0Ct}6P0OfO+Uer~= z0Ac7*;&k5CRgrakVq;@NYr-$lVr_nC==THSRm$Z)QVDm}h_JUUV(O087t}ZB;ljUW z#c|Js_|DKZkY(!}dIQ&c)cRV_x(=r8pVbgU%f zj^M#l4~lK(xeY#I%%cG#dONYCM=QD6&|)rSY;`q6jG<_!D8#+ac|4WN(%`{@gTBrYeO`LDSsQasPiz8C6jD{ zfe5jUCTDn}UwAUm|JP^>^Y{@Ugyp_|ABh>9=5QFhH^`g(TpGd+VjYJG%YhU1f~84p z-#2#pj5qt7vxIG?p9Bd->(;>B`(&|2yIt?W`iu2F_LjsdIC9O+o|yhBV0js=W#Nrj zx!08BYChk6$0kS2kx`S@3~%J2O((en49%-L?uhl$LxFXq%-tmA*b;v+=Szi~Yta$on`z$HwCV$or#jd=C#b&jYR|bl zekwciX5mSn;2a9{4+TX5L}l5}nfZ**y7w;;bLAI`DJD&O_{OhmncwEKPpfmj5%nzg ztfgh-$ABv()mB`WOXs-+)!kE!j&MOZ6X&a(ww;C}y~4WMO`7g6;TG&%znPKz!X&?c z$;>^N+RiDB27>pZ#2GT2qI{xXgi^5gb{C;TdPR_vok-z=Lsn6r{_pi~j?+D%4k_4) zjp;6xvLf?Nh}Ss5(^e5t%fFv*41IxU@|goQl?bics;=9<-vtG4pxDQMbWZ5-_qm8d zwq$$NR<^`;i(hzPn%d0szP~!zpOYOoH*2JV-SvZ^v(?QYFi>vfo><}h z&>AWP0ahbVgT-GjWT9?jJ*}aU@?F&u!py5f${(tHV?G!?xSG@Pn^i7yV{7PytVW}p zTYGz{%{JHgOS7EIY@3Fz^O^Oi`gaoH6w~BBLhmf>1O-H^ssjA<8|2Aw7x`YQp*4G^ zu?EFscD5OT0A8aF?S+;wp~pA0J=Ij)4))(7c}zGt#|h2S7NKL z<|=0#p$AiFv5rHY)h8OIzqP_nhOD=htk#DFdsILN#=xkn{&909MR{~H8%1?A+%s}0 zmajQ$miFVxbYa!&ZmTHxl{F}vz3;DOn0f;IgK`desAl#r=lB4=C~HNMny|K}W}nec zzSCCjs#otSzcnqlk2~rpx;Sh03>n;n>?!h*<`YB|A$X^jgv@NFbq_8GzvwWkt4E3uniw z)VS#Ew<9Yhu9fADaQ=~4Mmgtp^;g6AAM#f-R^2#MU%!_s zBN#q)$C)VaJb`b`RhDx(Wb7r6sP!I3*OR#I;*AM(%S(il)uFgQi7_Fm>l%?lkt)_WR=rozDPJHjAl~zH957-AeS! zb=51^xp17}nt_ad?nE#VVLh>GItuU#%(uvnTm zhGLsk;*0m3XU6-k6_P#t_~}Zi%R(b6RoZj`v>#gEFn9C zbJhoVs>{p8bsV@KT*87&LhLo6Qy7&A3koZOlph&75%yh%V zsZs5C{+t)!A_VpaN6jJSVUMotPdDix|J=xR1AN#Fi_vm(<2>%II~f2IA~w^K@OKol zfg#>^OAhIFPuD|s*(&Mf*Wk9iXtCO$DyYB0GZQ8zfNRauenl zlomlb7dKOM@frL29|3}#sWuI-hRJ-6N=22WG^Q6Svkf%O&7rT`eZH`QI2@|rKtu+{X`@%@8wMW5X zBv=7rh1IMK2&+^JL>Og7_)b$Z26#t@eD*TT=(oK`D`*GxA_sVy!iu3+I?*VzizBaM z5;&Um%8K@yB%u;)r!Irh#nL|jOpesuFYR||iI#bJNs#jzoYdq+Q!iy~NV(Fg5-(Yd zz5bNV^#IAy-cto>@6YEnV8jv7dM!3&y#h7T0;IdQNN)G!5Koy`#mz3eS!Lv1Llf{6 zQwe9#;0s_5&P?zh|316^QYk|yYqFCAI<0Z3yH}*R*bR@ZWv?%)iYzQTez;3j{oGU~ z^QV?wV(%*}m|fdImVca|<_<*3RgsCQDolE_g4;oBl^A7w0;yiECSVq&e#VqW=Hn4H(M zl(P%SYhWwwG8Tk1|DhcZ11Y!T7cKUlUB(oBY-gG-o z%M&fUns;2B=?W~BT~X=F0%Q=EkiQC}AmErAWH7KH0!}4bP&UfAPGi5*y1w&ebX%$Ej5sySm|7>ZhhS3tQKCjK zEiIo8v@?E0C$hT911aoL_cCT)$G-6b#ViNBoDu<=unF;<^oe z@M63e^vfGaQN+<4J%ZxX-3M=Ckxd0c)c2hkJ3FF~Y_H&m@)LlNC8VTY-B`WaaUUAH zC=lfrS%NQ2ih;rbNQrysh)<^hv*3zsmhlJ8E| z1*h0pDEnRLsY!zKOE+w;1dXXb;Q|>1D3|hEEFY_2{#l@L*P%W4#qESMg=+^EiC?v6 zYq!Rc-2TGjdzY;?*s7oH|E}-Y@Kq1vkp$#PzJo>+KGrfL;N~ry7 z@pdh7{h7NZhJ4(W!;Fp3%=Q=0Nr-Jq0Og<}!x;~!)!o`VUtgjTwc?ia*NyAxaJ6vEfHe0X)fR_* z%qr@p#WjFk;0eypYB!;Yt^~JdYTr&!Zd}Q5o@OjB4RTOqV*RV+(@O~^ z2Hrg>%PBL6=R%7Ul($r1_v9DpF%SkXcp~A#8(9DLJ@d(ck~+@_Zat`z%4(% zst5oDTVO{8+h@a-S)^i(Igev~Yn}|~qTD?g%swfWz6|c{OrN<;Vxi-y%E1BPD^eBt;F&u*f>Q$Fjw)hpFfh<|+32+kj6=q-u9sMOEnZ zKYJWB7*N++V5Hd>EnTQ8#CUFJ@>AxmEP|W*`|(NsVRG>e7C(Y!J~Tt+0zp-C4gl?D zHc>RxwJ@_AXlpT2sg!b+I%nH>vL_E__;vkwPaQQ_s`E?nT$2|p8~X71^{c1JU_vUR zgapfg^Y-fyFkI&EedEDO*VEg~OnYo!H;erdv^)vfFj$uw{#?XgHF?F3XjB#D+K{Gz zQ9&|vCyI%3gFMme1zD?PW-Aw6dSOEZgZ{oX8D%YqB@TT*bdMk5(2ebAMrVlxjV!o; zftOZHoJKW((iQ;6`nj$2wu{g&;PPP?Wte2Cl&RH#@StKz$niH^tuKd=D?pHoh|RJj zYqh_&dHDu$x(}SnK46sxKx6~#7jSNw*dK0-3Eh(&$3}Hr{(4ml&;rv|zS}z2L9cAg zPKHHs2qEhuIss0&bN4rdeQgDuF2Q@{1(fwh?!GD{bjj}>k;^q8pvgHHj8_x=IRzHQTweJp94SvMlN(n|0 zq^RC}V|fKe68y6~%{@*o?hxN>_}~hy7udI+o*o24oNM3Y3B={McO(#3R`!-z?G=mk z!uRCQ9sfPRUl6cAayCZp*|k$x){NWE8hM#FeJ3DZeyDH!Gi3O~_{^rgGK|#luck9? zeI7Vt9U3VH^>lshh{0f7)?(xjBZpSGBZFnZVhT0?#Ccy^u67i$EYW7!SB4;{&E}CS zw1cWK%*3?jbMu@;vIEqN;#8D#;y93uHfK*a0EgjyerSJV%QLj#p;nkc z9@)q(4ZP$Ntk_iiLv&tgAXt#23KTMkxj849K+}e*q(UQuAizW(>x((=T-WojXtiqmEBk4NTFhJ9j74HHr+BwXPR9b&8YADpv% zl(I7m{ai4UnawfUcN#FX62qz353NkY_cVRYdGsELhGSXgjdW+L=E!dO+>0W_oyp^Y>W5yz)OhP*{HFxyvqF>LNj@sTegaK;roIQU;I z7a9h~$FEM^eFVEQ&~_t7E&0Fv&hmKp!utwT59r#KmkdTG{X@6I=6$Tbuu}J;D^{n7 z2o@c$5Fz(j2C~xiRR2bfxXi_$gNlHFQJ5T^dgc zfk@{ZcIVa&`LPN;E%O-k2~FLz9X(1#Ju?EU_QJNys8T~WUeR;;fCyNAEcZs(PrK_F zu0-g$6(lpnRfL`+5ZcZVi)Z)ZSZy+-WxrARrnqyFhcs5kER*DcX ziw9i&dBpW1E;C&(8%;ZI>Mq=JD*Bo>)zu8+Nx-L53cg$N8~LnA?y6u?T_iS2TJi%r zu7bz{Xzx}5VJ1Ux-0;ALYkzP%mJ6P_0q*8=WEM>lloP+hm=XXs*7lAiQVmG-#!e>ie1ra2#?5v4bT_`$vx z%qV2?1uTCYJhv}5qYQu+M2Abz~-1dSpO>U78 zVOv!D4b8$?N^P;=L}lJ-fRp&U6XJyM5jl+GXV)h{LAc(zzYs18hzcx# z$(L9t@y{bJb}MGC>EvFvA3gmIU5ScwJjTG}xE)1TR`kE}owkNwE$e@L>a* z(f3|De5q^+_|Z&=4KOy7#h9`?`wQfHWKe+o5U^3`dsCDAW|hW9hTYG}c0gs1R6Xb^ zg$YT3XJy;-w4N?l_A;fDBxZ1r&wYA;4JMZ8_tMq7p}hzKxrsvvq|;7XU@5^_|`laJQfxG z<`$6ZDMiPC6u9FP=;uuj@2HZ;j0Dh6`KB+>5Kb?hZ%ReZwnrHprT(dY4=5W*mBH zxw#u-EphCv0aLFP;*a4E)b{|kP!~L*9>t-COvr&^y_0BYPS)4{CK7r(Ue9#{tT@BSo{r ztFvxmbZd^+txwjMv?M_l2!>_pwwe;xd{Gk4TtWhODYnB81HQ>2?^gN|vrr*OM$VpO z90JKh(zyGGUjtOAeG`dVR#>I1t>qBLte80t?wlk@xe^?i9>}fluqFm-^<_>%BQp;u z2@avgI_@PZ0wmQxa||XC=fC2I(neT%B2dm9Y9PV*{gZTEl(97l>CWDR(*gOQZ#K+e zRt%ga5w{28&26s~aG*(i(ED~B>OJ1XzQ?hr{`nqMxT6!q{PUkFnI_P*7Cs8`i!EYwk_H=se3p5R;%@| zQ$oufpx?n3v$KdsRem*+lWlLn#v_Fpn&cfB`}V?f8*z$70vpWcmvUMOW4lb*v9li$iPY@;&>^a?;) zT$pJ#;h|b9#Le2$rzv|hdAI5@P5<~TWGt1TJ^~Php#+7exK4|yN=MZ^)SLGloRKnJ zEJEF9_CN9t+-nfJ`XOkNMBFIPW=nZ69w=qQs3IT61Km=WfE_!5&4 zQ9Z+(OJwrIUKvh}n&4+5=KgLw%~N@_D#hNKPcd=cf*6}RPuY`P_-7LSOvS$d~i2Xt10mIe=>2$ zW(u6^s*LAph~%%pgG_Kf%LAvBA47b4o$4G0wq_hO! zs>+(Hf>nrurr_X#`EeY)e(wp@MZkW=FB+f=AC7S8v8p?O|o*yY0$+K^wjZZ1f!R2(ME6Sq^Cu^A`d@5lGe{ja?cVNG4X;x5g}-R z92y2j7$rdV9<~w?%{#lI>GzKkGYB?_W(@*Y%?4Ljdo4S-14rD^5+$9Z;!J_1<2*$z z4PsP#EyXxQoHp(97lLLyL0Wlo+*Lk>gdpgb9#I12T^AG;O$VvqtM{imj6^49N1KXZ<{jQVnziiNI0thcM@~X6QD0t^4 zf1RqsWv8Xb&TQ9L*6Mgu+*O_^ah4K`uYj+D$%&OfBN0Luz4{YiQGP*QlpL^z6>&C? zSgC++^rm)O;){9(lO&;{T^1t?KGQ^5nYxIL*oD*rj?MfpO03_Zo@V<6p`Fx+dqbBM z=5Ffg(@$XHD_0aYw~4Ws=mzaU*xh)NYFuf11EKJB_uJ~9u~yv(`fyj~*@4gkh-S|w zMl)%3m%c=b!ED>r06gjF7;kQ;p<8@MjG3H!e@6|YXS4OVvEV#kA?tL_X^Vf``u=^I zS9eUDoS^X_#-o;_3KfCSt_lm)7J2@sP}JokATi_PgrZ=FsehxGIz2U#@qgqAv$O8O z=Nh=ybh;w337^bv3>EB3k`AEaS3iVZS!&~UbFEy~qu$E!2^6KBfd*!SlkI88SO*l5 zs~cqa;HqE`ITosJnBm^Yq?&zvl=c4-^d9m2DdP5{3+-= zz#0(B8bVojD4zKxH@mwe>#pG?Ea^9e@bd*N-(qQBXx80+8yIVW67Qz5OcT!;c^cc5)a?({ci42LEPfU3(+l9=cyb_gNjD9AmHLL%_R0Ce zWPaLYyAqZQ@8`HXj4dtE=gD}lfV>nnL?C%FRY_F#Xk-!z-Zz=}g_Nr+aD7N$`dRl{ zP>A!BPfr|9A7-8;!6)YMw0HmG@IFfF4b6)0x2e~&|6|g+*{M3JXZ$4iP|QU94^CWM95Xn5Z6a`IjX{8P zYg_$;f|xKdc3j8Vj6;}+hR93uBD-2pZ7qf?%eBxJ5hil|Hgqp>k_590_q$;!@Svup zzmRf!Nn_hOe||i^OtrYNt-ZYhSbqvW5A*Kbu+2-!Qqj@J=qi%M)P1}%wkG$B=&=~K zSHtE%rbw@f?U}%xso}3hl!bGpv~%%0 z+mD&#ir+8VZ!}Dt879)?SqfYu#sqA()Xy;HH`df*0)Gqh3&VT&9yz1n7FX?hj?7d_ ztPj7uvXV-PqW}*IYBp>VgMu)L{;qbtbQLeyoL$23$GWRA@7LD2=WLx!6Oe=egkNKlz(QPC&(VY1AktdJng)19Ri zWJFFQQSV}sDtM%2VO%ZlmL4^PwYWHXag++Tmzs7=BO2U`HZ->RYGJg>U$;eSTl~&H z#w1&voG%JPM@HtYWqy^0sYyK`W#tc*ss@hAUnt3oC~5zKeC+_I-SRTXZ}edGw_Eq? z(o?yyJ{7f`jyF*c?g{XX)Nb^Ui5GZztxc0L#j=JtjSkgqPu2~TiLF%}YMK3=Ho#St zh(?X@je(I_LO?*b`C2w-=YJ*gJ=h@aFTK6hz$4<$&h8o+OtO5)h#P)#HZkcscQDX$ zXcLZiu<^uZ_*kacxVY%`l_ZTKxc|`VZ2gT_q@pwz{#x>Ja?w&#uNusG{g`KF{i5{% zX{~>VSxE$$aQnY@R?dO6rk`eV1?b0VmzhbQO)698tFH&w&-+wF7w!v#I93ik2Lsxq zVhR1M1OJ)7;u_bHXtNo;vshHJy88XfsW|~!T96?cH3bF92SWTrnE6RQ{^h|QsR>wy z?AeGO6Hs^WA%(Lqqy&mK2Qa#}+G!h`1DrS6#kfI0uwJ+%O_yAPv^FLy1gBOR4&wmns#_JU4J@jKHW4DJ5*T3Uj? z|D)NGu$JRykKv^8N*Xs7T)8om@V&?M-G6R3@z=%gOu|&IZ#n z>Hix{&xRuaoV`(I*9Eut@+G$9pLg=ac5E%S)-xU@^xxrYX$4lFQ%KH29N=v7>$!H~ zXj5-TrTXSFH;41S`-h7jdTJsNuI?;6z(uZ0EUq>M{i0;reT^ECRPsI!Ia4Qt3*#1S zcmH%Iivf#Co}1INIdC*1jIaQTq7gTaAe=d#YO8Wka)*v2xuO`Yj*T3pCJuQGODZ91uNGoVo3m$u}v)& zkgUSS)ohiY=6}bTJ$dmoLuHO}XK?3ijUV;lrW$C|fJv$*w^ah+XzcH0`N6jqK6)aV zKR9z`pOgY8WQ~d`mXQ31+SoX{5=BpZD}nA%*GvzIzYwu(2ATh#<;XFG19BQB00H5J zx^*JkQ#-3>gX>GQ(Tv5ECJBl9kV1-caz=8lIokcgL2&){ry!!)M5nEOWnWLRY-(~^j|sat+>vGpoP*?uwl>A%WI&wv;F05mjC}HL697eQ(-MItgeO;lvR0@4vCBMo(1gT*_!t+@@&;`78QOq^QEv5;rf{U z3w--2h&nd&a{wV z0#9|%SgcG9O&-N1Kgn(WRp;Qgly^)kum|7Q(KCm>tW@b@Qujw>oj^4Hs%5o%c??_P zxjxN(SVsB5DGG|Y$Ifeyxx}0==eU+V(a@*^)m9!|u>~>2B)?6m1jWQn9>(>q4e$q~ zY?jZw+9#no4G_lN-sQX!M%r4t46!!nUrC~HsSf7|fANzQ6{bXW44V2B-(h)kp>U;u zdeFaUQ`hFO>=(cVbX?!sOOW|PEJ5AbJDp$%;RHR~(n#RXG4lzoSq*73ve`p zTffT*3w7!kOp?OiaTp%wp4(ig)7PIp)dGeVI+!o6!7u=^4Jqe9kH&cE zw)(FqTowKs-3XYlTMmdJ?gKg2bZo#rG3TEZ9Nz&{Y+ zc{MEVH&IsyAi(*JUBgr=;++~%vB{rdNRoT&gUuc2WR&wngM;vol%H@hkYW@RTUrFD z_=mMyxfZOulI?T;!qpl?k-g_AkF0Sq#o~sfCJ~Ks04;6%A-sF;@}w$Q&5M(jzKCW8 z+{jLb#a4jT5jROlNCLeUXPcz1#SUPBQFYUaWdPzpsBk}1oA9{Qf6sR{zd(}cA_yV! z)BfPg0)GuhVLetUfB*j39FlWoL-8PD|F8ve(Hs%qx-YZgcwn_a0qp+?3c{N+ZX(V$(8?!gy(C2zCXErF$18Ou{LFt)QRU~8 z;?_R}&aaW2pm?z8(bmyXU5j)=nD{r$d>n1{YW(C;&F_x${f7S+Iq{%(QuQ37)g*Y$ z&JIpRqMtc)U591?)QaYOr^?pq&*F^#Tt=G1K*`_MOF(_WHy@6=VR^1@z@08GP0=5^%W8Q(5)?^X-Z7Z0XZhX52m zmTLvoTY;{6@eo&<-oWHI-ajfl0Y?7=-}ehF-4Ge8X^tH%rjL!f&OHB z@5T*kNt3|d?cW~4ea*_q0h8$Yg_fiGcKp=iN0>}qWEDd2GnSUfPh0(5@iaslR3|>( z2tH1ZW$W7)dQ9B4cUzAom%g_I_uhIW%Kty6TBM#Old7K(7CD0N>+I?PUs_TrUX-de zI0&#w^M9(j;1l59aS4x5kzh*=20U8%(0=0F1ubjqO9%oY!G*-$>W#5U6yqz}dpQOR z@{-*4Ph9a9sh1B($$dbdXRZ?v05!C#9Qjt4g^6$!&*mP2%Pd(6XR?@~&a=2PUMZ3` zq~dG|NeM_l6BiGUU_@AI7hHcT?X z4)I1T1d89zK^VyS!_U+jAme=ck9IGP>%Eo#L4BCEG|BN;W*a2SO2#IFF~@#7Y&#GX ziO8QlGoqn93D>|SJb_5g#oY-i72`5BmDtwVS%)xSY$fO*sMF${LwrhFH~f)n^`3>? z{|1`tK$^FE3guB#1A>9G+a6j2N=f2f?n$!t^VHN3REb>VaW;Rno9*#QL}@$$og z8E*X}8cTVCA|=%jti*PXQ|}XT3}<}Lj6jt6ijDY`jD}yr)i52llYuHHu%@!=YCG5jTLL)RII~gz+5^zv&0%%OMkK!| z2)O%t*Zk(yfUf)bedx8whVx@d8H>_%7(J0A9Fv*Mw(w={}Kn4h*X8bL0vb zM)&r@55as;KhqpjBD(GtJ&s-J*(bR~)#u;n9-=V*d`e0`o==XPBcBICZv0zeu#z&( zlg8Zeo^4H=Oo$)kj#RNAv5g4|?*dl`UOQb_K(`eR5Kr0#xDvsN4CdZLqYUWy_D!5W z2vwQZix*&ep+jhGV350qe{>o*M)S~1^83K^!AkSb!^2&F!F<*z7>!yS*8bwm)vBPO zy=5RchGlGQ*DYpVErH>{vlaa6vW4jpL{j8C3Eo^uqZ5>9^_9Q63R0#&f&?2qUt9P~ z^z&q>922v}no6sor@277qzzUU+c|~Qb?Q`!lby#AOkA`pXNeg=Of$qe_e{6#lg4J??gNUmhzY=_;os((hXJx(d}`RSehFLapsX>->OM>6 z?mo(jEO4kzTueB#1B%CQeJ6Ok$9ijU#d8n$BQH$gd2oj-DDD=*1HK953jhpSm|9$` z)d&Rb)BG(6*nTA{s>>BS*E?wp@DoZ^ndx+zEWO&;yjViAVOm|j+H-mKmo)z1w z?(8ptd#`r~6nBQ`GUi&|v94@$0MD4e*@1jP*Ls&DlC0;87t=dWU_S#sEj^iE;RaYUAY@aOjlkADhM?k4|X z0} zbJhR1|5hv-=IFtGCwKP?n%-1>uU9MpF;Wl&{^5OTUf|j}ySOjno3}A z&9*0RA+5La&m(MfOA9h~7%sW3mt`Qr_HimuLC%k2rpIRLUtpKP-`3;+|;m9rpZ!RT2H4t`~p&$>&9UIph z^D{bwfB#~0+tAp=zI6ZEG`9Qt@GcM{oHjHQ1kY#o7)OBM}n;l zQ+L3oGrn|j9U#SeBbi|zSW}JuN{hBh$qG;3+;rEkZr2|vzaMauJ4N7MLJJ=skhQRX zXa-TmE)WR+6n_0}V!QG8Nod6mLN}xfZrrRI;ia+)x4Q^9ZfI5T7iRR6)il@~51SMa4PecjG^vws;1a2ztqKd2J#et#LIz4@ilZ1*|1>&dFsHkJ* z2i_VveXaTd5m`$se|W293#2RVJwQcvG0=IoV0AMMLbFiUxT{)YEzkaQ|2^p-oc!%} z|9K6}wQ74?eRBG_0Ch}=e-R1+BUD7d5T$}7g6h#&=u=$=(iw(z@=g+CK8+kfaOxQo z9~qEjg!L}2MboCF=7YDszxRt!-3faKqoTQ*kep12;C(03EQS;MxiIhH$?zMx<=1$d z5kP*g$xA{Rf~qRlBCO9M@DKod^2&^jwpmtrEoN9+b$tJ&=b)@vfP|cbh|{yBmB7fb z2KUu%@;aa%XCH+9sg#;JUOvFubFG^w`vwlbjn@W-AN-(8knfrL8Q;0D!red%$>o(d zt9?muYj*EB2S3_~Jd>IS%>Ss-`~K|{#7&+FukUF5#L9V# zAdLZT-1GKqa!f?#0r_|44Rwq@vf{m zdxxo-60kU=^*PAlr+Gd&XnGraI|z<6DF3LH@B_cwz?P<9%a_oZJIg8_oYCLcM+=(U zdgiZP-G6Pl&TW$8VT*kyF$riGD`(4*pMIi|I}r>aY4tZqJ(u%wwIkWS6(kBebnZg< zLU}zkCgPRK^M(va&RCRnR=5++PtH{cs~hgW6oV=z*lQ&57wl-rbmd*JkJ?^dxAWJF zOLkxUgrgW|OgV@U#bO#(fek}ZDL4>#ab|+u#)3ol6S;qUNlAe`oig~hdk^j%Y-MlL z2DbW4HY>}(ZH9>@ew6Lx)TE;N3~(}Eif+@r9qdB6cnS(122m7}zLZle0HR^R-+mw& zKlc@RS#iI5S z;jKLa$Y6p&XYc?AOZM^d6&w?rHlIl;1#-h_fYOjC0=5hBwt zQq<$#JPm1!ed3&e?aLh|XD8zPM^W)H0ABED1|yqf#Gh}E;+TXTGC|aDeP8|Gj42ja zm^Q)$KVUf6P>ckf^TeBHV#s(#TR}E&lp2yo=6C;3W)#~28KDDyVXn=U1h!Jv)OwYr zanvH*!iM1jgarM40PAyK2i9TkR7P40>V{HAhZ)5p5YJWZjn2c?%TIe(*$=sk#8j8 zY3n$Fr;h>x%*s5H18bmSvvhdGOX((kx^l}kA^|mO4p}haO{Edu@Z)yMx*+ekX4YC{n>2eY^iWl{w0>F~pO8*S+1LA-~ z4eeqS6dJ~8wuo@i3W{3@XpaBsob2w?W4(OZwW8FXT|78gdi6&N!8+VMer?%WbLM@FnbMM!n(2p8z-M9oiPto40IGb|ewnsq{F3njG~^ zWhJoppGXz()$v^RaC{gS_g|I)D|9L02em>OD08scM?XU~l%<}QK9`1Q#i`-H?vQ1h}-0JNTQpuzsr3wPk?)u4%={09(-wr|Iswv*7eVNus(=WSk&n&;x89uD3>r?sFY`XrL&MT; zr}?U3c;+0tr$PWSd<@s^K7xfNE@_9{#n;TtTKfKnnl0*Kk0{o+pB!QD7>aRmhc z7yRpSc3VV_p=L(5(w`sZlrblLrECW3O6QG78#EYH8Y@j5j6`7r2jEa zxxiy27>(nrZ0EiE(kGHlo!;N29p)nFbt^*^!13 zTLN}SKpS03BK#FW=ciW*d=RmtA*2EE;;|^OIqE`iRr^ku?z{?7+kZC=iQcU~TwELg z2#zxAhZ-1Jf%K3~k9)AqCj4gLy%0HS?H&#ceY`1S)`!v|E{YUm|969LIbIn7z z{;VG;twL7;qb1?M1$*5wC3)X7Z}E^d*KipH?veTSfR3juPZ~GCW`D68d>-f9t0Tnl z_HX;1>g^r4ea2>o7IhGYh5k$zBKOF(>&D*-#d>j}PVZX9}Y8Oz4yh#1!L`mdQ)pc`C2Bia< zt8BJ@X_Nw{3O3mPW9v)csZPKDKczAynKp_rWlEtWYxb$os3eqqi7b(Q&)W1=A&kb7 zT}jAJ_O-Z_?UH?8u6@7OYrX&T+!oFJ{?F^>HS_%rpJzMgeb(ok@RaoQXXIhOb08u9 zzGv6+@IupPl^8_+zvMowg_lUmV$K#{Pv)=`Y!a)yM{$5V?6Ef!_j+el|3e4f^;JQb zD+QWKMGhy6u1V?(fAx^YJYK%!Gom@~WiYI{^grRF^J~9gaeY-j5ZZU|h=0eyBF@*g z6MK5=BI_^Mc|LJhbAG$*HSp}{Dcvp?F+cm$;Zy6hQ}27nkx2vT61Kqr>5t8wUmrE! zT-ODx-92njRKI=vO~1?m_k#i#o4qnePNB1pDfr^Eu~7uLbmXeO5SoL_>$TVNv=AMQ z?NWQuqKdlZ*&ptQU7kSrztM4RJHIDCvHSG3D96&iwa={DUUxcEi?J93yO!P!d3HUB zKy1e@PmeFQ&stK=-uwnYj}zZzfTux7`Wi)+>wy(zc<4Lf?DEkEs;tW8#Mq)o8Pbc3 z!KrO=543rQjoNu&%kT@3am%f@%V3+(UFB3f@O)F%#@aFfl#WiIK3oU}(qs0!!_?Wk zsQZNYzo1R%H@IHO+YUgP4fUE@AeM#bCCI_Sx;5q{7@NLX3MiM(xR@(C#gSX!Lk4^3zY*v2_qi*5-*s>Gzdx%cr7Wv!)lQORGvxPAlCCx;;6m zlwRE9*R9F6DCwe+Ck{5EyvQ;uWye>sJ)Ck){3Xymqec{8Y45*0Y>&SvYG znQ<8yx(VJBw<}*3pPW%nFTPc7ob$}b=fWLjZ-?1vhGpo-SIzy9IQxghLl^DBM~%cu z8rWg6v6B;LOKVZverz9p1?1)3g$cS=U6U9FUhApJLq{B?N}k)#*Z|}FYpuhNPGZuR z4N=U*A_?;QJV&%d4=#&e7^XTuX<*=++eC97gSa1IHH(-_>~iSJ?eR4ctRRdx+d+=p zL2`+hc+azW?_{A8(o{}J)rHrMW4K`L1wv0z5s5@7%3c2Knv_D%-m~j@5bU@$3N)eF z+uG|()rdNc^oJ0*o#&{2RsaRP@tcEIc6*)|()DQibTcpeeivFg@(>B8ddKl}7&}56 z0czx<{&{cmlGh*BeV;;WpW$$JaD>mTy^~)?nN+NIsnpa8>Y1e+%>*^hOi=gXs{P}P z)_BeDe&^~Igwwzp`v+4Pd|&* zBvDG~c9q-UBVI8GxsAVhC+Di;)OO=K-+%`L`@m2z`#@~)DfI8Uu8<3|7y)L-Ijskk zIPWP3LT!S?x}#wpYn1bQ23EI1))}s;^0=t!wFgwbg9Cw358JMqsV}j39eIn6N!?yV z1SE7EeA6I$X}P*>q?x~8(yoxW0#H>?!*BE{+2lu@u0BywF)s4=E(>|(l-i0+?wZQD zs3gNUj7rDKn9EFq)z2`>q|%3pfXL~bh7oQ+S0q$s-HT6Tt@*=LT)`FPg+vui&Vdh) zT}7Siz1No4EXl6iEIl)o8`MQ@y*a-y5eq)7r0)AfwZh@uOf4WLM&IjZdO^#{<${*0 z;|a5_mqK%fH<`n=AK+GSch=Ya3{DI@fE!M?F=U6{^#`wAD@ZS%_IO?TL3C{$(f}l< zoE=e41?-X{1(NOv7Z8U=)GdcPuESj?A?M;`4}>1SZ`fi7=;qPSXRz}pyj=Hlawewd z=Dv*BZjt0ltOm`5s<-}ubm8pBE70ct3jFh4mqQ9X(aV0#b0_NVB!qaqy^~cm9^gz; zZ@5mmDF@ybbyg}jjGD%oyEb~`C1!Bu;@y60bgOKFzl-wo)BCKhx9*x%3Qd+STqq*K zqp!CEi>z`u8t%Q7?koRraq$suZrTVy?@_}TjzrR6kL!ACNv~H4nH%yi83m~$Co8}yt2GjhT!7-I&|6~s!3&SvCqAsL3J9SUyPL&&%hZ6B;(x5+T`? zK|7rCBSD_eByLhW5w$malS!#=C5OYp^zB%{z%pQq%;N!1th|V}D-kIMd-=*9Vp!Q! zw@5ch+09O@W2&K8koxGm3@`g0wYn|s%olkn0!9L{Bgg$%#J!ZYTu+Kn^|ftOYis$C z32vZ;Q3>fQD#F5;6p8;t$yG9$%i$IlW+lRf0hCjV1dhVb%2Nq-&9eh#basTI<)wkg z%XWlD{8G%Z*AZ=FV*s3`_QEA?UaaH=`zWc@V&TI#-1J=%A-hS-#r6XF+1x0RU@-6P z@g%RirBsSsE4Zt;msFJ4YDim$IRm+upn&wYkpU`zozAbpih(r=wHmoc{_|r+J`j7` za(H2s9mx+NguMC{Ay1@;i7?=cg;=9p3nL@8ho`lN7_2vNza_*;MEK5>2pomXUXe51 zA20E`F3pFK+VO@bP5{h2r;}*&w(srsfj0|2+P$4jqmSlq9eMZk4@G|Iwa{_&>zgvD zwA@Rd;9|l3w5(FpUmoy7E^eeRE7?KVb*)otU7PGEwi!is;pSff>D5hGb7B zk%I?$J!u%;X4R5=Bp*&q zId<8*sf(^(b%NGBjCuBFxjbzr-Vp;+mvAHEB^<>>nUMkVN=aSCppxl^(;gLJCP906 z!g4wyJ-q=QlgQ6I+k-2c?8_|9WGJWYJAE6P6-D3G$QL>&LF%F2dU)f063jIEPe2ij zp9cp~{eo%(BUAMUdCBaqqkr#h^5HjmM{Mfxbs+iIjZSADD^OvclIkic5S#ApX4$`= zKxnj_EyY2f)=SQ0r(j(>0n0xA_c<%QEL8@s#XMSkf9tDuS;}0SbbQS=U6gwEU2_F# zCgPI1I?GzrlvmN3FoC?$Ix-MN&g8XRr79b)zxu9LYHzYByq1+0*3;92mjlsD`YgXf z1jK%Re*a9NBL_=ICUgSidv4zo?$sWG9^8K$r3WCOKoj5rCJCSKKkO(jIn_`!F(5M& z;pu38?ype0PSe_SH#hsPoPx7f>MhsIjN%#bIR2F4@3{bC+CC$ZGhWrfBZTf8?ur~b zjptOo;;e>s0W;Beou0C8KOG@Vj&E*N_I%1>=2zq-qPOUts(D8t_LFWeZv=6$$Cp%5 zBE~>oh;sdvHT>L4n4tSf%f`39pJ=#!F;ea=@JCscIh+52x(+hGd=9OJy}0aCkKXzC zii+|G`s+sAPwJ{t(Hj-_wAy2RY^T^!-8-(t%||V{Q@*!}MLBX%OPxMm;U2M`ZHhQK zubEDK`?l#KZA{)pZ$xS6C)G8XyO_Lj&2qL6Cq$Z};Sm;&5Qc88YU`~*-pR$fUb6e!bSFmno(hbZFt*+%!ZN~V76#$I~ zd?B?N!PB&O$N5{u4368ew1qlni;GYEBD`tCgcai?yTgu%v9eciZ@t~df}q8j%6Yca za4FU!b(J_8hSyoiXKnYCW;hOh&LVE)+{A^OZjawBbnl-Fe&!ov9zxC}tBjPOpnGJaKE;~ax93!Z6CZLA%N3{K4pK%n zhk7sTH+F^Ns#9$$%lxw81;ArP;taX#l|#I8ShgL!yE`4*Kq=oPKc6u>ER4BJTaK0n zz&f{?v%Ex4tiKJe;gK}zh*stjK06F09u}!X)}-q zqM|${*2{RI6nvP3cj?UzEA^XD1VTaBc3ep#-x-?Sz#=7UUxq|_&y=`u*r6&)dzzAG zO00#?X@>vQR_g0Ds2&mB7M&g*9u60jHrXMPXgPEFF|k&H5xN*TmxuB029`wB z6yhwXc2RQ@=Qz93508L2bMI>7JTci^^BJL<&#dPQRM4t2$gZe6m6J6DBva=w98xzr zG0!iXoOmabR5KxF+1hPNq$5B5hetplLU?!XAL`l3Fs;0-p5Ch5qD<)^(b$Ao@eFVKcxliRcP#l14{z2@U^o*K?*-Nm*<-)mesOYktHZ|dlH-q*# zobH&fF;2)wFC&tD!rp0W zN{JSw@JH;(!?sjebP`n6|5CoYzs6g?31VO_)mGjg=&?OI^t^o?) zxssLljCwiA({0`jY8h;&or-ko9H^FPW!Tt|8b1`&o^RWX4vyGi(oLLRK37??R*^@V zmniv_;ap93eN^Wc-5sn|2GbR;$-$c1+9$Of(m5j?GI&En*O?XYp`jV1FTqZFYfC|- zO0v;~x(Ln{I`&z`?5>uBs>3tJ?l&(8z?&&poes}F7sCrIZVz3?_r{Bu!@m!YM10up zeqoJ)ytamFM33+7+Z7=(vwVcI7Zpf1xcg{0(=luq<2wW?eQbFX#gBw$YY!4XBvgY; z?0*j=FcdZ6EyHSZGvec(>NzgENh42Y5w!tM?J&Q`y~Rh|pdZ;l?Tps*kamyW|J}d; zIr!Cq-2K+xBu%Z|moGOvj15gY45lx|AF8lq`s}itgBwafPmXJbkrwZ)6UjKgn659 zj;)aF-JH)sb%_bqFjLT@VtEC%Q~sEz739ZNbK6%^(Phg_r#^quT=4FhHo5aM(Qh;E zGwB}*cy~>myD!j~1!)#_*y-eNh{;f8%T9y22U<**aaxj|8bT4}>83OCg1&`r@VqMz zJ=gp;RCdAHzmgRwhR!*r;|oePwYAcbOh?4cm;_Z_5N7rjqS z6Cg!Dd>zP)T`m$7BfbFsiB7%Fx?+drTIk6oADlg7a1bRCnpnlJLXl?@_D7o>e>)tNR=t^ehJW^wD-E@23 z$UO>OUb26yYhVY>7`N6B(Y{Oi`|07GD=a_!88dVrg7P@G{3J5Zxss;GUPjub?F#x* zY?wb_SklDgan{;Q-o%8(Y00KMQj8hQ%!6+0K6C`&S=or4&VRMH2Nu1`H;89Ub<1XF zafm*fA*$ZsCXh8XeB%c6i{m*`G7sy1O!qwWa!8V9FZ~oVs{Rqn|E()?W#QVN80Irx z|KU$i2X^#q)}fMo--gan@a62R`iL}Wyyro7(2|mJ>+0U-lKo$i{vn(5fk^W(KIxsh z9$4I#8OLV3$JWRq?LcZtI)@fC0ogtK=kT4;jq@P;9i|o|9Tw8}ao6cIw4|DQQJB%* z%|ui#Lcn;Re!9LBMS3zZ+tMLg?UTOoT=UsM0)wtjJg8GmN$LLcmb&YxF6WP>4M8=) zB><0TVmPXZ&iA(4Z=aO1y&_l+KpYj^*;@G0XNbQ}i3EN@)K#)forvwI;ZOu*Rw>M>}r(Qk`f zEG_`VeH&>t=pHYo?U1Aj72@$1-UeOF`Tb;;Q=ncZe{v?TpZ40~t2S3B5JK32kVw@? ziJT%aKfFsZyX(x1`Lm6+g4b%6GeNPupo{d9YO{FG%R?P^TJwzxutn}eX*qf07*zE~ zC*fW{%RvywP9p`1JiH=M3)%Qf&4NbZTFXy`4N5P7ua0Ig_WG~= z+ruC~UQM+%!|Q9~#xJfrV#@2nFEX)4uAK*3Zt|-sIt7}g9mu3(o15*Z)oYK_h>b=u zAF8DFZKxOkMt(S^vK_8SeB+Pn`0G%lm8!eLlZ5xp^Et5 zZ3{JDlI|O*mQPc64wS5Q+Y&vZ#(c5`SnE|>A3qKxag&Fm`<<`8Ii1m#uXh_R`UW^_ z&r3@`0S<)G6qvIQ^j3_2to{+Q_P&kMJ!wnZXaX*-(85)Pg?T4@MhEwKf$n`p#4;W9 zx(nq&cd(xNRM#Tyh44=I120wo`eVKmFoZmu(^}D5BK~V4_4=AeU>2O<`bbG`$2H&I z9@Xa9$y`e;S>BdnaPJ;!l-+a`PrV)E%V(1iIyfQ$6_B>^57mrS^EfY*{bb1PIbVd) z@XbJYhIYIh`lRp1{uIl$*L-iU1f_GwlE)LudsmxZjgFmx@`LgR8kOlKjEc=P`HMFf zACa21nY?aP=l|n?9}?fLKrP%uyVbWvc?!2%XfoXZ{O9-Y9eR@SE68SRz(OV zSLh_ED+60de!h;^An#GSc8xyDv50-MXC~RNa>?dOPyy?;Jm-EID7CC?0@V$F$>~Yw z;JB@ANTpGYn#*A-3L$H^APYJ?vha`|bY(Y`ydg9flS%9kLG^mR4fn$XJA}C84ImA2 zmo2EglJ`{08@am<1rp=nT@ zYbanyb^W9EgkR5XP#WW%MC_J8Z9ZKzHpXdbWpx2@&C%spNNY~NOxnl1 zsrswe(>`3%M=qC_r{u0fEt%6EkN8b3@lf8GH(IH9A+{%XW2pt`D4?mPrkT3dyd>tN z>jY4za&ZSkL_~3R^m=~27ipE7_Dbxm%QmiHfN7PI1n9&hIp*{HIj*YvxU zus&`C9xqYbifyrog$v0&sK(2;QMxB%?{=)z_9BlZ;GN`s(YdDlQLSdEk12Z>e~_8D z0PU$^9c^*6q2{>>XIzJrsR_z%rl$qEn%;lBZJ}q@-f=97tP2IoT_cpFA~ruP(I5z-h8lzGO7Hp=gx zgA7~co-odu&onC0qL~>~l7!HgLLgH(`kty-_@`Ddx*FXP}8U_9z>5*88S zN6l*NSF*e|LAa(p4Zx{=Ltf&c@?l~u_cE04$j_MQX$GJ$uJ|+y6$`O=5!KD^$((78`a5Gv-wQcPf4Z6(F2fQMyGZx#XSA3n%*H{-YC<3mu-`)4{y4;P5p=vlU45-hl^>++g zf5XeF;oDE?`JGU>yfl{UOlf5GZC2>P$&e-)qRoUcws}$zI`*F-RnfJoxA97vobu#% zfn1xJ+M|B5{@|>_P6tLtp3qwU!jOBnV0sE_<;e3&OG_h_(51?&3F_)CJ?(>EEPoOfimIgqAZ1Xu@l;fx zPWrCa?8?55C15~)y?YKqNbJOR>16>m|Fzt6@o+FV9-*g@^{UnLV-!*SeN)fSrX25} zvUvASojRq9>d@?xJkz~AE5A3Hw@`W`f3YRVVRHrbgvDY5NA_#47;E2C4HDjI{6(yQ z8dSfg0F;cXqk8Wv<=*FQv?gv`jzg4N=%{l+RPLMq8q~>ZAluW(!q$O;j9!_BsGQ^J zSW!QR>8!9Agvq=NMyygbOGM>W zqR;880_9`wFNAH72KKw4AOmsf!%y0ed5B@g z(&py-*CNN@L;P&j8Mzais9q4i{&@TmQF^1v7) z(1js^FiJ_%)wpr%9`PenSWJAbU9|XmjoTNd&Ne2785=4Ras@4^WaYL;<^U!BILu6 zp*%HJtmvM2RHKuH$;@tQZ<>7NQ*eHlT79P675_0|1l=!YGwHq`+!cu3?X0FO#WYlbyX#%~*D7Q)U-zqUjBx63zi8 zfN3xbT8Y&jYD?lr@VuzpimAlonm%7ccl&j?AF!C)PJepdgi7+U$Z~(4ko`0&e;rz1 z^zLG0R|zl}R~1v#6e{T_KOgCm&8eoA0jjcWw^*&^gfFU@$8QLH_(VpUf=*QzxH)%W zedA!U5S+{-fNnU)lacN5W4;$)bmlB5n=oqjO(y=WK;9q6$jKL+UJVqyAppB&KLVO}vYh8gAy13%7i z{UzG~fCZ(9sTF~shb~zf`~z#_6-F~jZ{;3MEL9~+lc2P1)utf`JSg3t_x?S-Wu;gm z2(P9$dS&0~K{TTVfs;mOd7Fn2k1G&;(zE4#5ni0&#sg&gHcs{r?&Ol!I&yr6I}sef zyD|RQ_INN=g-${LjPuY#%5y{dxLm8;2on=jW|RMir90=`u9o*8hHvtNxuIF0hM>JE0y*Q}(%t|? z=+JbJ*srEj2&ecbNEGe$oT?Tg9!c6f8_QGs+{mEAsoZ(G?|Q|$GgL+XHlnYCCAxiR z-`Q=F&;9%$01*FY;0eEAiJX(6p&Gu5a`?#^FD^V~w%DSZ_Hg5aUa~C9;(SP}GN{Gl zD`#h~B8jXnH9T|;!?>GShEM5PM94fzZ7O*)U}pj;2;Jo|wf+>to6(uBC2 zi;)gXfH|{@YHITi&NpQcPUJ84l}+7Be(1Q@XR6LgS;i^uk)%5=G(2=+V=u-P!-Xn~ zVe)#u>wVY5$rf1Qnj-a?i9;ExiGa&-S>Clv-!vLkEX|sEYS#5IiN-eSm84OWrUst|G+ZO+Ag9V=sHk8AQ)dy0jc>!_g>=S)%ve4eP%heF-Gcu|` zc&M)oX|)(*#YO>bXrl_)kZl`n@(2V4B_vqO*ka(nMyEK!vjBJ8!{uZ}9x*7l`CS%Z zSP)cE1_jsJXg9oOJ5_NCsTn?T+8sw+64jv>YIL@#iSKQ(6x(gsohs8D0V({u696GE z*H~Dd2i<8sh6#>CU^mx>h&)5_CaS{^nPHwhD@Os>g`XqAm`*$LWI?(YCLv&J%<(oZ z74Scv2KYPGxj)FrSl~rzRp*AJ6XmpC45@ZGnX3b@?FV+uoq6>E2;H`S)E@z1^fYBN zOqTuN#Qxza!&K~$FMh5IvHY`_V0j}TgTIQ&DLEPGwlVxEqv<5y3$E&c%{8C<+p(ng z-33KTPby~XBl)#@cBWnNWf6M;I?lKj1zmnzfqNpXnI^yxn7h>Nys$93f|M?ZHBGwO zK&MW|PhgfdWLD)uVwP-YcJf6vb(b45E)!EGo+2~q$UkXzOynyvis5(tU}gBcMnvom zmFOB+F6mkf#oskv7vt1g0cZ&4{@ZkZ0d!!1u0b3es*}0hhCJh)dTT9GTK52_ENkQT z=_D{qP-s&<(s4J}kL5ykWHTarl=WMx&B#oFKKl$VZ-(Bs17eAxigESWbbj1f^y#vW ztVCcvuCPTW5xt2e(DQLn1?b{TmwK@Z^`hUPIgKpS~`cKygUUoye$3-3RZX zpEKey75cNuQibatXKy9vFX^l-EYYXmExNl8%3axY->(l}4bb0zb5a`$twyIDlduyV zHb6Kn*x*n1<@3@Id+iaPQVoAC^o7pU-6COeKlQp-lvEGGihFYxPYR^M!%qLJX?cuf!=?MQfk!W%s|@weco?qUqXh zrvtG5NscMFId`aB*q}0vk z-Ty8&Df+{SL;KEcL$u6{%1}eIcq6|NtX;1G!re#~eyUt0^?1TV($Fjq?w@x*Q8o3Wqt zdap6DRVxHzO{sZ#?MIG+4o-zJUW&YZqFPh|60?5{3w}B6(i4aB?(WA(@eL@0g!625 zh68c2mgjsE#OWC`U5iZAF!zi+$4rI<1t%6)W7CDD9E98^1U&-ubVi0*{jXN|9Y2GF z29)(y+3^(4gWU(523KEqXq1~s6!7Qg`>9E)oC`iL~$)AaSo4X$)+~42V4Gk3wi9_l!Sx~^$gAs(QN$b%; z3_BfWJK-W7V>c)T=0?UDt6n}Tu7a3Kip%MVztgFIF+%7u-ltNZtjkVdv$wu77^515 zteuAqbEFmjsdi2=)3N0TR|C?FSToIv8u*MWFFUoAmxhA6gVFZ4?MKw0u;;&fkL6YQ z-w8pk?HDURbXQhR(EvYmeSJ%kiJ!8Yfr-+d;8o}R=EqQA8@UWNi%*1x6*)YaV^Zs+ zrxVSGIGbdd(D!qo=ruoX%iScy3IOs1O+pYvD}5}7w10mvzN-|+KefLi#j52DBpA01|;&fM)U#&9MH6+ zTz`LrdsoUq>mv?kLc?--1*#2{wpnFt2_49Jy4vn(ofgiaz4nwOvCJ8$$mFly4B)FoA)xsKde zPP=YF)R^PdF>x#8)#nS4?cWJn;MQnGy8Ww9$PBHd^?ME~VjmletFCDmc@z{M*|%=d zp~zctljponeYlmeNos|4swom7+v`=3T&&{w@1=PI!T#@rxz{g=v_K7PWt3IE6kBVl zbfKetTNiz0m(M-WQCr-D@$#1d4{JD?Vq!pt+ap|=p7v$b4DiCoWFcMfVrbpBgHaL27)>tA_NJ~ zYtIw1n}j>Y;PVaP|GBFql@BLwdm;Rj=LqK3_WYdi83@z)dXUtl(|x@zJ7__6=m68P z^MAuH7!6o8<}N23I*Wj0YslicwsR@?3!*yW zUyib{fEiTE{wae?%VA?U7exyX9T-Q=hTz*$`%##;4m4mRvoixYyqRy|CkUSKy(yFN zMQ)lWiid9e_v66P3Q!~)TMzK>?}sfodlh~f7{Z%*CU+{w${qLjwaWo%Ta^+Al?{f{ zW^g_Y-GqYk?n=JLAjtsZO#Y;X?3b+(5P6bQ<;`mg_uZJdnFA#pr0mb2TDZ_&n{G>4 z?dT+*FPwy(SRzNl!QZAGEzW08O@gPdzJ4F8I67NKxm$byv_Fm0VxWItm72y5V$NN& z6qjvEe`U#8ziDdkKE&-}c5Toj`1rOrHdb@@!q;Y@ zeH3OS6j+E9!>u7X1}d2p#~$jJSRbJ-s^nM0x^QS7P-^?hn@h`C&${bj!L51ehK4aP z0VLbAvKe2T@_GHDvO22wtGvf(XJ*$ZA#}p$xlh)um$yC*yVL!=hd$xcJGj2+fUl8u zi-@@s-ofGp7wvkwql7&U*S8~I9M;F!(cx^s2DU@)82~%Tv6Q?5S!omw4ma-k5AmKt zpupjUlrDK$Ha372<3GWeso@M8n5N#P5SLcdA>0M}^67$>Y&d4x(YiHi-4QV@o1OCX zGW$?xCyX|ZQi^12wHkES?xbBk{1ndNAT2ADW05z>;L@F$7sL_Ppw;W$qqgr0;KiT3 zooTXoW_pIegYoBak(~fF?tTtr$Ros5?n_OpN^X4+aw6^?-bSDBA_v7R6d1oU!HFqX zo6{_v1;9epZ(?z#zkz%-xj!G`6WG|JP+&X?Qcb>^#liW;q|05sdm(=mJXAaceHO6XpzJ$QWvWM$O#?|a zcr%}%I}Cd;eXGIQ{+FmO{5FiXGSmI1?_#aMFTl1U`o`bBDcBEumNY=;_K5HaHW{WWs^kw1Flpq@3!Tt3YC&{ z$V|YZ`abznl(OTuIsOAS#_(KU<&7+=aw%T>H9iwm`s79gaV52zaVny@=?vF4=;neA zwSIXa6SUG-G3QA7Y-_m|;Q|U2>CntK27Y0X! zFtv0W>C%w#)W-n^Crc)8CPk4x3~wB_&KcMa;<8=tvi-jS@Vr2-aoafX$3>AlOw(Nq z0oLhX#UH_eNED8I(!F3cl-@>aZbAbdB$^ixfD!bJ84n6}E=_K@dr_h-*sO zg)IlJXcRl6(9yLdg+b!_L>Qr;z2&Xk-A5dG{g0NOUX)-uR+WMNm@J{!M*_h>C)aZaV@sk*oyxSTUVrbRzN(k^J z?=vHhOmyT_VVpz{=}YnxqH%f6BFl(%6T~rT_b{Rin=_ck(~z+cA=d>JgqkXm zR9|gP61lygaXGhct*)^|@pjz1G^!nv7W?hJ0=TaE+F#6`R524Fydl_iWwUjrM+l9L zh19G&&A+y`{gU2oRyp?mfclB!lT5q40MM>bmwIz=~CnFQ&r)wW-89|5oK2Iipk{ON?OEe&(MJnShw6M*`&L!G6+Z zrRY3PReC94j9(aY$n}G_H?laDxpkOC-JpEfgrL!$$ zI#R)T8Go*#?Uvp!mK>k0>K*HWoT~8ko&V;@PN)=Qcbxm^6R5DSs=-&ft=@AV>zFU= zdK4a)U=0a;BzI_ef^O1ZUv+$k+SQxdEN*incw9dl%SW2}cl5#ZdYRcFAPa==M53~& zTO$p+eBEW3dtvzt<`5nm8whl{sz>$BRkLhI=mvc&eEq3c@<&Q=$24{fURG zbEIiM?uuC>egM{j^CBXsM}x4M)+F*)Zw=ILrR>}x8qNJ7=4@~*xL6$eI(THFRzCWZ zTB0KTjFr#W%2lds-_!(C)-DO^myLYhwTqLuQQ}bd@}eZu%ZLc{P3B~!aU^xOM*RgY zp0acIROuZXjfi-eCApA&7Tlp zF?V>+n7T2jyLazxP!iLq4GavBK_kO?7(D{`X}pIT1!>n}U;iNvD-R4TupFuDZaVrv zCP)}FvfrQ@a+qSr)*TPJ@VQ-IvfB- zOujP-H}Kcfvh9+x`Xl6@=E1VzefOk7UK8p!6x#9S_3?e!rd0Y%T%w!BiOmfZi1s4$(=Dr=vETd=&w<%=3eZ&q z%4#B2D&g$8v!H55e-0OKWtCWm&gK6YuEJ3TI4zGOP1)hEMO(dL(XM%J7B6^{km;}N z1Ff!uRT?vmMuFpSt1eQA2k3Y+ex&)JjQMgWfTn)AncAoMbh^86~UB2Qkr> zj|0#p2n$uZ^JyScTa>YP?KAGkk#}$E?mHzeKc{@%$CmC@zuV^wF4vjmo8{;fGydYS zcDLi><^4*g2}+)yj>Q0W{1|QL>~%}e4LL#*B4%WK&HGw|(GkM-z6Q8NCW*~NhJo0d zzS0IU=DkTN;4Q<9>?S5s+DQzKTF=~;JMu_PGtkRwn@&`dfJu688fvKoykN8Ruk&X| z=Rbs-M&Qvj-K*`RE@%z_5&b!^+Jn>~D2HPu_qC5samLl%zm}M|h$vR{!|KEF?V*1F zFC&T#cQZQ=?6ziPd7nqXBn(OJn85IjpEUyH6iB;fX1v{DQsE@Mh1Mn|*H_4E zmkJj?H#D6wHC*hugRnMI$GVJPJ&x&O*I@|~9lo+HJreM3GPAwC9W9YK_W~7w-x?wa zkw4$Kfz95#<_!vSTd{1`5$&~#1X9dQqz{FSI~`_FA1e&InU-%{U-(Z%kjcJp&(03DWU?tNM3sZKh7S84 z$QW%tOhKcQfOQ@oD=^{vc!a_m>V^Yhy&|kdE<;Th&n9b`ly?V8gWSVd2-8(?Ui(xc z83uY?M>L#?iTESD)T6(JW!0*@)V>ZnFmvjECX$gw6X^pqrE?0HB*I#w@1NByI*?VX z7GM<|g^5PY<7q2A8(oNvC0bsBT5f`jc6m`%$(>n8j-201ht((DnQl>Jw{YL}go9W+ z6XDm8o&tAsEG;iDuPw3!Ll$*Qp1a+BZr4Zq7XbxKBePLlNL!xspd| zyt8$F(Xn7OiS<>S!W=SIRy@$rc^))e9l(>L7zV7hg&A=#`~>U4(! z*U+*6##2XGIJl_KdK+d^)+yJEzxG1di9H@Y1V8s9p8H6(caHoT4?x zkpg_f{M&veyKs+$99KO^xZbms6D9fk)fc75-@LV%_{ubX^=-!GMNTQL9XEocoLA>% z257V$p@(@BKgRcXEM&}x&l&1%Ck&w`FI!_09<#JjIrbpN3hn7GupcN|?(zQc;R6uN z`-DP;=e=ti2Z>+eqzN;djS4k#U4KS2*_aipQ})N!rEXf@a%X(ck^<5fW-AQ`n({W` zFZuk(62{OaT?s&G5L;tX^!lCugGz;ISv|Nf^}$> zh@i3b1z1v3l`KGl)9CvAW1^wkA^CW)x+!dJZHqu9{>55VJ|uq^4Wd`(FH!%8oA*+sO_%Q_y{+F11@4V#R_Bo+h+ zQ@fwy%VVCly>5F8nu^)sF#OTQ;q-#Xi3GeD0K+YND4hxhD{TJ2^dt|Pzbv#7vHkL> zz}1Bp0XN;<`a*u6=eCutWRlHu<|#19C23xUgdjvHnS z$nL>$X>ATPKn{A$tOvFELKJgyX)2T>p9=5zrRXtcvyjo;2O&`Z-_-vbPbpT^gtM4ctuf>w~V!B>*W zu!}J1@j>Nf5mU)(dzMPL`kxW+<5JFj&PxjYFg{!x{YWKT7oPh(tIXwE-uLb}!$V#?^)i>N!B-;-1ciXV187cSs7y)h$&f zWNr|bpzz9Cl(u(B&h(X-hN}@-Cd#P~DrhL(YTrGw+5AL_B}S^X{>t-rryh8b%x;FqOsIZM9j1IN|2Z-oo;}hcr0X42Cy^ zVoDb$ScDq)u2NSKol4wJoGUyZfaU|G_@Me?GF)BhS{3CKxAx~A1bWBP)%3q*5>!0Z zT*N>(7Qp;yQnG) zI_%AjX%*+;z!?7#kEV;*`&VNLkUNEyQUic&&4xJ$!~W=oVmITPdr^1T8|L6;0nnKA z6y=6H;b(+U>u=LNxh!rQt@Z?;-Xtk>iAySpiR#22r^O@3xBxIAw%((a5-T@)RW%4l zQ^I>J%5BkMVQ~aqq~1ZwYfN{#_`!|;$Zja3-*!2$P>>}F@&?`69oMFE2%8(tqtnyy z;1nxp=`1>G=$m}Su8`ApgrI3js4!Tca?|pR+FZ~=BD~J&O`@_Oyzbxxn3k;UY%?ma zRbOm6$~=Ok%a@s`XAL~9<=A8idK!XuJ{a4BZe?pwNa>Xov`XKGsa=95MtONF4*ebs zK>ejDHh~kC!=v4wGAc?oGs~XNJ4~%T9q4qsa440$OidJYa}qpPloymX*Po)*{+vPU zd=Io#=*Y?ujA<|uT@lP+M^2O2)W~O<4Ah95j`uh&N8~zAAiql=)mPrxTFKX2mv8rx z!_rKxGp#|C8QqT^xDzgJ$L{6v)bD1Hm#Xvd&@`#0x;s7h{eFp!PA8(bc9*x)a`wL5 zh5n!*0fqC#S=ilg*q>MaPy)97b$@HHNy0(lk4TPBS62??F+4#!wly~T+d=aiNWh3k zD+$CrM)vX%AQ*n=8$*xZa`{L$VnS3uDx244*jL@Tr z?bz(LI!H9!8losD^0dm)4Iv7Y4MG-aUjj305ra#2n8;?n0*^P|Ih$R4zCAK`L+kA3 z1pW?TM52J9x?037xm!)G>-odv{Wt}?z8PAqlx#HxZj(#u;}duSSd;YJuDZW_NwpSY zZ+I_WL^;PKcdM^&bH6X3?>-U@N_9vSN>=ASw7uBU(i)?d@J4Q%JM+gQIvg@{bm5&;0D++xjCuK>t&`L z?WH;=#Wy_C9f$_~MzH#Rs4l4I3aZd9IEbM_=o9;WA@EPhYDf-piq}9*m$9>Y zCW$OGH1m+GiUU!fW-6u`W;r)I9$7Ly);J{Ol79>ewjB9Kk%>s>R>D}a4vQ&L@10*> zjrPc+MdrLG6ss;~M<&PTV7kg{Q7k?R4S!$6YVR5t2pES^&(8{DI!;yphcT)FV_zwx zGkRRQn4L}0a<07$i-16rWcBI8IRgv+PX78nE>3<)f8%i8fw>Op2YSgLf`D!?UFM+Bz}9)V2Z57pN#*2>H}!-dWS2_9Lc-9|blO=>Y7NE~u^x5{(51Xh_kyRa zUQz3V^4H}|%O#3jB{tV2k}4J_vcw$yJUkY~9GSsDt_wU#chyC$Qf{fju*8C|PV30C z8sCf94Pz@^3Sk}}DnyOfx5n4|;No6H88xP%NVkB=F9?%zr0nIh+FN zpVlY3c6MT$V~f-v3-Vd#X_x>Dx+m)J=2!F*_p5%`{yQeQ#~bWy``1cb<+$J{1C3Ek z-pB`e5u3e2X+{*?K8PH;KaHE{F4AScf>g!87u^SDW>+GE;bmPZo9%65OPfL0@#k)V z`cTX4_CQyjtn-@4W6QN7we|T46C$4MEYagk_#-LR+^yT$GQW-to}di;er1z&1F$d4D9-W$vkUN zO!{8!@sJJ|&N$%lV2!Px+SDlRkhW`C;2rfv4$zdfbK1M-AFO zw(04km9S+}8n_y%;h*<-8|Os|>vhg4(6hRvGoqjUP{T@{$Myc%9*6lq3Ri|7gLXfa zQ*2=HP)y4;ZzNg~{8L&*ES5u6(&NwHDss>dOj=WcGR^EsVAqJ-UY~#J6xd6WnF)hb z|B+y!Xa#{8VUb{|Lw+}CNu`$;mmieB+5|aN@TFDx8NRTKIm$6l{$2j_f=E;@i z<&R%Fn1}@h3+frX%OW#@=xOdWH?J55|Fm@D5#|Xm1__=6tSfC-l?uE7t#wepQpx#* zfVKbV>3jg0l^iIqqRkUha^Re1)xF>fgbG82_3%EvLAo~Y4{1BZvY$9H-IH9oFbFk@ z_+QI^I?%cevk8jDfr|3^_B))zG_K!)c#zFa~6=n9Izz5gG04dPqJ0of2mmOM1D;h$3wv#ltenBlHq7uOd$fc@ry z!__wJ{uA7~>~hN$G7{nkkXaU6__y$GY^kfM$)?FMaLpw4m#}R zAN)`^#*UjZV{NTZuGOM!xUek;{BNi{tc{o6yO;`oH!QmL>^ZYHazgS?{cLda+_aU} z-1}s--6Dmlv8CpwLG%i`?>NWMhyUmS$XEMVRvZcoVRkxpb}c}bH(se2m3x-CMp9uq zP=(T-%vi;?6u3sG?WAGz2S2%p?n^9{9*|6kNXX73-dqQ7#|r6AW%5Tvp&Xm8HJ zlQ2y37?Y}x)qSM4V5Vlawwz|&?_%rP7^p4>=FWbU*Klw>jZ|64E!lxln_F3NAc6U7 z;G86^ervb~QKmRKg92P<^}qVZuH4L`FQY;h2{ww&TLb>QNof-Si!FE7|1xn>W*1@B zAEC|PO^Xw)gt`b3r1R39IV5|F!w#L_)-bvciXm%2H6r=wSV#=2xZ}dP2iWouCae_1 zKM+#34DnCUYYYrq71<|cU;S#ieos5R==`rE-1{o(ukza-!1#Q=CjOURR+@YC>=XL^ zt??ewFC9lLMYC3bo)-gE&9Op`b4qB2CJXXIo7={eef-MHn=ELgHN}AoncuKn8qf*9 zDDi7^ithODn2{{Oya;&&9G=NeU;me}2mQ^Sy2#g215Zj;heSq#??&bh>N;YPn_f85Pr!hp3VbVLjkaw_HwGH3Pjsns3l z!;DmeD=R@WMek!+KK?s|HjPe7;moqk6ci@L+EP4l9&K$ZepXNzW2gH*s|O2Oi0*`I zY9=4PSe}|XTb>7B|9@R#xz_-Ll2lOvX#qjnL_q=R20=m)5Ri~OUav(O zlu9EY9TL((tdiWym(d*ldl0DPEZ^ezY#))aT{xSJ^gMd2X_T;!d&Ybx zqC|?mW1H8n4uTV`0Dj{RohSo>3tfHuDRE=i>n3zLrusHg1hx~R?bd@`I^3RgRXq!n z!a?V?JoSpF1e{NJt*v#_D_<41TF{D%r|enF%9q?Fz~uqbBauWS|K`oD#KoMyv3Ius zT2%XWw=NfDIY6n`<+9eI?RxQu=`-ai`vB@}%1`B}W=Y5?6yoYvWG6)~`)2!Zq^UKCwD3}2 zor1$J^dL%QC0ty~gP;lSoZ^{tx(|L4F2D)aE9ccxYA;G^54)R=O#FCW6G}W;Ifer6 z)%EGa>f9)hNCbxslA5L5wp`SFvJ6fXbWXz%{@COe8!v)X z@$ynBbqmXTr&8Fg|HgQuGKxCUk)p61g^#7n@YX|NTsmmDxm%|ojR_O7o^F3{u{<{h z+mrfMH}nwWhS~_xpS3nGY7RvgmZ~2Bg>(40QL3-qzm^>|PuP&aY_@86#o(K03}L?F zQtyI-Afzb%{wSUO!NP7O0;%pwkcd3*7_UIRDI~CS76%I1A~8Um^vC|f!{E0W6x;Ui z#$@yj3x!C`?>K}pwR#6i^*(jM(@ub=JSfzPLAfPzl2!mFojpKd#jL$4D%DOmH6 z!Rr=7cY$1^f#A6@lT#x_62jgaVIM%1jWSB#6)mWnBTl9dSEEPN+HBS5(3;Lru!2g2 zToarxj|dN)$J3vxmC;TWY1Q5K+5F+za)^g9(^$2H;^bFo`(J*KDEA|X{Vg`7Fon@S;sgXb#rh&Z z!1?l?KMz+naTK<8Ab_AQj2svrn{Zdd!3z=g8s!HgXyy)R-=;+gND0(&-HD6h&gWv- zh@~3c^2woJy-L0V>ko)g^_McwLzlMg{z;gUMYH|gaOsc+Jf|A1 z;vtue4uVoYloIZWr-ob%J#;CThQLSRGaw;9zofxT?(1-9=ApzW=&EhIT15|^5{Iar zN4ua_TR^Zq)v9$S?8)5J3ElM29#!>7u!MUi80~W@KMur>LHJCO-;;rf=YsP~B5wP` z19poSE_iRK@Q_0H{c-5yI8W~@1*PG(j8b$vvE|XZvDW0A9CY=}?w=Sdhb>8kOMMA5$cja4fdrMTvRQ$%j$$yQ(b(TK%Ber{KSyEeU``Q- z#99)%i+fS}0u1WZm#@AMBL^v@hmJmrL4=-nmpD!KgGGW?{yRqBaBk~_=D>Fnz#0hj zH&TUw6re%K6*ACQqY&5!Mx+C2lXj24yur^-7DKfti3NY;fg<=rTY4JhgI6c87@yFR z6NrJ??;2a8`^xOPAI(KvcRzjs>)IdFXHQF~iVg)F#+a2)H?E>^ z@DA}eV2=K0;9y=5pfcWIavf!k+(iSBFddp0a>Lop`C!-_daLc2rVq-~u1--Jk1t3w zX+lE#fdpJR;B74E7-vII^RHDPeiEx6hc?O-x_3$W$96Gu1~eo75I}nQcsWo(y!>52 z0LqX!QkHUc|6Dv;2bO-@PUru2Og?*qN;))IF^q^=H(LvO*7caG@0B#bT_Q}av6m2% zdMB$rZ$P%s14#(}Tp(38<&*Dx!dU!3W4!u*($@SmVG3Q#-)y*ah~ksT+UlcJ<7gBjV*xyg!jwI&=mUbBHPe{qp_pWIB*(zaW(PnZ^yGth!&E4NKnWVEu09SZ z0%CMR_43R-QWqFzV>DX*_@nO#{8~q%W5EOLcca}Aa^Qj6BJKOT{Wl$D>y7C^A{&YT zS7ISAVBfDMR}-qsjmlCSVk%NPQLa%%R4v$H*TcWT*=K~pw}GuTV(j6B{V0jw_Z;Ce zKJN6{`fQXch1p4pG^p*L&yFO9FjA%^pIJu^GPHm~P%HlTd;qyt0cc5N`NYUxEv6Fz zPdcN0T?eat330!;l#pNw^#=0Wg>|m9q=Y9zE>2q zWWjSYCzi7KH$)4_gnW6PXA{86I41jP6d0{O6XWv=D7&SZLZFQ{X`HZ=Mye3oie!pH z47qEM1LViS2OUE44H@?=3*$*}{b^~6UQ&LXNI23<7lpTUgIk3=d?YGqXVEnnwU$1D zQD?N%sU1WH3(=%yQ1#FaMQV}W*w|iBNqGY8WO}GdNw~&1K?DEpt2!M~dL(8Wr3>t1 z(n_QV8U!cu+AqDkxdi#1b|3kjSFa*Tdk+gE_}ahLKiP7c%K1JFDxP4f9QfYLW;gt! z!fi;IYviGn{QErnNE=Q17PHv6Gg9og$POOnIetVIFDI2ubAk8PF;a`c!e;9q=_lSE zJ+y8YwBV?evTXKO;$P#-wp+mW38<&YI8`w+5Y0@Rv6g4i`E_3K4vcJKE*&ze+<$y| zQc-WVP(h6Q@hKg}+^51+g{aV)I(nu4pAQLjW0c8JoKk(l4b<~q&gj$TE5PbV3oHS~|fy%LK z@n>&Tv>b!ZF@Ky=creM#xo{q=%bY_yGr(pEeH5=}T)!Q3ZvYtlRUO0N2~4h$Z9gmd zU?+CLJ}@38f$99?$zcETOyBJXd$14Qa%$@8ZqkU!R3Se8$8?U1f3jc(KCm1cCT95X zvpR_!FFc%Pv$3cc?`K2JkBHG!=v_R_b-e4Vl5yiQ{PugMhlj&ZoyhL~DYdA_o`1pwOU(&E|?~Y-)tn<1~#L{@5t6 zBmU~%Nsf(HDcj~tYIm%i1p}KU+WT3w;)DdS37K!Hk-@FBvp0%KM4!WoNSr1MDc26{ z#4IBf35>fr9a%e=&b3&`iNoeb%6wRB{>E-x&qzBGh#i?9JpQAGacvj2?01D2UnP+G zi;K_X@!)=}|NGLC8W1pPU!SE&LrgpTYO~?K0!v&#ucYa8awKZQs&pi?;>QMe`G1xm zEj933sMGSlOpHw(FP9TU9FDq!=LHGf#V`Hr%{;f+7ltcEovp2(I)mwm!TA(0k^gJ6 zScX7sw_fvZe2lG#|w|*Jpa{+$+%gw-AppB74c2_ZJyUg4CO6=qOabD zNd~*Dslud^_N5u~E0$Mm-@;7rnRlj9OQ40!pF1}mQ6;u63@r9{wBplfCA!PNVi-^N zui9@4vHO8G%pZMx$h|)96tCQn*Ud>`{cwNzuimrdn0xWkl09tlky(=0VCtufE{Et+6^|Ojaw?WqTYBR0mIuJ zApVw`Zo>k2*BqhLa~}rUZ1^_7%r9ylj4;GYhmjGJy8^T@D%Xy&erfbUuE(AXIlxll zUmSn^BpzB@Meu~@NTZPe>D$r>bLqbbV%NF4Oj^qn>U|>vypGc}=JULaX#cx?hxp3DI7K1<6uI+A5lsyHu->gkd%|@U>2931 z5M2e^+v!S5@*j$ISg|ID~9br~*oAEo&rpE|YPWH8>1p$p-ZQKF5 zOkUSY_?%_e;G<{Jy~{+H11~K}ZG@X2VQJ-Zn%!0qlibJ!0JCOGmv{vTz#gr(N#2VU z>8?&8Hq@&%9w(6E{4EyJy3i*`04#@>JZOemC-OXC9GmD{n%8_R8IcD4-E;u$p(6z7 zdXqnin`-Cglt75|s?BB)tKi_CUe|>)e$NoKs)x&vl1UnlQy^QkFQ&V+u@er&eLD%6c+X3%hh7JQ8C zYhi;M@b{=Z3r)mT>w`$A^?rX9@hn=79{AuTqwPe;O$MhKKUk*@sai!iLWRv{1?gzt zpWF0YgOSL-4j1~s-poa-GJIfjOMp*JMJiB7FiIgDEP2(}x9=`5Qc##fR}S4~9~gcH zk-5g09t;rN#f6!={K&-oH9=UIlTrOL8cp_$8ji|M*ycGO!J^J87bmKfUm01^`C@bOMY_GV8O@X*t4v;rC}HIf^1R81Bil zjn21$&in7yQ^-ZsBB;MeMe_8nsi_FCil%Y>9s>J3qE&PBFN?SZOX2ASUv%hGl_=QW z*xW~WD{FH>*fB`U^=DBvZqod`6K9cWXTb-WS@R>84+HEof8S)uYJ^M7hq)=7qKUsh&wn$B|~+F zAU^;_{GJhPR=wm~zJKg>D;?M44N#P29`LJ*sxbnu0MA$-OW@v8lg8y}Fwnu0E_?dz zf}qQq1`;OHKmx;Wc7)4>Q#S+I@GSrTqc1Wvqk`A?U|S?UHW6T_&f<;*53nOkwq>7j zOY>(+wA+^m2KZ)A$H2n(zcm)QPX*(WE+42uOZtnD+=Ta@X=%-Sj6vxb!^*3OZR_uf z9@?&p=Mm2hr%D57h=;OigZ0BzK3ud5V2VXBXMqb1ew5_d(8{6}LKablvf28NbbpZ4 z0Z4k)np%d?hvQ6*b}hIXup3=WcYZK8pp!lfH>5gj8Y%e@Ni`X&q&76(o=xa6^?k9t zFLIE!G%KXAKH7}fNtT{s!>IgfjJ!MYe>npo#X{ANo~D7rAv~{7iZ{s|VnF|Ypw{Nb z@=WOo*2C|vj)9hWtH{nTpPPAMBF6l9+k2bOC;E3Q&X1IBuJ80#M8R1U?ZMe*%8?8?}c&+h6wcxvkkKR z$vb$&JNwI1ERm@QvBl7P_wIe5VQ2^L=pr6YLzW1}RZJnM9<4=#tVDyTsvxA~ityVl zu2En*o`gDKuxzm>pB$Y5OmGuElHm$0Ua-5cNwyy|jv}iU&c-+p&_uDZMkq}i!Q{8J zPB8bO7snIuiM<1mBaeG~E0F}m7{hAi%vpWTda>^yD=ZFne4Y3CArFF@D5aijXY?C@ zSX){i5=(TGmMXtWblD`!dIVW*ED^@~gs=<>Yp4z01FN0u^hB=hIT(!UvGlYZTI*&L z1E0u11Drj@G7spUIlyWnmlB)?$!IM)0t7=?MDTMGVNn6j^AF(LTzdlhky72#R&XHL z4^@r%HNJyp5_0Ol0iR=uP_y2ciJW9~UEB2vdochEr!41H`=xF-P9PYLdyv-)KwwMz z1$RG=6KAnge!_Ix&>34^&Z_={J@~d*Wn#jZE>`z%BcO2-oSkch-{7hKe}dixRcii>W6m1w|~3OPd|*g0hH7zt2C+R6k25Mo6kb@pfBW*9Ow ze>XfSNCPcQHHs}W00hEj>HFKkUARo;|2AzcQiDFSuo6+$obyOiHmpO!(_D{H2k$=LK!f8zg*f`&{N<C5o>Elmtwx$3(uh~muqpsN7k{aS4Fv0Af?Z3kZ*>RJ zb|P>s1?&v+;dy>2$Z&KD#Yy|QoCSkKUi1Ao{hEaZM=fasgGwTX36K_Z=T zg>nL#;exG!r`i`Ik0O1(?SgmPJ!9E zXdt)F4dVvs7-h=;He~OF%j(2Bh}w65QqIns`A*}U|KTa#efr*67-V*XzME7L@+m_> zNv!J?37aqwx{I@WOxLVKj-5O3$2QIMtSAHVE75XpwxS^UhJHl51q@M5jN`c)dLd&WQ05SBZ@tNZC zNkIlNhUXNlZinx78Mb|PW^B(P03y{JIi>3xLvMD45hnFE0Yt^$Uo8LOS-~ATW(uqu zTU?w{-7e{qGQov?8uSp$M{?%F#nm z0&*36*&w$wQPUJRNc9li9}7Hy~D4U>FcE zNI0FS9fhHtduOsIBA=1c1NAVydQ%Z3@|z9Mh)~1QVjp&TpguaIE<_B_g*nHVaD4WX z0m41T^(zLuxTN5q#{+Sddy032*>vglbgZ(O>a?s3ncycT(}uJd-E5Et`{ptSp4Avn?`!+v1^tP%8{dUjB;lxs3z` zpTIVIE*#W+he={SyitsHkn3u0qdWmke)qDn6Cmf3M~mD>cwbfpe2qGA93gVRoGMq^ z1xC|L&a^VFG@4a}j7^45&OZwFr1; z4Z});3&)in?8LVT*{*41*_xxk2h}ID@`nPyCj)S*3Yye1rqvmt(%!M&(u}Yp*xq=# zja?dT(StqiU8Pqk+{F%j0LmiC@Ht#CV`=pnpZlC0H=2-Wi5JP-B_`Y8kJ9jr=i zUqQr#Rs*w5+Q>RS9nxgEhh)p5j&TC>d4m1^K`t7&7kgqeH}m7cLkhLG%5_FanKQdf zmKvS`V!KGufgN0z1jaN$PC*^-JmYiKxSj-=tefqZKP<6wR*fKEKUbIY*B!DP7Xhrr zZ+rizuAI~d?*UJIe`4G5kl$&!Jp(9@-!=12CW@_myKc9;0oK$&R{W7@Z$)6okY8F3 zV`*Tze1*64Zr0b|P(bLm^lNCMsUT4pEzciY2+o zZ-Z{QD8Slmh;`=N>Hn{~c8BCZWgvkGKD0Uu{*QTwju>_h@_I&DMx!9b6WjUm_6Pl= zZvlJSSp7B#rB??5aFD~=3FqZ(URrzJotUd}=qj>vx3p~FsJ+KnedMDao&XW(|2m<) z==5Nx__z;x`~VZTV0!@Om3u3^UMyptw}_$@To>TN)Rr!=Ot9_te%;N9`Fol)B}R-i zA^P;HWkT0b!qU@5uXvso$L%mClNbrnXxI)Qkq?{~k|OP~*^;Dy(#PxrqX3R|%yOod zJ7N00N~I-`TP@3_>MNI#1`!Tfs?|W}rEd)D2t{sGUtIp-E%%4<%K?1-&)~VBYkhJE zviiTi<%z0O)^-9oekq0SY+&L$*a^!jkG7SL$hMuh3KKa3YK(Aj{Ch@tdLVOHiDY!E z;33T&nAPoSh7X;q#knF?iuAVOiC$rvFvTay3t{!1Oh-*?xh}XiqtgkL@JpdS2>L+c#r#~uqwwD-+h-xu_=e)u;`Ue>4MF$2%h@qE?C%G2)R%6A?H{+|uy$ zK&72``8_{KX3_&Gt$KWvo&C}?GEhGRb4XSpu+aus0Wv4GuLV0V-9>wUd!Om{&3_0o zwD%-HQmg$LMC>Ba)HD5{kf5804g7bFR%H0#DiMIqjcTv;MIag3n?=~>E%Rw+eB3X~ zl{?1+QqHBk))%ZT2^$R{V&?6!3?R7MM?bvYYz$bYx3+9~B8pUO1)|r4bHn3&F(@Xz zrH#J2V8!hJr1BG?GqcXjzz+KnP!`Y`VcT{$nxMn4USzH3KU^cY8ha@OUBHjr((t0N z|Nq>DLuR!Iz#Gh}uaI*6{DCDndc|olFP{QIVoowMfwP`twv~Zmer6hAr2$iZ0j5N_ zzS-u!xKoiy`y$?E#B>rIA1;>zjgY>z3{}|Bw>NIY3tpQYhBY1I2jynJmN@_<#Icmf z`BDU!Y~B76$jOow&z&PI&Q{BA@=1N?5J=qj9630uhdHH7LjZlpF@EX%Wixc-1jFE1 zjQG4FB{Pvlve^g=+^KeNT@ygzdmvcDANV^~tRC#ae`odE;O|DTR(`4MS-r4SVO51V zNj|078F}WL4d(J)FRH#pGN(h53di}v zwfi_lgY#C$Tao0#2|1HIODw{J&6Xqs!W%--QuTptTA3D$G_|tg$^Er5jV8gmu|C(t zx;8i>@mI|-YnMb?7j@2ua=q57_seJtJ{kg1#QPs+?4A|gC!3fF2h8&G%9$hT~=q` z7*eP@W}119=W~}Ug=&t1Io68wiNj0%8g%8LuEq=<+Dqs=upr zIGh7>$!ppDEPOE17>}q~1{*-o+rKBvbsF}iBt>pGJ;*%)!)4A^@OOR~2yzjHj`J3m zM!@o^gPVkufjdX#Sll?^d;Xp_Rv@lA25@bb2RO?QO&ZJfya4R*yWzqRT{EiJP}YyX zNxn;)+DA+@*~5JyW6H zSD>UNc0(pR8Ib$nc%RFvGO5c>e1O{Mir02{DJlUzhmaT-pD_YLt|kjFraN-b6`%|?u_x68#&gePc^F`P9J_Ps~fK07w-EXqJC zRv)8n-5{0Ts+n&#znrnXG(YAB%Zl5X8|cinACp^NYFZZ!a+-seAz6zGdVBYocV<`_ zem&gf2*r~yOzFMnoFqKAaVN&dxNSy)|4OEYWZ+Kh9Lm|9N<1dwn zwIy>i&o4y8kf4XXm`T+>wCE_cE#(oT0R5w~+g>QqRU_{uz>`vL&5>}6I)-+#w0DPM z-K<9klPNnYQ;geO)`|W$!CCpZ5h_07vda35YdVym7=o-Vso2bY$5j(;l$Uq1z9|<< z?r*LD!`$H6l(?Nw9Hky)n4=WR%LR<2Vzk<;!^-l8yg5JhzHu(CRt9Dt_Q3`igRL$A ziF9U%jG(@890!w3fVBNMT*WaD%yaEVT467o2z5}0PG2PilDNM;(HDPSrz|E=~#S^O?6Gi9&L+__N!orS4t+r!rssq4FeU@p2#7yg^Mh%aP z$AR`qy`t-jRmCEBu z82&JzQS7x~fG8Ckn~4rOD2BlwRcXX5@$^}hokND#1Od4+QRQbTjHo&;>S z#Z1Xt;tIwSHsdXd#fQ6c`s9F#un#pgN{|hmbW%D{kUW1rJD+l2p)OpT)OkBNl7nuG zZfQ~lDco@vpnD91gjYSZxu$Ot3xuytMi@cE}V)1TzI*{;kP~A7JnF$BVunTx9Zol z)uW=C0&cHrUVWY{qR|Ugxe=JcmRlRLDAY0ODd>Yy7C3_fPI3h)Es{UuBge!hrM+0D z+)dNDfUbz?9Hky?L)St!8}1bN1xjx3R9I!*m&a8R(!hh`ZAbY#9jypMmGw>4)NMcW z*Et0yW2~%p6M7gDr~Iqr8)-3<=pvMIFE5+yDb};MAC4>TT+%alyC@&(c?G{%)`x00 zV;|~_t7)mr3JNX@PYs3xfA~ZNI}4g+4S7LUxcd>zE;?auwnoEf`z9|75v3x z8STD;da8E1RXv6xbCLYH=d-f2MpTG2o@?|Ha<@;`DU^goL#+v{vL<)Fozh``%wsV# zv!12Y!^5M{gTL({peljA{~QxkmE_`%vzXETG&T0M(W>s7t9*NK{%lJ|VRpH`1{{d!uO0^FP$=qe~Zl05&zkTKR^a;8ous`9$AvGG~wV=t-b;VR+j8^hiwwaj=2mtDHp zUsX{K18F~N45OKTXaQ5|(&zaO2W`9MZ5aLAC6=gvs0@KK}$c`-Oj0&tg4~Pav+eA0_UXTD4}|!Eu%2KTI_?fr2cU z)|akFL>3Fbeo{KSEc^-;a9*+d8nzVc%{uwY%kkvgcwa*Htd~sl!nI5X?Z?yve}niz1x*FARTp_quR(%W<(^b(C5fMd@~w-jlZ)m zoMUH`aF`Q51h?loGgtACz6e-MU5?AWWBO0b(nr{*8nG24;a_-yy|AaQDeVud%DS7W z@3zm#NC!Fuqpt7mRmfRiWq3ZHH<6n>6cZ~q!1f|JIk_1^Mn}Cgofn^~z_sSspTDR7%3sJeYmpQ^v3K4^2-~ib-mjXKHW=3QCi{ zr`(%qWKu41`LdK0$Gi73ogIxqZYx9Y!#{mG_$u~_x{2sJb<3I#U$6AWy7{re?-CO+C6nO=^SeB9nb~Z%_hs_EJv@DnKvHGc!Kij?j0fAH)UiBmpkV> z?5Z4`S<}th-w7Jlv^y`4z0xZMd^l5#D zuPQov__f%8m}i8o4MkYQDa!cxsN!lNp{XdBRfhFp=F1WTZsrq%CHY)QBysoHE2P#t zPj;=4yG1n5;#UntoIza_33V=3mc%D<-UlpLsD36&<|VeKLI96h>;C}{WE>|%M6(LE za(et&>_LFGk5@>Dl3}H5qQE?FVBKS^H9e|Ql^4W@&URE_WRgGUXO>_iSbdi><=lpb z*bJg#xrLP77Gb@H@RMI*+vw1RsUJUvr}Km8IbD8^ooDQ2)r?kflZ%EmQm$2H#fva# z(nS?l2xU*ztgR#l(k%`Sf0r=VK5p-@uckr%dC<7y%q&G%eEVKO-gmwR!AEq?+e03Z z?rrC_xMGQ`SG!A@g4~<(#?!3h)YJ-fS)h)wGymM^k2eUeWLF8-gElu+>B!@L@fll9 zq}Qq20K8W!C)y6?Pmbi%H)%PT4hLMBEMfF2dhv#-(k?C|gDG7rH?8stz7U)j&=_4; z;1KJDRkgudQ8tU_%!6iIrh>^~vCfiK}O&cx(Rxb z$urMszCF<{SUul*1gxRpz(BXo)pnYmw}x;R9I8Tp?2q&uG}cB|*Ji^Bg28avr7B&( zvO5Ubq*vYrzjq^Dns&3Lbn2XUiniitiO*=WY}D(V)$F8Obj2~k*ug_sQ(+keg`x(y~DkE z){cos#0<}&gvlU00)DBX_B_B?o831LqhOdF@M^E5k6Ao8XMq{7C0$ zdAF<^Dh$sMV4tt`NuC#-OZF;+=U!H3WY!-H2kbj1AVB3cF1n1Xw#`|awT|0CArL zW`3qOES8C3)#+yPT{SO-fJYIOf)2Us(dm;K6 z!XdX10IdPh`Am2c)lGXz%!Os@iR18x>AB1*Cl2GZ7BG#L-!;`I@4;{pFZB<-k@pec zv$22acyDw@U~$3jRFSlzo^crUn>Vl;?xnr6O3{tF-HUF!_a6vc6n%2>vbp(j4%Irc zRg-tR?OBm3842ebHPxP{nY`a0^sOA+t(rFPE19)++Mgcz43C?4I#tf+_Ps}NGFeGQ zMWymJEMl@*&#O>kt&3FG8A=<1n(ms)>>nJ%(eIpHCwJs%B*64VtcR~Dez$$ET99N$tyMckU*YRMg z=%R&!q2#F-11=)mY97h*J|C4FEpb;BNC-rZULlpE4{;xFO!Y0@23&F^8?G?CxXP60{JK%6aMY%PRJg&|B)yWR2rY*$kVaZ$lxK>q?vVD(T%A*#$vj{ z=WF-9LDp60Ar_9<{!3?XemcggHaW&kx&SXC+)7J_aK$Fr>B96L2PyIMUAn$hflcL zP0hb~vp@|#4Pq^!k=2;qkK-n!9nx_J6oQw z0r&^B5DED_l8{}wyowxVD4>19d0J#b^`DqRR6v3d-hvZCq^ihIQf3a0biCe;|DvE*4IwcJd8J#Q{Aguc0?NOpwakU0X_Nx-*Xs6n}au%BL z;>S7EJ84In_=}fj*^`}}tTfW|&hOc?_pa{GooT#_j{C~L$jgY3Gcqz#&g6NGchJp? z-FL~Ebm;h8qUfe~|2~)K)K9O1!52_}9>edgYe+u+?!Dl4)8r-Yf>qb<)piJNuwIUb z_h^Cl9vMea2QSq}bw@J=yV~ZCXu^YzK7vD6L}#OApg3AVdB*_Q-p|L!g9OQUxW!YT zU{LJE2sO7OOlK@~KO7DZ_YtrNJIu(~C%|pLG(SDPN8wSC^{@h;bYM);8yU8o!MXG~ z$GH4B7Fgb4nsdCx`hI+c`tTHuq931x{Ff)zD$Z)}oH+ORJ{FqDnGWk%=MIQ9hLsGcheb`7`3D?D zp-#5YWrojULG8=;a+cdCJSP@BC$0q^Idmwa-9{ar{Olp0$S`e97p%vmA`Pw`)=B;j z*be(~gt382K&NKtci^1`6RI#Df!w z_7D^Iya`?@x5}DmjCU5G$5iOxMJ(XEt5?rhtSk(DnR?aJ2RlRy8^sLiZ%1}eUj%>< z*6{rK(^B}L6=z#V>w7QOgnKVMl+%iQlzEHEY1DPU=~vt`vOGjT45?-xGN$vEk=+!= zFz|vY=y{d%oYf?c*ffuuto2U_eUJw)6lg>E`A#hfrlW6SGUPSa$hSSFc?~iPf1Oxu zSJxYC&N%UvnF5P@0JdPF%j(Ev*JIM6?6q&%-D!yqrtLKF09j8Fjk&vJ<^$>Z&MfQJ z!<0LuN>%sZr79{7EPAh<_ayPty#sv5R0ixvE%B`U7TZz5-706^yivU|uKJv5jxFcD zdg#H)7-hcVr>yUKrVg+t-<3DH*HVAjY4yp!5pfDna(GT&8>ZZ)6T3ub8 zY|O~BuA!gS@bK~~W?Jh$VzEv%-?W;!1J_^}Qao?6mDQAZ9{1zjQXzP2xE#SPsZ$MD@T z`e{@`K7}RMSUeeG3rb*Z42cCLla}tD3Sk=D278k<6k-p3`_>0lnu>|I=f94@0zP-U z`Zn9?Tixquqj;Za<{`zwZCP1Z3Yr%pDsmN3(vKAH&J-A-fTG)+9mGc<&Lng7a=mFi z3iz>SbR2eB&ItAZ?8*{`UbsP;0 zq?4M{kQse=V(ph6gGXs;w3Tykyn2GCV@C-kZ_2w0EuG!(11q|lYbz_vbO^@pbn?LD;&TBf`qn!6=N0N|dei;B%_$Ll=S;S zCMbY<0SoEZVWM{Ro|3_K6ztw58KLX=bD#EebH^Tr?&6NM^aVe$IZh~PZ&E`q263SX zP8Sx@dmo6^TxDdLH)g)5cAiNI&0o+Ca2_6YR)1S~((N<5Xa&`qUglJ?g8 z48(d1w(q#afbM)aNL3@4?Xl<5iu!MEuwQEjbzmUJ_rf218msNMaB1ojWjZ|31yIGCCf>`kpagvwYMB@)oQ2ki<=zFYKV#MijjHw)ss$WcuE*z{f zKZ$q-p-Y@AZx|(>_LRK(xlrquPs`38Z_!u8s#_jeQPb4P(B9r&)6zm+sLS0y(BD0n zte5PvzD7kaO08-$sV6i>N0&VJI?e4@6ebs=zo+66uYutw0m~1x63?V8dVdW~PW@!; z^Y`c4`RmJY|o1Mo?aSV*bI_^o*i8Q`2Nq2NR97K`hQ$U3bM2`77`vKcba&iS?x7&?aMFHAL2k}B zcNy)>$mgiam@H#u^yBH@XBX!1+t0B4nf@GqNe*4ed*g zboj%&^4$SAuiC2{;-F3|HhX{gAckxHJQ)K{>4}f}SE(KqBC{JvDd6~#>>Kcq;|E&! zFPSSiLYfHYmd+Ji2=-6G8<_z5HdC|8LSOdyAD^}3zEV4#pM;gXgf}ayFN{+(>nUP|7_1w_ zsqdfbvt;+&@29tb=D2|9lEj{l{TEoH_gFnBvy2UIY^^bj)RdL|0*u~Fq-lI*F+X@40X-PNWDqrOpzj6uC zTU2x|=nc*!*FMY4X1fT8e*A5$3dQnYs`y@U_Y9(E6LSQJ4r1VBILad78<9YSE3#g( z10Bm*Jl6RR3ZUzj`=;BCjkI)ICz^Y)tE(}ZcRH$;4eV#VlzT^&Z@k$;0uTrH^i6qR zI67n7mMiT0H}FO|^#5gyu`8?NwvfIst|B$BU;zFfMBfYt!o^sCItZ7YK@5M{yS31P@eth5V zHSU@GMi1Fi)Y9eyiZu#Gf1Ht>h2j`?s=1o)!=kIHeT=ygJtQ^Lf5Ho$_!FgPO`MYC zJY*EQGrw5wKS16C9P*UZuV=8vvi_bQk+>x|DG2G%ztr^Jo_9^@h4XpIjCspho<`ttJTTc{ig6+@V`|e8nx5mVVR_B zXVsmmfAtT15^&A|(J15QRdEdsl>^eaKiSRDg;oCrYQ;wEEM+#sTetpxjhue#u}NQ- z4)RVXO$V}f8n}-gQ|A*yL+GK@TK7*02J|9A^?l1s#~E9A_HwI9hCd6@X}c>XSs5s| z>NVsD5hxJdV0kOH?}TA0DfQPEHIlT#Dz1---7E%W&y&!dDTLn)vtc@~yvx%liz=3v z_D%Nl+ZKtrNGWSPydpK6s>m2@Yqo3leleZxs?Y2 z5bB|`Z9~P2LXIDpxrd4{ZZ`Z`Nb<6~vgjy3V`JtjU*~|*4`QpI&W<3VWiGe8RRRUR z@G*)|xppDhQkY-CH59y?13ukdRuRm;?tVmA6rHewYt_oU{A9*@rycm3Lfxk36CNJQ z=^rZ9lBX8c?m&T@80W< zwMfC)iyQMNeG+RPem^*R>9aHYNOkE_Ar&=SVX|Id2{0%&5CX9Q5!Q0&^I+iC_%^0sO z8Q2%igS+CbzxX^Ua=)9YZWwjd0dl?jurr7RU*z096y*$eV5|kzvfOJk`Q$z3>o&s9 zGZGHn&s;tTwX{x0e^UC_u~IQuC;G2W! zB7JiL`Q33R{1V`hafiyCxACH%jo^rcR#d}t;HfJ&uYx<;2hwZ|3a!nYE{dJ}kx%E9 z=%|0zxr<$M(vxArBTtm_L^jo8&YP1eXKdRaDl3$6%Gx^nC^!LO=E-qsLS3Km3z^%OH_=X!d_N?b)?8>J4gpS`st3-nNJHQrf{vvO@!oqm?2SN5M;HsU9MGDyd zmoI;>GDHF&L~|yOOV@eE=)Cb9+Ya0wg@pQU^$h9ajEQ$I7#1l-CXa~K(3p-rt$6g{ zH{6|}G|Adt-srvoNcuDs8%1SuWcf!pGzsKhSP(Dlb%PgUDaAYO(hhkv?VR?9Tu!G`>qm{y^ z4Te>5C~ZMlQf}P1r1GP`KSe-5!S%}*U658?qmNXKj6U_M7-r4Kr|5yi)uMQ;Zqj@` z;}HZr02Ow{ov>}UR)&)t1X~C0-mK#LgNQ|lh^Kf_aS(Qd$;&Gk{e7^ zfdvf~5?bb>u19kF>6wcrdy2}z9Re?;zndTIo8Yyk)yYd@_2ij3(>rzUBH!0yu=)#O zwb8LXQ(#s82@A-tFkfv~mN?!?+Ykp2&S5HFmX=UWf2j~PK8M?dWY zkp#7+>s^jU<*0{qxZt&Vm9{iJ!L|1FwCn$;9 zktMRFC4C3!`!6 zq1*;PL@4uC3STr&H#@FqPvo6!j5m=E^p@qY#^R_tml{oPC3vH8ct4C+vW7)u63XXp zj#>`4n!Em)u{M3-n0E@@Sp^b@E-fuV{)g1D@~P+}D*6!rj4CcCmLd@Ni>^0oBM{j4 zF%hxr}ZR#Vs5^|ycvsmRJT_aLhON7q}xRe`LH!$)ypEfnci*fnS*rB%WOMClX|B&3mU zSVS7cAO#eprMr(yDUGD0a41Ou>H0sz-uH^$@0*{xtjL*}XP(Xjx&QQ0SfKmQS^lpe zD;WEmW~U2k^Qimr)c19G?r!pky^%6J^G5zgx&+PJ~$M&(V<6NXdS`C0H!3sHmyLbn?Js zm|FZV>ZBvoIei&AsME35+1yM*BDDSP75pa(EmUMAZW#KYuJH8($4dNU$Sx40D=QA=Hw!e!U` ztVw|Yd*WM*riDMtN(acT3y(H$oU*n2Ig3fm8}c-?UdT9SL*^carOZ`?zET)OzvrI{ znG+23^=a2KHG=u=-;r#uk>NfYk?X;L6L6KG7yUztse3FrG~O?MM|EODRkS-o!00dK zjMA>-?d{x`p3_A)_>*Xj%g8we>6Iy>e5k+0J0+x7>= z#+R9GHp-(jn?=dHnjlY!yps!Z{XnJf0fPM5zG)XjIQ(ZsQ=M4b8o$Vz6~f`)D5ud- z36?h|NoPAi4ZThaUcrWtmwF?^dP3WCH-Hc8IhMQ*vcPkCtTiN1uI|QtV}kGqL+^_x^dWH*enbRqu-( zm`~j!`8=Q&|Ew`{p9SKPn6=QMH)q|=y-RfmsYGYpc3~!&=buWP{lyIbzjq{^8Fn#* ztcEf2{oOy)6v=Lfm-Z2B1%W${8c8*({y&AYf5~q021hze08eFa?KgkaNEpKmXsz~{ zNjcFi*cjZBfUgu(0>ZjgmX@3lsRyF~qY_5z&@8T_bHRPa;~u3BU#j!9)8uCM_G}B~ zi^B(kB?B@?A)Wc>)Ksy5w~}$zIgn-CZj~@?5N?z??A-*uBo#&ZK*4oP<3dX zhRF#zm-{t)#ia(yA~k_i0T405L&67J^7a?c$;v9}16_bx?YQ>Yr?0q}B1z%k>0WiD zh}bb{+o{`BY;~KbDY8k2PbgdxtC^Xd4P4x5^&krs+Cj+Y`J^Cu3RI6nyJEP{!`mg4 zzFm*zN3~UI$L`&WJ=l@QIBxL6tv}!5{+cE_gU_~<6&Jzao+6fmeua0tttU8Ra$+DZWEEgr7( zzmq4Xm0qb@+#aSuJ#&!(#*H`{8d>#YiFt#NVo5Ko>_vTw*fflcjAoAM9yd^D%VQzm zbY+DUe1#^H+=x;1APnPYAJHpEZNqMkuPq|dbERf zighwJh0Zx^s=x9#&;`i4qlZn$N^!+fnc)Z&RBA>>Qn0DNa{8w6M@W}{_d75cT$Z5G zSe1+6SXW6k9Q_^JOA}U+)sMLwEhEm#ka%v|dZ)Bs_kGT(dv2@YCCiP$2TIo!U<{+r zhI^4m>&JTSg|<~ze1qFJT5Rf4W@WSQ3?1BYR=p=i7~x4c*-va71D9P8~uSOe?C@BkK_(y?juA)bP);8^R(^<&5sc zbQo&miC0wkTq^Twm0PL3z3)<3xhkaOY5KRh!U!mM+CLx?YF@j){^q6Q`;&rcigC~8 zV}fj+p?9CivZ&(0|`iEdZwn40=O%mhgM5|U#p3A7^ZX@-98Splx;Ot zr4oC7asE))sIccOZVk;Qu*{&)24}YgHMj4>9E0|qE9%;GwdMP|obEgGXX+RC_w-oU z=91-(Vm!khjs9b?v*Z$?U?lV>n2p=|FsjI+bfO0_HO9pcb7;cXp%rw^=p)`XTU%pf zOerVuAC6=VC?8;=Sa5m7+e5HazCVC2vJmR9|6cE1_L&1}|FBiPx1wNXep=B;=t|A~ z+SaTFi5#8148cV-^M&J6UWH%jXX>9VNRG)@f1aW7gG3=D67|zNfoFH>nwHDPa(sGH z<0rbGU%2r#eoJ8|eo;NBrDci20F2QW2$pw5E1n79{`x$8Md1=w+-Z-tE!4u{A{-U_ zVa6dVFx?miJ{?-RNEs%qmEHc@k?MQ^wk|ZB=wVLf{L@-}r;XA1jU*k%%X_QUBE(Z| z@V3xRDtB4RqvVCa=wF}vmm+^(Q&fMs^f&oV%>l?}Z!MxZR)^L_Pp%0syk~W;i={Bs z$dj|{t1YN@zF5bRUTVT8OHv*MB%<3R!Xz*`(-1~{VJKwQN2+P}C#qqHrsIu)0g0Jo zk^Jm#Uu78EXf2`ZiiW{wKldqhq%-_jk(k!W-w2yKh7X2mQUD9-yzlU|ZsEL4Eaz49 zGN#q`yzWyYI({vg*AI3v^{`);o_Ty}oZ(K+epcB`I=@}x3a}9!Q}@ZzFax&q!UP?c?+XQq1!jDBqs{Q;NrvXgl`#WzonyS@gK<;3OM;SeMx7IUH zN7uY}{3xRx4bgesahk8O=*fR9>|-nV+}9y%a;U?@1yEb*b$9Q|)+} z&eaN~?_y+wR;C=r-uOywi$IkhKLrc}2S2>M(80?ZcWrf;YyVP`aC}tO>5CX`l$+dx zs2D2Dmyf1}8X%c&<`pWwmAf^w5G)6{H-zA=e^Li&i7$%DNih(J2iF9hH5qHP97YEhrwQV`sS6{bv*Q;X^P({huv?o zS#l|~`(Nn)MaYkKz$+?$DeTiR|eHUd-K=Xsau+Ptb_8UZUfHwp$!pNYxO^6TihKn=6 z8%)e(M_+F?EU1Tu?tDhg&@qvYnwm9gCH%Kymr{9CzU7{!DKf1dr5<}iZGq~vp3254 zbBb=iLge&g$x?ut@rJ)&6iu$8AifQ4$awI*S&AG|rrK+JdN?3!A6(RM;)y9j-sJHFISwW$NWwwd1j^#K^2_7z7knvjxVXvl_(YJ? zm%FsHLukkf#rq^sGleSu2$0a{Hxb-?niUg=a z2Niy(U^Wu}AKZORRhhrx<=?ZYMQ+f6^zEQjG{*f1|AUwTr&GS_GeLNTMZA6l3nTx6 zB4vcS@(6AYzTOGm;7tN6ER4S)0gV#0|}O@WfLd zS8i?_j6`Z|a!>0T2XD`%b)(mja^7C?E_lfUt*zMVMU3prd0@)NbRVDg9o^$3HZ|?+ z<;CiM9)1)Qw3Jsmn#+p8-iOzqDNC%3K`xunbm)Sa{Hb1rv%`Cmxhd{D2=W^Hv4_eJ z)Mo;+c_|*`md2*EdZvA!GZGb)ixZ-Rq*6Rw&|lgr67pdQuKdQ^pUJE7&*C%UKGVej*b8TcZUg zh@AIYZTVO=+&=?KJiMD3=t?gIMrYrdhjY?|^fd~|hN)I9zeL=Eu&ZPE_AhM13b6W* zknaZ~K=N)Sj4Z+YkyE9N21P0xI$W)C+`6O3KX~wvPm`gioisJ|b2mpl!=BY~P@1b- znn^kqNjpRp>b0u<+^d5aS0uhq21Ld%O$0?{-zZ1sbyvr~-1v(XTf~YE#LXhsdLz#qxQuoH`Rp4UZEh;C%OBS|f z$MVYOy8B-vO0GHEu7Xun$ZE=sHpgk?3N^PQDcS@;HQch7F2~MxxWBtP)^=$;f z&mmr$p}m>z*jqk~WUTH;vwc>uhB?xz4lPCSNsr$RB)MjDb34 zqLwh)$cc<^u+Oi0C$JD4^B61Lbf!Q6xpubSuohiIh)TyIdB@^Q&H?s>kv80P*ws8C znb_#s{wFC0_mu{rM8bN$u(uwiGozp09#h+&{8>AdJ#N&B_Yo$UHW=Qi!!r^^j$8_& z!v6rG=K+0!?Fa1p@QdcZt$BT!Takpz|`HJznDR%ojdj=`QFswwG_0Sgx_ z=rji;y3&Wbt`JPtIoP2%id9|zypVGxLjDli36vQ|!@!3`ujG9+dje z84xDi$e>nkwl7jJqDk$oywB#oXH-q%eSPK}@VJ}Gh8+u&|A+p75hE^NR~x5SSEg43 zBV(^Hwkh^Lx*OgL3Uz83Vg)?|7J)8MNsUP1&R_Cf`tFn0ez6Iz0%Hxcdgq`hWV_JD zs0U*hF}G5+Gr%!@P9x^;uxcZbd@}Zmd}8_?tTZ4BCQB?a4C;y~fj@np3W$t#d+@g6 z025?tCNjfcEhYl#vomViF6V)FJ-wT$0+keh6cnk~axmm|T_Bj-))6FMA1)^{YMVn(^2OA) zU*h|gMDyD6^m<_A{L7BT`O`1gw+!GfB4;Dyv+rzGs;o6NYOp@Jsl(3E7`OL51J_DE zOi90iB|yLydf2daQ0@HVEV?Ja%#*C|*t?Aq85_HiW*U9^iTXS97abO|YwZphFB>$6 zow?mdY0oq)v~qx@kF8~H6ryTj5E#-ZC^z7yHYg}pwk?BSg>b5pQS}V#xm!fRhH(NB z$MY)|zN%3WWIMH(j@=R68SU#Elm+7Y_E;lWzr!L93D_SCOY#U`nB!_lv&f~Yjc?of zM!k2zy2)@>2CwcPMMd(rcV0V**Gd<~u>D^yKz{taP$j?#xXi; zy7IQh4f(HEw^?0;QRe|yL**PSQ!6?%6FSo*64k|xk^}5h$YL!vCx}*9n%3s`*TXZW?uU!v@nk8MT5_Q*MVPivt?I`P{Qnxc_^NVmx0?x)b zp|%g{{1}d;Wuef#cc7~HXJ+2%oyX4Vh?1w=v23V}??bj6SgI{o`(v+a%vWAmRw)ls z$p~1JC7rh?&9oq$x1gL?A$7|2V4S$q9no5x_<1lyPXCfR-gAS8-97`luehm#H-=TK zA)1%H?~FKp1GlJ){tF4lU!)z(?Bh`AZy|;U_Um5tMLgN}U3%k(Jlh&OtZ`reM}3z| zq3JYl<*t!PMAe1vP3LYz?AJtXG#dp0^TS) zb9zGOZlje`W7u+v9)Hlr*iEjb;9eFN2QPOz9hT1v$7wPmjRWf+M^}wiSR~ew~z-3qe<{|eAxKXarK}|*q&QkPY z7i2FbUS2Wg4unp3)3&A^UsdESUvxyJB@D49cBCeBvL+5?CJd!rT>D!|Q_yM9ql~y$ z#Qcig34IF(zR>PqsM`5PG9f`H`u*lUi~HV`hX{0P0(XOF_NRAkQpI+5$e8-Ek|Uuf z#yHKqFkhA9q<3z)pfKJOC<3gM2L=)3*B$(oiaXRVwKspmKc1hidP_7eJ_RN0dx=`d7*?cnSFp+Z5A#}UcW{M1d>#cu;k&E!AQg%0} z!Hjz5`T}QEyJppQy6(jLdF*RW;qVq=0v;YF=ygJKVh2k?XQo8CrewanWTm_$B86h; zG*pqlj5An@r>4q68H}g%pltvIyEKPwTZOd=(dfp;rfWcOR%nL_}dz z1~gG_+P?s8(3b7-5ynNweKJG}22cF$2KFqBoupCTq{qd}kkC5Q$GNB2S zoBf)bwOa}kcpC!<-ZvFchbyj9w^)BC(o}C?Yos;kPH$7!56S3kJ==JG#+^fCeX|YmIzQa*K}_|>IidbV*Oqp11eG!;->QVb z*haua;a6I2k6PB^qA}WPN9CRVY60qX59_jh7R-4c4c0)5Vm}MM&;?ndAvwAs3!+$= z#h9;T9Z?^vclO}#6I^$W;J8kfK?WzeM(8z=PNni`~5jbhr zitfIL@}ce0_(14yBtU?P)SIu*HRk&zeuM!ycGx{wySC)xD|%M2-1Gno?`Erl8;dBf zLL-pBEE>k86JJW-@X@JY+UxYtf=XKEl(HZ8y5#mw~^{N zc?gEu3m!n%azFk?TI2hweZFgI-q*?2MF)e8M0fQbL<#B(<-)5on}%3p-d*=O=e56hJGN;wQ%!YHjAQB2{$4_BGtq%Z`(z1#OPL_vG19;7LE4y-TPHwmc? z|07ENJ?-GqUglDJDR?jMBlPs_MurO3PhC4h&%MWSozbE+lXQPsm1>E8KjP%lzPs_C zPv|Zl;W%Pa$RaQ=BoNEcKUAqxJ_KLMWb05}v~(>r{bnpJrir% zU}nT+vPbB2^dvLFei75I*`*rGtx?AY_6o))bU}C+-?{0zkC&H!sdp5Ikfd%ckI8Q2 zS1n>0W*sEeXgGkO_iAWo>$%%A+ST9sYP-B)Bx?J|UdPGuCC&YnO~)_b2>c84%|Q93 zMEP^6@|RNCU`ptSmn+XzX77HGAO5Ey zy|V}}^8qhMIRaU@b~XzwDst(nzc;DYdAPULLBTs){aTSIBWCSRVwgnAJ@J$nDL7}b zrg+M8sTBA#Rw_kNytth2?(o+Ic=_?P{DvFyrx@CNIVm2bDVCfHWL{NMAMk_jeRd}p zP41@=)x24>j8xhmU(F5;_1Mw3-W%KmX^4F>T@*)`3A*u5F2rvr`8|w}ZzWhhLm;=X z@)_vE{K%!2U3j3^`l;w&vTM8rhOzdNaOFn0rD?@fU?|MXk;Tdp z&8yI50_h*{rTNz3yG|*UeA2@UBrerO>mn(agO}*urqk3;s)Px6H+{!`mK(Hcx$&Ut zwj&97IL(0PUp;1pV=b2MHalbNJ9?*l*;ru2a0Sk$7`Y37EYECUOB7D(;SJ!_cl({|-oSDq7SF5&p+`0lN4~OD^|C2XZL=;x;4X_$!@hfcm`U{OOQlflbvj z&qc3F53?n7wZ!*h$irm05S z^2L^2S*TcP-S|QvitL6+E9H)$(x_jeG+0$@6=4ptkX1{6_So%Pr+mE;^pB)j zAOg+}Z|F|FU2iYW$bHSxb$K{=qjKaP6ph()*`31>LHCAC8U68ju&HHgaG5G=6Bm}{ z1V^YZEsl4XOmuuD=~$Qx4yXPzUdZ4p#Z-yQhO40SP-f~0j|kT~pFbOTbTulLg7^Or zaaz2DYyNzYLUr8!tpn3?bEv~%UnGadtEHnsKF&PUl?(ZL_rK;J08=5m8!;$jyTqW_ zAt7n~usi)La=c?sm$Cy~7SsbBAWr7Gx1tHb)q3sxD5>&7KHe%m$*OhJ?N2fpc3*Mx zLeZHrxbaK|jZ9F-h3rHa>wjO{03upSvdMIuTzU!O)9=1G3k!v*Y>xBLH}Y?*;C&2NG3Dfgk=+J!gZ7%t z7Uh|w@!NxjJ00|FbweIyROR+Po>!EW)w@j8l?qwCcKHd zq}*j>?3WEOG&0ESYU=*2lyrUNubiANzs=9V)7H?GGHx}LKK`UJF(!K1B ztc?+9>WW?#Mt;VV25X@HGl$l{2acR~y~#bhl3V2@0wxN~e0Bzlfg^!T^;EQuziD=6 zLyY@|am6H$&63v{mInH2hb!R`r_+w&lG4}e>*!5`DpZ=*M5g5NKMKw>q&J?wmYB%& zB#pT5(wW%#+SN8_@$~+8evb}`eqAcJ{q@R=B1`_&A#KA`e>Y>Wdjgyeza*kNDgj+{ zKC4^WGhf>D-RHOa9gZ}^gVVt#Y66FMcq$P_y$)Gl1$yDL&1b6(68=xt(WS8EemQAeqfXlRWG6lVH_ko#(MN;b# z%ti2U2Yy~dPWMCWi#%9i^^F~SX(jt}zIqOztwZ8bo5{fqs6mC&&XmZWwZ^)qcIP>c z#>S%G{0{Dy_U0D4OSWq=mVDSLbnvPYI+_#J+Y&pP6FxU5Y<{3{;tG|-g)J@3ecH~; zc6A3;fH_b_Fw`*7FX7g%pjU??8Gg&9k2j|VI6JjvW3S(sB8LImo{zJtwq_imM4P^P ziMkp!O^7^uX{%Twyc7$ahkvX@=qAdc5>P=VWf(`DLM{>x|FX|07zHUf{vkUZP4CCJ zVo)(>kiV1{(Ngby#-d@!A-i5`&z6VI*-_Ar%8Ig)AyASlP$dJzeV`;`s3aU$-_o&S zsEk`^xVc(LYOmdz% zbsjo)tyzX5CrQbaeq8l2OcsQeAk?P#vqFtJYJ26{xGt=Lxx3^?fsD{K=uh}%i6yg3 zpF=A|Nao(v(yXeo04P-<&vsU3mx~|vuincj+}LR7#VLB^Q^sg|cR6u{1u!IZd`JXP zYqur3e_fSi9C0a+lPKSP*&EZs5}heTRmd_EA^CA2lO?)^fvSZi{ZsHCLEcyCCF4%( zb9@&Tyh0~1f-JM0V7Yj(T;}G=&i*c24j#xBgfz8xb{tt)SWpPMzAtPT^lo9JpFGgh z5cUmI|B$8YcFDG2ZB27K)@p6p09f_jOFC-wQMd~4boEqaUdKoLL-l5~YKmc;`u z^cg&P#$EZw_o%M$i4k^Yun^=H-h11s8*gS#Ztb2+DdjwyrpW)m=m3j|I0XfXEuES) z$6^;Vx{BoW&bqvn&xJE8hb$jb+&KVDH%CQFgy!F8n>ihtKP zH$RJ{-a@%0qsU5B%SL(iKtQmazIjjxOJFKr0Hi+#Tn&`W4@ziGU_$onX#RwXG7Ue*QoX4QsOW!vcPEBOFlv~hkzX_G%2R<2Ul z1@u-|AHJynh1sHNbJB6MNr!IHsm%o`M*67(&d&b{i~pd7|6HSVVO2h(43rJzitf9# zDhWP$jxnUN3RRusW#}|1TrT-KX*g(W!^OaW@9jrGHyBV|Zppk*?ZLI+p)0ts|BuSM zcN89zxzNmPRg%uBitn;^Ho5!@r!Etxu9*n@I#Y=*6BitARgy^Ad~tWxnW&p_F?&j0 zC1QBwa^gD!d9ux_^;X-#Wz2R4i!U%#qX9vuSDI$^xqIN;Ap96r2k{%-W0h;$I@BK9 zd>+*CrHco0loJTzpp@droxVK=qZoIk3Fo-qQ?lRes}KQRc<3-96-N&0Hxcp<8WfTZ zt*OkA?8OO%mP}F>qThbguA94oprc~(2A1mBE$Y0_nAJsb38LVtmRg^`SLRBXN(On@ zlzJDn1WDa+j-&E~Jc&AYbX|nhhbE?K?mx7};|%02$>hhKlnN^&D*C7?+g8kgFStH< zB^1g+o$d84@4Ljwx$MUIMsb1s_8`W5>aZ#N*-Jz9DntjitL`yU10vDoMA37iOV33q zXH8AhY#3XRX=7|!udm7X13!x&OG3w>;P+l*vM`Cc;6U=v!(TR%yq2A9EUhY3 zm=n_TE;kB&U9=;4S$BT9nS(W_I{ly5n}76wZo%y+{A&bRVO!aFk!NCVV+jZLg|p($ zO!l4$*fqMcNWr*D?r~UR>z)F0tzJdFK+k>c34iehAJT@HyHb1MBlO3{OjseXzC2j+ ztprqIxmT%Uwf-}lqDBrz6yy;E*4EaSR8;VDiv;`%3$MS+TBsCShBWT;_V!P5t3-lE z7dTXUpKwx~(sOg85EQKG8?0E)es0JWy7Q^tAtP3bO#Q)U4vox8>nNd6WA6OQ5zQ!x z$}kBsb+b8c#-`=e?v={{Lh03fBHH5-!)*Df=|YWHL-U#w-UU?Z98hpxxP&?d#hpy1 zU_!j@HuI+OgZHjn{h;7$r3(RCHMK`Hc#f_kYvvw`9Tc0R`M{DlC~W#9y%u~%h> z)j~`h32;X>K@kUN&Wee|1RFw#8k#11vw#+qC<@A!51!Hs^=9zE&yqtHU(*!*Lj71? zSkqtfWNfc7bJgh_#v*BSl;v?TpJikJIdUz(FX(;y1L1GAdtcA&=?+2|7&SCN0!6aV zb)7m<#qMXXCieNW6hchNxuMDKj)(V9Y^~(RK~SGVl8vPo!pZs?+8LBw@f^wzZ7KRZ z3<_feyzp!d-@JtXRM`# z%HL0`tC`gH8%7CuyQ#dC^!3_RC9C;h#&D;g^JGic@wt4^!drE|ub&XI8(E@d4~96s zC5qt(z0R0CNIE%mr8`j5qdRAyPS>zij1ul3c7X!NK~XFCEtH%!evTVAAZec9H50Hb zf<)Wxs~tVOjo^4vFvB7F=yv1tjJnEdwN)j%WAeGDO^Nu#*uzpw+yM#75o zb2^xgtE0Z7C9;rvf>kUiyjQy%?R87Cp|noY%tEk>*S`@WEJq^mDnD#@{S<4T``kab zJO;jNh@e+Ekm*>|>^r-jmNQoH7GeZjz=d3Vrq- z)SCcUB*nlfq8YC&i|ic-17^rQ^qsg=JnME%$U zhB46tplXeKLhEI>DGx4$<`HW>xi9{z+F0#rfxUe`fARFJl>#ufJSfhx;y{dzy9CUU zp?h~4g7baZ3*eo`c(8jPR)mJvpb&j-P8MkS{2Stxwx7!zF%fltALWpjYaW425KPIb zOnX6~6~$W=Sduf&V20hBS#?HT zKUkLsLrr16WAsBEVsOd*>_MIwWWkiw&aX%;bgfy?k*l5(e^%ck zM~9SVE`BjYtVbesmA~>DYP{0q_7l#kvMriFDvkAm5;x5;L7lx=1e9a{IrAaNvBdyx zCqNimwPgsEQ91_n&)b8P4vH-|KL3onRm<4Nt?8o*DP$yJk1@;a2gnAt%rk&}n8xK8 zpu)%GVTtu}o;TH@<{PxS37GxmYp%N(rC@Y%g z84#%-%L-%6p_^cW*o_)6#3>(4ts!d(9p#F#L(tXZ39|v>B|(>DvfwH}8%Y9;99!7Hk+T zRDUck!093N;Jz9mrd}fBVLMI9)sr%-eZ$s~-Zi;gAI5g-pb0SHb!9@Z{fSwcp2(M3 z{i9^Pe_!a-6LlfmVe1oLzPUCPyUJ8-)Hxiazx06>b~ykHio+KxVF<7C^zTYtP3)~? z1AF+}ALCA78*jn9M6$G=n%CF1;8SW+8a5suufXb*SD9r^N?aba}W z6kRk%bz!ION!UZe!G-gI`6ugFQY4hAsPG9@zS> z>~xc*wc`C-N-sSwVRX-}miIy?@z1q37}aKz^BlQ`{k`HTcHsEOd^uh)5Q}(DAMFF= zc(ubPUU)USlcqrW-FEcGvX+(ti*5i;M~ z{5j`GR|hnZi~Y(ra=#z*l<&1DMvP`0z=dDaMJk*Ao+HpEu%(NV=2;$vxM3R!zpk=D zyK6s7w(@~}@kL%sE3M&^3FI+xOlYqyM>J%j4#O~1Q)+(Ff4U$J5zV2s=7Z>|rEQR6 z)r1$l70Qy>ehA^Y6>{n{uE@KAO$a~u%{7#g!tQ_hqU3M)2y`;d``wU77FeXM^_^7q6Y0GppESwS-zI%il0T z<&xcj?(17WbD4zf4(fqTytBi5|LE!46HDubRIbl>B?a+0wI`<{8Q zM>Yw*snP=-#pLISj3i!G~i>1+2$6!wlTTAw}!I%k$%?8Kv$R zsS_(W_)x+kni__^&JPOqdk&e{_s6ak8;?Kg?`pgcyy*mTB|WsWNDCA2LNT6_eOtbr zj59$A(A)F$QbCF^N;rA%%Z_OA<9g|b?x{2$o7%OcgQQjv~*&&x~}bP7*1dt9S4 zcapp*S9?9$&P3I)JfTbrk|4ijF}-}W)1SSsG46z-^xuxio)RT-(*C*D6cf{^aI~GM zG0BU9QYacRcXDB2RH8#W^Jz6Ml`pT0at;HZnfUp;OIqg(Bz48sX5ME0UoHT_hpPma zZPN|Ko7t2UjBE=gx^HNeP4XOnT{r|yrI$)mL?YlrOC*4YWQF5#6W9wU5>yCalT9>uC8x1`obIv~)WG#|0!U*Rv?5htO#pW1s>I_y?iA zL9$>^Pvy>g0tdG@=T^%`ZpNl+flgo+s+R`DCZ66@r>4&Qwsrbegi)Ekbt&Xc>fSt2 zcVlNOd)N7eG~vKePy1Zc?~Xqw*!P|5iS!J)%Cn`0IHNfbhh|zw^B91$i?Sd$BYy}k z@m39J#4PmL>}{!-sO-0L)BH^tJ|(s-HpgC9&JDRp?X1M_-vDN%i-+%WM$)oZ{AX_8 zcMeqMkgJ0p{LW?d2&jA%Fx=cMcXs7oZiU9J*z439T1=ajoo}S;Bq0g&#B0SD0r)L~ zpPT=_zB1osCiyCMAyl%H-1+sc>jD(8Pj@6D@U3(5K>qqqinwA)3nip49sK^u3r_=~yv_q`$52>uytUFPbr%`lPavD;n7b$@IFo zR(Tb@oN_ua0AENSG@rQrU8!C_by4@1JE8QT5H1m0mc~EzpJ3WgJn@wRkw~kTs}fL} z{+^vTYxsknMeZ{JZ}EV7A20Lqv%eXV(In*2l0`^cJJr825px-+baB|(Y4bppXja7K z4RoP?C@b{PI=D~6$GjVJR8HLRt+PZhbOErP@X@HW4tMku@xDlaVTW;Y*7=t(=S!FR znz+|zpGVw74rXc2jDcJcTZvycF*$fbtEDN>hQS+wt@ujBmcH$`g%sR33G^TOc7j(iW z+6~bM9u>T){Q;-yKH(84#Ex>2EOK1t9z2MeqCIpc%$!-3H~#c3pBsN(d_s@No7U3U znBVSbJEW7B>9;(+un4$IA;VnPMG3{HAnA%iZ<0U{Bz11%D&?$JyE@nIDe^w`5SnW= z(AhHu8By8Hq-FYg(^bFRX@bS^2(78f_l^(w3h;W<#@^oE2zs5yAc&+*#y4)R<66knn{BDd)q_TcZ+;~j9mZGqpJrm@SHJJJWlY| z@k3YgjDczHq-{d=s@fmlfbPv zIA9$tJv7+TsF`3EIh`4B*h2M3&Yy@8vhS~rK!UDkNW@fKAJ3N6FUSXuX0H%l9_Ooh z%}Hl53Y5SF{&=+TNT-YX$!VvQsLd>6Zbj9n8fg#IDEhSP^uTS#s%zizhAHN2v#ke9 zHW?71S(-1MD~HIIB4la98<;=Zcz>DfmrfMeqMWglwgp+scTcU4Ani(^2ipA39D98; zGjqy%$pnG0z4-<-IcI$xiO@wgZMy7c?V#SZXhN0GB%Qr3dKMjSwC$98DLQ+-9i2EH zLd>lTP0M{e&ZzR_&@!V2%550nvcC!xZTs$k4mFZb+IP0@N*P`SL{!y3&av<|*)L8Y?V+<@C>G zOP=OXQ9A8dIi$$hUX0=~wy#*4^sKOa8+Z?6517p(&g`ftXe}Xj@-itE!Wku|vbAr~ zQ4-#h#rg)Up`GO0iC^jHr#a#`zZ>bT#|a~vsd>Q3v!?cQzm`4~NSR~MYnw);VC~l6 z>`7E(g3|~LE}L9nyEpq+?DfD%_0+d=uYV%}r44ZAQRGok&SJHYWOfPqTZvJ1Ujy-S zhdB%hZR7OPDE7A^Jg%Vwzj(8Evtxkg=Mqm$(My<}?nf~vNKrXd4v#D*MM+N&=|GT5 zdLR?hUH}FH2g=QxOuEV-UFQsMiANfU-{RB)fJ}GkJTpFLtJ9@I^9tWK%a;yXU^;J% z0#&tht_A&4e1sWjl_ti{CQG8v$Iu$Mx&kxCQn$*kgG(x@_57RJm6u(|3;dqR-#>q( zm(GG)lQl)oSTG{Xp`rQj?Q5RW+r{Dg`W!;ULu&x$NMmOu2^K=K zmJtC=QxFpqgC;zjQ>Nl~Qq@J#=qZBFV8RhuZAB&uQv4#FG_^bMWKo*$#Ph%A#0E#- zORY^ZU6?q+zTg*B@M z7)~L8?bu|-L@Hm@B#5zklEO8S^{%Od>)AB)5fer2Pe8)&f0t+LM7b$u_+ndNt|{CLcI?>N z-byTQIKm({8(lR_8(0Xuzv%s(9*mG+eH+Qg*aYW!h!hN`jLr1z4hNepg=!Z&&(j;@ zDI%1K`bf9XZMX~~&FtGjar%F^!aRKeNa6tdj9w-S>OX>2`CMt_0H9p&GBdPxE)xai z%r@^i;_6CGXvTYrgf~SG)74vG^|ok~VgxJdou(M*$co z8BPutJha3VR7x?!5^wJMe+-lQ&(juPw|Tt^d>5dzXPiuUzp0s3WoLVWHRw1V%*D#O zUeOI4MMWieVz;)=RM^_C2oxVN&COcT%@odS*AVya*G}srCcb$FdHjAX&v5|AU~N_h zE^KN7y)5H=Tr^~B=UnKXPDFOBj zJRZ(h5PKu{Z2bPt6i8#SfdNn^$DL4t>!I}rjFkRzQQBuAlEVEwy7(={atBDJ?#s!@ zzh~`M1^&huv&y)J1h2cp$q!^HZlx+cIz1LUnNB$LDrzynCW7|rv2WL5_IPMR?FLdX zjWt1qus<#O^GFhm#^3Nr>p4bq560Ee5$5<^)Rra@v zA`=xc{wM3yql<>1wMjC{#D+Dy7Sb36Md1yGS3GSna-ZZveBJzZFkR>kklsJp#s6+} zmuanj1JZl}Zi(Q-fHs`)6Bd5~U&{JRV2{V~&&=VS9)J90D7rfCk;Fz-X=}%;y3rrsN(xLhRVw#BikM zySJ@h$XZy#6CeKZ+(Dj+ii_Zr4eOX8S-RkMRcGWi?3&}3_XPTn^pLJuP~rcEAVGl& zl?WbMtT53Oi;rZ=2P`sC#Wa~Cm^pb0fq<~d#=QCbZfT-ORk||xw>snZLGj#n@a&)c zvzNgFEbXAe)!5Aj=auefoHm~3&!(JQ=RTq`HP7&H1E)DUQN$(=EsamDS|XS}1_xQ! zKk_)zk7DS%hASP!;}E+ti+;!C)37r)C72Cv#t8E%v!N7U@igQ1S23EY^A+2X zQ9jZYkF49_YP?&04I*UflVv9{d|aHa9!k>49yzpL{|T0F$!|k1b1CRb;5L{7n0+tX>y@VENGic!?*_@>o|**?V~k-ENHF$)dUMkkOgJ+O?5t zeAWWF=tZW&q@noRCuTC*ENlyFkF=oS&i1F(1%8JlKvA)Vt!XI_G@GvA?b4g=gbeOq zS<=ByUH2$MNB0B~htw>CZu)4eC~!bjxVm%n%xYUalxQ)my;1lIq_7GT1rh!y=E;^1 z`LuazEy)>td8wHsibjJ)p!VQC@#s%tt_bgKeEe|LH}42GIFBWCNI&%F8a~f(!}}+{ z;Pr7Wh53EEy@#=4Zk&*Y_OGDrV#75wuGE86m$!7RYBx!jG1%93ypsfk^_qv|UZ~@l zlOQr5pLzE=h@WeS9`r^C;o4S=j*h}Gsk?~rUeUkVkdPtt>n)*t(eupfVpE1E1cY!H z&!R`)+TUL$f!2VSA}#YI3ifzv?zkbn$@F=_y^m{`Ng>S*a-b8Gz_It*hn4Lm)F_@0 zmL$v8qVYqT&lOC?!p2eqfJv8<@US!9^jM^Qb$} zr4q2z=#)5_`Jk#l4i|40$`W{)>MXv7crMg8h@H&nk?t_gXID3!^>JL9d%Df(Nw(6b zkGwi!O%&7>d}WO_zaZuWAm)arbNNO6)cpepP@_(PAohr;v1XI$ z8Du{F_W{q~YxtU;TTG%PDok3V#Mc3k2O1IRKkTlg5X<;n?w}JC6ogps_`&P_Qj933 znUngP74=$(2R9V?fc{MuG6>_*j$(^4z$)$9Jd!x+-=aKV^!+)vv;^+G*sRs>A2e~RC5r|gGT<&|S*tJz6hV3~HYP3HvKX|@F%lIVOF^t7cb2+lAJk>*x0)6?l z&<8_j+6p{paZ3$9M>fRT=nGAa_M_D&2@!ldre5Z(7f`t z^>y7#X>i?QYZGKdpPlm9yVHtaLOBWBOBHjf8EA6BI-#4RH zDZp4LqMI#D>xbIj0HfMNs8=(Y^4ATx2f&WW2Q72f*+~`+!Pf`rxQd@&w8jAlG(%q!PK8hSx;B~b-qoU@JPaa>o62=rSE9N0$Y{`MDy(GXLo77t_PR_$tDEzj zhTjpKuo$y)Bq{%gBlW}JWzXB6?okGYy)Vc04~D`Mipe;A@j|T$3*H)XjeWP(dG~H2 z*R&v9z(^`OJ6z#XJE*7y`Z*X&qxM(9prX}T?Mpvv$O2o*rIg)}oarw*`aS`IGnLmY zhK#w#21{407X~*SC!>sjlPO$j=tx|zg{e{G>$HMo1cY=!LhC#kvGc?Em(VFQSlDY9 zmXLyYXuW0y=F%tb(jZFJI~gBpOmzd#)6Y*Km*mW#C1}i*T4lq;O{PA5e5DjlJ+iU+ zi7Z`>K#O?lWb!NDveo>>Sf4;iFf7q;>cvKn!-{?-nYuFV9Wm)LRRCgpwolIs#8_*keH?MPww_&VAcY1DY9DHzd2`W>O?arY^mn- z{9Pt_kXhb^KNH`Jon(rbLFW#XNiz3n1{W2-OA;T|Y5lq!MP;UmzWnVFP}G~B40|{| zyi&D3xIX66=ElBvnW4VEVQkcw&L0;la&DcjoUd`Bu?OE~pv=WNq1xj-8QCOACv13A zzTO<&uM)l=$=%!b4Yj_wnVmC?(fA#Z-ho4mz94w!(G_hWJ`#eI$;1q^+VA$PT@`b6 z^)G_(@mN#GJ&AdB?K00Yn>r~;Ywl~5t z&DM3^^o~@LLI{le6s2<-4|CiI^VPR~VEbI=Gt2YxivY5AqKi`WA&=62$^9*0ZIZ*p zyvq=x!QE^aYiwRe2&w>`QxZc(faYHV6_Ab9<=@P;e8h>rt)ehhQ0SupwuE_tF*k+r z^`wLvvcAZEg=r-Gzh3i1C#%d-eFQ*=)ba_)_m z2&{V>^PW0$q`fqRM&ultxXFd-mjf>WGx@fD@2v~=!98%y%(^6nnPdIpX&`Vh-v|wQ zFY+3LQ?~|BbA8E(oY~sGjD059Y?khr@ipHw^uymnKb!GFYNDd`OjjE8=&vFn#t~cZ zf~pJKy3s5N^KH7hHP=e7$fgKpD2mD3;KZ2bi_dk|`RNk8Pc_+%mQ>+A?B(Ecd2 z*0%(r#C#rwhcZd@_s8`}PDtLitotO*362{Gari&muks{QViUX^7M#Xv*+RdHB044g z)V-5s(8n7ua~@{dhD|wfQ)xQD1c=6ojTzNyDl`aN-_{I3$WM7m?v-Ep;@;hHr~6HG z5e~h4?a;>-Q=}9Zp>HzxOAbW)8aic|us*#%Gnc5Jqzx;?y3ERj+Hf`WySHXec^2{M zur>rv;p4DfuC|oCLplFK@)oGnG{(XcdW-=+lJ9zH+uyrrYFv@5jI*3M!jJ6q(k^;t zQ}_MrDKj%O0cmMz{2qHdMMA@c8NI_4eDqXQ0mPT&>WS|N(Mg34n-99id|w57NY`jU z*jXsR2SPoEo*VO@Lq1AlzxZS^RHnBY&G9Q55?&u9#_8kW!R;R-z17P8@|qk=Jut|b zS4BB@p-=Ja;1>aeCovj|ss_SjZnyREOqikBW$Etq6+^B-W-#-YG%UGeV$R|h6ngs- znh(6*3^p_}!hKEIXNYs(Vo#{f{+E7smKtzxeCYxzzP$Fy9J4uzl~Z9+((9dG`uUtW zjL4?D;ZiS3qiPr*=&a9!fSGYA-W9ya*pN@)=HF8AXzrEHbx5FcGK56)=oY`3XOIF} zqPMh0pnIg~h7NdDc$3St0`}qx2ev4{wFWvbIq<04=|}sAM!gAe``apI zU5Rp>jA^6b8_`pr!C?AsC?;M?RGa>}YavGPZ@WvLtV&F4wc{Tctw(1@pedZEd8cw3 z%*(w5cGKJ~E{J>ODFp47lO-r*rL;c$3m&kGI=Qc}MB)9BBVwjhbN66m82IAb@h#Rl zA|S+Ly(gXRa`_7@A+5+Ofl=0=7|Yzjsk5H3X=>B{_Yy;YAy--$G=wD^5VpU{*0!hr zE}I<+_&m+6$7(+U-*;~q(YbfeAMvi{IkT?WS)$LTHy_sAyvZrV4MTn024YXNhl6?V zI68NCkW)K&^hg`mu!S`!Ltebk{vTP_0T$)4wLj!W6B|)!QVqnQfFL48dX$n_0O=h9 zB1o0q+4UNgjzj?wDMFCmrPoA?N|)Y|-eIXr-T%yDa&iB8%p+#mZ|0jhbNYFY9NC(L zU~MtaOiODXTb?QI`8$u)3*nF<&rxSH_cRFNzKsU+{u>r<{vYwq&Wl42-seERc854N zS!1^hetl89;X4v=ukBVQ`$HxkwYgcJxBLs&gk_zce?h!YYv1IypA?O9wf@4ojH|)Z z6CCX$*gA-^vU`U=1WRw!^iDLz07~Gh$nci5D-^}K3o!+5-ooi?YHH37R!AS89b|uU zoIMCs8m>2Q-sE$hj-6{`)_xT|?_Z>I9w=A-2N8+2Q~p8^$F1~|9hW^$;WaJ_srZNU zA4NJSa^q!=wdfBJJM+39U4K>5$1oFUb)*jO+|k;~jM}YCeF7tU;T}M~A>xIu4<{T)+6rMr4 zmX>h={GRv=c`geBqRz8gfUj6fS~etEdakpR1YR}-2F~*F^VcpnNwYUeleU?0wvLWJ z0*>Y`Y8EW9IP|bZJ=scKOhy-c-?G+4j9Wi3#AkY3a8k4f#jxF!{I19$uo%7Rp=si3 zbmi`NiArMgu*HppW5-@*LRbgFNcHMG=3K0CAJtJ$GgdgQKGd zkboPhGT{P1G4`e6;jJV-4G^l8Z%RzSm^OVxaZBTAIRK)C!P?-W$9;z)D03bwY; zavRi@XE8)s7BNrPR`w&Y{g)$8glDWnRPF5AoQ}`@NB8MJf26lSCPakFYZRpL8q*d$ zeygE&Wi`4`qLnr9jezh#a=u#eR8x8e-SBMafL2nm<^dak7dr$_5xfP+D4~#X^;m+?}W`A-4ZfEQaM@r$0eB zqO@BuSkJN5lx%`I7xUx}28TD1AlVh`I!Pn3C?m1HGZA-ta9dz`-G05_rPfS(tJ`%p z8=TCKti7!88sN}-_Ac)Qi?$!H<(tNCjiwl|$>=85v+Yz(+F!6309VcWZ3ePPnlvGQ zBxo%3YFcMtF5!&_jX|&qpCug+Vc*Kk7XjF6_nNr}vJukkJIlM{|+80LW8=Bv1%s)|^j zD18cX(E+MvZjd&RQUD&_ATPw~QxX+>=x0{@UR)_i)9c&yV8Hj@=Dloe?0Wtu1L=U* z5FrMg6K-k4UD=(-50*ENQFqw7l|(Bn?+i?=1~Z&!vAWY@RlepBI38$Q%gou`aF;%? zQA{D>Y`cb^fRf9iWgqzUcMLdDKHVHVn&Esz$sel@8320xc&yJYfP zJ)kT8Z{*8Ukbu}+S7^0_IHHH|4_KyPM}Am%%mW z!HSFbtC&)y(ha+pgz;v${x!@MXK;1Rn+*rMZCM;_%}%|`>k`VLMVBSCJ40kwo64qk zVRwF^X1#*6({}m;N>yQzbhqtuXlfC)AN}Q~B1B&DYFC}StRhF?hfErVs^^kIC6W#4M$MkG;JS4S8mZ8wd~ z;5IY?C&%lO6lo*I|F55^3uMeJF6S0HmT^HSvCza`z@1y%rLd@24Z_UKDYOXC%{fiN zvPMZ!?YyjD+|zuscpYOO$>9qov&^i1nnUjR=@s|M2@EAs)Q3a@^ng9mg)$f{P}BWaKv}S zmSAt%IvySX#5dBNi$W^XzE{L%&B2{>vP*p9&h}!vG&)o9o}L~H&(&1Jz>3Yfih!o= z`lhO;-Pwt_%uEp{dYO~pkS}$0K38)v+}PqRz1x7;q1#qr(>dWqg+d8eIj_UxTqB*C zjctWF!!-QuK3})x6&w1d>%i7J0CG30Smar3L$$0Aw7EWHyIq!%kpXDHws1lmaM#025iNk+C@^3MB4WgEr zV4A8B+$>qA)QuWGosu~~UAAQ$>w>G-R6?o|tF4>q+4Ai%{@PY0lH7JKZY`J4-Q+D? zTwDxYORP%3QSi~qrJhg2c-{QM<3nMpT-Gl^p#^`Z&25)Xh@nHk0vwkp!oKOQG+R1i zf!D~kjrnp(g}t1S~@y@(0&}+4Wfo*AKNVj1U)3_8R!c}*pFa6*XgzU1PCYuyKiKTXuBWy z<<8(}?Z{T*?%=nof>_ptly)6*{l@l23~8NMZMdBP6?dRuM<+HO=yHaDD^i6lkAxPQ zcnTDMTy6WcART0-{Bjia{Y8V#Vkn@%Dh~+@4$?7XtXB0DPvlj0^uU=wejZcc8gBl@ z)%XFQsi`S4A3Xr%F*#J$(n^_;;4Hy&2=iTWTJUT6iyWQ_5)=_(2YlA;a3X5e*Hp3S zIn9E<1H#*NcjZ19UZ(=(J%S%-hQI2rO=m`O9K#CIAacRbbi8J2O3GxsGCxV}W45J* zCfrJV|qURD4}a#{NDehDR}P5zRo80AMI;&y6@JEX036B}rkd|c*a zgAWMIQ_^CRET9J@J4j_s=fI)fGHkMV?iUD;%=!&&Q&}Gae>AHfxD1?*H~+S_(2MN5 zp*PNf5=;;qqnsHGydT@tnf$;dg?#2re#)o}ATKlmx}$H0kJ=$Ovsy)u1YFVb?5+8n=@j~m=Yc?%0ET1i#& z*_56n6EKH&W5m;tUIB4O%v z;iX=>2730UG(I|2u4egz?wTV(1cY$vs^rjaFM+!&itLCyC*1Qxe-_|K<>dEP=3A|9 zdmm5XL5tV=88fF+HQ|a=Bj=FF$^vDgod&$P7}5_0?o;4{#6F~TE{oz4_`hsu|8L9a zKo3}-X?iIjq~rfk^+1<gv?8>|(HNn%yC@dcku-+-`2V9W+eT5L^Fr;I$H*Sn1HA{Y&gk zeIbV7J8vGB{60KGlKBQtC#t{9v}|K0BpPm9m)MG0sIuLzv8^Keo~eEWBnlr*{#Atq zE0>#r8u6Jx7b~&#=PO9!Uo1?yK@QR6+7Yteo}iyfD&%A zHN;eV`bYd7$b@yB+BQ16l2Oy9B~)Cudgnr3f=W*9fMVt`e8sM__q#%ujsOYEfkp2V zAtDAiasTbr0!SIfP1J6FFo)(`&e7Gn2Wyv^D`rg_L>|`+irw@c$;2%SV0afDZJsJn zv|nhSQ^=k2|EZY`9B7CioZ;Zu^qBYAi}3ARyNm*4NH<@VKPW}(CFxRSJcm#Phpam~ zI)`bXarV;ArWr8~a4jeC8TyR@*o7)^ajldK)gl$E4d%j;WXFK18=T`PdQCRml^lDm*6Yu^wHYnQ~+zXkR7@olQuYN6>sviFfRwZ5y`X3-AZ;DSlH zP7p)m@#^Fw)VKBd5avLaGg5Wjlcj-^{Gt~*;|I~`6P4p#1<<79KUnO;TSo`kCG|}x znUr?jH|9V0hY}dsi}~RcvZzRl!6e3tRb9gXhlxheL(I=Fx7&jXbq-fgBv_tf{pHNDHUJCY9X`f+R=Cef;*l5i6vk%J}z)6SB|I1`J>_ z;)SjRWWi?XhEf@s! zjHflx+0SnCtwDOgzJU+Y^zjjO9!loQc`p?zb`UQ@x1@5JdG$qR6tWntDmQy{w&wgE}`7;Aql8bBrbvP8cdyuxNbnor<%O(UneKwVReR0;?l_` z_Jv?mKzNj)xtG5r>YT$yBPn#UiG?+w+Vr7&WlgqMZT`9IyMxqNM@J)JT|OlIYx#;n zJxpxsnD!Ot0CwbY)QcrY?UI#n+@Ko*D|bxS;0Yc{oF+U=lpjeBKWJjpa^@J;To%S8 zCxI)KW)r)_#9!LSevHeMN;uX&nWgt9a?qLi7o4?3{!x93>iQ~j-H7@IC7TL5gt`uIye587 z<+R&YlkACVlf&-K_2fZWA(r)E_GO`9PJNUAem)he3(Cu+y>?jje7XzD*5&(qBv_Iy z22|FODjqI)zm?x1wVlPyPIY^9>NDEEhWyt|n9*FGjvI@#dhnANCSNXtE?U9mF+g$B zH|fmK2ZIWK%=k`gIpZ{B>+GKm+eV2;l18ee3`Vw6ly!gqM6}mh5s_FybVbTKkehpr zeY_8Y!F=$c7?!|91EzrPjqB4tLXCr#6)j<#u*9OAm`isKdbLlc^HWX1sTfwhcvikWrDlPRvX`6B3V<*@QXQbYk3Zzit&k82!;yh$@5W)^oe&<2*l;c z;m?Wk!(AWTFYB@~K+nX))(^w=dK-BQB0(`J3MEkqjRz)mN}S2aAA*3aV~FWWRlea$V69I6>L18q;97*p;-pf=WyahiXxn6H zbZuw}!@lLNlkb0#*!WwyzEKmpP^|n;$R;GMuOd#+kk49}p{{WQRocm^NRuSxtG}ZPc<(mNm6s}rVW-wyi>#N2i<8;`_cksUo z>>ihQn{ca{as3v+!nGL0qIetY)raB!jl70?xG}OLPyq)1H`tGDHfDs65f&1=eahRT z$suG44m;t154|WPgkbr#5}mER3`Zkk=Jp%nG6mcm92qY+tEsi`tp6EAH8fF|Bf%|a zSbAyM94Qhf!J%=PKAe68Qi@RZK*rl%?Rx&Ok*X=3S1;4$b3+vp`hwyn|5OCNQaNjU zKB)W?17bR=x$Rmu^x)*^h`O6fhg)8)K;FzW!H28X*&a*OCqCa%+qcnJbNY2~c@*A{ ze3I!CuDA=$d?39ZnkoGUM_|C6Xl-q^8>)N&r#$m%*!~26*(V0{AN8tyz)`;H_d_b9 zMRpFDmQq-x+pCw!HNJvi;|d!c&+2hri1w3cito39y~8>Jd7YK|SZls=qsEqup@|u_ zZ{F&oi(s%nAk(z0X?IiBime!> z;obKgpO_e?AuXarCgA`LasOw)^_CvpB2+$$C#2PclE8`%!C6g_V%-Jrgz`5l};Sl4ICbMAhwl@4Ox zSyVuizUoxC{bcw7mvDuYjZHrbRxDp~%5J*-SxD*HYVq)lkc_d%n>S#tV>4B27a(P@ zn<6z!lqR7KBu43Vw~P6Ms{Sf1L9ZW- zF`m})+jR#vZOo0OB{*{d3ldUnR5QMtadJ*EOzb;+Otwc;G#F)-V#?=fYDUK+Da6$T zz!}K|NA}q}u!y^fhB1+0x5I}b%%X#!h5N;f(xs2E24;iY&|2TtJW;!1`h?O`52&Dn_pfsKqcptLZ+6Gd z1w>L;p1oI)`yztBHo3?TE+(7crAsHF;L2|E?Wy?#7=u}?t%4OB;Fy2q3>-QDf=la= zFin|wP;}pEv+-yYc-H&x*1Y&DF)F-EvyGXZd;ZBpGoBFBsL4zr6LX_0;6sYjvq)^D z#z!|>jR^>9`nE2Q0U7z`!?e*tLPB&;XtvzwvHPEM-WyvCXZS3>03iSW4fkK8!ITTl z_8881U)p>MbMNuzFK6UuCzpmyyl(vfwMHyR-$1t_zUg>vi{_@W_lFH?sv)xrd<=Fg zcO=<7fDOCaUyha%`yS*DTsrr@=wwMG!62$PI?b3wkpzJ8J$-Z*?-W;&FO+}Okgiq< zvVRc+P>6Qt&JVB#?os*8OGDo3ZDUBRXkkc*V|}<&hYl0=m{v~Qi499D+DK4&6_H+* z+-I?XO2KxDOp4#*+hL%-umR)TXEP2;?(3F18T>jk~DzBnb5ofsk63hxrqkI0#i@r6P z%};uM5SjJ+1_Pu^Rf?(bt=6txD5w!sAfcuK_d^U^cOL=0r^PCAq3s2M>H2wWHz}+a zYKT~_?c5OP>I~qW`BU*f(5}Aiy@_-A$;1h60dd11XV8lNQ_0j*?sbVf)Pk2^yoC?D z?`<*m`9+r}1(?7QcvQHa?H-kW!NWeUw30!*(pHx#LOK0X#j ztkhn00$R3JMkIS$H!iy$Fj+WGJKzjv<8=ZehTj=RVZ?hL>$A`%2YVHMi@L~ca?j!0ua{@39V?T7vfs)A>)uwCKu3WFd2qPM~=G;AHm8B5^Z4s-tfSk^YLc5Nmk~G(41O# zEG+6@X3o;k9rP_K8EgTrD>)~r zkg6cz#QWWW`)u^ga=g(gwRICx8GE$*a8>^3icp-|+h=Q3&61$N(1!tLzO=ZJRDp7k zhBzojm12+pGuxlb#pb#A7jSKv@SdVouiM-y6iOf+D1k<-JWJQ%%I<4 zREG-B_7-l%l;Z`(R~d4$vSmF158MS0ZiU5HbOiied8P6(VH&^DcNOB%bx{50hY)LF zUgwRKw*W3QbYZoV%fxDO`fF!vq953c@BV2&{PqMTtFNupm~Ajo@;29GUj}AEIWQkMyz$~4dQ?L=2oLG87CttQvK7QcMirZ zgR`~_pfO}tP};qQ&T)c~?KEhql?Su_*-)u1yM#W!T^+%L(}9zjB5@i5_m4MU(3#^M zr$+=$eog++_|{+bzriwlOHCaDf`V#zGNIKQkkHA5IQo)&a^32__s#knNXY7Y@mhcr zZIn3K(BX-uW<5$14D}gC)H*h_*?s4bKF`4ctY{Uks6_)~l1O~!fR99O^pPxjxWe`P zYVg9MB1ZF?S1`v4@Df$;MdE;fx&*w>U6(Wb`o0)F(uQo0Gtf2^84^LIiwMcPQk?NL z8`8>KEX;tN`hpoID|<&?j}gs$+zuA4j8^370%!Ud4MzC z67~177@IBJu;iRTO!%1<)l6MeP&hwtXk5!>gX5Jow^KV!dh7zcRZJLMaf(@w2A zjEt{Z@JzSgZR2TppYuEcn^>52bvr-Ka042M4<*j_ilD<4&SEtwP)LxVFxa%@K;;8x z$L(O&ktf6N{c&hBi08%g$#__)8T}uiM4#5dKa*sB$=}C4{WP5DW{TNhM@qx{z*p4Y zIfSVf|`c}pCz>HRERJBUH zPeKCl6T0jyH9z3~Z^e`Aupy^8XP%`}X#JM|X8jga#y}Rjanq<|h^Zp>)jrQeAxh@1 zYb=jldB90>afFVUSD-h*Y)=ttTi`su1 znwW9q0KXA0U#M~R?JA%y{~Kdk7L5ATv0Gl_tuekcwuL`Pt-Pj@i*_08%t%g_M5k}} z8v^dgdR+53GvL+^rNFmD0{>u#VT=zU#Bz9&2V%+xFxje-fimcyjyaZrih*v-h3A9! z-4fcottU%0?#bnS^3$nqzG9^&Ev{Ey=()C&Ab*0DbOCFA2$|{|M8fBH1RBV`@SG?a z3?z-kkd|M(dUZ2u^`KiwZ3$n61mv)jyU}yX-42Y>1vmXy-UBU8L>+}uBMbhTjS@_O zOGZ4IxzhXj<&-D!o9ime6G6Qb=dK{`mH z=~QQ#4QY1=<~O457V=h5yH4p(5d!>bqlY|nd0ly{JA|rbTm%r2@LQL%t$uwWsc*0u zx%dbLqy>3y91CZV6So+1R^w?%Qt!Eap&(90O58cxOylWm;91(dB7k?xS8Y5ptF`gT zo(%{(j9G440@HG;tGhu+uh{Bf=F`>D3F601-LNBl-Wm?aZG@ZDb%n_~*}lb*P{6U0 zX)05xiuit&Lf#93LWO5!F6R!4DVA=mmqgxm;WQV+U1;!&Wxal@<5r)y^g`EjIrx{l z1Xy2sQdr~hSDJO{NoqQ`FXVAH1xCHIxc7ERONXy<_a1F_p{H|}=e?qDNlRGQ`|_Q+ z1pxHv(=~7z+*z;A^jwK2D3PW}v@Qc~6HMV{-DBZO3Pox`@&GjW4W=ch4b}H{ z_xn#Oj`|iWXlm4g9)y9|2Mq$gi#e_Ro!1q_N!EC8y07YYr`6%gZbqSzTUsAZ#?@ zq~>u$yTpXxZ53$VCB*HKYhQFSe6EC-&71i7&M~ZVnwh;!_~1-01=FwurU9|L+nGVt zRg;0>f@4QHCC3ug_^JoW$Q)+kb<4;2?57I6rEaqlbz-;A=f$hoM0xZEeYAWyk$#RL z>V1yle=W3_0b({#!`UXb)MxDO?qjNDjb5WGm|hZBj4Ma9>#*-~@!X)-%);>dXG%2+ z(wh~vjZxwnMYD7IcGYx<9$9%pE&jhLCUXEjb8QGBT(cXlf0y0&0{QxxKbm^*`(IBW z`}<_Ufr)5~san?{#+1-g=~mR{cfG~eKACRJUi`Y8ICp~Lb3ctc!ZA}@fKkK9pjm|EhhvXDc*5tl4NJ!S~c_s@Js$`R+m3dGxg)D=}zD_ z6Mvm&#bwUDhXOOg0xUlF&Xp&kANz&j+RbF3PTNq>?Q@O&_Q1fzt zAIsW=GdHm!zWiE)mEl19`tZUv%__pP_1dW-POuP+-WBd{&XD!OxYiGGEg#{}Ai-I? z!&jvR{seI>0G&#UIC`(`XwYVs4f;w5;>&NtRlnS;eL2$YvaU8b0WZIlyWDgvyh2QI zz?{}BbAgfj5Z-1rp0uDKAm}h2CrygPZ8f-VMkJ2Jv+tPSym>Rts9QW$JypPK!x2*F zu30+Az<#}7deP$ymn!C~Xm_Q&DO@U%?%cWP!UY13eNK@RIDeYQL+Xci-KHMM6D0Wt ztz1G}*-L7v6z#IyfNxw|5Qnt*?*`mrw`u1(Gd)^s=hSy27oBy|C3K>Ez`O!5ZD;Yg z?vL^9ALF_kke*qoMj(*AHoR@dDn1Nq|J(*>w36;Cmv-d z?~I~NCJ?Y$jaJNM=Qk~NDcn)tfnhy#3oNlNDQ8^?kJ(R8E?Jq&CdR^nHo--wFaF}TXs}#qEDa);`}`_?jbH3 zOPS$%sZnwz@aI&^{GFDmJ1sVVz5l8t!@>FY^7h8YvOx2^rsE+6V%m<4f#C%`-Q7Pp z#E)WGpBow*tAo9X@pM-@`uaRQkzBE<=^S1^BPF%BzieNl^9+PS;}3AVfDeS?r8EK z!nA$`411UO7QLc{%APq5&y5>~e&Gi0=cSgQm-M;osUH6=oAPRH>Fi_&E|}^rjaBw^ z3EH{rIWzZPPiR?$4XA`MWScELBn*W}2l@CjAEd?xw8Nmi1n|4L_S=Nc+UjLT0WgY2 z;lO*@thTr zqDQIKDg6qvRqdLFxhb`WVDoRQnSdvb;`WAvgQ`-zN7CDDui)HB-@VCW09+U_H=b|# zA-kt^&)izdKrQmm0sK3=KcrM=_IQEI5I;}=4zHx=C`oAl(El3*!9tQ+N_9p$WX4f} zOTD3>59(U?9=T2$^RTp+c5qmR+(I08`R;0F=0}3deBTKZ-5QOtE)Xy?nMySsAv2WE zt%B!DcXlndXD8zjYKN9)O>K=yQ=8hJ4OaZVe)gusVl%a+Gj2{p98wc@&y;T`@TY$y zWLA8BtbT{g^bLQ-7gPfMKU=hdwiYV*@4fr{4kcl4N4 zs+M9`9jclBJ{!a5AuVIH=+qx*G5-!*bPJcmOyy=HwvA+=-3k_)*zdV~3s5G5(8(

#cGAK*DU2Hj5_KQJi(D|0k3uKfT4tbJrmFV!^6JtOo#_Ij@P zy5}-wnoLh`B($Zk=ugfGth7c+0(A7R)QRR_(eL$FipOZ?D{=%xk(_=&I|g=LYr^!N zYL9ZG9S|95nclh_%Y-@4&dx>-1!Pv!V`cP`a{}MgZ(<0y)6Ft69EhEHAaEk5Ti!bC zAD#ZHM%AMD*9^5A?Y{!*)L`$*?KJb6_)Gmp>>KS9y(D66@*ILx%v{@>fN+{!N;cc> zwY9^Iz*Hlk+C-u#I@FEmW5aZ*&f5?piCJJ?eUZEfTLPI;obBY~q%OPmWN~p(?DhEZ z<4Iv&jBQqODG8>53P52=%$tY3#1CV~y6}cdWooqE682jX<)(x(*&Go(pv(q~!axNL zQoDp;)6XI>ahNtuoQoi7KKj0t58x|B9yrn3`v;ryVGNUP&JRjK1r)Kbn54EY>1P9_ zxj%TzTh`KSi;RU=fLubPu`Yw~rgoy-a6g-Mxf&o#L!XFKC!c0{y>nB-L7~EU0&s^FuhvLlMX=9HmF}iz2eBs z_`coSX6H`NFJ4%9{zX|01KfzChbDIJ=$%&G#(rb4A)206=RTr6FNMM4llU8K-=_m} z!%s)OG~NNO13&=8xQiJaWH1MzgrjE+6J`W2&?=4|J*o*{+R<@!l{8eadT~k-Icahw z(1t#bu0U_YOdwZ8n$q@&vXc9*!}V0*Bj5{TFw^_B7%FV4h1KuTN9jB$ zq>&7>=bSHZX_CY!k<8zI8Dr1l-8V()QqYsv4jMKGZcBS8u{Hgk$UHG3ca;VFw<#l+ z&(LQ~Uk6LcNuiZ46ovzK;RI>!u|RR{3^NL_Z4?RA}LqeCpY=u)%DhzS}a-`o@ zuuWcJ365CB?q+Lzrj07#nuP&;f*5acC+*zvrg0x*;95V6s*`9&OA04wruPC;U*r{i zp*vVM=@4mw;NZjj{Ctd%xDNs9Z$k44+r;dFH==Zs_<%)ZPdwj>Y2;0VkYgwGsYeXy z;S?ZICRA7SbCK%y37VKL9S_$4`G)vvF4Ln@!9sw2f^liz5bGp-!isz5jc?n!>7iqj zA9?EWGiP7;(pQgPc;UsqsPR1y-`D=bmKrz{orYSR7_1nCBqM58Xvx{6=wKRnD(Q}( zZLz@*t;X%8{t&ejEV^OZ4|+^YOc18l^F@UE7gg2VLIF-Khxn2Jy=A z2AHSOJ8NcJ5uqd>5sN&I2qDqwt^0J^qh+_T}usY)dq)B05N-?&ys%-YcpTVw<8m?m9?Celg>~${YbbhRG89 zZLkwDcq5lCahYo;#pF@GEB=BA|J#!QUJHXnEYDh4Cy33!S@h)9 zF(;}b>ro={BK37&boHoA>ntZpV%`(OhY0;NOfuT5n!jm*nw}vXJ!hRb=9cC>J3EUI z={XtLAa!y2H@3ux5D2;;dN0lq9f#SwCSO#wE5Zv+2LH0#DC1`*Bp&PfipmT+gFflz z0r8l$jTM{6Br&pK!z1rHqW>?RyZ9GRAAfH4OdGMdclXYj$w49k+S`50gQPH>c$2IF z9F=5R2ej)l5q>T`Br43&&4Ftm=1#MRV)a(~vEN$0v_2X7ITg3vVA>I0sHYx+wboa% zG#8DGyuQ3eSdS*WxTWrrhyA9{z>|r2Lc^516K3pL_>dPzxE(fvo_)jkPg16x{*&lY zU^*nR%1#&H!-=DS4q(l;uj?toO5G04U+a#Rsu*45bN#YqN{4{)5;PR8Zoa17-ny6(WwY7@)D7={TvWuVO z>S{g`b+kDez<7%u&6bv=j$nFv8rpV#g%3^xM$9vHaC$y%O#B2LrHHC$Zdg;{Y)>YL zYu{_pG^Emzz6cs}Q%CqV!cR}AcgL=CWKtS(xHcW1&4bDUac0ZHv1bbi7PAPukP;?a zG@B!84&4aJ%W{-hFCy)^vz$*AbLt4O>QO@`6hw6#!9xahzrFQ_A9*Q)mJE6aK^`f) zkiDiVR-k#p9N6a^8LuZXuuQ=2;n?<=x{W&=8(W&^8}v+6g!zP`>{ZZ#ijt>JH{n7b zg9n;&0Bpe3js1q2t}p5pxzN$tkpkKx@f>{%9k)oXj(&H#N#NL8{C?mwa*md!!80vx zxZPA2)2cQ17HL%U1JX_PK&>t@IY=Rv>e*RNgO8G(AT~+V7C;Gw<834%xoHCQQbUGv z(BO5&LWWLgMr>!UByztYO+HUpOmn0A7Kpg|4bsFM8^X}<^;h~ML$NVY3RO=}$orbO zk8plFw55r2vwnl{4dE|CJVp!6(6vItL4*(PxF_w74f6i=jmAajUYXk zf?jfe^e+|37@~wXb~b#Fw8r`O4L6l{dcop<}}- zSZF}{4H-F1wv?%Au~N((_r#>p%-2dy;PP7x3rFHgpU9-5>G)z!chQ;E0nkjslR@{ey`~zjfP;v zItYTRdIg>~FqHLIu?7jYo`_G0+16esc2Ze<6!vyYA8;ia*gejcq_gR|kq6E|piuN-QNopw`boLF!7P-yA-C7#O{n{7D5omOS#y+5_r)#jB_% z<4nXnfSiWGB+x2IF4ggor5u;9k+&m5LoHSb>hq{X{;Q)vB$znJA5lHAReEN*6Nx1Y zE7t*>4TU+amx99Yf}A>sWDYP}9E)`kz+!a@POg^fLT#}7*I|`$*$r?)UZSXi>}lWu?&f6L_a2`spgz_!L@Dc=5KoZ;U^w@=;Zvum!3X;X7PM!`5PX7 z;P8s@JvLu^LSRSJMw&Er*(TdiN9q1rJzrsrbUfOIGsQKK^e1$b-ep~WDKkWR=BI$E zj5Z#xp_|e7)dD^$lhGwqS)-e1>sz`tdKXILir8$$LrE?!z)k% z$2_A}zyfiVlH7!R&+Xf2t)a|-csW?wIc2ntC?bV%7it>(UgnJTjTk#gRPm*FJAA50 zA5ETb5f&PibW^HSp_1eRL{vb-tqgG4uuAc;VvlhW5$4DNI{GaZDZrNs6_CoDyq6T1 z&Lq+xw8)H)3W{CS1FKm`DI&aD2&S@lWi;Dx*O^M-{)X4Heo2lmf|j=KSd|=BzY_y} zH6C}H&}+pC@+Gg6yZhu?9YM+#8IU$@baYh9)OxjJ_z^kTX!E${wP*B$N#>qHx`%_c zKu}tXrL%&J?R-UK6N#u$1*le+0;lhaEUAXi`%^as#AB48f_xY)jk`b48wLRL#OQLJ zCs`$l*l=+?QC~_!IVK8g9q^#*0%(raO4Qi8Ul=Z0H-u?=%7X3!-w5ev8l>6fCFa|Zop2K%k zpSNblktruyxUQ zX6~fVkh>Mt`pEW+Ks(ktoL;Es18eRa`<~ifm%q-#uZ=#T^8hv&vQtA*1}0x z&D(yEtqq?C+0ykUD>xkYrU@an?l5O=G(erWfml8eDVWwHeWBjDqa5f=T0Cwl;xigj zXWg-Fu&gR0|031!X}Ld`#jP8R@Yl)%lLQhRez**yLQet=ZoHY9nTRi^l_six`yd-O zEf!bY5E^}g#)C5k5t6VBDY8gtJt21sLC28=w1i}A8B`%zae$|_hfC^-`&1F?IwJ{7 z?Eo(A_DH0iZbmqcwBnuQ+_6aYZ#1X5+ow*QqNhSKTe|(|a5XEfiwiztCfQ#Ip(cYtbCbea?8&$kphT0ZvAzeUSOuAwu1Rv)d&11CZSY#i= z(Ex<%W6py`xER9Q;R_g!KCG{B!JGV^x-38r#^8_jBybBcp8IlFYsq6{W9%x~Zr(k- ziuAgGjYmsEo1-b&;sSvq+H9zgIal%B#BeIIO^a`x5qbWJa49yW9c*aw;4@^-jbiDir`?HAyIm03e-v8ejnHYqr{02MX#7jE{96 zNVI%?SKNs^h{2XP@AP4U$!)fp2!>Xw{ehgk1Auna;TCO9lLAe8x#92IoaVm0yFT`z z_kHM_-u=w8^I!S;$xAO@-oIz(Q}2Id#W`&Rgv(L>6Fn^|Du{CIHzGO3r5X9t%?TV1 zA}dmZ3Sr>QlVBaWW2DkiL+F4+vfEf|gBAHZFcm2<8vku>t0vjLbas{OH}g`8X}Ren zQbK{$%_fTOzJ2?&&(Xz?=1;8<6?*-8lm;F#?oHBcCjfP_^Oy+~$uCt84e%Pk)_DBnqX4%d=oHC<9=mxLsWwg^*cMGck<+pLw`B~?QfVemaVK@^*q^kU9PB(q z8Q=z;1cu zqI?VK@$qq|Gr?TMZjjtuNZOvnY2*zdD8c87k>Ek>sC^ujh6I{P5;5*qL*j1Y+ru>r zgzNxPlWJ^BN3Iy4-aR$fqOwR!B??y%uK4mP=7h$QcH8lFWFPUIoR&B{eKIMwT#;eg z$Qc^H*ObIYn)aF2vBV5L5|(Aw(MExb3v8<3$}J+@cZ{FnSIDJ7tz=@P^AVs(GFWt{ zDm(#Y7xtp3k$KX@G>R%?EY3krM-B#LGsV(L#5-=0{wiV+Md73eN6vNg$tI8sP!Xoa zha@?wO+`&n>QgFd9mO=@A7IW&x)-}m4IY|MQVouE)Dv{BII;Yf!^2@m*N<*)MdcvO zl~V{Qtj2nQGg$Y?OS0=J8(`A5>6*&d&|(K7dz_ zrU;stHisay3x|5v6H>J79rI-b=dj+pQhN7ekKCvKcb0M2wrttlS?S>(fXS+3+?A52 zrVERRArr*$kobY*;GDf2)A2^go^qsXMF~if zRFW+p8M}Mj-~D0x&FK#<>p`UZ;h-@R2}{nC%t-#L6fm~c%WLC4Yvv{+NS~mQMJx29X zT{dyF3l}aB1ke5GoY36d91F*~=ycolCK8c;4C0RxKlYXCV?8&`=#JB{z`QhJ@ckk{|G*I>vK;XsQcwX(9%+!# z%}m#Fy=Z1;26j)*1Kt{3APka?$ziZm({E@d3p5UF1xQ(ZZ*)8-qsa}@nNVCXsy zl%CkHlA|P5j3yA!Ik*TEdWqBlcEgq)M)kyPfv3>7)zQT$zrl6Xbpr}HHjP2;tDGrW z`$}{#&tVn$wJ)Xh% zC(Pa96hm zv163*0&*}ank16xV)FA!X(zy8lg2+V_a=+M<|Smn0%6yzT^}G?Ud(NanmRpH1_0Xa zbi2Q{=_yKYtEgE*x@5VFa?qYNrKEK@bONR29byU8gL)WfV{!0)u*p zD~lpTYHa*qfQP0lY=XBh!lO=#RiufC;kL++o6ZToSI?*6} zP3#VwE!WnfJ^_#97HxF|e^jQZcVTckH$EpPz*KG3z)15R3HHHt?&(0G%A*KPUTl20 z2I1ogASSGZPO5Ic5($qYpf|O$p4K@=)BqgKZ9|MgQG_2g{2)qg&y26W)Fa&LlFhl^ z2>>@IhxxIBiDdTd7LNqwKIgy0QW7nvDBj#B6m3$xgCYugFE)iZxQdBgSJC{4Kx&>q ze#^j<$|WV++6?VnlD5SW_{+eOR!zvC#6w(Zb!A%xr3%`}doH&b_%K`_?}9gGMK9ol z1BU}s3XB6XIoyYZ6 z_;Vx=`us$j%E(JaO2a(kE=NRNxPg)4^io^~P(sV=TqIXKl=z_&5tw`)BQ|$!;N^1c zBEN3>qG5Zu5wbn{@?_`TTCv#e=`4D7F&Yh^7hM}xtuSWjB^~G7vXZ_pvn?t;-dnww zI2f@S_twh?fh>@3O(cE}{i*OM0jNt{!e1vS(FRby5}UQHh>cXFDDYr)#Pz0a+Tn!W zEHv{tp`KQp52jtjmFA_o9mVin8z;0FGH!JWI6HT?ed8wLA&nk15+I{4nAd&}#(_nR z-fH%zm?u^l&RYjZnW=(#L;D006Y|iI7f$+vexq+0_5eQ}^Nbab{gRWr5aDXU-Rv#Z z+x2?{gz1FDRDJC5;lr9gA}{A2kRrxF5j&CI6|1KlS8B!0I>0mRS;yi20o0VX)Q#fPH%O(YP@r9qMy$>A8o_9BM)zI7(CSH|+6u54 z+k8GLBf@hxunTF$T?wqEr+2$mr%$`SBCjp9*Q7X4 zcPH04cI+6o2V#JSPO0x z3wuy5F%cj;d^hrx zyT%Y{_6nod+LNSHi&$|t(VKCN*llaTZsy_ZjBbI)qzJuWxEGw|J=g0DQhK4V!!&V@ zT!>qMPJ@M9ROoXOZNp4l)M^lvJV_>*GoH@KPBk~;tCcV2_!*wRJ*Fa_n3|>epk%n$ znJo5x{fKdYiYLM^lj|VPfCIu`0fQmQHV~;Lj6U|QLq7vh-nw3f+IKGyA?Zme0;oTgC=S?U5iNi zG`5_m2#BeQdIM96@Vo>ls4D}t%dQ`7ulOecXP(c)b1gsbG7tDoJ^`DWIo1?yOLBG^ zvzPHR>RtHYi1$KHx(;~cE3mG_4K#rwP@Ii{ z9PuKy4P4n_+omPKyMH&VHTMkW;Y5UBrJ*ABzc_rozJsEDonzD}Vn1;=psM64zzQ^( zz8FX+)aDtm2e!$P*|5AKSS6WYKm=wDeBrI}rNM96{oH=u* zX+@fC0>Fj0gK6tXq>F%~(CHQj(ka;5JdRQsEfNU{3o|>=Oh}Rh1ImJ=rD3T_PE1UQ zcC{$U8{C0*x<}+UP598ELxhz?Cz^0fJ4sr`*^`l@549XDyx#x1uFbfGD-L_20ZoKj znIZk4B&T&KdDRMO=+QxfcaxgNqSsb~RxJS8(YTrXB{m#I^Dej*AZE_d@w8-%!2BQ` zmq4Q1VUZG(U~pAnITHy-{wI{&UP6m7PMTdvmrd_h%A%7;0C!ZZaBf5;JCcFqX zGCMm9Nn>4*w^ocK6o;OsnH169D&At5Qs^Z_1<8eLZ-EnXY11&5B)vAc8bdN1$dxXa zMukZ*TAEbP=-F&ftL_$HiZ#Ss(-1k$%*?PAl+AF>iS!aHli?&T#4|-F^YiloouLHGeL{6G^)x{b_0u9iYyi1zBYe9?q$!#4S z9mUg;??3t{ofWucE1vq4+qeA=qKg2@kT=oP_f;Qoe@Glg5oZ9Q@d|vOuzxu>JCzrvR>h0U>rNqu~>~3i4~iqeHaZ$9E5khZHwLf>@Rs}98wbi zeM{t$p2EgNDT%I2B0Eql7)H6F$qQwGSN%*72Jq83 zJ^ewX6$BIwa>DE4)1f*xka#_qag1atctqIZE%Bb}TiO%s0g9Kfmw=y6U^d%F+gu?H*CHpUsI|abm}hh!LL>vU6>{$Z z;1e-f!3450lwgO_iKt19)}e@jR75p({~$#XtSH)koo>aN-IuPN?sQw8lDmtGnt(9D z9JeS;RBbdQT};qZqmi44w8R~6+uKO@o+ zv7;a!?3tw1P%%-N3$kn=!F3NYQoDq+J8jNd7RHS?<=IZwr~I8piO0LXrxo{97bJ)H6H! z+BzHob~ZU8EuFTh0ndsIoI9ifK}f{P9ALn=mG3qYVDiGq@N_*P#Kz5~g16qPd!?*3 z_YhC4HL5*}Fj}eE7XKR~EruHFXMi^g-)FI6q^?iH`v&vyIq!CuR>F193W?x|cCxpf znM0Br&|CSHrXj38BhA2eKS^=;+iW(lc3dV{0umVFt(1gzmTUd#Evw(VinkK;sjNtk z;=WO(YL=Zq+sEO$FR4crXd{mt8nGt@yZ8-L->^AE()32DO;b}-Krlz=oc4t7hi&K$ zCX3afFA}C`2@FVvC&;3X-gv7?`y|;90A;C_I;>*D`<$WZP>3tW#DkU9kkI}abSp|W zr*5_Znbm}>1xS6%jxjh0$gW8o5c-pOB`O!e{{;0|`%I2dr<;$YMTvlmB9qP^nw#ux zlKQCEA4aaA_+krH99Vc9KpyWYiYV7{Cz+-|CCSW=_>oyh_Lqb9@pYPjv8NN+UuiAS zQ=4($$cj!Jdp|NOI^?wUmE>w4U$i+yj}22YeHt*8!3}1T_^^o4xw9yW6sozVRP4jy ztw65zWMTj<7Bw?e&semUBq$;dFlCEnTE-{`!p^oRh)@{whQCh^WkYx9Dv1HQ*$>}B z<>Fg#V4x1%>UULxZ?s$N84QF=bJou3Aff&B?zq(*?Qb!wYszs2%mW<&2MTdcO@ro& ziKz+mH;fQ9MZRd-c9P;~kVRv3+Q%hfv>3DEvLoP(y(}5Q%>tvynJg{yi7+M!c;bs> z4$-=x9Ts&Z*rkR!HI{YcGx-JS$wO?nFiTBfI`<2IsiQ@vI(Yf-uLJvZDDX~pStEnr( zJ#a!1>7^i0cf^uQ%cRUNiPcl#iHk5tX9Zvu(k0$S3q-5L*d}fISM_Cfx->V|N#*E1 zO%!_v!@)8!u4DVHq~T+G>K|SnI6qrs_%K@TMG$3Ug2pl)^Cqp7{-Lh9vhocw2dW|N zfAZh7*h7a7;c6vYN%u!goJ$pb|JwP<$w}J#B$=!_Q9XpBGFUbZm-Jo0uM#&{k!b?$ zD)XQxOC^iRd;!MY(;B5$icHQ7C9i`?D`nrf&%r+c#V5n zl|X~&90_wtaujP$9HYRS)wF54Z$N!|uONVyQUTdXxPN6;BF#bTa$AD>Cv)Q}Mp3|I z*NKo7Y@q_9q%gf$F4zeeXrwB!%;fIFbHI)lJ;OjP8_*K)1QXn&8pJISlE@^i44+xV z^V9?YfZ;Uplt)I?^SmN4Xr8XLA&C@EKiMxl3K;;&;r}ws9a^$GUlS0HD3N{1PF)$T z3%3IB%_RQmb@U_7mlj(ZB-T_V+U9jptzOZRwOC_3khj?q9=+)-_^vNkr`sSg&H?Qq znTAd$$NWU?Ceucvh*_n-iW3%Rl5+#`lgJ0+RdSVbC74fnWZa)3HEKBo-(X)&XxF%z zxH8sIPnwlvLS4{8n@6Nc z?sRtL6<>6*dQmgcx)6f&_9fuSKu9@E0pZncwkA)vc0nz0Q;Mp<9LYuB4}n}f1vK_mpJfz9~|ldHXsLO^!dTJ3`-6G9fsr3?=>JqQuUO`A=GQP?CU8KC{>qn z3j`b+C92SQ)q7hdgBII_PjzbAmb|C~K(P25*rGB0aO!g>BR4^V?=%-{LC^4om7?cd zm7JcQZl9~IDdBj=1&|*ZEw-YN&>m{r;Y0**2rwwdb@$e6N0MZRd5bK{MC03-rmg_0d;b4V>I(`$ zp=)|Z(hDV%QIx3F_~tA|M`Y&CeF3VN53qxC_Rfrq@bK`<^5wa6?wK7F`N=NMM$7oc zo`v%_oe-!M=f}8MfXxw`O;}NG{@1_$)eZNkfGBQ4`(PAVO>EvSc7P=RWD%-I#~i5I zQ)PlcQYOC@JI6sjJ1#4gshg&&sD#`WqgreZk&%2pn&GBy1gix44PP;4WeN0G^F^CJ zpWnl2H|NlvwsNQWeO6XFWir3C09993qrCO*5)>thWCS#JdwC(tsXUK;z+iibeMIpf z=p*Ga_CelMZhIwaXHa29f8{~Yp_i9hgPURsEXBUQ?KV<|GBm|-SNRth9k=-tuj!b` z-od=ZS>21E9Rw*fGPUn=YLpH>S4&mLLkcko+ccjCx<2sPrY#wRjgU(klQd>!eltOZ zuPzf}jAPp%H{bKwE-%P}Gj7{~qGLd3i(!!+&G9ik3nUzwk!ie7b3QTKc6q_aj_oMM zWGN?PPofH3-{cDcL_E`sDq>K~)I{%ec`2)I&)AmBo^Ql=RcX}lmEk!C1oJkhB4#K|rh9JkHGS?&p^Gyq`%^4rv#As(_I#wrdtF|b z9({$PaUv?oV_OTHC_lR@6)dEfts2ox!E!!)KG1_)NyF>cubs8|Az#c9qT{xpz7dw_ zueBB+(|LBy)07yfbnHl_M1|z2Y z`Fa+Bc@PY0)27J8_Ce*uis?C=uka}MwtDItXE5Kx=0V8Q_I796Wv@&Yyl+X*EH%HNNnIoWt zez&@9y)>MB|NgzVe)sO3fgK#^o204T@|SDfqNaUxlA?1jAkua(eC&q0N&eKJ@)8u7PEru3zdBRWFIOIy0TAg?u1s$LVvE5cNgNo0^d*MNxZ-%T}U4w2d z`6~eoaNOe#=bq~0;tD)v*aGw#rNWv{+%Ti_BIqy?bQQ6A-=V*eZ99lDPld1tD<@&1 zisn|Yw~;E>9Z`_4hKp&^y70Y4WvpZw%x~;SX5ul_o&hvQ0UJ5+LrsbU9(-m^K2Sou zJ`~kt#!pH{*pH4zGS2zdU;gqJBaf!O+H>Z$Y)O*JCmy$UnpqLP3EFlPVZ_5>MjD!UWVEmBT++}O_!nO&Qm{VsV%ycWt>&ZTp_bwPlWa6jCW+3-j`47jGY{r(a@4|E75PriaXHYPvpe zr0T3wC%KB#sJ6261)=EGEgA3qyYIe39>Wx_Yt$s0c4`6&>rDiYu7*c9_q+TCpC3nY zE;*Kdu{GpV!SJ5tn%A%S*WD)>D|J8GZ!%Bhc3dMt_9%zE zMZ~7Lnam_=hMV@?u>(f6$~vmDJ2@nRns#_ zA*eVTaU`Z)Q0!v)%BOuT>Xy;w&Ie6G@sap?`HM&QzQjWQYDj2oa_DYiKlXIfq@F+} z+fO#bh!l~hWCqTVMP+8*y?YlW3~XGmpK~7)M3Onf$h5Q< z_L$B(ZVhsL)+=z$JZQ6?`}5HL{O3R4%B27M-~XP(W}G=$*dCIW>WX>q-gFaQzPB%K z)!Wvke5!i+toyxf%8%*z4i1_#8W?xQ3jJ_IYQnU+WTK^Nw8oj)R3OJa){5sE<)m~q z@UI<7ms6t2jOa6j~n}=hBjUeut9X%NM`ue733|Y^u4+ zX(>w@|Ez1gIq2+H6X^WvWfw&;<;#?~@bf`sQKJHP_-Um}DLVF!*ERsA&t4uZuQ163 z!Hq&J%75*-Jc?|dQW57Ct}WyGU%}>>wl$2VPfqITWMbhaTQ&p8J^{1jb4JUXgem8f ztsY+si}B{+f!l3NST!0nX%j)06{fPsA86WBE@TM}zsm2dNEK}hmSk)8uLZ^F9eatBLF*0Q&6SdmqT!Xbu8@fM?(&Ieb8q%H~;uLw*ZdNrN})3~0LcXQ+%TV@3%g6QbL(-iS^_<>#{ zkI`FFnr=L3B-V}(FMO>6UU}BoGGTADfYV~zdpc+QeREKy^&e>-P$^7krM=lJaYaEj}z zlcb|3HL$jL)2qQmOr=e#u*`P(lXG*080D9`HIFnlI#N`&HkN4eEf)LA^hj2@RWP3; zgD5OdzOs3UZ`K&EkJdb+J6cj?`r=+x0{Y{Lq>hjHZV9d;k!LIV$bmS zs_ucPUYpNI%l7n=sc24C05yvZ3>L$8bTI`0VBBwFo2&uky01MzY2_)GX#gOdW4mw$ z^qwEDv-Z1p?=k~_{No>|B)FKC@N-`Q!-4f7YeO zgUV=cWz0hDM$j{3+V+vucq|1LkK}=BTVK6;xPz5L}tQwWnN4fT_$ZcgPn@kYM{rRgI-DY<(dK z8jv3EYzX7P~sS4c7(8sChkE^K_KtPu9Ugw-rj8VF{T5nvCiQL z=(WUCH@PWt5i^3ln-4$2w>kFPxanNP4>tB6v!i>-gggbaQMGxdmN;_)tz-;&HH0o_ zjtUi1fSuFKN7um$eh#ctyL?O=Lx%fiQ-tFcAD1lW=s*0!KiKk|H!+3D zW)WjGbUq zz>2G^=1FxUco8q;DmSiPgn2F^nXjW%!4pp^xm)yeDRCUT@@ zE)f@7H}Zi3w8Xg^Hsh1Km51L4t@qEL`pedcI&Q}14YIq$`=Bk#Q&8e)1#-#dZr1cp zEybs1Tr2S8CJoFy?s1m8As}#k^TZ}NPbO{EGd)ML3h&>)hgy7ma!Po!>D-DV2urEg zDBxLGCqG~i@q(ls>~@pMvpqT1nH=f$^|mR+aW_lO_k&1~qUDouna_Hex2xnmy+k)6 zr3b;mn@&~Eg$enaE|PgX?xQ`P_dosgQL}f`ryKU0f**U) z)_f-8{I4%p+dbn8Ego-VWrb}RM|CVJ=nyXZ6oP^y|MBHojZ4N~^mun!8_kbnXq|4W z4kmu;Onz3}Vrg?X=|@0q#wAeA<{L%wPqLhilb}Gq_grx)F(@`*nC+)hH{jqHQ-z;7DJ#-R=d;~KOSA}0AXKM>4@qNG zdR8ZjXw80Hu3_!=Ec>!sO?}Ca?=z-JFI(WN18;frPc36Bqb3`gmE1af*<6B3%osT5_NH&$P6>X${`zb6 zGur)4^Rw~+LZfV2X21OM%jSk{Sy9F#)TM3*5e?oags1scEQR8zvkaAFX(PZ=alk2 z*1!-tjaqh85x>m*0qH*{YOjL#vtD&>Va``gPS+TX3Ga_+z;pd%6W7^zu#pf|>Gry=BkjuM51KtW~L!n>x{5y{1Wr z8sB@bOs-zQ&XVZ^_PNCIb2}`95pLR5n^ZCFe8o;xQnFbOqdTOfXUmGCOqQHe%JEqR zXET>_ZS)7C)DEOMj~fH4M!QLqV1y7&&;q*LDor%J>7?YXDZ9@&<3?`U;;YAa;I{F) zCnc`)BjeasKND-G&cz@2`QABUQ?SyG0|BLa8i{!~ zUD@ebin+6?V*>UO;6sxC>((osgR?<5GfX+7(#YEF1^%akVZyL-0t=$G;QsQ0?=mND zBGGC$jo^jJqB>|Xa;z%hELP1h?tQ2e4IWp<2o6jpIi7%oLwVtJg`xcOj!pDMp|$vS zr3$$9LV=K5WsNdj3UrnCP7yV*q1=F*`^cjZ(^`Z~uvwLecXWKJQ2i@C`B^Jyfz5W8_x`sa${ef!oh~ zhFQ;lQyRKCC!G`We`^wC@M|iegk&O=@K78}d zH?G%nPRUVK^o*3+}761E?%LD5`$ztO7fD_q+mz zn5*6zS@Nbf(UdJb4*r%_SAt#Ecf>1gUM13(lgOK@N6TPz{`j{Qxykt>?veHLG=poj z*ywK!z0{STpvDN_NWgu`y3IJy7<6BqgadP7HDdnXmkVJ7?`7=jvwBvyW*8tY*uFWx z*RR_QV{D++pUhCz*a8Nd^Med}&%qEs*4d2Yp<3EIw?{ioLEdfsFaq!s*BOu}6WL>vtgh7~@yW1#>5X&U(W2MLWt6r0Hr5uKr7t)uq zO92S2>A23JNSl=JM4qmvVgwQ;Ne`#|GV)XXey~q716r<4ELhFn7+ck`iPFmpjf#LJ zs<-p0byODT8EZXSN|sFK-$>Uc{ZeDARLW*)#7&9ENg`|q`_-)dm(ox9*+xj!zAk*6`zxLMjt4{yHF!Ql!) zwAZI$bR;gHcxXh;k6r7y5G;(`xsmMAd6VeFe9O~t1R&SFJ0y>Wq;c8fS}dsV@f4`K z*1S;_(^x?O8{Z0+d@LKMFEttQxvERo18!P4T2wG4S2lHSdp?G1`y(TH_wL=^$3|7p zma^_#mpvo9Rwk-d7W}4<-A;El-LWZu^2%YyH!h*{Xegg-tmMYncU0LO1~hIIz_U#-2@1N%>Z`V$$gZ-#~h(v^I~nBIJ&&IVsd zmjzvn(G>zrj&GXJC>d`hg8&9I=-6ii@~KK4Ux#xDe!Zq>CKQtk@Me59=KFX^A2f~rC;dTtKl^8 z+Ve+FMcV5e(5&6m(r}zr0p>zkHa{kndh7(Q{4_Oc3#r(=^3dkAr#J{jeI8X&sw8aY zG!FsZRHPF<@8)(8xaFKoz*nGU5vx(y?8FS-#GWDZ$W11~70z2;oI~R6IB(6oq2Z0X zV^`g0+c7kA_0%4@kw#J3O=!hx&iLbo_+6?{%PL7ZiF z!I>a3@3%GNm!Z{XUl|!@o+uqON+vCr@l1U?M;`!d`RHSBvR3LTqNDM6c-?wM@S33- zU4k3ay?2c4H+M}{I0jUpn!|KCezCSCZgIQd@<^Fyz`QZCu42w zy0wsgq=3H+NU=?lytdOU{6zY6YDe~~Tm?^NZ2Y%9t*+byJ?X?pBITYp!i*4+6Njqy z=4ni%)479N-6{Y@h*(V^f@arwL7+_SkwD?+U+x+IC#ug9DEZ6M9E07UBp$D<>-aA( zoa%e=0;fYxfl)%ZbJ?WiO5*CP&E(*%lo+h}`i{jIWKoaFkv7Gp>BT~gVH+OdDcOrY ziVWq6Ym*$F2`@zqICCn#o2kr8{rKaLk)a7R1!GnYu6#b$HXQI?d{=)Vk)eslua1XC zWF@lK2dM{G4*uMH>^Zv^X3hjgh$UX~bF5h1z0AWw4qbe%K~^kV#xPoG5Eq;0ZquR8 z&NdrAm_swfBDAFDPxsQUDTv0bzL)yrD(8uvCZRUU0} z1hgV5C)=m?-PzpZ0Yi8q`4P@c!hNi=dv!r4b421m43|A2Qms#{k1Jm1)=!5v2b$s%b1b=lg3 zzR7zVK{Ls{n@<3gKx@CodgL|-o{Y_XR+`ot*+jUYq*%R0elA7Ofi;HZ$mu@0=rRE8 za@F3-Evlw`-HiEV)I|*3lW|t800O=4jA{b4lKitsc6)~wIjJSx-8|PVs3ZIhiXWS* zG479-Nd!Ii1Z9XP#*A?ioJyN{V>P!m39^p)Z(hGol%{K~RJ#u!4|@zxDE+U#m3G#P zb&6t``SvXN!yo>T9T8bQm{0tEk#LBQ9JSF%n*nG(b7A>6?d4iEpprUC)*3!}jaFv9 zE8}rqVs%)_lC?9{Be}0AG-+qM0FJI(?`pS$$1gO?n+3Xir8jE+6dOtO2GEaFLS1Jb+#KU^G&`hpT)Pq&x{t-O6is9G(o zptt_Qy5lt4822e=l-7h(Vtdb8E14g^bT~L57Ltyd>_&@{xsB$j<@r@@Qz5#W`hbB~ zt)LfKG61cdSW1n@+KhwX1nIH89FOpZfHuD^_Mhxt74IhHy^4O-)HU~ck>ilS~mAzNGwascK zrN9_%lj5nXwUO`Tg2uAl3AMO6;N09iuPqZw^B}M^E{D7g6s56g#XFkU2e!qi1Tz0+ zw(J6dvx`c^oZWm`N&rA&(ki+bU0y1hyaK5Zof$v*>eZ`>EPK3=ZlfBn`Dg`;6xh2a ztn5wUo;{m`Hj~%^v@UE$T#yrzNBh}vo*zDZ_^{b7V!U(lY)~BMtwRp5f&sb8JSZpA zv|kRU>!!FnAwSbu;Y^%TX&HE}m5pkRPVkgb+X(IBE>qjt{l$e)BG{@S`L1epRCxIq z`<0)j95fOL<#_%e7k6m0;D3vfekz9(ac?_2Av38(v3VLPGXF>|e(UBdD&2Q9Tce_R zkh+mo_NGo#`OFk1*rZeEb&owuERB>!^oj1$Q$3Xiae0I$pLVyS@L*r$E0r`V5nN@{ zl7Z0}3yhCp!(%2~lR&42NyryVvgN!OlXXI%t?l;Ypv%8tpR zHoC~}YlP)Hf*q%$|gW09hOjGS9v26nd2elJBjgs&#AN&R3Jj(IOwmFy6L{<1X7_ZsMzx?ux+&a5(@4U~7MEm5!`FajE6PV>j1dH>R*N-4JP|eJ=g7RS zKHLNBSb6%Cz8(k9Lanr{+pQnwg=YNy7zH&o!n*H-CVpa76nHg{b+2}6T)d(yu*mbV z`*6uN03p&eRf_u=7EaJ1Q-lLh#_W8eU~Cqw8Gwj;%NHGp2FaxBrfV%emXZ6y^LXJ{ zidnDjJN*@*xAOzThW_sL~-?eO_+t0Zmj|EWO!zC4+in`IrR#ahzC^AyS< zS{YBYXl}yl$kbi!nsXqu*|~X(_wV1g+kyO>BKBLMyj zaNVW71!u@*RGsay{`RY5K8BJ3PTL@IeDzHPo=5%VH`Cc)KFMdfYLz)>%qn?|+M?Q6 zFvlSu`0`H6=3ME`&0ThWC}qhED4aORWaf)2R71nJO|N~t71nqb;YtCLsZiC{GkEe{ zGxArjUXg6Q9QHhcsNG3>*14GXA*hxkEmaji!8axd+m|$$2=D4VXY^AK?Z}&{tnP|7N+- zz4(0OLC4R%Z^bv8jIcs^6`lWoFV`wFb~pKKXn9q*)M!>j6>H{mvVK?+2iybG1)JTR zaJEct7-Oqdpth<$OQJ=o)||y5SOWIEmt|&G^%2l6elV2n?2rxpht?b zom+gLn`ch`*H0JP*!syOUMFUm7SVypfp=l0i@=P*PSl`z&5T@c4|+9E&q?t}Er)s2 zo@?wPH7SJ6FnPp}g)|m53B=lld!|@VQ{ewRMV3CI%jqf^()m7hZ5GT{EBxV1n8I+g+l9{4l+N} zGVRqJRG;LP|M7t$urE2uQUvm^{PzmMwgH z(Wp)PN~f6$!+q(p+}u(76!W8#(AFRnZ{|Tg$gc>VWZswlafDDFd_@ps?<7)qm5VRb zPI|YV3o;*>C>=_jStAi;Y0p{%R{y8#PSsqUw@*QWX`V+$RXz3{mCe>$`7n=s#l`M>&C9EpyK zO*xqY+wmWmq*ElmpU+;3HIV6*wewf0#VKOv^{*l#GR}Hm8DU)RNmi-6)nq*H(_%mC z2uF5!X^qkSL;5s5s4(kkgSRW4y|$+%Hh(XHKSrmrBOGr~Z7{vZi3Kz;_T|L^hubDLGSHsm7*y>@Xm0BgAReIH18=Fb|{PWM*`v+yi zrBwFB3?ojjIs~UkP6!1FYXcuX8+pqoBXTXzv&5ausTT$H#a@RD%tPVjZq@3guF1bS z@5_mTaUR^|YKEVs-ni+3tG3GLzjes@>fa)pd86pS7R(esxvO^`d6#()4(0t2DknJ86xII*V~&W+o%g@Q|d- zUXU!UOv)xr`cMb9P86z=3}dS7a@$QMnZ29=ls0BFk)AYt{Dfgy-{bLI&7P6;3nZ zvK$<(1M;U9Ez2QqI-DYjv7mIi&$DhqV^ZUcx{<)p`TG>l3h6~&Hf9E}50_hD_lb_; zt>*L;Yv4=N&7P)uuS#NkP3^WzpX(@>oonyVO*7 z%bnb}`TAtOmwH>N=TqvKHF8z68*3@6ALsKjv<7OslFLh1*(wJrjKGKzIo_mvPbSQd zKa&UP4RAncUiPEW6hjmgCjt5~XG0{d`tHBITw~fC@(Q^Q)T@kK0c;**q2-OoxFdRx zg9zNFC)OT!ww@qD#Zvl|A*hO)tvr?xv+7QAY37r^``zyfR#DhSjbyXuhY0^j6|0Lz zKAGp<&4Qz(8@vr+(%29Bs&3B|jR6Z}@$?vovc$p}1#%yK*`BPn$uHQU7?9-f`KPq1 zO~xs+gXljw6{CJbVG5nzhgz3dk&JSn~Zato8 zA$>;+;jYe?`ELi8)-7)W(F>uf4IrJxaKFlNx^4>@Q9x0M${^Y6o0eu|895^= znD@uHZ@2yBE{^r}W3~-3p89tSy~zFMxnncE^}+)*c77XsJ$tSewB=Ay7ykG;F(#e% zyweGpuu=tHKH){>$8Noj$xfwu4)k3_7ydqqh(jV}lxfUFiBOPjgmN~oEwi@y!n(`H zfEGJGQPKVhVR*#_O1*h)DU6fl9N?HR)!^AI@PNA#w+&rRi z%945R^~32_y1Kqa21bCh7Ilf6FkB-b0)J%;&u465ISrIczO|`xVH)Mfgz5q2`Mvi^ z>87j}<^=hpx>9$Yn|L6FwEpmiKfr8nPI61apk2z0hq4$WF3a)^U}4;7Ea0mMsJxD_ z&P_>0U0xtOwTo?^gSav4sLIfg*KB7U)S6WVa5~Bm#&Y7O1+tOVdT|;#Z%R|f28N|> z*BE9L!acODgJUA*US-2Dw1uSD^UAqrw$eJ3 zdDG~qJdW}d;l1zX1(CwkX`!Kt;i`Qc`CpUIP2}#`W>~DolJZs=)pjbrsa3K>i)WP$ znBP2wSwzW$1BHt?Mm_MF+|=&uGhIb$G|(e=LbsnR!Nts!YwE_#RbIn72aH5lFUFWI z1<#6E$h_^@^M$B9KHF6SQ}zB=Cxt-rT?}C4++>~0CmbZTq^$)HL{{?J+3=-I*?Vq@ zm|R|?XbMikLC3wDre^Q21=Rig^Urlu&QvC7mwb8QVu3Z?{3J6`8ic(P6&8a)BUfAk z(ywbuO^mRfQa+rAe*N{=4kYw?EZW>;%(*G?%KT?7%5hSK)hSgVBtJe$Did~W&+zp6 z+Htg-Hzy$)2~5y6rh}a1+qZ8s6(?D|r^HAnCyyApK=E5NYuDfBGo=iHyPIwsb7b81 z(k#lZ;Ojnq{8(F4rX^#@w;Dozke#_Q-ycfe(;CQCUyp@qo1Cck1xoCTNcBXI1c%_S z-8i;V1*2dF_2>{yxsM1X!<~@ul>Qc}+OaC2tq#&7Lb>{MU)9SLrYADp##h5<*x>!G z>T9pT+MW#48xyb%J8mvUws-GH@~u4}{?#1L8Wf1#FHV7cWqJ$6oW)oYw%4y;UtUmT z;!vvT@&kf|@o_+dP4)_G<)F#T!}i>itR6dpT%BiC2j0siLjOpLuMAk@P9*0MJcylU z_&MQuwas+LI0ogc3cs&<1rq6Zvl@2eFlt+{k)dX;GC5g}&CpEV@ztwWanVUd_Og`) z+_38p=pXs*-N^jLaXe$p{!9i2h2X(n7?qf~!`Pk?=P*{A=lW(RjcoLxx`E?8%9ZWF z4R}fqXvL6X3N~iuIsf(aJHjQKB@CN7d2I+ZMhYgsD4&-gg}_wQuvvlGT&vB}t6t(a z-+aR#7G`?fe;dDrOHkCK%>(F`FW|qO?5>Gg9Qx7WOY$3kITIZBI(s`&eD=ZDtjln@ ztFm#`%+|tzMcXig`J8y#o`r7Bl&Ln5|`g?`)m{A09_m@@~0pj6Ze*6V0?X zCq7nNjlRKi`^|55t7zQ!!E+0prl8kBaZaQvil8f0n=e27`OkmebL%7V|L_n0Flolj zn{>1Ps!wxXW(+wFb-DTP)s0_$6=x>DtbbWGu)r|~Lh_IMQmCxRuK}2Trq*T?w&A3Cq?}an4p%Sw(&Dc=x)RvU4V9CKiPUNMG+Wbjc z`wS{Zf9f8|2PTxGy(i^ZahcVLFjK(qi_IN8w#u`OdZS$-zKHIk9Sx=cCe)vJL7Obzt z=G4!0bAuccP_4>P1iCDFl5aNwq)%G&fD*Z;wp67pnQSKDUU|#CHm_qEim2BC9*LSB zxfE<@4n~9J+Usr%rIHDZi&X~B%K*OEw2DT?f-x>IidjDM^Ups61Wo0UV!`b+*q&X| z9b?z(@=9;s zy!rU?BXZ$Aw?}B>V>Wrx2zW?eNBf< zW7CNgO$OZQb?!c>-^XYOivhLt`k6c{E4ZqcjOyEOzin3;h5J^dJ>1W@Y6ZaP#yc8q zh!duIwwAPMIhaG*hxb~yQSM_QO+FlhX*{|PI>wwoStHNfSBCEh^-(2KgI@Q)7VUVi zsa&d;lD2&Es@rz5!)Jlz6R3F7eq#iX4vdP^`IoW98&_7Oc6_&|6D?fLkYuCTP3>jJ>>JIp zj3?p^50Z;Wm&Gya6p8^PzJ+blq;*`o<1l)UQ#83WH~`kyANketP&A}am%ydbNR{gL z1_T1CemI!b&z)^s=O051h6%+cvb6@^J*(C?A3K?Q>HRZ}&SK0ul&9k?)3teY%EKGa z-ceYOy7lVLf{7&k@`AQ4yWX^s>A<=}ZAj3wqus#Aq1H1Q-6vIZl6X0rAd+aR5j1#a zTa9t{WI3eE;q#=uqgaUKau`_L{^@t4Mk%*sYGIm4B|Vd9^(CRPScw zzr%?DwRMVD_2n!jjBfRDtwZj z(jkpQ-egG5brBHZ#&L4MXwMwjd0!NcmNM5KnsL109Zg5jMdo6RS|deh8T=WYc|Hjv zB$xTgv-IQ~h4x_Q3eZrYmoIy<)v}UG!m6dGQlz3o4yJ0hY|g(J;o>oD`&JbLG^%z;@5w9HLYw1>(;I2DcI3QWj%qb{apEwbrg!trM3xh(0iApu87F-}BlFPt&D zPaG$>Q%>6J*RS*Y(G}!IBAq|j#Wy8RK@%IP?1P?ypFH_pWhn<9W){ww$i-dTX5Ndy)yeMvH-t*4Nj);l77vy=(MmA*bT2GuI{@Zteaw z?Wn!ICrGJv>}HEkDn?FbM5yiopPuWsvGN)ElQvhZoGUKt=5zO|an2ts>LtroCjr}9+Y+6orDo{$@p{s zgM@R0Gpng~`toaE&Af4hL>!K@JcIaQWh(qOI!(! z+uq6Y>eZ`*^W{K3e=WCdbUP!KOBMc=YwxUrTWLjqvCh zYbv*u2_N%RWi;grspN0sdb8EoN-#L0l;JRW8tx;jyx9!n?%WaIJ7eZ0Hve|My6jo0 zw#`eS&F0~o*|W2zVwQs=c+8HLjqhYhp?SEf_b3fuHwxj-s~zXzT_ zwj9;ey4n98Q8+WW&m;t9oB?rncgRh3i9wO8wkGsYEZB0{OHsa?FF2Mq9n6f-@5tMc zxsD>>Z5Ok2#-}sJf@|AH4Y3b8i)+=(tR^=BkmW&bg#N*k0Zxwlz|(3_b_j zY7jquw3G~eT_f>eWv`k|Wxx}~|4q?>tAP!3o)!H0=btm-nU*Kk9*D^1($`guE z``o8_ScI&9Hk?LMdxzakZX0xcNlM0d=7gnKM3HZRlpg zWmHE0t-g>n5zoJ}p(pZ4bjRYFesZ~yS=Y7@Lx zmwC`lM)iY(VGKwB9vnbpmeqtv8eP?;1)`hksig2Ak%iNK^L<+f;Z&_<^+c>+BZeaN zZBcmazbPFg>In82Bwvlxf+yX!l|=h-i#DTYfjzE|N;}DjnI6PzAA#?1l9`7+r}SzS zM|)o9R`HCdq{lJ-aEt?4ydD@o{q&Qi$}-2+kA;yz_Fy=0p+|dt&+GuFhAZeV$GAvV zIZuD{=1qJU)NOf@3}DjHw|eqEPZdtN6!12uY_ZOHXbGtv=R`ivJY=J011tUd@Zm%0 z^`0K2U^=k0&@{(GR?ma~`uxix5;&+1{j8DNJl8qVJyLol|Kdw*p}&m(Xx!*0X7Fd? zBe_pxGEZ@=GOz%se);8>gBF5&3UTk~QnNmi!fC}G@z8!sz8b-4=3(M#tipLD{?(67 z3B#UVQ=`20V-$0}W548v*#&vWG2Jx6kJa=~0aUFizWL@GeL*rLJs4KaJVr@#6ai^_ z1w25Tc((j9>$~Z;fzIB&6WjZtRFI4?Nn^yk&)P4J9{COPFsa|0u96mx-WumYQ@f~? zw{PEaK4UICUQzk^uE;=yCxeVC7*7Otu)^>06h@2=IT8Vg+7$kqZaa}cu8$mJh;b?dKNBLG=Wd=8Y73WVVa+ zn+CR5mz7(A11NJiADrTWRO7W~Ov;6Q?=(T;Z=r8B21@2W0UG-V6^~j<_-jdhP`R+S zYYrjZ$wisS=j+`Ealjvj!)yx{u<*w{r7;26CU`BtJ4p0BQM&%Gmy1mj{oi`Fat%Vp zwk)d*8YYCfJF$@+d#XLA`EQpOAmZc*ZO(9A_ij?;DKmzUc5gSXCPQlR$RdZN_t2cpy0RYm@B7`T7E@7QP_jEaQZ%K%7A{(Dn9waW{k zS+`bRq;|&t@^bBk4_3DN&yj8GQpPKAP?06QVxJqOW~M0Zh*zv2Dm(UvAAV>*z>gn4 z=J%@XHW#k0?`p4*nNF8ao^gtfFNQU5&E#|)VHG&o2fe2yZwUjN`&f*1L}+vEe32{Y ziPUZcGCxdEpR1Q+SkY9?j*-H{9#2TXq%QE3Wd zGo+VcC{Vd?n~2WlbvD5*nV*#zuU)Y7L-q@|!THT$Q|+euBJRW{dMEP+As-=`2A^%R zSxUz>eK00E_Lu8wUOtsge*N{=`Q>x#s}bBQiK#w}5@0Tm0O_?)hFq&}kxzzZRj98E z_Gj4HjBRk5zutYwewj)Y9${N|2%F<^XeHVV-J<~PahvNnz_hJ^4GY;h4*WVN*Q(wPt=-a z241;>9HZ8h&9*B4tU??%#;ahua1Rf#KtzrZf}(sSPrOg-wyM0?$kBfT4{83b>=f1- z!~lw9WMMErI(;KxA6bHOLyxmGt<466dyvv|+)BV}fSNKqP4w+SPw$hlx*wdb0u~Mq z^yv=m#%w}l#SbW>CUvSpo@}sBa@7%P^I?p#U^wJ?R2|NA0ogC3>v9gZEs9A{ECcUm zmbhB$kp5-^nfI*m)iRIEOCPYO=O6Bi8|}5Ash@Vt(#{@oD#Xyqhf8+XPC=_RtSWl^ z{Q<-8sI#O9e)qfIW&HUH5oz3OGonzwK^4z`{p()^AS2Vc)qyWjiG0dpm6JUKpo}(fD!#THIi;j>!zhY)8zN=Y}@!rxE+mXU?wFuo-6jKL7Dz28N@z;)5Hz{s}%M? z9hB>JGS;=qiFD=Ii`e}8PgeyAuH%jpO|*D0keiu@Xqi~I$M6Objj?LtID_5N>QOv0 zAy{W~pL{?#Q*HX?rGsa)H$W7};GBF0ER$v=q5^~vEC`t&|@84L5$oXskXh15GN{g<@NO?pOOGqW0^PUjh=Q54NM}ckn+r-I5oH% zgZEr1(d$mj<8Iq{YGmG=oh$&fPfx_{k299Hh)wLhK+$p#kH$(HX0~}00VuOJv-Ln3 zPNg`%aks5ei4yQqEDH8E1+r=+b0QpIU$?a#3g4*>gZ4tz4+Y3D0ZZ*u79~rd*Vziy zYwzI8OG_2D^85Gi+4Kj2(Pvpio5A8Kh|Fv1JKiL#2)ZG$7%ALECoC!hw*DeZ5iazJP2KH`ehH*>yh5{k6`ZS>!of14cj zY`6HFQF`q1d-kpt>-Pqa$i}9JR-|<#>?6i zbua`JCV;6fe&87zr-t4xFBJTu6+EIIA4uRvI|PIDXU#(%hwr8F+xV_|NFT`f#oyy} zjI4EEy?OH{Ux?U6!C^Q(o+H_|=Z^lW5@`jLe^;9iP^#BS8$GvbOsEX7B%pYJEOV4X zpC}r=^4IO@0u^+vnAEVlwR~4)aWwB#-(?}yq#bXtt02kqu1-G_AtZ2f4$XxwWD$}WywmbeR(!zb4~xLozax2oKh}yO*^xT z2mqKJOojG+qhM?n7flRNYiU+iFj_)wk_L=>QUrdiy!)h_YlgF)Sb0`lEcZdmRGJ(v z!PG|qNCS!ARS3!$Q;0|(mugHeJFQ@=!^JiB_+WG!>)GE$DaBu{J;j{)eT<&Gh^WoT zJ-tb{i>kEYBn?h7ysP;@G(|#J=f#*A2fDT<;>POPV~1@oWhxc#Bo>T!Lbnv*iCYqH zhe*G;fCQs7=5wnZB5Zlwzy9mL{`ljMV}F89$hhnI>gW5|*82D1O-`5J<|PM`2?4Z@ zBxiS*J8cy5b|lZgg)NAi;EIsbXvfrSfp$Ha)WwSbzr56d!TZ_T41hgUo?26-Vw8`d z(#MY<1zt}cSoevvh~B^a%fFbD^5zRaT@~Hqqb)bdLT~`oQZm{1!qz4VI6~gEKx1uFCUlR)==dg8RVtMjZoBmrJn6VXM=3K0Q>L|G8 zkoEosOrQidTLs>2W)%CaoUes;tN(UjF{+�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 literal 0 HcmV?d00001 diff --git a/docs/logos/circl.png b/docs/logos/circl.png new file mode 100644 index 0000000000000000000000000000000000000000..516678deaa5e34795300c98a9c2b49bdbd80528c GIT binary patch literal 19207 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 itF~&Zz*@Ci!~P#4a^MMU?du}|0000$oZa literal 0 HcmV?d00001 diff --git a/docs/logos/cisco.png b/docs/logos/cisco.png new file mode 100644 index 0000000000000000000000000000000000000000..87b863b7736c9d029a4b9f29ed5cce0e055945c9 GIT binary patch literal 35608 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 literal 0 HcmV?d00001 diff --git a/docs/logos/crowdstrike.png b/docs/logos/crowdstrike.png new file mode 100644 index 0000000000000000000000000000000000000000..359cb01adf8ab581347214600a0259b0a282d4e7 GIT binary patch literal 34911 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 R4SWYhQC3Z+7G@Ume*x<1&bI&n literal 0 HcmV?d00001 diff --git a/docs/logos/cuckoo.png b/docs/logos/cuckoo.png new file mode 100644 index 0000000000000000000000000000000000000000..57cf35a56fae11e85813de9f00b349615dcdeece GIT binary patch literal 11970 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 B){OuF literal 0 HcmV?d00001 diff --git a/docs/logos/cve.png b/docs/logos/cve.png new file mode 100644 index 0000000000000000000000000000000000000000..315ccd8190b154c555725f3981c6695035a21dd9 GIT binary patch literal 20015 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 Date: Thu, 22 Apr 2021 12:47:06 +0200 Subject: [PATCH 257/476] chg: [doc] yeti logo added --- documentation/website/expansion/yeti.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/website/expansion/yeti.json b/documentation/website/expansion/yeti.json index 3ec7789..93341dc 100644 --- a/documentation/website/expansion/yeti.json +++ b/documentation/website/expansion/yeti.json @@ -1,6 +1,6 @@ { "description": "Module to process a query on Yeti.", - "logo": "", + "logo": "yeti.png", "requirements": ["pyeti", "API key "], "input": "A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute.", "output": "MISP attributes and objects fetched from the Yeti instances.", From 9364859ce99d834efb3b56f8f9830ef0ae8fec21 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Thu, 22 Apr 2021 15:05:29 +0200 Subject: [PATCH 258/476] refactoring of the module --- misp_modules/modules/expansion/onyphe.py | 96 ++++++------------------ 1 file changed, 24 insertions(+), 72 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index d8db477..cff803f 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- import json + +from pymisp import MISPEvent + try: from onyphe import Onyphe except ImportError: @@ -9,9 +12,10 @@ except ImportError: misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], - 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url']} + 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url'], + 'format': 'misp_standard'} # possible module-types: 'expansion', 'hover' or both -moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', +moduleinfo = {'version': '2', 'author': 'Sebastien Larinier @sebdraven', 'description': 'Query on Onyphe', 'module-type': ['expansion', 'hover']} @@ -19,85 +23,33 @@ moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', moduleconfig = ['apikey'] +class OnypheClient: + + def __init__(self, api_key, attribute): + self.onyphe_client = Onyphe(api_key=api_key) + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + def parser_results(self): + pass + + def get_results(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if key in event} + return results + + def handler(q=False): if q: request = json.loads(q) + attribute = request['attribute'] if not request.get('config') or not request['config'].get('apikey'): misperrors['error'] = 'Onyphe authentication is missing' return misperrors - api = Onyphe(request['config'].get('apikey')) - - if not api: - misperrors['error'] = 'Onyphe Error instance api' - - ip = '' - if request.get('ip-src'): - ip = request['ip-src'] - elif request.get('ip-dst'): - ip = request['ip-dst'] - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors - - return handle_expansion(api, ip, misperrors) - else: - return False - - -def handle_expansion(api, ip, misperrors): - result = api.ip(ip) - - if result['status'] == 'nok': - misperrors['error'] = result['message'] - return misperrors - - # categories = list(set([item['@category'] for item in result['results']])) - - result_filtered = {"results": []} - urls_pasties = [] - asn_list = [] - os_list = [] - domains_resolver = [] - domains_forward = [] - - for r in result['results']: - if r['@category'] == 'pastries': - if r['source'] == 'pastebin': - urls_pasties.append('https://pastebin.com/raw/%s' % r['key']) - elif r['@category'] == 'synscan': - asn_list.append(r['asn']) - os_target = r['os'] - if os_target != 'Unknown': - os_list.append(r['os']) - elif r['@category'] == 'resolver' and r['type'] == 'reverse': - domains_resolver.append(r['reverse']) - elif r['@category'] == 'resolver' and r['type'] == 'forward': - domains_forward.append(r['forward']) - - result_filtered['results'].append({'types': ['url'], 'values': urls_pasties, - 'categories': ['External analysis']}) - - result_filtered['results'].append({'types': ['AS'], 'values': list(set(asn_list)), - 'categories': ['Network activity']}) - - result_filtered['results'].append({'types': ['target-machine'], - 'values': list(set(os_list)), - 'categories': ['Targeting data']}) - - result_filtered['results'].append({'types': ['domain'], - 'values': list(set(domains_resolver)), - 'categories': ['Network activity'], - 'comment': 'resolver to %s' % ip}) - - result_filtered['results'].append({'types': ['domain'], - 'values': list(set(domains_forward)), - 'categories': ['Network activity'], - 'comment': 'forward to %s' % ip}) - return result_filtered - def introspection(): return mispattributes From 94f6af88821baf5ae0fabda9080960c030f3adf6 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:02:21 +0200 Subject: [PATCH 259/476] add summary ip object domain --- misp_modules/modules/expansion/onyphe.py | 47 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index cff803f..21f1466 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -2,7 +2,7 @@ import json -from pymisp import MISPEvent +from pymisp import MISPEvent, MISPObject try: from onyphe import Onyphe @@ -31,14 +31,46 @@ class OnypheClient: self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) - def parser_results(self): - pass - def get_results(self): event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object') if key in event} return results + def get_query_onyphe(self): + if self.attribute['type'] == 'ip-src' and self.attribute['type'] =='ip-dst': + self.__summary_ip() + + def __summary_ip(self): + results = self.onyphe_client.summary_ip(self.attribute['value']) + if 'results' in results: + for r in results['results']: + domain = r['domain'] + if type(domain) == list: + for d in domain: + self.__get_object_domain_ip(d, 'domain') + elif type(domain) == str: + self.__get_object_domain_ip(domain, 'domain') + + def __get_object_domain_ip(self, obs, relation): + objet_domain_ip = MISPObject('domain-ip') + objet_domain_ip.add_attribute(relation, obs) + relation_attr = self.__get_relation_attribute() + if relation_attr: + objet_domain_ip.add_attribute(relation, self.attribute['value']) + objet_domain_ip.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(objet_domain_ip) + + def __get_relation_attribute(self): + + if self.attribute['type'] == 'ip-src': + return 'ip' + elif self.attribute['type'] == 'ip-dest': + return 'ip' + elif self.attribute['type'] == 'domain': + return 'domain' + elif self.attribute['type'] == 'hostname': + return 'domain' + def handler(q=False): if q: @@ -50,6 +82,13 @@ def handler(q=False): misperrors['error'] = 'Onyphe authentication is missing' return misperrors + api_key = request['config'].get('apikey') + + onyphe_client = OnypheClient(api_key, attribute) + onyphe_client.get_query_onyphe() + results = onyphe_client.get_results() + + return {'results': results} def introspection(): return mispattributes From 8fbe371eca25fc985c4a59608debb835024a4d98 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:06:20 +0200 Subject: [PATCH 260/476] add logs --- misp_modules/modules/expansion/onyphe.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 21f1466..5b93e99 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -45,6 +45,7 @@ class OnypheClient: if 'results' in results: for r in results['results']: domain = r['domain'] + print(domain) if type(domain) == list: for d in domain: self.__get_object_domain_ip(d, 'domain') From ff6470d0e29955b6e6ceebcf280e4fa4ddcca3cb Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:07:44 +0200 Subject: [PATCH 261/476] add logs --- misp_modules/modules/expansion/onyphe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 5b93e99..041de2e 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -42,10 +42,10 @@ class OnypheClient: def __summary_ip(self): results = self.onyphe_client.summary_ip(self.attribute['value']) + print(results) if 'results' in results: for r in results['results']: domain = r['domain'] - print(domain) if type(domain) == list: for d in domain: self.__get_object_domain_ip(d, 'domain') From 9fd23d6fe03eb385e52ec8401a4f1080e6ea5894 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:09:21 +0200 Subject: [PATCH 262/476] add logs --- misp_modules/modules/expansion/onyphe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 041de2e..8f6dd2c 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -37,7 +37,8 @@ class OnypheClient: return results def get_query_onyphe(self): - if self.attribute['type'] == 'ip-src' and self.attribute['type'] =='ip-dst': + print(self.attribute) + if self.attribute['type'] == 'ip-src' and self.attribute['type'] == 'ip-dst': self.__summary_ip() def __summary_ip(self): From 7813ba4fc347ceab4eeba5cf3ffe0038c3c0ed71 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:11:10 +0200 Subject: [PATCH 263/476] fix logical test --- misp_modules/modules/expansion/onyphe.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 8f6dd2c..d80a832 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -37,13 +37,11 @@ class OnypheClient: return results def get_query_onyphe(self): - print(self.attribute) - if self.attribute['type'] == 'ip-src' and self.attribute['type'] == 'ip-dst': + if self.attribute['type'] == 'ip-src' or self.attribute['type'] == 'ip-dst': self.__summary_ip() def __summary_ip(self): results = self.onyphe_client.summary_ip(self.attribute['value']) - print(results) if 'results' in results: for r in results['results']: domain = r['domain'] From 436254cd8c8bee6bccd4729917c2b09f84cddd6e Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:13:32 +0200 Subject: [PATCH 264/476] add logs --- misp_modules/modules/expansion/onyphe.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index d80a832..85c5a0d 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -44,6 +44,7 @@ class OnypheClient: results = self.onyphe_client.summary_ip(self.attribute['value']) if 'results' in results: for r in results['results']: + print(r) domain = r['domain'] if type(domain) == list: for d in domain: From f32717c8969a6b1e27cf9d0855d925ef377c1b7f Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:15:38 +0200 Subject: [PATCH 265/476] check entry in result dico --- misp_modules/modules/expansion/onyphe.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 85c5a0d..72bdcad 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -44,13 +44,13 @@ class OnypheClient: results = self.onyphe_client.summary_ip(self.attribute['value']) if 'results' in results: for r in results['results']: - print(r) - domain = r['domain'] - if type(domain) == list: - for d in domain: - self.__get_object_domain_ip(d, 'domain') - elif type(domain) == str: - self.__get_object_domain_ip(domain, 'domain') + if 'domain' in r: + domain = r['domain'] + if type(domain) == list: + for d in domain: + self.__get_object_domain_ip(d, 'domain') + elif type(domain) == str: + self.__get_object_domain_ip(domain, 'domain') def __get_object_domain_ip(self, obs, relation): objet_domain_ip = MISPObject('domain-ip') From e1c2c779aa74ab99163ffd3c6e82607acce0dc4c Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:16:43 +0200 Subject: [PATCH 266/476] Update onyphe.py remove typo --- misp_modules/modules/expansion/onyphe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 72bdcad..64fd62e 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -65,7 +65,7 @@ class OnypheClient: if self.attribute['type'] == 'ip-src': return 'ip' - elif self.attribute['type'] == 'ip-dest': + elif self.attribute['type'] == 'ip-dst': return 'ip' elif self.attribute['type'] == 'domain': return 'domain' From 098616846da8ee85f6a9a02061e8e08e816161db Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 23 Apr 2021 16:19:47 +0200 Subject: [PATCH 267/476] add hostname --- misp_modules/modules/expansion/onyphe.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 64fd62e..2ab3677 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -52,6 +52,15 @@ class OnypheClient: elif type(domain) == str: self.__get_object_domain_ip(domain, 'domain') + if 'hostname' in r: + hostname = r['hostname'] + if type(hostname) == list: + for d in hostname: + self.__get_object_domain_ip(d, 'domain') + elif type(hostname) == str: + self.__get_object_domain_ip(hostname, 'domain') + + def __get_object_domain_ip(self, obs, relation): objet_domain_ip = MISPObject('domain-ip') objet_domain_ip.add_attribute(relation, obs) From 7f1caaba25bcc241e6c94b4888ee1add2003b7e2 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:16:22 +0200 Subject: [PATCH 268/476] add object certificate --- .gitignore | 5 +++- misp_modules/modules/expansion/onyphe.py | 32 +++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 323f87a..4c3db86 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,7 @@ site* .idea/* #venv -venv* \ No newline at end of file +venv* + +#vscode +.vscode* \ No newline at end of file diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 2ab3677..774058c 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -60,7 +60,37 @@ class OnypheClient: elif type(hostname) == str: self.__get_object_domain_ip(hostname, 'domain') - + if 'issuer' in r: + issuer = r['issuer'] + self.__get_object_certificate(r) + + def __get_object_certificates(self, r): + object_certificate = MISPObject('x509') + object_certificate.add_attribute('ip', self.attribute['value']) + object_certificate.add_attribute('serial-number', r['serial']) + object_certificate.add_attribute('x509-fingerprint-sha256', r['fingerprint']['sha256']) + object_certificate.add_attribute('x509-fingerprint-sha1', r['fingerprint']['sha1']) + object_certificate.add_attribute('x509-fingerprint-md5', r['fingerprint']['md5']) + + signature = r['signature']['algorithm'] + value = '' + if 'sha256' in signature and 'RSA' in signature: + value = 'SHA256_WITH_RSA_ENCRYPTION' + elif 'sha1' in signature and 'RSA' in signature: + value = 'SHA1_WITH_RSA_ENCRYPTION' + if value: + object_certificate.add_attribute('signature_algorithm', value) + + object_certificate.add_attribute('pubkey-info-algorithm',r['publickey']['algorithm']) + object_certificate.add_attribute('pubkey-info-exponent',r['publickey']['exponent']) + object_certificate.add_attribute('pubkey-info-size',r['publickey']['length']) + + object_certificate.add_attribute('issuer',r['issuer']['commonname']) + object_certificate.add_attribute('validity-not-before',r['validity']['notbefore']) + object_certificate.add_attribute('validity-not-after',r['validity']['notbefore']) + self.misp_event.add_object(object_certificate) + + pass def __get_object_domain_ip(self, obs, relation): objet_domain_ip = MISPObject('domain-ip') objet_domain_ip.add_attribute(relation, obs) From 4478440d5b09153381efdafa394e4dd29e5a0037 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:16:47 +0200 Subject: [PATCH 269/476] remove pass --- misp_modules/modules/expansion/onyphe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 774058c..d7720d4 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -90,7 +90,7 @@ class OnypheClient: object_certificate.add_attribute('validity-not-after',r['validity']['notbefore']) self.misp_event.add_object(object_certificate) - pass + def __get_object_domain_ip(self, obs, relation): objet_domain_ip = MISPObject('domain-ip') objet_domain_ip.add_attribute(relation, obs) From 32aeb52efc82485dc773a2c7e7019db4c32f4bb9 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:22:55 +0200 Subject: [PATCH 270/476] fixe typo --- misp_modules/modules/expansion/onyphe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index d7720d4..89e8188 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -64,7 +64,7 @@ class OnypheClient: issuer = r['issuer'] self.__get_object_certificate(r) - def __get_object_certificates(self, r): + def __get_object_certificate(self, r): object_certificate = MISPObject('x509') object_certificate.add_attribute('ip', self.attribute['value']) object_certificate.add_attribute('serial-number', r['serial']) From 86beb488c1fd5746e78dff2bc6ff2a84863006ad Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:25:27 +0200 Subject: [PATCH 271/476] add test to check --- misp_modules/modules/expansion/onyphe.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 89e8188..cb7cfda 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -80,10 +80,13 @@ class OnypheClient: value = 'SHA1_WITH_RSA_ENCRYPTION' if value: object_certificate.add_attribute('signature_algorithm', value) - + object_certificate.add_attribute('pubkey-info-algorithm',r['publickey']['algorithm']) - object_certificate.add_attribute('pubkey-info-exponent',r['publickey']['exponent']) - object_certificate.add_attribute('pubkey-info-size',r['publickey']['length']) + + if 'exponent' in r['publickey']: + object_certificate.add_attribute('pubkey-info-exponent',r['publickey']['exponent']) + if 'length' in r['publickey']: + object_certificate.add_attribute('pubkey-info-size',r['publickey']['length']) object_certificate.add_attribute('issuer',r['issuer']['commonname']) object_certificate.add_attribute('validity-not-before',r['validity']['notbefore']) From 73ea9620bf1b90913c5b8729b0e238240dd0071d Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:39:56 +0200 Subject: [PATCH 272/476] add reference --- misp_modules/modules/expansion/onyphe.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index cb7cfda..ef2277c 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -91,6 +91,7 @@ class OnypheClient: object_certificate.add_attribute('issuer',r['issuer']['commonname']) object_certificate.add_attribute('validity-not-before',r['validity']['notbefore']) object_certificate.add_attribute('validity-not-after',r['validity']['notbefore']) + object_certificate.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(object_certificate) From 16f9ec9f6d611075f3e7ec37fc53b82bdc460532 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 30 Apr 2021 15:46:59 +0200 Subject: [PATCH 273/476] fix bug --- misp_modules/modules/expansion/onyphe.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index ef2277c..05124e0 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -100,9 +100,9 @@ class OnypheClient: objet_domain_ip.add_attribute(relation, obs) relation_attr = self.__get_relation_attribute() if relation_attr: - objet_domain_ip.add_attribute(relation, self.attribute['value']) - objet_domain_ip.add_reference(self.attribute['uuid'], 'related-to') - self.misp_event.add_object(objet_domain_ip) + objet_domain_ip.add_attribute(relation_attr, self.attribute['value']) + objet_domain_ip.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(objet_domain_ip) def __get_relation_attribute(self): From c06b8ff604fac7a62060e884bb86aa24498a9beb Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Sun, 2 May 2021 16:45:55 +0000 Subject: [PATCH 274/476] Version 0.2 of the cof2misp import module. --- misp_modules/lib/__init__.py | 2 +- misp_modules/lib/cof2misp/cof.py | 103 +++++++++ misp_modules/modules/import_mod/__init__.py | 1 + misp_modules/modules/import_mod/cof2misp.py | 219 ++++++++++++++++++++ 4 files changed, 324 insertions(+), 1 deletion(-) create mode 100644 misp_modules/lib/cof2misp/cof.py create mode 100755 misp_modules/modules/import_mod/cof2misp.py diff --git a/misp_modules/lib/__init__.py b/misp_modules/lib/__init__.py index c078cf7..d92e989 100644 --- a/misp_modules/lib/__init__.py +++ b/misp_modules/lib/__init__.py @@ -1,3 +1,3 @@ from .vt_graph_parser import * # noqa -all = ['joe_parser', 'lastline_api'] +all = ['joe_parser', 'lastline_api', 'cof2misp'] diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py new file mode 100644 index 0000000..2dfd267 --- /dev/null +++ b/misp_modules/lib/cof2misp/cof.py @@ -0,0 +1,103 @@ +""" +Common Output Format for passive DNS library. + +""" + +import ipaddress +import sys +import ndjson + + +def is_valid_ip(ip: str) -> bool: + """Check if an IP address given as string would be convertible to + an ipaddress object (and thus if it is a valid IP). + + Returns + -------- + True on success, False on validation failure. + """ + + try: + ipaddress.ip_address(ip) + except Exception as ex: + print("is_valid_ip(%s) returned False. Reason: %s" % (ip, str(ex)), file=sys.stderr) + return False + return True + + + +def is_cof_valid_simple(d: dict) -> bool: + """Check MANDATORY fields according to COF - simple check, do not do the full JSON schema validation. + + Returns + -------- + True on success, False on validation failure. + """ + + if "rrname" not in d: + print("Missing MANDATORY field 'rrname'", file=sys.stderr) + return False + if not isinstance(d['rrname'], str): + print("Type error: 'rrname' is not a JSON string", file=sys.stderr) + return False + if "rrtype" not in d: + print("Missing MANDATORY field 'rrtype'", file=sys.stderr) + return False + if not isinstance(d['rrtype'], str): + print("Type error: 'rrtype' is not a JSON string", file=sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file=sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file=sys.stderr) + return False + if not isinstance(d['rdata'], str) and not isinstance(d['rdata'], list): + print("'rdata' is not a list and not a string.", file=sys.stderr) + return False + if not ("time_first" in d and "time_last" in d) or \ + ("zone_time_first" in d and "zone_time_last" in d): + print("We are missing EITHER ('first_seen' and 'last_seen') OR " \ + "('zone_time_first' and zone_time_last') fields", file=sys.stderr) + return False + # currently we don't check the OPTIONAL fields. Sorry... to be done later. + return True + + + +def validate_cof(d: dict, strict=True) -> bool: + """Validate an input passive DNS COF (given as dict). + strict might be set to False in order to loosen the checking. + With strict==True, a full JSON Schema validation will happen. + + + Returns + -------- + True on success, False on validation failure. + """ + if not strict: + return is_cof_valid_simple(d) + + +if __name__ == "__main__": + # simple, poor man's unit tests. + + print(80*"=", file=sys.stderr) + print("Unit Tests:", file=sys.stderr) + assert not is_valid_ip("a.2.3.4") + assert is_valid_ip("99.88.77.6") + assert is_valid_ip("2a0c:88:77:6::1") + + # COF validation + mock_input = """{"count":1909,"rdata":["cpa.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1315586409","time_last":"1449566799"} +{"count":2560,"rdata":["cpab.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1449584660","time_last":"1617676151"}""" + + i = 0 + for l in ndjson.loads(mock_input): + retval = validate_cof(l, strict=False) + assert retval + print("line %d is valid: %s" %(i, retval)) + i += 1 + + print(80*"=", file=sys.stderr) + print("Unit Tests DONE", file=sys.stderr) diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index 694a434..71ae7fa 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -13,5 +13,6 @@ __all__ = [ 'openiocimport', 'threatanalyzer_import', 'csvimport', + 'cof2misp', 'joe_import', ] diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py new file mode 100755 index 0000000..27efe55 --- /dev/null +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -0,0 +1,219 @@ +""" PassiveDNS Common Output Format (COF) MISP importer. + +Takes as input a valid COF file or the output of the dnsdbflex utility +and creates MISP objects for the input. + + +Author: Aaron Kaplan +License: see LICENSE + +""" + +import json +import base64 + +import pprint +import ndjson + +from pymisp import MISPObject, MISPEvent, PyMISP + +from cof2misp.cof import is_valid_ip, validate_cof + + +misperrors = {'error': 'Error'} +userConfig = {} + +inputSource = ['file'] + +mispattributes = {'inputSource': ['file'], 'output': ['MISP objects'], + 'format': 'misp_standard'} + + +moduleinfo = {'version': '0.2', 'author': 'Aaron Kaplan', + 'description': 'Module to import the passive DNS Common Output Format (COF) and merge as a MISP objet into a MISP event.', + 'module-type': ['import']} + +moduleconfig = [] + + +# misp = PyMISP() + + +def parse_and_insert_cof(data: str) -> dict: + """Parse and validate the COF data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none. All Exceptions will be handled here. On error, a misperror is returned. + """ + + objects = [] + try: + entries = ndjson.loads(data) + # pprint.pprint(entries) + for l in entries: # iterate over all ndjson lines + + # validate here (simple validation or full JSON Schema validation) + # FIXME + + + # Next, extract some fields + rrtype = l['rrtype'].upper() + rrname = l['rrname'].rstrip('.') + rdata = [x.rstrip('.') for x in l['rdata']] + + + # create a new MISP object, based on the passive-dns object for each nd-JSON line + o = MISPObject(name='passive-dns', standalone=False, comment='created by cof2misp') + + # o.add_tag('tlp:amber') # FIXME: we'll want to add a tlp: tag to the object + o.add_attribute('bailiwick', value=l['bailiwick'].rstrip('.')) + + # + # handle the combinations of rrtype (domain, ip) on both left and right side + # + + if rrtype in ['A', 'AAAA', 'A6']: # address type + # address type + o.add_attribute('rrname_domain', value=rrname) + for r in rdata: + o.add_attribute('rdata_ip', value=r) + elif rrtype in ['CNAME', 'DNAME', 'NS']: # both sides are domains + o.add_attribute('rrname_domain', value=rrname) + for r in rdata: + o.add_attribute('rdata_domain', value=r) + elif rrtype in ['SOA']: # left side is a domain, right side is text + o.add_attribute('rrname_domain', value=rrname) + + # + # now do the regular filling up of rrname, rrtype, time_first, etc. + # + o.add_attribute('rrname', value=rrname) + o.add_attribute('rrtype', value=rrtype) + for r in rdata: + o.add_attribute('rdata', value=r) + o.add_attribute('raw_rdata', value=json.dumps(rdata)) # FIXME: do we need to hex encode it? + o.add_attribute('time_first', value=l['time_first']) + o.add_attribute('time_last', value=l['time_last']) + o.first_seen = l['time_first'] # is this redundant? + o.last_seen = l['time_last'] + + # + # Now add the other optional values. # FIXME: how about a map() other function. DNRY + # + for k in ['count', 'sensor_id', 'origin', 'text', 'time_first_ms', 'time_last_ms', 'zone_time_first', 'zone_time_last']: + if k in l and l[k]: + o.add_attribute(k, value=l[k]) + + # + # add COF entry to MISP object + # + objects.append(o.to_json()) + + r = {'results': {'Object': [json.loads(o) for o in objects]}} + except Exception as ex: + misperrors["error"] = "An error occured during parsing of input: '%s'" % (str(ex),) + return misperrors + return r + + +def parse_and_insert_dnsdbflex(data: str): + """Parse and validate the more simplier dndsdbflex output data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none + """ + pass # XXX FIXME: need a MISP object for dnsdbflex + + + +def is_dnsdbflex(data: str) -> bool: + """Check if the supplied data conforms to the dnsdbflex output (which only contains rrname and rrtype) + + Parameters + ---------- + ndjson data as a string + + Returns + ------- + True or False + + Raises + -------- + none + """ + + try: + j = ndjson.loads(data) + for l in j: + if not set(l.keys()) == { 'rrname' , 'rrtype' }: + return False # shortcut + return True + except Exception as _ex: + return False + + + +def is_cof(data: str) -> bool: + return True + + +def handler(q=False): + if q is False: + return False + r = {'results': []} + request = json.loads(q) + # Parse the json, determine which type of JSON it is (dnsdbflex or COF?) + # Validate it + # transform into MISP object + # push to MISP + event_id = request['event_id'] + # event = misp.get_event(event_id) + pprint.pprint("event_id = %s" % event_id) + try: + data = base64.b64decode(request["data"]).decode('utf-8') + if not data: + return json.dumps({'success': 0}) # empty file is ok + + if is_dnsdbflex(data): + return parse_and_insert_dnsdbflex(data) + elif is_cof(data): + # check if it's valid COF format + return parse_and_insert_cof(data) + else: + return {'error': 'Could not find any valid COF input nor dnsdbflex input. Please have a loot at: https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/'} + except Exception as ex: + print("oops, got exception %s" % str(ex)) + return {'error': "Got exception %s" % str(ex) } + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo + + +if __name__ == '__main__': + x = open('test.json', 'r') + r = handler(q=x.read()) + print(json.dumps(r)) From f1da1dd6fa2f5a01d3b23ad1c0f7b8e8d6718689 Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Sun, 2 May 2021 16:45:55 +0000 Subject: [PATCH 275/476] Version 0.2 of the cof2misp import module. --- REQUIREMENTS | 1 + misp_modules/lib/__init__.py | 2 +- misp_modules/lib/cof2misp/cof.py | 103 +++++++++ misp_modules/modules/import_mod/__init__.py | 1 + misp_modules/modules/import_mod/cof2misp.py | 219 ++++++++++++++++++++ 5 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 misp_modules/lib/cof2misp/cof.py create mode 100755 misp_modules/modules/import_mod/cof2misp.py diff --git a/REQUIREMENTS b/REQUIREMENTS index 34c15f3..0fcfcb2 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -59,6 +59,7 @@ isodate==0.6.0 jbxapi==3.14.0 json-log-formatter==0.3.0 jsonschema==3.2.0 +ndjson==0.3.1 lark-parser==0.11.1 lief==0.11.0 lxml==4.6.2 diff --git a/misp_modules/lib/__init__.py b/misp_modules/lib/__init__.py index c078cf7..d92e989 100644 --- a/misp_modules/lib/__init__.py +++ b/misp_modules/lib/__init__.py @@ -1,3 +1,3 @@ from .vt_graph_parser import * # noqa -all = ['joe_parser', 'lastline_api'] +all = ['joe_parser', 'lastline_api', 'cof2misp'] diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py new file mode 100644 index 0000000..2dfd267 --- /dev/null +++ b/misp_modules/lib/cof2misp/cof.py @@ -0,0 +1,103 @@ +""" +Common Output Format for passive DNS library. + +""" + +import ipaddress +import sys +import ndjson + + +def is_valid_ip(ip: str) -> bool: + """Check if an IP address given as string would be convertible to + an ipaddress object (and thus if it is a valid IP). + + Returns + -------- + True on success, False on validation failure. + """ + + try: + ipaddress.ip_address(ip) + except Exception as ex: + print("is_valid_ip(%s) returned False. Reason: %s" % (ip, str(ex)), file=sys.stderr) + return False + return True + + + +def is_cof_valid_simple(d: dict) -> bool: + """Check MANDATORY fields according to COF - simple check, do not do the full JSON schema validation. + + Returns + -------- + True on success, False on validation failure. + """ + + if "rrname" not in d: + print("Missing MANDATORY field 'rrname'", file=sys.stderr) + return False + if not isinstance(d['rrname'], str): + print("Type error: 'rrname' is not a JSON string", file=sys.stderr) + return False + if "rrtype" not in d: + print("Missing MANDATORY field 'rrtype'", file=sys.stderr) + return False + if not isinstance(d['rrtype'], str): + print("Type error: 'rrtype' is not a JSON string", file=sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file=sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file=sys.stderr) + return False + if not isinstance(d['rdata'], str) and not isinstance(d['rdata'], list): + print("'rdata' is not a list and not a string.", file=sys.stderr) + return False + if not ("time_first" in d and "time_last" in d) or \ + ("zone_time_first" in d and "zone_time_last" in d): + print("We are missing EITHER ('first_seen' and 'last_seen') OR " \ + "('zone_time_first' and zone_time_last') fields", file=sys.stderr) + return False + # currently we don't check the OPTIONAL fields. Sorry... to be done later. + return True + + + +def validate_cof(d: dict, strict=True) -> bool: + """Validate an input passive DNS COF (given as dict). + strict might be set to False in order to loosen the checking. + With strict==True, a full JSON Schema validation will happen. + + + Returns + -------- + True on success, False on validation failure. + """ + if not strict: + return is_cof_valid_simple(d) + + +if __name__ == "__main__": + # simple, poor man's unit tests. + + print(80*"=", file=sys.stderr) + print("Unit Tests:", file=sys.stderr) + assert not is_valid_ip("a.2.3.4") + assert is_valid_ip("99.88.77.6") + assert is_valid_ip("2a0c:88:77:6::1") + + # COF validation + mock_input = """{"count":1909,"rdata":["cpa.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1315586409","time_last":"1449566799"} +{"count":2560,"rdata":["cpab.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1449584660","time_last":"1617676151"}""" + + i = 0 + for l in ndjson.loads(mock_input): + retval = validate_cof(l, strict=False) + assert retval + print("line %d is valid: %s" %(i, retval)) + i += 1 + + print(80*"=", file=sys.stderr) + print("Unit Tests DONE", file=sys.stderr) diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index 694a434..71ae7fa 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -13,5 +13,6 @@ __all__ = [ 'openiocimport', 'threatanalyzer_import', 'csvimport', + 'cof2misp', 'joe_import', ] diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py new file mode 100755 index 0000000..27efe55 --- /dev/null +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -0,0 +1,219 @@ +""" PassiveDNS Common Output Format (COF) MISP importer. + +Takes as input a valid COF file or the output of the dnsdbflex utility +and creates MISP objects for the input. + + +Author: Aaron Kaplan +License: see LICENSE + +""" + +import json +import base64 + +import pprint +import ndjson + +from pymisp import MISPObject, MISPEvent, PyMISP + +from cof2misp.cof import is_valid_ip, validate_cof + + +misperrors = {'error': 'Error'} +userConfig = {} + +inputSource = ['file'] + +mispattributes = {'inputSource': ['file'], 'output': ['MISP objects'], + 'format': 'misp_standard'} + + +moduleinfo = {'version': '0.2', 'author': 'Aaron Kaplan', + 'description': 'Module to import the passive DNS Common Output Format (COF) and merge as a MISP objet into a MISP event.', + 'module-type': ['import']} + +moduleconfig = [] + + +# misp = PyMISP() + + +def parse_and_insert_cof(data: str) -> dict: + """Parse and validate the COF data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none. All Exceptions will be handled here. On error, a misperror is returned. + """ + + objects = [] + try: + entries = ndjson.loads(data) + # pprint.pprint(entries) + for l in entries: # iterate over all ndjson lines + + # validate here (simple validation or full JSON Schema validation) + # FIXME + + + # Next, extract some fields + rrtype = l['rrtype'].upper() + rrname = l['rrname'].rstrip('.') + rdata = [x.rstrip('.') for x in l['rdata']] + + + # create a new MISP object, based on the passive-dns object for each nd-JSON line + o = MISPObject(name='passive-dns', standalone=False, comment='created by cof2misp') + + # o.add_tag('tlp:amber') # FIXME: we'll want to add a tlp: tag to the object + o.add_attribute('bailiwick', value=l['bailiwick'].rstrip('.')) + + # + # handle the combinations of rrtype (domain, ip) on both left and right side + # + + if rrtype in ['A', 'AAAA', 'A6']: # address type + # address type + o.add_attribute('rrname_domain', value=rrname) + for r in rdata: + o.add_attribute('rdata_ip', value=r) + elif rrtype in ['CNAME', 'DNAME', 'NS']: # both sides are domains + o.add_attribute('rrname_domain', value=rrname) + for r in rdata: + o.add_attribute('rdata_domain', value=r) + elif rrtype in ['SOA']: # left side is a domain, right side is text + o.add_attribute('rrname_domain', value=rrname) + + # + # now do the regular filling up of rrname, rrtype, time_first, etc. + # + o.add_attribute('rrname', value=rrname) + o.add_attribute('rrtype', value=rrtype) + for r in rdata: + o.add_attribute('rdata', value=r) + o.add_attribute('raw_rdata', value=json.dumps(rdata)) # FIXME: do we need to hex encode it? + o.add_attribute('time_first', value=l['time_first']) + o.add_attribute('time_last', value=l['time_last']) + o.first_seen = l['time_first'] # is this redundant? + o.last_seen = l['time_last'] + + # + # Now add the other optional values. # FIXME: how about a map() other function. DNRY + # + for k in ['count', 'sensor_id', 'origin', 'text', 'time_first_ms', 'time_last_ms', 'zone_time_first', 'zone_time_last']: + if k in l and l[k]: + o.add_attribute(k, value=l[k]) + + # + # add COF entry to MISP object + # + objects.append(o.to_json()) + + r = {'results': {'Object': [json.loads(o) for o in objects]}} + except Exception as ex: + misperrors["error"] = "An error occured during parsing of input: '%s'" % (str(ex),) + return misperrors + return r + + +def parse_and_insert_dnsdbflex(data: str): + """Parse and validate the more simplier dndsdbflex output data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none + """ + pass # XXX FIXME: need a MISP object for dnsdbflex + + + +def is_dnsdbflex(data: str) -> bool: + """Check if the supplied data conforms to the dnsdbflex output (which only contains rrname and rrtype) + + Parameters + ---------- + ndjson data as a string + + Returns + ------- + True or False + + Raises + -------- + none + """ + + try: + j = ndjson.loads(data) + for l in j: + if not set(l.keys()) == { 'rrname' , 'rrtype' }: + return False # shortcut + return True + except Exception as _ex: + return False + + + +def is_cof(data: str) -> bool: + return True + + +def handler(q=False): + if q is False: + return False + r = {'results': []} + request = json.loads(q) + # Parse the json, determine which type of JSON it is (dnsdbflex or COF?) + # Validate it + # transform into MISP object + # push to MISP + event_id = request['event_id'] + # event = misp.get_event(event_id) + pprint.pprint("event_id = %s" % event_id) + try: + data = base64.b64decode(request["data"]).decode('utf-8') + if not data: + return json.dumps({'success': 0}) # empty file is ok + + if is_dnsdbflex(data): + return parse_and_insert_dnsdbflex(data) + elif is_cof(data): + # check if it's valid COF format + return parse_and_insert_cof(data) + else: + return {'error': 'Could not find any valid COF input nor dnsdbflex input. Please have a loot at: https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/'} + except Exception as ex: + print("oops, got exception %s" % str(ex)) + return {'error': "Got exception %s" % str(ex) } + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo + + +if __name__ == '__main__': + x = open('test.json', 'r') + r = handler(q=x.read()) + print(json.dumps(r)) From 790090eb0b6268cf379b8a7f307a65b8d0681cb6 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Mon, 3 May 2021 11:25:37 +0200 Subject: [PATCH 276/476] chg: [farsight_passivedns] Updated the bailiwick attribute type, following the latest changes on the passive-dns object template --- misp_modules/modules/expansion/farsight_passivedns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index de18735..93337a3 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -85,7 +85,7 @@ class FarsightDnsdbParser(): self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) self.passivedns_mapping = { - 'bailiwick': {'type': 'text', 'object_relation': 'bailiwick'}, + 'bailiwick': {'type': 'domain', 'object_relation': 'bailiwick'}, 'count': {'type': 'counter', 'object_relation': 'count'}, 'raw_rdata': {'type': 'text', 'object_relation': 'raw_rdata'}, 'rdata': {'type': 'text', 'object_relation': 'rdata'}, From 8e55101dc8d9c8531012e1e61c5eb444a264e3df Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 3 May 2021 12:04:22 +0200 Subject: [PATCH 277/476] chg: [cof2misp module] fix the import module/package "__init__.py" missing --- misp_modules/lib/cof2misp/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 misp_modules/lib/cof2misp/__init__.py diff --git a/misp_modules/lib/cof2misp/__init__.py b/misp_modules/lib/cof2misp/__init__.py new file mode 100644 index 0000000..e69de29 From 10b5295cdde601b8d419989616f3ca7a22095c2f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 3 May 2021 12:27:52 +0200 Subject: [PATCH 278/476] chg: [cof2misp] remove logging in the misp-modules --- misp_modules/modules/import_mod/cof2misp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index b37cb00..73936e7 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -189,7 +189,7 @@ def handler(q=False): # push to MISP event_id = request['event_id'] # event = misp.get_event(event_id) - print("event_id = %s" % event_id, file=sys.stderr) + #print("event_id = %s" % event_id, file=sys.stderr) try: data = base64.b64decode(request["data"]).decode('utf-8') if not data: From c6d02cc17794a983d2930c62ecbdb93ca30a7f7f Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Mon, 3 May 2021 12:41:01 +0200 Subject: [PATCH 279/476] chg: [cof2misp] debugging removed --- misp_modules/modules/import_mod/cof2misp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index 73936e7..a208a0b 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -187,9 +187,9 @@ def handler(q=False): # Validate it # transform into MISP object # push to MISP - event_id = request['event_id'] + # event_id = request['event_id'] # event = misp.get_event(event_id) - #print("event_id = %s" % event_id, file=sys.stderr) + # print("event_id = %s" % event_id, file=sys.stderr) try: data = base64.b64decode(request["data"]).decode('utf-8') if not data: From 09f0f3943a82ede71827c256c6c44f07d9850b6e Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Tue, 4 May 2021 09:44:47 +0200 Subject: [PATCH 280/476] Add license text. No logical changes in this commit --- misp_modules/lib/cof2misp/LICENSE-2.0.txt | 202 ++++++++++++++++++++ misp_modules/lib/cof2misp/cof.py | 11 +- misp_modules/modules/import_mod/cof2misp.py | 7 +- 3 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 misp_modules/lib/cof2misp/LICENSE-2.0.txt diff --git a/misp_modules/lib/cof2misp/LICENSE-2.0.txt b/misp_modules/lib/cof2misp/LICENSE-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/misp_modules/lib/cof2misp/LICENSE-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + 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. diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py index 1f40907..395569e 100644 --- a/misp_modules/lib/cof2misp/cof.py +++ b/misp_modules/lib/cof2misp/cof.py @@ -1,6 +1,13 @@ """ Common Output Format for passive DNS library. +Copyright 2021: Farsight Security (https://www.farsightsecurity.com/) + +Author: Aaron Kaplan + +Released under the Apache 2.0 license. +See: https://www.apache.org/licenses/LICENSE-2.0.txt + """ import ipaddress @@ -90,7 +97,7 @@ def validate_cof(d: dict, strict=True) -> bool: if __name__ == "__main__": # simple, poor man's unit tests. - print(80*"=", file=sys.stderr) + print(80 * "=", file=sys.stderr) print("Unit Tests:", file=sys.stderr) assert not is_valid_ip("a.2.3.4") assert is_valid_ip("99.88.77.6") @@ -111,5 +118,5 @@ if __name__ == "__main__": for entry in ndjson.loads(test2): assert validate_cof(entry) - print(80*"=", file=sys.stderr) + print(80 * "=", file=sys.stderr) print("Unit Tests DONE", file=sys.stderr) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index b37cb00..018ad9f 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -3,9 +3,12 @@ Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input. +Copyright 2021: Farsight Security (https://www.farsightsecurity.com/) -Author: Aaron Kaplan -License: see LICENSE +Author: Aaron Kaplan + +Released under the Apache 2.0 license. +See: https://www.apache.org/licenses/LICENSE-2.0.txt """ From 117200f334f612579d1094eedf60cafe85df4cef Mon Sep 17 00:00:00 2001 From: root Date: Tue, 4 May 2021 07:48:30 +0000 Subject: [PATCH 281/476] oops, there was a minor error. print(..., file=sys.stDerr) . Typo! --- misp_modules/modules/import_mod/cof2misp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index 018ad9f..3fe36fc 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -173,7 +173,7 @@ def is_dnsdbflex(data: str) -> bool: return False # shortcut. We assume it's not if a single line does not conform return True except Exception as ex: - print("oops, this should not have happened. Maybe not an ndjson file? Reason: %s" % (str(ex),), file=sys.sterr) + print("oops, this should not have happened. Maybe not an ndjson file? Reason: %s" % (str(ex),), file=sys.stderr) return False From 780590cee30db3bd96b4f6ceb5de45020e628325 Mon Sep 17 00:00:00 2001 From: chrisr3d Date: Tue, 4 May 2021 18:36:56 +0200 Subject: [PATCH 282/476] fix: [farsight_passivedns] Handling exceptions raised from a query error - This can happen with for instance a wrong server URL --- misp_modules/modules/expansion/farsight_passivedns.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 93337a3..47e7eaa 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -148,6 +148,8 @@ def handler(q=False): response = to_query(client, *args) except dnsdb2.DnsdbException as e: return {'error': e.__str__()} + except dnsdb2.exceptions.QueryError: + return {'error': 'Communication error occurs while executing a query, or the server reports an error due to invalid arguments.'} if not response: return {'error': f"Empty results on Farsight DNSDB for the {TYPE_TO_FEATURE[attribute['type']]}: {attribute['value']}."} parser = FarsightDnsdbParser(attribute) From d0c2f943546c21c27211e6704da020a1ef0b06b5 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 7 May 2021 12:27:11 +0200 Subject: [PATCH 283/476] add summary ip, domain and hostname --- misp_modules/modules/expansion/onyphe.py | 131 +++++++++++++++++++---- 1 file changed, 112 insertions(+), 19 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 05124e0..874eff4 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -33,14 +33,20 @@ class OnypheClient: def get_results(self): event = json.loads(self.misp_event.to_json()) - results = {key: event[key] for key in ('Attribute', 'Object') if key in event} + results = {key: event[key] + for key in ('Attribute', 'Object') if key in event} return results def get_query_onyphe(self): if self.attribute['type'] == 'ip-src' or self.attribute['type'] == 'ip-dst': self.__summary_ip() + if self.attribute['type'] == 'domain': + self.__summary_domain() + if self.attribute['type'] == 'hostname': + self.__summary_hostname() def __summary_ip(self): + print('ip') results = self.onyphe_client.summary_ip(self.attribute['value']) if 'results' in results: for r in results['results']: @@ -64,43 +70,107 @@ class OnypheClient: issuer = r['issuer'] self.__get_object_certificate(r) + def __summary_domain(self): + print('domain') + results = self.onyphe_client.summary_domain(self.attribute['value']) + if 'results' in results: + for r in results['results']: + + for domain in r.get('domain'): + self.misp_event.add_attribute('domain', domain) + for hostname in r.get('hostname'): + self.misp_event.add_attribute('hostname', hostname) + if 'ip' in r: + if type(r['ip']) is str: + self.__get_object_domain_ip(r['ip'], 'ip') + if type(r['ip']) is list: + for ip in r['ip']: + self.__get_object_domain_ip(ip, 'ip') + if 'issuer' in r: + self.__get_object_certificate(r) + + def __summary_hostname(self): + results = self.onyphe_client.summary_hostname(self.attribute['value']) + if 'results' in results: + + for r in results['results']: + if 'domain' in r: + if type(r['domain']) is str: + self.misp_event.add_attribute( + 'domain', r['domain']) + if type(r['domain']) is list: + for domain in r['domain']: + self.misp_event.add_attribute('domain', domain) + + if 'hostname' in r: + if type(r['hostname']) is str: + self.misp_event.add_attribute( + 'hostname', r['hostname']) + if type(r['hostname']) is list: + for hostname in r['hostname']: + self.misp_event.add_attribute( + 'hostname', r['hostname']) + + if 'ip' in r: + if type(r['ip']) is str: + self.__get_object_domain_ip(r['ip'], 'ip') + if type(r['ip']) is list: + for ip in r['ip']: + self.__get_object_domain_ip(ip, 'ip') + + if 'issuer' in r: + self.__get_object_certificate(r) + + if 'cve' in r: + if type(r['cve']) is list: + for cve in r['cve']: + self.__get_object_cve(r, cve) + def __get_object_certificate(self, r): object_certificate = MISPObject('x509') object_certificate.add_attribute('ip', self.attribute['value']) object_certificate.add_attribute('serial-number', r['serial']) - object_certificate.add_attribute('x509-fingerprint-sha256', r['fingerprint']['sha256']) - object_certificate.add_attribute('x509-fingerprint-sha1', r['fingerprint']['sha1']) - object_certificate.add_attribute('x509-fingerprint-md5', r['fingerprint']['md5']) - + object_certificate.add_attribute( + 'x509-fingerprint-sha256', r['fingerprint']['sha256']) + object_certificate.add_attribute( + 'x509-fingerprint-sha1', r['fingerprint']['sha1']) + object_certificate.add_attribute( + 'x509-fingerprint-md5', r['fingerprint']['md5']) + signature = r['signature']['algorithm'] value = '' if 'sha256' in signature and 'RSA' in signature: value = 'SHA256_WITH_RSA_ENCRYPTION' elif 'sha1' in signature and 'RSA' in signature: - value = 'SHA1_WITH_RSA_ENCRYPTION' + value = 'SHA1_WITH_RSA_ENCRYPTION' if value: object_certificate.add_attribute('signature_algorithm', value) - - object_certificate.add_attribute('pubkey-info-algorithm',r['publickey']['algorithm']) - - if 'exponent' in r['publickey']: - object_certificate.add_attribute('pubkey-info-exponent',r['publickey']['exponent']) - if 'length' in r['publickey']: - object_certificate.add_attribute('pubkey-info-size',r['publickey']['length']) - object_certificate.add_attribute('issuer',r['issuer']['commonname']) - object_certificate.add_attribute('validity-not-before',r['validity']['notbefore']) - object_certificate.add_attribute('validity-not-after',r['validity']['notbefore']) + object_certificate.add_attribute( + 'pubkey-info-algorithm', r['publickey']['algorithm']) + + if 'exponent' in r['publickey']: + object_certificate.add_attribute( + 'pubkey-info-exponent', r['publickey']['exponent']) + if 'length' in r['publickey']: + object_certificate.add_attribute( + 'pubkey-info-size', r['publickey']['length']) + + object_certificate.add_attribute('issuer', r['issuer']['commonname']) + object_certificate.add_attribute( + 'validity-not-before', r['validity']['notbefore']) + object_certificate.add_attribute( + 'validity-not-after', r['validity']['notbefore']) object_certificate.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(object_certificate) - - + def __get_object_domain_ip(self, obs, relation): objet_domain_ip = MISPObject('domain-ip') objet_domain_ip.add_attribute(relation, obs) relation_attr = self.__get_relation_attribute() if relation_attr: - objet_domain_ip.add_attribute(relation_attr, self.attribute['value']) + objet_domain_ip.add_attribute( + relation_attr, self.attribute['value']) objet_domain_ip.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(objet_domain_ip) @@ -115,6 +185,28 @@ class OnypheClient: elif self.attribute['type'] == 'hostname': return 'domain' + def __get_object_cve(self, item, cve): + attributes = [] + object_cve = MISPObject('vulnerability') + object_cve.add_attribute('id', cve) + object_cve.add_attribute('state', 'Published') + + if type(item['ip']) is list: + for ip in item['ip']: + attributes.extend( + list(filter(lambda x: x['value'] == ip, self.misp_event['Attribute']))) + for obj in self.misp_event['Object']: + attributes.extend( + list(filter(lambda x: x['value'] == ip, obj['Attribute']))) + if type(item['ip']) is str: + + for obj in self.misp_event['Object']: + for att in obj['Attribute']: + if att['value'] == item['ip']: + object_cve.add_reference(obj['uuid'], 'cve') + + self.misp_event.add_object(object_cve) + def handler(q=False): if q: @@ -134,6 +226,7 @@ def handler(q=False): return {'results': results} + def introspection(): return mispattributes From eb48635ce59de9edc3b132f1eb838c0c9aa30633 Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 7 May 2021 14:07:18 +0200 Subject: [PATCH 284/476] remove print and variable unsuable --- misp_modules/modules/expansion/onyphe.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index 874eff4..eba3564 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -46,7 +46,6 @@ class OnypheClient: self.__summary_hostname() def __summary_ip(self): - print('ip') results = self.onyphe_client.summary_ip(self.attribute['value']) if 'results' in results: for r in results['results']: @@ -67,11 +66,9 @@ class OnypheClient: self.__get_object_domain_ip(hostname, 'domain') if 'issuer' in r: - issuer = r['issuer'] self.__get_object_certificate(r) def __summary_domain(self): - print('domain') results = self.onyphe_client.summary_domain(self.attribute['value']) if 'results' in results: for r in results['results']: From 382025453ec2adb658e31d46d4f4352d160ca68d Mon Sep 17 00:00:00 2001 From: Sebdraven Date: Fri, 7 May 2021 14:38:42 +0200 Subject: [PATCH 285/476] fix bug on loop --- misp_modules/modules/expansion/onyphe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index eba3564..c777707 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -106,7 +106,7 @@ class OnypheClient: if type(r['hostname']) is list: for hostname in r['hostname']: self.misp_event.add_attribute( - 'hostname', r['hostname']) + 'hostname', hostname) if 'ip' in r: if type(r['ip']) is str: From 267c167acbd0ead479c82c08b54b699493467415 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 7 May 2021 23:31:17 +0200 Subject: [PATCH 286/476] chg: [doc] cof2misp documentation added --- documentation/website/import_mod/cof2misp.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 documentation/website/import_mod/cof2misp.json diff --git a/documentation/website/import_mod/cof2misp.json b/documentation/website/import_mod/cof2misp.json new file mode 100644 index 0000000..cbbb0cc --- /dev/null +++ b/documentation/website/import_mod/cof2misp.json @@ -0,0 +1,12 @@ +{ + "description": "Passive DNS Common Output Format (COF) MISP importer", + "requirements": [ + "PyMISP" + ], + "features": "Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input.", + "references": [ + "https://tools.ietf.org/id/draft-dulaunoy-dnsop-passive-dns-cof-08.html" + ], + "input": "Passive DNS output in Common Output Format (COF)", + "output": "MISP objects" +} From 77035a82e0c39d26fa97270dd254edd36d199331 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Tue, 11 May 2021 14:46:16 +0200 Subject: [PATCH 287/476] chg: [cof2misp] bailiwick is optional --- misp_modules/modules/import_mod/cof2misp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index 16bf259..bca2df5 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -81,7 +81,8 @@ def parse_and_insert_cof(data: str) -> dict: o = MISPObject(name='passive-dns', standalone=False, comment='created by cof2misp') # o.add_tag('tlp:amber') # FIXME: we'll want to add a tlp: tag to the object - o.add_attribute('bailiwick', value=entry['bailiwick'].rstrip('.')) + if 'bailiwick' in entry: + o.add_attribute('bailiwick', value=entry['bailiwick'].rstrip('.')) # # handle the combinations of rrtype (domain, ip) on both left and right side From 7aa6b39da82bb39b9a2e00a6903e7588a3d881eb Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 12 May 2021 18:30:54 +0530 Subject: [PATCH 288/476] Added a default distribution setting to Objects --- misp_modules/modules/expansion/farsight_passivedns.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 47e7eaa..ff877a1 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -43,7 +43,7 @@ moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 - +org_distribution = '0' TYPE_TO_FEATURE = { "btc": "Bitcoin address", "dkim": "domainkeys identified mail", @@ -103,6 +103,7 @@ class FarsightDnsdbParser(): comment = self.comment % (query_type, TYPE_TO_FEATURE[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') + passivedns_object.distribution = org_distribution if result.get('rdata') and isinstance(result['rdata'], list): for rdata in result.pop('rdata'): passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) @@ -121,7 +122,7 @@ class FarsightDnsdbParser(): return {'results': results} def _parse_attribute(self, comment, feature, value): - attribute = {'value': value, 'comment': comment} + attribute = {'value': value, 'comment': comment, 'distribution': org_distribution} attribute.update(self.passivedns_mapping[feature]) return attribute From f6c0f6826330bf18705ec24c86b744b72d64df53 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 12 May 2021 18:38:55 +0530 Subject: [PATCH 289/476] Default distribution setting to DNSDB Objects --- misp_modules/modules/expansion/farsight_passivedns.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index ff877a1..3167f4c 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -43,7 +43,7 @@ moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 -org_distribution = '0' +DEFAULT_DISTRIBUTION_SETTING = '0' TYPE_TO_FEATURE = { "btc": "Bitcoin address", "dkim": "domainkeys identified mail", @@ -103,7 +103,7 @@ class FarsightDnsdbParser(): comment = self.comment % (query_type, TYPE_TO_FEATURE[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') - passivedns_object.distribution = org_distribution + passivedns_object.distribution = DEFAULT_DISTRIBUTION_SETTING if result.get('rdata') and isinstance(result['rdata'], list): for rdata in result.pop('rdata'): passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) @@ -122,7 +122,7 @@ class FarsightDnsdbParser(): return {'results': results} def _parse_attribute(self, comment, feature, value): - attribute = {'value': value, 'comment': comment, 'distribution': org_distribution} + attribute = {'value': value, 'comment': comment, 'distribution': DEFAULT_DISTRIBUTION_SETTING} attribute.update(self.passivedns_mapping[feature]) return attribute From 6a731454f1309e5d71b1bb131c31982ea6f80f74 Mon Sep 17 00:00:00 2001 From: Rambatla Venkat Rao <68921481+RamboV@users.noreply.github.com> Date: Wed, 12 May 2021 21:42:25 +0530 Subject: [PATCH 290/476] Updated Distribution Constant --- misp_modules/modules/expansion/farsight_passivedns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index 3167f4c..7cf6f66 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -2,7 +2,7 @@ import dnsdb2 import json from . import check_input_attribute, standard_error_message from datetime import datetime -from pymisp import MISPEvent, MISPObject +from pymisp import MISPEvent, MISPObject, Distribution misperrors = {'error': 'Error'} standard_query_input = [ @@ -43,7 +43,7 @@ moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 -DEFAULT_DISTRIBUTION_SETTING = '0' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value TYPE_TO_FEATURE = { "btc": "Bitcoin address", "dkim": "domainkeys identified mail", From d495ca7366560fbcd449d39cf049d2b7a3e91d3b Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 14 May 2021 13:45:36 +0200 Subject: [PATCH 291/476] chg: [test] onyphe no way to test without authentication keys --- tests/test_expansions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 84958ac..1bcc93e 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -310,6 +310,8 @@ class TestExpansions(unittest.TestCase): def test_onyphe(self): module_name = "onyphe" + if LiveCI: + return True query = {"module": module_name, "ip-src": "8.8.8.8"} if module_name in self.configs: query["config"] = self.configs[module_name] @@ -324,6 +326,8 @@ class TestExpansions(unittest.TestCase): def test_onyphe_full(self): module_name = "onyphe_full" + if LiveCI: + return True query = {"module": module_name, "ip-src": "8.8.8.8"} if module_name in self.configs: query["config"] = self.configs[module_name] From 5b41c82f78a1dc29b5ae51c3311e8e2d8b455a1c Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Wed, 26 May 2021 12:16:11 +0200 Subject: [PATCH 292/476] Add a function to validate dnsdbflex output Signed-off-by: aaronkaplan --- misp_modules/lib/cof2misp/cof.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py index 395569e..a222a3d 100644 --- a/misp_modules/lib/cof2misp/cof.py +++ b/misp_modules/lib/cof2misp/cof.py @@ -93,6 +93,25 @@ def validate_cof(d: dict, strict=True) -> bool: else: return is_cof_valid_strict(d) +def validate_dnsdbflex(d: dict, strict=True) -> bool: + """ + Validate if dict d is valid dnsdbflex. It should looks like this: + { "rrtype": , "rrname": } + """ + if "rrname" not in d: + print("Missing MANDATORY field 'rrname'", file=sys.stderr) + return False + if not isinstance(d['rrname'], str): + print("Type error: 'rrname' is not a JSON string", file=sys.stderr) + return False + if "rrtype" not in d: + print("Missing MANDATORY field 'rrtype'", file=sys.stderr) + return False + if not isinstance(d['rrtype'], str): + print("Type error: 'rrtype' is not a JSON string", file=sys.stderr) + return False + return True + if __name__ == "__main__": # simple, poor man's unit tests. From 4816844d16dadac5c9e85cfcf101ec8b9607621a Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Wed, 26 May 2021 12:38:56 +0200 Subject: [PATCH 293/476] Add a function to validate dnsdbflex output add dnsdbflex parser. It's rather easy Signed-off-by: aaronkaplan --- misp_modules/lib/cof2misp/cof.py | 40 +++++++++++---------- misp_modules/modules/import_mod/cof2misp.py | 31 ++++++++++++++-- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py index a222a3d..7b8d35c 100644 --- a/misp_modules/lib/cof2misp/cof.py +++ b/misp_modules/lib/cof2misp/cof.py @@ -27,7 +27,7 @@ def is_valid_ip(ip: str) -> bool: try: ipaddress.ip_address(ip) except Exception as ex: - print("is_valid_ip(%s) returned False. Reason: %s" % (ip, str(ex)), file=sys.stderr) + print("is_valid_ip(%s) returned False. Reason: %s" % (ip, str(ex)), file = sys.stderr) return False return True @@ -39,7 +39,7 @@ def is_cof_valid_strict(d: dict) -> bool: -------- True on success, False on validation failure. """ - return True # FIXME + return True # FIXME def is_cof_valid_simple(d: dict) -> bool: @@ -51,28 +51,29 @@ def is_cof_valid_simple(d: dict) -> bool: """ if "rrname" not in d: - print("Missing MANDATORY field 'rrname'", file=sys.stderr) + print("Missing MANDATORY field 'rrname'", file = sys.stderr) return False if not isinstance(d['rrname'], str): - print("Type error: 'rrname' is not a JSON string", file=sys.stderr) + print("Type error: 'rrname' is not a JSON string", file = sys.stderr) return False if "rrtype" not in d: - print("Missing MANDATORY field 'rrtype'", file=sys.stderr) + print("Missing MANDATORY field 'rrtype'", file = sys.stderr) return False if not isinstance(d['rrtype'], str): - print("Type error: 'rrtype' is not a JSON string", file=sys.stderr) + print("Type error: 'rrtype' is not a JSON string", file = sys.stderr) return False if "rdata" not in d: - print("Missing MANDATORY field 'rdata'", file=sys.stderr) + print("Missing MANDATORY field 'rdata'", file = sys.stderr) return False if "rdata" not in d: - print("Missing MANDATORY field 'rdata'", file=sys.stderr) + print("Missing MANDATORY field 'rdata'", file = sys.stderr) return False if not isinstance(d['rdata'], str) and not isinstance(d['rdata'], list): - print("'rdata' is not a list and not a string.", file=sys.stderr) + print("'rdata' is not a list and not a string.", file = sys.stderr) return False if not ("time_first" in d and "time_last" in d) or ("zone_time_first" in d and "zone_time_last" in d): - print("We are missing EITHER ('first_seen' and 'last_seen') OR ('zone_time_first' and zone_time_last') fields", file=sys.stderr) + print("We are missing EITHER ('first_seen' and 'last_seen') OR ('zone_time_first' and zone_time_last') fields", + file = sys.stderr) return False # currently we don't check the OPTIONAL fields. Sorry... to be done later. return True @@ -93,22 +94,23 @@ def validate_cof(d: dict, strict=True) -> bool: else: return is_cof_valid_strict(d) + def validate_dnsdbflex(d: dict, strict=True) -> bool: """ Validate if dict d is valid dnsdbflex. It should looks like this: { "rrtype": , "rrname": } """ if "rrname" not in d: - print("Missing MANDATORY field 'rrname'", file=sys.stderr) + print("Missing MANDATORY field 'rrname'", file = sys.stderr) return False if not isinstance(d['rrname'], str): - print("Type error: 'rrname' is not a JSON string", file=sys.stderr) + print("Type error: 'rrname' is not a JSON string", file = sys.stderr) return False if "rrtype" not in d: - print("Missing MANDATORY field 'rrtype'", file=sys.stderr) + print("Missing MANDATORY field 'rrtype'", file = sys.stderr) return False if not isinstance(d['rrtype'], str): - print("Type error: 'rrtype' is not a JSON string", file=sys.stderr) + print("Type error: 'rrtype' is not a JSON string", file = sys.stderr) return False return True @@ -116,8 +118,8 @@ def validate_dnsdbflex(d: dict, strict=True) -> bool: if __name__ == "__main__": # simple, poor man's unit tests. - print(80 * "=", file=sys.stderr) - print("Unit Tests:", file=sys.stderr) + print(80 * "=", file = sys.stderr) + print("Unit Tests:", file = sys.stderr) assert not is_valid_ip("a.2.3.4") assert is_valid_ip("99.88.77.6") assert is_valid_ip("2a0c:88:77:6::1") @@ -128,7 +130,7 @@ if __name__ == "__main__": i = 0 for entry in ndjson.loads(mock_input): - retval = validate_cof(entry, strict=False) + retval = validate_cof(entry, strict = False) assert retval print("line %d is valid: %s" % (i, retval)) i += 1 @@ -137,5 +139,5 @@ if __name__ == "__main__": for entry in ndjson.loads(test2): assert validate_cof(entry) - print(80 * "=", file=sys.stderr) - print("Unit Tests DONE", file=sys.stderr) + print(80 * "=", file = sys.stderr) + print("Unit Tests DONE", file = sys.stderr) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index 3fe36fc..abddc0b 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -22,7 +22,7 @@ import ndjson # from pymisp import MISPObject, MISPEvent, PyMISP from pymisp import MISPObject -from cof2misp.cof import validate_cof +from cof2misp.cof import validate_cof, validate_dnsdbflex create_specific_attributes = False # this is for https://github.com/MISP/misp-objects/pull/314 @@ -147,7 +147,34 @@ def parse_and_insert_dnsdbflex(data: str): -------- none """ - return {"error": "NOT IMPLEMENTED YET"} # XXX FIXME: need a MISP object for dnsdbflex + objects = [] + try: + entries = ndjson.loads(data) + for entry in entries: # iterate over all ndjson lines + + # validate here (simple validation or full JSON Schema validation) + if not validate_dnsdbflex(entry): + return {"error": "Could not validate the dnsdbflex input '%s'" % entry} + + # Next, extract some fields + rrtype = entry['rrtype'].upper() + rrname = entry['rrname'].rstrip('.') + + # create a new MISP object, based on the passive-dns object for each nd-JSON line + o = MISPObject(name='passive-dns-dnsdbflex', standalone=False, comment='created by cof2misp') + o.add_attribute('rrname', value=rrname) + o.add_attribute('rrtype', value=rrtype) + + # + # add dnsdbflex entry to MISP object + # + objects.append(o.to_json()) + + r = {'results': {'Object': [json.loads(o) for o in objects]}} + except Exception as ex: + misperrors["error"] = "An error occured during parsing of input: '%s'" % (str(ex),) + return misperrors + return r def is_dnsdbflex(data: str) -> bool: From 6824b4e99143ba1113f07a91ff7684ed549a7178 Mon Sep 17 00:00:00 2001 From: aaronkaplan Date: Thu, 27 May 2021 01:58:23 +0200 Subject: [PATCH 294/476] push version --- misp_modules/modules/import_mod/cof2misp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index abddc0b..96fd4c4 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -37,7 +37,7 @@ mispattributes = {'inputSource': ['file'], 'output': ['MISP objects'], 'format': 'misp_standard'} -moduleinfo = {'version': '0.2', 'author': 'Aaron Kaplan', +moduleinfo = {'version': '0.3', 'author': 'Aaron Kaplan', 'description': 'Module to import the passive DNS Common Output Format (COF) and merge as a MISP objet into a MISP event.', 'module-type': ['import']} From c4bc2408ad92924d907029a3166417ef78ef2558 Mon Sep 17 00:00:00 2001 From: Alex Resnick Date: Fri, 28 May 2021 14:53:35 -0500 Subject: [PATCH 295/476] add proxy configs for virus total modules --- misp_modules/modules/expansion/virustotal.py | 49 +++++++++++++++++-- .../modules/expansion/virustotal_public.py | 46 ++++++++++++++++- 2 files changed, 88 insertions(+), 7 deletions(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index f5f29c5..2922417 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -1,5 +1,6 @@ import json import requests +from urllib.parse import urlparse from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -13,7 +14,7 @@ moduleinfo = {'version': '4', 'author': 'Hannah Ward', 'module-type': ['expansion']} # config fields that your code expects from the site admin -moduleconfig = ["apikey", "event_limit"] +moduleconfig = ["apikey", "event_limit", 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] class VirusTotalParser(object): @@ -27,6 +28,7 @@ class VirusTotalParser(object): 'domain': self.parse_domain, 'hostname': self.parse_domain, 'md5': self.parse_hash, 'sha1': self.parse_hash, 'sha256': self.parse_hash, 'url': self.parse_url} + self.proxies = None def query_api(self, attribute): self.attribute = MISPAttribute() @@ -43,7 +45,7 @@ class VirusTotalParser(object): ################################################################################ def parse_domain(self, domain, recurse=False): - req = requests.get(self.base_url.format('domain'), params={'apikey': self.apikey, 'domain': domain}) + req = requests.get(self.base_url.format('domain'), params={'apikey': self.apikey, 'domain': domain}, proxies=self.proxies) if req.status_code != 200: return req.status_code req = req.json() @@ -67,7 +69,7 @@ class VirusTotalParser(object): return self.parse_related_urls(req, recurse, uuid) def parse_hash(self, sample, recurse=False, uuid=None, relationship=None): - req = requests.get(self.base_url.format('file'), params={'apikey': self.apikey, 'resource': sample}) + req = requests.get(self.base_url.format('file'), params={'apikey': self.apikey, 'resource': sample}, proxies=self.proxies) status_code = req.status_code if req.status_code == 200: req = req.json() @@ -88,7 +90,7 @@ class VirusTotalParser(object): return status_code def parse_ip(self, ip, recurse=False): - req = requests.get(self.base_url.format('ip-address'), params={'apikey': self.apikey, 'ip': ip}) + req = requests.get(self.base_url.format('ip-address'), params={'apikey': self.apikey, 'ip': ip}, proxies=self.proxies) if req.status_code != 200: return req.status_code req = req.json() @@ -106,7 +108,7 @@ class VirusTotalParser(object): return self.parse_related_urls(req, recurse, uuid) def parse_url(self, url, recurse=False, uuid=None): - req = requests.get(self.base_url.format('url'), params={'apikey': self.apikey, 'resource': url}) + req = requests.get(self.base_url.format('url'), params={'apikey': self.apikey, 'resource': url}, proxies=self.proxies) status_code = req.status_code if req.status_code == 200: req = req.json() @@ -179,6 +181,42 @@ class VirusTotalParser(object): self.misp_event.add_object(**vt_object) return vt_object.uuid + def set_proxy_settings(self, config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') + + if host: + if not port: + misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ + 'please also set the virustotal_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' + else: + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' + + if username: + if not password: + misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ + 'please also set the virustotal_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host + + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + self.proxies=proxies + return True def parse_error(status_code): status_mapping = {204: 'VirusTotal request rate limit exceeded.', @@ -205,6 +243,7 @@ def handler(q=False): if not isinstance(event_limit, int): event_limit = 5 parser = VirusTotalParser(request['config']['apikey'], event_limit) + parser.set_proxy_settings(request.get('config')) attribute = request['attribute'] status = parser.query_api(attribute) if status != 200: diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index 989e48d..12aba9f 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -1,6 +1,8 @@ import json +import logging import requests from . import check_input_attribute, standard_error_message +from urllib.parse import urlparse from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} @@ -10,13 +12,16 @@ moduleinfo = {'version': '1', 'author': 'Christian Studer', 'description': 'Get information from VirusTotal public API v2.', 'module-type': ['expansion', 'hover']} -moduleconfig = ['apikey'] +moduleconfig = ['apikey', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] +LOGGER = logging.getLogger('virus_total_public') +LOGGER.setLevel(logging.INFO) class VirusTotalParser(): def __init__(self): super(VirusTotalParser, self).__init__() self.misp_event = MISPEvent() + self.proxies = None def declare_variables(self, apikey, attribute): self.attribute = MISPAttribute() @@ -66,8 +71,44 @@ class VirusTotalParser(): def get_query_result(self, query_type): params = {query_type: self.attribute.value, 'apikey': self.apikey} - return requests.get(self.base_url, params=params) + return requests.get(self.base_url, params=params, proxies=self.proxies) + def set_proxy_settings(self, config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') + + if host: + if not port: + misperrors['error'] = 'The virustotal_public_proxy_host config is set, ' \ + 'please also set the virustotal_public_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' + else: + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' + + if username: + if not password: + misperrors['error'] = 'The virustotal_public_proxy_username config is set, ' \ + 'please also set the virustotal_public_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host + + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + self.proxies=proxies + return True class DomainQuery(VirusTotalParser): def __init__(self, apikey, attribute): @@ -182,6 +223,7 @@ def handler(q=False): return {'error': 'Unsupported attribute type.'} query_type, to_call = misp_type_mapping[attribute['type']] parser = to_call(request['config']['apikey'], attribute) + parser.set_proxy_settings(request.get('config')) query_result = parser.get_query_result(query_type) status_code = query_result.status_code if status_code == 200: From 1004bb8bb79d1bbeb76d53273387a5bdbf66777e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Wed, 9 Jun 2021 14:31:27 -0700 Subject: [PATCH 296/476] chg: Bump deps --- Pipfile | 1 - Pipfile.lock | 1311 +++++++++++++++++++++++--------------------------- 2 files changed, 592 insertions(+), 720 deletions(-) diff --git a/Pipfile b/Pipfile index cd631be..98a6f18 100644 --- a/Pipfile +++ b/Pipfile @@ -17,7 +17,6 @@ passivetotal = "*" pypdns = "*" pypssl = "*" pyeupi = "*" -uwhois = { editable = true, git = "https://github.com/Rafiot/uwhoisd.git", ref = "testing", subdirectory = "client" } pymisp = { extras = ["fileobjects,openioc,pdfexport,email"], version = "*" } pyonyphe = { editable = true, git = "https://github.com/sebdraven/pyonyphe" } pydnstrails = { editable = true, git = "https://github.com/sebdraven/pydnstrails" } diff --git a/Pipfile.lock b/Pipfile.lock index 896a592..e649998 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1e40a27ecb603ad61301ace74783297f581773a131fb83638a03ae2488ba4e12" + "sha256": "7a06c4c5e7971831c0908f2db178124724b73d092f902d03f004bd928a3f2c94" }, "pipfile-spec": 6, "requires": { @@ -18,52 +18,52 @@ "default": { "aiohttp": { "hashes": [ - "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9", - "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f", - "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f", - "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005", - "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a", - "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e", - "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd", - "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a", - "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656", - "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0", - "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6", - "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a", - "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c", - "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b", - "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957", - "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9", - "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001", - "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e", - "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60", - "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564", - "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45", - "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a", - "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13", - "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f", - "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4", - "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f", - "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235", - "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914", - "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3", - "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3", - "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150", - "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e", - "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347", - "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b", - "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7", - "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245", - "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1" + "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe", + "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe", + "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5", + "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8", + "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd", + "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb", + "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c", + "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87", + "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0", + "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290", + "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5", + "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287", + "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde", + "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf", + "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8", + "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16", + "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf", + "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809", + "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213", + "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f", + "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013", + "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b", + "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9", + "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5", + "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb", + "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df", + "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4", + "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439", + "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f", + "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22", + "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f", + "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5", + "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970", + "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009", + "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc", + "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a", + "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" ], - "index": "pypi", - "version": "==3.7.3" + "markers": "python_version >= '3.6'", + "version": "==3.7.4.post0" }, "antlr4-python3-runtime": { "hashes": [ "sha256:15793f5d0512a372b4e7d2284058ad32ce7dd27126b105fb0b2245130445db33" ], - "index": "pypi", + "markers": "python_version >= '3'", "version": "==4.8" }, "apiosintds": { @@ -78,39 +78,30 @@ "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314" ], - "index": "pypi", "version": "==1.4.0" }, "assemblyline-client": { "hashes": [ - "sha256:6a36a654185ba40d10bdd0213a1926aacb4351290824e406cbff6b6b5b251f5f" + "sha256:3403d532f9ce08ac19374ceaecba543baeb297257ab1ae56b23f2fe1b651d3e0" ], "index": "pypi", - "version": "==4.0.1" + "version": "==4.0.5" }, "async-timeout": { "hashes": [ "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" ], - "index": "pypi", + "markers": "python_full_version >= '3.5.3'", "version": "==3.0.1" }, "attrs": { "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "index": "pypi", - "version": "==20.3.0" - }, - "backoff": { - "hashes": [ - "sha256:5e73e2cbe780e1915a204799dba0a01896f45f4385e636bcca7a0614d879d0cd", - "sha256:b8fba021fac74055ac05eb7c7bfce4723aedde6cd0a504e5326bcb0bdd6d19a4" + "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", + "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.10.0" + "version": "==21.2.0" }, "backscatter": { "hashes": [ @@ -129,14 +120,6 @@ "index": "pypi", "version": "==4.9.3" }, - "bidict": { - "hashes": [ - "sha256:4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09", - "sha256:929d056e8d0d9b17ceda20ba5b24ac388e2a4d39802b87f9f4d3f45ecba070bf" - ], - "index": "pypi", - "version": "==0.21.2" - }, "blockchain": { "hashes": [ "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" @@ -144,72 +127,74 @@ "index": "pypi", "version": "==1.4.4" }, - "censys": { - "hashes": [ - "sha256:0a2e2c73471d37fb55c4c5597d48334cfc56fd39daebbae18c7b07f0d2a51dc4", - "sha256:d7d935ffe3309f8279d566113f2d958803154fd090ad07abe0d3458a396db9fd" - ], - "index": "pypi", - "version": "==1.1.1" - }, "certifi": { "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" ], - "index": "pypi", - "version": "==2020.12.5" + "version": "==2021.5.30" }, "cffi": { "hashes": [ - "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", - "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", - "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", - "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", - "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", - "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", - "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", - "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", - "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", - "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", - "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", - "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", - "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", - "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", - "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", - "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", - "sha256:7ef7d4ced6b325e92eb4d3502946c78c5367bc416398d387b39591532536734e", - "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", - "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", - "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", - "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", - "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", - "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", - "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", - "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", - "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", - "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", - "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", - "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", - "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", - "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", - "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", - "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", - "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", - "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", - "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", - "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" + "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813", + "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373", + "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69", + "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f", + "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06", + "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05", + "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea", + "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee", + "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0", + "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396", + "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7", + "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f", + "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73", + "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315", + "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76", + "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1", + "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49", + "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed", + "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892", + "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482", + "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058", + "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5", + "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53", + "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045", + "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3", + "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55", + "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5", + "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e", + "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c", + "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369", + "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827", + "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053", + "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa", + "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4", + "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322", + "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132", + "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62", + "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa", + "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0", + "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396", + "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e", + "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991", + "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6", + "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc", + "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1", + "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406", + "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333", + "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d", + "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" ], - "index": "pypi", - "version": "==1.14.4" + "version": "==1.14.5" }, "chardet": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" ], - "index": "pypi", - "version": "==3.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" }, "clamd": { "hashes": [ @@ -221,18 +206,17 @@ }, "click": { "hashes": [ - "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", - "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", + "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" ], - "index": "pypi", - "version": "==7.1.2" + "markers": "python_version >= '3.6'", + "version": "==8.0.1" }, "click-plugins": { "hashes": [ "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" ], - "index": "pypi", "version": "==1.1.1" }, "colorama": { @@ -240,118 +224,96 @@ "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==0.4.4" }, "colorclass": { "hashes": [ "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" ], - "index": "pypi", "version": "==2.2.0" }, "compressed-rtf": { "hashes": [ "sha256:c1c827f1d124d24608981a56e8b8691eb1f2a69a78ccad6440e7d92fde1781dd" ], - "index": "pypi", "version": "==1.0.6" }, "configparser": { "hashes": [ - "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", - "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" + "sha256:85d5de102cfe6d14a5172676f09d19c465ce63d6019cf0a4ef13385fc535e828", + "sha256:af59f2cdd7efbdd5d111c1976ecd0b82db9066653362f0962d7bf1d3ab89a1fa" ], - "index": "pypi", - "version": "==5.0.1" + "markers": "python_version >= '3.6'", + "version": "==5.0.2" }, "cryptography": { "hashes": [ - "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d", - "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7", - "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901", - "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c", - "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244", - "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6", - "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5", - "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e", - "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c", - "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0", - "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812", - "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a", - "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030", - "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302" + "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d", + "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959", + "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6", + "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873", + "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2", + "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713", + "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", + "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", + "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", + "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", + "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", + "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" ], - "index": "pypi", - "version": "==3.3.1" - }, - "dataclasses": { - "hashes": [ - "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", - "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" - ], - "markers": "python_version < '3.7'", - "version": "==0.8" + "version": "==3.4.7" }, "decorator": { "hashes": [ - "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", - "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" + "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323", + "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5" ], - "index": "pypi", - "version": "==4.4.2" + "markers": "python_version >= '3.5'", + "version": "==5.0.9" }, "deprecated": { "hashes": [ - "sha256:471ec32b2755172046e28102cd46c481f21c6036a0ec027521eba8521aa4ef35", - "sha256:924b6921f822b64ec54f49be6700a126bab0640cfafca78f22c9d429ed590560" + "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771", + "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1" ], - "index": "pypi", - "version": "==1.2.11" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.2.12" }, "dnsdb2": { "hashes": [ - "sha256:55c9f43eb231ff21f40a69183fdb0220f175519e108bc19d0c098e07532d0dfe" + "sha256:e7ed25c8ca1e456c77deaf67f440ae0c2ff94c714dab4d67df14ccc82f501faf" ], "index": "pypi", - "version": "==1.1.2" + "version": "==1.1.3" }, "dnspython": { "hashes": [ - "sha256:40f563e1f7a7b80dc5a4e76ad75c23da53d62f1e15e6e517293b04e1f84ead7c", - "sha256:861e6e58faa730f9845aaaa9c6c832851fbf89382ac52915a51f89c71accdd31" + "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216", + "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4" ], "index": "pypi", - "version": "==1.15.0" - }, - "dnspython3": { - "hashes": [ - "sha256:6eb9504abafb91cb67ed9dc3d3289a3ccc438533b460eccbf77e36c5323100f4" - ], - "index": "pypi", - "version": "==1.15.0" + "version": "==2.1.0" }, "domaintools-api": { "hashes": [ - "sha256:62e2e688d14dbd7ca51a44bd0a8490aa69c712895475598afbdbb1e1e15bf2f2", - "sha256:fe75e3cc86e7e2904b06d8e94b1986e721fdce85d695c87d1140403957e4c989" + "sha256:10fd899b2fe063a23edbcf15daf516fe14fb4a67ef1bf72af630a183161cb003", + "sha256:fde92d0f1fb0cfc324548eca85c3bab7774ffa93581fd92ced954ce11d5891e1" ], "index": "pypi", - "version": "==0.5.2" + "version": "==0.5.4" }, "easygui": { "hashes": [ - "sha256:690658af9fca3f2f2a55f24421045f9b33ca33c877ed5fb61d4b942d8ec335f3", - "sha256:dbc89afbb1aca83830ea4af568eb2491654e16b2706a14d040757fdf1fafbbfe" + "sha256:073f728ca88a77b74f404446fb8ec3004945427677c5618bd00f70c1b999fef2", + "sha256:8d38764803c27bbccab2771e6c021cb20647049b36617f765fac79f01af07a27" ], - "index": "pypi", - "version": "==0.98.1" + "version": "==0.98.2" }, "ebcdic": { "hashes": [ "sha256:33b4cb729bc2d0bf46cc1847b0e5946897cb8d3f53520c5b9aa5fa98d7e735f1" ], - "index": "pypi", "version": "==1.1.1" }, "enum-compat": { @@ -359,22 +321,19 @@ "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e", "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157" ], - "index": "pypi", "version": "==0.0.3" }, "extract-msg": { "hashes": [ - "sha256:7300a50bfa91405a381826f8e22f39458c7322fea1cd660ef699c4157a58be4b", - "sha256:7ce5761911b2caa9f07042efdecfcc9cf4afe524c3efbfd0aa5fa277faa1cc53" + "sha256:6ad2702bef86e6c1b8505e2993c7f3d37a1f3d140903138ee2df4a299dd2a29c", + "sha256:7ebdbd7863a3699080a69f71ec0cd30ed9bfee70bad9acc6a8e6abe9523c78c0" ], - "index": "pypi", - "version": "==0.28.1" + "version": "==0.28.7" }, "ez-setup": { "hashes": [ "sha256:303c5b17d552d1e3fb0505d80549f8579f557e13d8dc90e5ecef3c07d7f58642" ], - "index": "pypi", "version": "==0.9" }, "ezodf": { @@ -384,11 +343,18 @@ "index": "pypi", "version": "==0.3.2" }, + "filelock": { + "hashes": [ + "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", + "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + ], + "version": "==3.0.12" + }, "future": { "hashes": [ "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" ], - "index": "pypi", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.18.2" }, "futures": { @@ -397,38 +363,36 @@ "sha256:51ecb45f0add83c806c68e4b06106f90db260585b25ef2abfcda0bd95c0132fd", "sha256:c4884a65654a7c45435063e14ae85280eb1f111d94e542396717ba9828c4337f" ], - "index": "pypi", "version": "==3.1.1" }, "geoip2": { "hashes": [ - "sha256:57d8d15de2527e0697bbef44fc16812bba709f03a07ef99297bd56c1df3b1efd", - "sha256:707025542ef076bd8fd80e97138bebdb7812527b2a007d141a27ad98b0370fff" + "sha256:906a1dbf15a179a1af3522970e8420ab15bb3e0afc526942cc179e12146d9c1d", + "sha256:b97b44031fdc463e84eb1316b4f19edd978cb1d78703465fcb1e36dc5a822ba6" ], "index": "pypi", - "version": "==4.1.0" + "version": "==4.2.0" }, "httplib2": { "hashes": [ - "sha256:8af66c1c52c7ffe1aa5dc4bcd7c769885254b0756e6e69f953c7f0ab49a70ba3", - "sha256:ca2914b015b6247791c4866782fa6042f495b94401a0f0bd3e1d6e0ba2236782" + "sha256:0b12617eeca7433d4c396a100eaecfa4b08ee99aa881e6df6e257a7aad5d533d", + "sha256:2ad195faf9faf079723f6714926e9a9061f694d07724b846658ce08d40f522b4" ], - "index": "pypi", - "version": "==0.18.1" + "version": "==0.19.1" }, "idna": { "hashes": [ "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, "idna-ssl": { "hashes": [ "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" ], - "index": "pypi", + "markers": "python_version < '3.7'", "version": "==1.1.0" }, "imapclient": { @@ -436,123 +400,131 @@ "sha256:3eeb97b9aa8faab0caa5024d74bfde59408fbd542781246f6960873c7bf0dd01", "sha256:60ba79758cc9f13ec910d7a3df9acaaf2bb6c458720d9a02ec33a41352fd1b99" ], - "index": "pypi", "version": "==2.1.0" }, - "importlib-metadata": { - "hashes": [ - "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a", - "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe" - ], - "markers": "python_version < '3.8'", - "version": "==3.10.0" - }, "isodate": { "hashes": [ "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" ], - "index": "pypi", "version": "==0.6.0" }, + "itsdangerous": { + "hashes": [ + "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c", + "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" + ], + "markers": "python_version >= '3.6'", + "version": "==2.0.1" + }, "jbxapi": { "hashes": [ - "sha256:7cebd7ea73838ffd9e77b6a3bac6e4e1263b8cb4678b0579361b9257db684893" + "sha256:2cdb8e935cb35c3af83209b847cedb3911b5f0b4d905ed89f76fa0e34d62ea26" ], "index": "pypi", - "version": "==3.14.0" + "version": "==3.16.0" }, "json-log-formatter": { "hashes": [ - "sha256:ee187c9a80936cbf1259f73573973450fc24b84a4fb54e53eb0dcff86ea1e759" + "sha256:03029bddba697d2f6c81419a80f1c58d3a89ae715336c6a88b370e7d2c983198" ], - "index": "pypi", - "version": "==0.3.0" + "version": "==0.3.1" }, "jsonschema": { "hashes": [ "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" ], - "index": "pypi", "version": "==3.2.0" }, "lark-parser": { "hashes": [ - "sha256:20bdefdf1b6e9bcb38165ea5cc4f27921a99c6f4c35264a3a953fd60335f1f8c", - "sha256:8b747e1f544dcc2789e3feaddd2a50c6a73bed69d62e9c69760c1e1f7d23495f" + "sha256:e29ca814a98bb0f81674617d878e5f611cb993c19ea47f22c80da3569425f9bd" ], - "index": "pypi", - "version": "==0.11.1" + "version": "==0.11.3" }, "lief": { "hashes": [ - "sha256:0cd2665ff28937755c8acedc2e3fb9de5ba752353e19b51b89297b8be3f63ccb", - "sha256:1a110bd5db41b4fde1a61094658b0366352ed4c0a00b55bde821046a59c2f913", - "sha256:1fb570712fa17ee153aca263ab1f1ec763772ccb46992e415b3dc1c0248466bc", - "sha256:2ee8f9787ea92109f19e5e4d22773042184ac524a3f11399ea5e13d974ac1f05", - "sha256:348ee294567826cad638b7e6cf2ede4ffe03524cd5b6038896f78e5b006d6295", - "sha256:77ba7dd0d48933c0b26c980bda1ab4a7ad3c7031880181fab0b94caad3bc1a4d", - "sha256:8774076dfbcf9b6906be4d9243de4a78fc09d317292251072d460ed1e0eeb96e", - "sha256:93d79a47db9977e6471b21d5efd4e7af4c29c76261d6583141fcf10f6ccd0eba", - "sha256:96d2a8d2310c7accaeb5c6679833c0cd8f0fb6d8c682a5df59d4d868c8881661", - "sha256:9837166402248a4ef29018d498c4eccc11cbc92ee4083da046fa747d3863b43d", - "sha256:9f2bd417090df21548af3a0216f3a02056291348c0826a5ff78e3f3046283978", - "sha256:ad19b9ef5c2a2552a82683bbf92ef3e986b422d552968b378195e356191aa545", - "sha256:afe4d15b519dd7d97732e85b7a2b11154c97a40ce517e1044b5cd5f80074ce36", - "sha256:b0a55424b3ffa08d16bf8ee6e5e9474b0a4b392ca4d94545c16e47e6366e41d4", - "sha256:ccf977099153eaefa351e72e84dfa829334699521ef00434b50647d80de2cc56", - "sha256:d95cf1224c7b311b8d25dbd4de627d28717266e62b9721f1dc4c8427f929a60f", - "sha256:e6ff05e6ebcb9bea8833fcb558d4db3bc2a78031c4792fcac9f9612fa78258b3", - "sha256:e8c66834a0ee9ed1899db165c09ca04aba8dee574de1ccc866d82fbf0c059bb8", - "sha256:f31fde4e7174b4bc9b67ff22fd93fa15fc3faa1592ac669f3addc95d9e66168e", - "sha256:f9b00c396c9f45c5f4cf37c034428ad525d6d7c7d38fc6c49ddc4b558201151b" + "sha256:17314177c0124ccd450554bbcb203b8cd2660c94e36bdc05a6eba04bb0af3954", + "sha256:1cca100e77382f4137a3b1283769efa0e68a965fa4f3e21e64e3f67b6e22fdc8", + "sha256:208294f208354f57ded772efc4c3b2ea61fae35325a048d38c21571cb35e4bfc", + "sha256:3f510836d19cee407015ee565ea566e444471f0ecb3028a5c5e2219a7583f3c4", + "sha256:44bd7804a39837ff46cd543154f6e4a28e2d4fafa312752ca6deea1c849995ce", + "sha256:5122e4e70fecc32e7fdf2e9cd9b580ddd63fb4509eae373be78b3c11d67175b8", + "sha256:544b0f8a587bc5f6fd39cf47d9785af2714f982682efcd1dd3291604e7cb6351", + "sha256:5a0da170943aaf7019b27b9a7199b860298426c0455f88add392f472605c39ee", + "sha256:5f5fb42461b5d5d5b2ccf7fe17e8f26bd632afcbaedf29a9d30819eeea5dab29", + "sha256:621ad19f77884a008d61e05b92aed8309a8460e93916f4722439beaa529ca37d", + "sha256:710112ebc642bf5287a7b25c54c8a4e1079cbb403d4e844a364e1c3cbed52486", + "sha256:8b219ce4a41b0734fe9a7fbfde7d23a92bc005c8684882662808fc438568c1b5", + "sha256:8fd1ecdb3001e8e19df7278b77df5d6394ad6071354e177d11ad08b0a727d390", + "sha256:932ba495388fb52b4ba056a0b00abe0bda3567ad3ebc6d726be1e87b8be08b3f", + "sha256:9c6cc9da3e3a56ad29fc4e77e7109e960bd0cae3e3ba5307e3ae5c65d85fbdc4", + "sha256:a1f7792f1d811a898d3d676c32731d6b055573a2c3e67988ab1b32917db3de96", + "sha256:a4bb649a2f5404b8e2e4b8beb3772466430e7382fc5f7f014f3f778137133987", + "sha256:b275a542b5ef173ec9602d2f511a895c4228db63bbbc58699859da4afe8bfd58", + "sha256:bfc0246af63361e22a952f8babd542477d64288d993c5a053a72f9e3f59da795", + "sha256:c672dcd78dbbe2c0746721cdb1593b237a8b983d039e73713b055449e4a58207", + "sha256:c773eaee900f398cc98a9c8501d9ab7465af9729979841bb78f4aaa8b821fd9a", + "sha256:e6d9621c1db852ca4de37efe98151838edf0a976fe03cace471b3a761861f95e", + "sha256:e743345290649f54efcf2c1ea530f3520a7b22583fb8b0772df48b1901ecb1ea", + "sha256:eb8c2ae617ff54c4ea73dbd055544681b3cfeafbdbf0fe4535fac494515ab65b", + "sha256:f4e8a878615a46ef4ae016261a59152b8c019a35adb865e26a37c8ef25200d7e", + "sha256:fd41077526e30bfcafa3d03bff8466a4a9ae4bbe21cadd6a09168a62ce18710c" ], - "index": "pypi", - "version": "==0.11.0" + "version": "==0.11.5" }, "lxml": { "hashes": [ - "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", - "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", - "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", - "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", - "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", - "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", - "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", - "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", - "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", - "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", - "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", - "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", - "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", - "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", - "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", - "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", - "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", - "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", - "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", - "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", - "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", - "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", - "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", - "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", - "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", - "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", - "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", - "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", - "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", - "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", - "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", - "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", - "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", - "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", - "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", - "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", - "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" + "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d", + "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3", + "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2", + "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae", + "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f", + "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927", + "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3", + "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7", + "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59", + "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f", + "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade", + "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96", + "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468", + "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b", + "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4", + "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354", + "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83", + "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04", + "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16", + "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791", + "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a", + "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51", + "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1", + "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a", + "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f", + "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee", + "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec", + "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969", + "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28", + "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a", + "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa", + "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106", + "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d", + "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617", + "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4", + "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92", + "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0", + "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4", + "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24", + "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2", + "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e", + "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0", + "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654", + "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2", + "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23", + "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586" ], "index": "pypi", - "version": "==4.6.2" + "version": "==4.6.3" }, "maclookup": { "hashes": [ @@ -574,19 +546,20 @@ "hashes": [ "sha256:47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc" ], - "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.3" }, "misp-modules": { "editable": true, - "file": "file:///usr/local/src/misp-modules" + "path": "." }, "msoffcrypto-tool": { "hashes": [ - "sha256:56a1fe5e58ca417ca8756e8d7224ae599323996da65f81a35273c0f1e2eaf490" + "sha256:234f85ef59945fa1ebb618ca029f31f0cb43a637344dbda5c1bb8578b2d96a68", + "sha256:7f04b621365e3753f8cef8ba40536acc23d0d201c0ad2dcb1b3d82c83056b7ff" ], - "index": "pypi", - "version": "==4.11.0" + "markers": "platform_python_implementation != 'PyPy' or (python_version >= '3' and platform_system != 'Windows' and platform_system != 'Darwin')", + "version": "==4.12.0" }, "multidict": { "hashes": [ @@ -628,7 +601,7 @@ "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" ], - "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==5.1.0" }, "np": { @@ -640,43 +613,33 @@ }, "numpy": { "hashes": [ - "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", - "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", - "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", - "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", - "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", - "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", - "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", - "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", - "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", - "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", - "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", - "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", - "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", - "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", - "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", - "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", - "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", - "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", - "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", - "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", - "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", - "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", - "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", - "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", - "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", - "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", - "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", - "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", - "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", - "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", - "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", - "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", - "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", - "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" + "sha256:1676b0a292dd3c99e49305a16d7a9f42a4ab60ec522eac0d3dd20cdf362ac010", + "sha256:16f221035e8bd19b9dc9a57159e38d2dd060b48e93e1d843c49cb370b0f415fd", + "sha256:43909c8bb289c382170e0282158a38cf306a8ad2ff6dfadc447e90f9961bef43", + "sha256:4e465afc3b96dbc80cf4a5273e5e2b1e3451286361b4af70ce1adb2984d392f9", + "sha256:55b745fca0a5ab738647d0e4db099bd0a23279c32b31a783ad2ccea729e632df", + "sha256:5d050e1e4bc9ddb8656d7b4f414557720ddcca23a5b88dd7cff65e847864c400", + "sha256:637d827248f447e63585ca3f4a7d2dfaa882e094df6cfa177cc9cf9cd6cdf6d2", + "sha256:6690080810f77485667bfbff4f69d717c3be25e5b11bb2073e76bb3f578d99b4", + "sha256:66fbc6fed94a13b9801fb70b96ff30605ab0a123e775a5e7a26938b717c5d71a", + "sha256:67d44acb72c31a97a3d5d33d103ab06d8ac20770e1c5ad81bdb3f0c086a56cf6", + "sha256:6ca2b85a5997dabc38301a22ee43c82adcb53ff660b89ee88dded6b33687e1d8", + "sha256:6e51534e78d14b4a009a062641f465cfaba4fdcb046c3ac0b1f61dd97c861b1b", + "sha256:70eb5808127284c4e5c9e836208e09d685a7978b6a216db85960b1a112eeace8", + "sha256:830b044f4e64a76ba71448fce6e604c0fc47a0e54d8f6467be23749ac2cbd2fb", + "sha256:8b7bb4b9280da3b2856cb1fc425932f46fba609819ee1c62256f61799e6a51d2", + "sha256:a9c65473ebc342715cb2d7926ff1e202c26376c0dcaaee85a1fd4b8d8c1d3b2f", + "sha256:c1c09247ccea742525bdb5f4b5ceeacb34f95731647fe55774aa36557dbb5fa4", + "sha256:c5bf0e132acf7557fc9bb8ded8b53bbbbea8892f3c9a1738205878ca9434206a", + "sha256:db250fd3e90117e0312b611574cd1b3f78bec046783195075cbd7ba9c3d73f16", + "sha256:e515c9a93aebe27166ec9593411c58494fa98e5fcc219e47260d9ab8a1cc7f9f", + "sha256:e55185e51b18d788e49fe8305fd73ef4470596b33fc2c1ceb304566b99c71a69", + "sha256:ea9cff01e75a956dbee133fa8e5b68f2f92175233de2f88de3a682dd94deda65", + "sha256:f1452578d0516283c87608a5a5548b0cdde15b99650efdfd85182102ef7a7c17", + "sha256:f39a995e47cb8649673cfa0579fbdd1cdd33ea497d1728a6cb194d6252268e48" ], - "index": "pypi", - "version": "==1.19.5" + "markers": "python_version >= '3.7'", + "version": "==1.20.3" }, "oauth2": { "hashes": [ @@ -695,76 +658,63 @@ "hashes": [ "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.46" }, "oletools": { "hashes": [ - "sha256:8481cd60352399e15e9290ac57862a65952e9c83e3526ba833991a5c78f5cca1" + "sha256:e2a6d3e3c860822d8539d47cfd89bb681a9663ae4d1ea9ec99e88b14d85b6c4e", + "sha256:eb5310d15e79201f4d33d8107209dd8795a7ea0178030ecbc45c4cc915a166e2" ], - "index": "pypi", - "version": "==0.56" + "version": "==0.56.2" }, "opencv-python": { "hashes": [ - "sha256:30edebc81b260bcfeb760b3600c367c5261dfb2fe41e5d1408d5357d0867b40d", - "sha256:32dee1c9fd3e31e28edef7b56f868e2b40e280b7062304f9fb8a14dbc51547d5", - "sha256:4982fa8ccc38310a2bd93e06334ba090b12b6aff2f6fcb8ff9613e3c9bc48f48", - "sha256:5172cb37dfd8a0b4945b071a493eb36e5f17675a160637fa380f9c1d9d80535c", - "sha256:6d8434a45e8f75c4da5fd0068ce001f4f8e35771cc851d746d4721eeaf517e25", - "sha256:78a6db8467639383caedf1d111da3510a4ee1a0aacf2117821cae2ee8f92ce37", - "sha256:9646875c501788b1b098f282d777b667d6da69801739504f1b2fd1268970d1da", - "sha256:9c77d508e6822f1f40c727d21b822d017622d8305dce7eccf0ab06caac16d5c6", - "sha256:a1dfa0486db367594510c0c799ec7481247dc86e651b69008806d875ab731471", - "sha256:b2b9ac86aec5f2dd531545cebdea1a1ef4f81ef1fb1760d78b4725f9575504f9", - "sha256:bcb27773cfd5340b2b599b303d9f5499838ef4780c20c038f6030175408c64df", - "sha256:c0503bfaa2b7b743d6ff5d81f1dd8428dbf4c33e7e4f836456d11be20c2e7721", - "sha256:c1159d91f29a85c3333edef6ca420284566d9bcdae46dda2fe7282515b48c8b6", - "sha256:c4ea4f8b217f3e8be6247fc0787fb81797d85202c722523f41070124a7a621c7", - "sha256:c8cc1f5ff3c352ebe756119014c4e4ec7ae5ac536d1f66b0316667ced37637c8", - "sha256:d16144c435b816c5536d5ff012c1a2b7e93155017db7103942ff7efb98c4df1f", - "sha256:d8aefcb30b71064dbbaa2b0ace161a36464c29375a83998fbda39a1d1740f942", - "sha256:e27d062fa1098d90f48b6c047351c89816492a08906a021c973ce510b04a7b9d", - "sha256:e2c17714da59d9d516ceef0450766ff9557ee232d62f702665af905193557582", - "sha256:e38fbd7b2db03204ec09930609b7313d6b6d2b271c8fe2c0aa271fa69b726a1b", - "sha256:e77d0feaff37326f62b127098264e2a7099deb476e38432b1083ce11cdedf560", - "sha256:ebe83901971a6755512424c4fe9f63341cca501b7c497bf608dd38ee31ba3f4c", - "sha256:efac9893d9e21cfb599828801c755ecde8f1e657f05ec6f002efe19422456d5a", - "sha256:fc1472b825d26c8a4f1cfb172a90c3cc47733e4af7522276c1c2efe8f6006a8b", - "sha256:ffc75c614b8dc3d8102f3ba15dafd6ec0400c7ffa71a91953d41511964ee50e0" + "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0", + "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118", + "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44", + "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709", + "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc", + "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba", + "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161", + "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6", + "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23", + "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1", + "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d", + "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36", + "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611", + "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48", + "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846", + "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f", + "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c", + "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b", + "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba", + "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e" ], "index": "pypi", - "version": "==4.5.1.48" + "version": "==4.5.2.54" }, "pandas": { "hashes": [ - "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b", - "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f", - "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648", - "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb", - "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98", - "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a", - "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11", - "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a", - "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e", - "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae", - "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d", - "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9", - "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b", - "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788", - "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca", - "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5", - "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a", - "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814", - "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d", - "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086", - "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a", - "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb", - "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782", - "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b" + "sha256:167693a80abc8eb28051fbd184c1b7afd13ce2c727a5af47b048f1ea3afefff4", + "sha256:2111c25e69fa9365ba80bbf4f959400054b2771ac5d041ed19415a8b488dc70a", + "sha256:298f0553fd3ba8e002c4070a723a59cdb28eda579f3e243bc2ee397773f5398b", + "sha256:2b063d41803b6a19703b845609c0b700913593de067b552a8b24dd8eeb8c9895", + "sha256:2cb7e8f4f152f27dc93f30b5c7a98f6c748601ea65da359af734dd0cf3fa733f", + "sha256:52d2472acbb8a56819a87aafdb8b5b6d2b3386e15c95bde56b281882529a7ded", + "sha256:612add929bf3ba9d27b436cc8853f5acc337242d6b584203f207e364bb46cb12", + "sha256:649ecab692fade3cbfcf967ff936496b0cfba0af00a55dfaacd82bdda5cb2279", + "sha256:68d7baa80c74aaacbed597265ca2308f017859123231542ff8a5266d489e1858", + "sha256:8d4c74177c26aadcfb4fd1de6c1c43c2bf822b3e0fc7a9b409eeaf84b3e92aaa", + "sha256:971e2a414fce20cc5331fe791153513d076814d30a60cd7348466943e6e909e4", + "sha256:9db70ffa8b280bb4de83f9739d514cd0735825e79eef3a61d312420b9f16b758", + "sha256:b730add5267f873b3383c18cac4df2527ac4f0f0eed1c6cf37fcb437e25cf558", + "sha256:bd659c11a4578af740782288cac141a322057a2e36920016e0fc7b25c5a4b686", + "sha256:c601c6fdebc729df4438ec1f62275d6136a0dd14d332fc0e8ce3f7d2aadb4dd6", + "sha256:d0877407359811f7b853b548a614aacd7dea83b0c0c84620a9a643f180060950" ], "index": "pypi", - "version": "==1.1.5" + "version": "==1.2.4" }, "pandas-ods-reader": { "hashes": [ @@ -776,72 +726,71 @@ }, "passivetotal": { "hashes": [ - "sha256:2944974d380a41f19f8fbb3d7cbfc8285479eb81092940b57bf0346d66706a05", - "sha256:a0cbea84b0bd6e9f3694ddeb447472b3d6f09e28940a7a0388456b8cf6a8e478", - "sha256:e35bf2cbccb385795a67d66f180d14ce9136cf1611b1c3da8a1055a1aced6264" + "sha256:32740c5b5a1f950320c0350aa002b0b35cda5941db7e441b22b01419f4923eec", + "sha256:3c2c7be55764930d7db83ad53baa42e69228d1534195451cc3a519f866a856c8" ], "index": "pypi", - "version": "==1.0.31" + "version": "==2.4.2" }, "pcodedmp": { "hashes": [ "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955", "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278" ], - "index": "pypi", "version": "==1.2.6" }, "pdftotext": { "hashes": [ - "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" + "sha256:caf8ddbaeaf0a5897f07655a71747242addab2e695e84c5d47f2ea92dfe2a594" ], "index": "pypi", - "version": "==2.1.5" + "version": "==2.1.6" }, "pillow": { "hashes": [ - "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6", - "sha256:1d208e670abfeb41b6143537a681299ef86e92d2a3dac299d3cd6830d5c7bded", - "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865", - "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174", - "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032", - "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a", - "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e", - "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378", - "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17", - "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c", - "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913", - "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7", - "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0", - "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820", - "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba", - "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2", - "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b", - "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9", - "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234", - "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d", - "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5", - "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206", - "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9", - "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8", - "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59", - "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d", - "sha256:cf6e33d92b1526190a1de904df21663c46a456758c0424e4f947ae9aa6088bf7", - "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a", - "sha256:d673c4990acd016229a5c1c4ee8a9e6d8f481b27ade5fc3d95938697fa443ce0", - "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b", - "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d", - "sha256:f50e7a98b0453f39000619d845be8b06e611e56ee6e8186f7f60c3b1e2f0feae" + "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5", + "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4", + "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9", + "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a", + "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9", + "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727", + "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120", + "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c", + "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2", + "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797", + "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b", + "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f", + "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef", + "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232", + "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb", + "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9", + "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812", + "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178", + "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291", + "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b", + "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5", + "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b", + "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1", + "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713", + "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4", + "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484", + "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c", + "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9", + "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388", + "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d", + "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602", + "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9", + "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e", + "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2" ], "index": "pypi", - "version": "==8.1.0" + "version": "==8.2.0" }, "progressbar2": { "hashes": [ "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" ], - "index": "pypi", "version": "==3.53.1" }, "psutil": { @@ -875,13 +824,13 @@ "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" ], - "index": "pypi", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==5.8.0" }, "pybgpranking": { "editable": true, "git": "https://github.com/D4-project/BGP-Ranking.git/", - "ref": "fd9c0e03af9b61d4bf0b67ac73c7208a55178a54", + "ref": "68de39f6c5196f796055c1ac34504054d688aa59", "subdirectory": "client" }, "pycparser": { @@ -889,100 +838,85 @@ "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.20" }, "pycryptodome": { "hashes": [ - "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", - "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", - "sha256:21ef416aa52802d22b9c11598d4e5352285bd9d6b5d868cde3e6bf2b22b4ebfb", - "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", - "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", - "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", - "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", - "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", - "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", - "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", - "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", - "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", - "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", - "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", - "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", - "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", - "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", - "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", - "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", - "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", - "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", - "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", - "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", - "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", - "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", - "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", - "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", - "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", - "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", - "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", - "sha256:b17b0ad9faee14d6318f965d58d323b0b37247e1e0c9c40c23504c00f4af881e", - "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", - "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", - "sha256:b830fae2a46536ee830599c3c4af114f5228f31e54adac370767616a701a99dc", - "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", - "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", - "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", - "sha256:f381036287c25d9809a08224ce4d012b7b7d50b6ada3ddbc3bc6f1f659365120", - "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" + "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", + "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", + "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", + "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", + "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", + "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", + "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", + "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", + "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", + "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", + "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", + "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", + "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", + "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", + "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", + "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", + "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", + "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", + "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", + "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", + "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", + "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", + "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", + "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", + "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", + "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", + "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", + "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", + "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", + "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" ], - "index": "pypi", - "version": "==3.9.9" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==3.10.1" }, "pycryptodomex": { "hashes": [ - "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", - "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", - "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", - "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", - "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", - "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", - "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", - "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", - "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", - "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", - "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", - "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", - "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", - "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", - "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", - "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", - "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", - "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", - "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", - "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", - "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", - "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", - "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", - "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", - "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", - "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", - "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", - "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", - "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", - "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", - "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", - "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", - "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", - "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", - "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" + "sha256:00a584ee52bf5e27d540129ca9bf7c4a7e7447f24ff4a220faa1304ad0c09bcd", + "sha256:04265a7a84ae002001249bd1de2823bcf46832bd4b58f6965567cb8a07cf4f00", + "sha256:0bd35af6a18b724c689e56f2dbbdd8e409288be71952d271ba3d9614b31d188c", + "sha256:20c45a30f3389148f94edb77f3b216c677a277942f62a2b81a1cc0b6b2dde7fc", + "sha256:2959304d1ce31ab303d9fb5db2b294814278b35154d9b30bf7facc52d6088d0a", + "sha256:36dab7f506948056ceba2d57c1ade74e898401960de697cefc02f3519bd26c1b", + "sha256:37ec1b407ec032c7a0c1fdd2da12813f560bad38ae61ad9c7ce3c0573b3e5e30", + "sha256:3b8eb85b3cc7f083d87978c264d10ff9de3b4bfc46f1c6fdc2792e7d7ebc87bb", + "sha256:3dfce70c4e425607ae87b8eae67c9c7dbba59a33b62d70f79417aef0bc5c735b", + "sha256:418f51c61eab52d9920f4ef468d22c89dab1be5ac796f71cf3802f6a6e667df0", + "sha256:4195604f75cdc1db9bccdb9e44d783add3c817319c30aaff011670c9ed167690", + "sha256:4344ab16faf6c2d9df2b6772995623698fb2d5f114dace4ab2ff335550cf71d5", + "sha256:541cd3e3e252fb19a7b48f420b798b53483302b7fe4d9954c947605d0a263d62", + "sha256:564063e3782474c92cbb333effd06e6eb718471783c6e67f28c63f0fc3ac7b23", + "sha256:72f44b5be46faef2a1bf2a85902511b31f4dd7b01ce0c3978e92edb2cc812a82", + "sha256:8a98e02cbf8f624add45deff444539bf26345b479fc04fa0937b23cd84078d91", + "sha256:940db96449d7b2ebb2c7bf190be1514f3d67914bd37e54e8d30a182bd375a1a9", + "sha256:961333e7ee896651f02d4692242aa36b787b8e8e0baa2256717b2b9d55ae0a3c", + "sha256:9f713ffb4e27b5575bd917c70bbc3f7b348241a351015dbbc514c01b7061ff7e", + "sha256:a6584ae58001d17bb4dc0faa8a426919c2c028ef4d90ceb4191802ca6edb8204", + "sha256:c2b680987f418858e89dbb4f09c8c919ece62811780a27051ace72b2f69fb1be", + "sha256:d8fae5ba3d34c868ae43614e0bd6fb61114b2687ac3255798791ce075d95aece", + "sha256:dbd2c361db939a4252589baa94da4404d45e3fc70da1a31e541644cdf354336e", + "sha256:e090a8609e2095aa86978559b140cf8968af99ee54b8791b29ff804838f29f10", + "sha256:e4a1245e7b846e88ba63e7543483bda61b9acbaee61eadbead5a1ce479d94740", + "sha256:ec9901d19cadb80d9235ee41cc58983f18660314a0eb3fc7b11b0522ac3b6c4a", + "sha256:f2abeb4c4ce7584912f4d637b2c57f23720d35dd2892bfeb1b2c84b6fb7a8c88", + "sha256:f3bb267df679f70a9f40f17d62d22fe12e8b75e490f41807e7560de4d3e6bf9f", + "sha256:f933ecf4cb736c7af60a6a533db2bf569717f2318b265f92907acff1db43bc34", + "sha256:fc9c55dc1ed57db76595f2d19a479fc1c3a1be2c9da8de798a93d286c5f65f38" ], - "index": "pypi", - "version": "==3.9.9" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==3.10.1" }, "pydeep": { "hashes": [ "sha256:22866eb422d1d5907f8076ee792da65caecb172425d27576274e2a8eacf6afc1" ], - "index": "pypi", "version": "==0.4" }, "pydnstrails": { @@ -998,14 +932,6 @@ "index": "pypi", "version": "==1.1" }, - "pyfaup": { - "hashes": [ - "sha256:5648bc3ebd80239aec927aedfc218c3a6ff36de636cc53822bfeb70b0869b1e7", - "sha256:75f96f7da86ffb5402d3fcc2dbf98a511e792cf9100c159e34cdba8996ddc7f9" - ], - "index": "pypi", - "version": "==1.2" - }, "pygeoip": { "hashes": [ "sha256:1938b9dac7b00d77f94d040b9465ea52c938f3fcdcd318b5537994f3c16aef96", @@ -1017,12 +943,12 @@ "pyintel471": { "editable": true, "git": "https://github.com/MISP/PyIntel471.git", - "ref": "0df8d51f1c1425de66714b3a5a45edb69b8cc2fc" + "ref": "917272fafa8e12102329faca52173e90c5256968" }, "pyipasnhistory": { "editable": true, "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "fc5e48608afc113e101ca6421bf693b7b9753f9e", + "ref": "1f020c44c440988899a6798903fd6941e06f8930", "subdirectory": "client" }, "pymisp": { @@ -1033,11 +959,11 @@ "pdfexport" ], "hashes": [ - "sha256:439389a5377a9128018e9e4cc8e7ed9efa45a5efc4e77afbb55310ec7935d197", - "sha256:eed98c96b41a5e13ad1147f331ccb66e4fd9284df87528da5c99d759e29309d8" + "sha256:81be4569199c117513d35d06f3cd46d5b412c1e8509ec1cfa0e6bfd19751ef4f", + "sha256:cf04fe19391fed4251cef1f267d80a19e37ed4b88602fb5f9790a3cd814d9d00" ], "index": "pypi", - "version": "==2.4.137.1" + "version": "==2.4.144" }, "pyonyphe": { "editable": true, @@ -1049,7 +975,6 @@ "sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51", "sha256:818ae18e06922c066f777a33f1fca45786d85edfe71cd043de6379337a7f274b" ], - "index": "pypi", "version": "==20.0.1" }, "pyparsing": { @@ -1057,29 +982,30 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "index": "pypi", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.4.7" }, "pypdns": { "hashes": [ - "sha256:640a7e08c3e1e6d6cf378bc7bf48225d847a9c86583c196994fb15acc20ec6f4", - "sha256:9cd2d42ed5e9e4ff7ea29b3947b133a74b0fe0f548ca4c9fac26c0b8f8b750d5" + "sha256:1cef645d6534a86670070762dcb9af62ce1456b018fc818302cb8a2a4bf5a8ec", + "sha256:b54ded94416e8770f1e26f91988798018cfab0e637908aab6086b0d2fc54f57d" ], "index": "pypi", - "version": "==1.5.1" + "version": "==1.5.2" }, "pypssl": { "hashes": [ - "sha256:4dbe772aefdf4ab18934d83cde79e2fc5d5ba9d2b4153dc419a63faab3432643" + "sha256:249ea2152827c10e746fe94c2957c0a525f8ed7ca9db2cd972690a3a136d7bb7", + "sha256:88cedaa4191b50154951fce98396521ad6c1d7e3eb914343e7a12ec0df1882a8" ], "index": "pypi", - "version": "==2.1" + "version": "==2.2" }, "pyrsistent": { "hashes": [ "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" ], - "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==0.17.3" }, "pytesseract": { @@ -1093,7 +1019,6 @@ "hashes": [ "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" ], - "index": "pypi", "version": "==1.2.2" }, "python-dateutil": { @@ -1101,64 +1026,59 @@ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.8.1" }, "python-docx": { "hashes": [ - "sha256:bc76ecac6b2d00ce6442a69d03a6f35c71cd72293cd8405a7472dfe317920024" + "sha256:1105d233a0956dd8dd1e710d20b159e2d72ac3c301041b95f4d4ceb3e0ebebc4" ], "index": "pypi", - "version": "==0.8.10" + "version": "==0.8.11" }, "python-engineio": { "hashes": [ - "sha256:33f7a214be5db35c867e97027bfe63676cb003d82aa17a607612b25ba5d84e5b", - "sha256:9f34afa4170f5ba6e3d9ff158752ccf8fbb2145f16554b2f0fc84646675be99a" + "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", + "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" ], - "index": "pypi", - "version": "==4.0.0" + "version": "==3.14.2" }, "python-magic": { "hashes": [ - "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", - "sha256:b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce" + "sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626", + "sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf" ], - "index": "pypi", - "version": "==0.4.18" + "version": "==0.4.24" }, "python-pptx": { "hashes": [ - "sha256:a857d69e52d7e8a8fb32fca8182fdd4a3c68c689de8d4e4460e9b4a95efa7bc4" + "sha256:cbac6cdf28bde418acab332b62f961225f69993579f4662faf9f7a878150d2b5" ], "index": "pypi", - "version": "==0.6.18" + "version": "==0.6.19" }, "python-socketio": { "extras": [ "client" ], "hashes": [ - "sha256:870f8b00a63ef7c9a1f85fd70028624867bf246115e82625f28ef79def8847bb", - "sha256:f53fd0d5bd9f75a70492062f4ae6195ab5d34d67a29024d740f25e468392893e" + "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", + "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" ], - "index": "pypi", - "version": "==5.0.4" + "version": "==4.6.1" }, "python-utils": { "hashes": [ - "sha256:10e155d88b706b25ede773354ea782eee6d494294651228469c916eb20f7ee1c", - "sha256:2643aec3bfcd1062accafb915aa624b81a2b0f6dad9d0c1021debead4a35cda7" + "sha256:18fbc1a1df9a9061e3059a48ebe5c8a66b654d688b0e3ecca8b339a7f168f208", + "sha256:352d5b1febeebf9b3cdb9f3c87a3b26ef22d3c9e274a8ec1e7048ecd2fac4349" ], - "index": "pypi", - "version": "==2.5.2" + "version": "==2.5.6" }, "pytz": { "hashes": [ "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" ], - "index": "pypi", "version": "==2019.3" }, "pyyaml": { @@ -1193,7 +1113,7 @@ "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==5.4.1" }, "pyzbar": { @@ -1207,18 +1127,17 @@ }, "pyzipper": { "hashes": [ - "sha256:80d3acd52e9c9291d88f3d7ae36f30ade38e4639941c198c62285018667dc777", - "sha256:dd4cc0d222e207e3b25570f5214411625cc117b7f463d2d51e22d669c7880992" + "sha256:6040069654dad040cf8708d4db78ce5829238e2091ad8006a47d97d6ffe275d6", + "sha256:e696e9d306427400e23e13a766c7614b64d9fc3316bdc71bbcc8f0070a14f150" ], - "index": "pypi", - "version": "==0.3.4" + "markers": "python_version >= '3.5'", + "version": "==0.3.5" }, "rdflib": { "hashes": [ "sha256:78149dd49d385efec3b3adfbd61c87afaf1281c30d3fcaf1b323b34f603fb155", "sha256:88208ea971a87886d60ae2b1a4b2cdc263527af0454c422118d43fe64b357877" ], - "index": "pypi", "version": "==5.0.0" }, "redis": { @@ -1226,54 +1145,43 @@ "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==3.5.3" }, "reportlab": { "hashes": [ - "sha256:009fa61710647cdc62eb373345248d8ebb93583a058990f7c4f9be46d90aa5b1", - "sha256:04a08d284da86882ec3a41a7c719833362ef891b09ee8e2fbb47cee352aa684a", - "sha256:07bff6742fba612da8d1b1f783c436338c6fdc6962828159827d5ca7d2b67935", - "sha256:09fb11ab1500e679fc1b01199d2fed24435499856e75043a9ac0d31dd48fd881", - "sha256:18a876449c9000c391dd3415ebc8454cd7bb9e488977b894886a2d7d018f16cd", - "sha256:18eec161411026dde49767bee4e5e8eeb8014879554811a62581dc7433628d5b", - "sha256:19353aead39fc115a4d6c598d6fb9fa26da7e69160a0443ebb49b02903e704e8", - "sha256:1b85c20e89c22ae902ca973df2afdd2d64d27dc4ffd2b29ebad8c805a213756b", - "sha256:1da3d7a35f918cee905facfa94bd00ae6091cadc06dca1b0b31b69ae02d41d1d", - "sha256:33f3cfdc492575f8af3225701301a7e62fc478358729820c9e0091aff5831378", - "sha256:3b0026c1129147befd4e5a8cf25da8dea1096fce371e7b2412e36d7254019c06", - "sha256:3d7713dddaa8081ed709a1fa2456a43f6a74b0f07d605da8441fd53fef334f69", - "sha256:3e2b4d69763103b9dc9b54c0952dc3cee05cedd06e28c0987fad7f84705b12c0", - "sha256:4ca5233a19a5ceca23546290f43addec2345789c7d65bb32f8b2668aa148351f", - "sha256:5214a289cf01ebbd65e49bae83709671dd9edb601891cf0ae8abf85f3c0b392f", - "sha256:52f8237654acbc78ea2fa6fb4a6a06e5b023b6da93f7889adfe2deba09473fad", - "sha256:5ed00894e0f8281c0b7c0494b4d3067c641fd90c8e5cf933089ec4cc9a48e491", - "sha256:6191961533d49c9d860964d42bada4d7ac3bb28502d984feb8034093f2012fa8", - "sha256:6f3ad2b1afe99c436563cd436d8693d4a12e2c4bd45f70c7705759ff7837fe53", - "sha256:739b743b7ca1ba4b4d64c321de6fccb49b562d0507ea06c817d9cc4faed5cd22", - "sha256:792efba0c0c6e4ee94f6dc95f305451733ee9230a1c7d51cb8e5301a549e0dfb", - "sha256:79d63ca40231ca3860859b39a92daa5219035ba9553da89a5e1b218550744121", - "sha256:83b28104edd58ad65748d2d0e60e0d97e3b91b3e90b4573ea6fe60de6811972c", - "sha256:85650446538cd2f606ca234634142a7ccd74cb6db7cfec250f76a4242e0f2431", - "sha256:9da445cb79e3f740756924c053edc952cde11a65ff5af8acfda3c0a1317136ef", - "sha256:9fabd5fbd24f5971085ffe53150d663f158f7d3050b25c95736e29ebf676d454", - "sha256:a0c377bc45e73c3f15f55d7de69fab270d174749d5b454ab0de502b15430ec2a", - "sha256:a1d3f7022a920d4a5e165d264581f1862e1c1b877ceeabb96fe98cec98125ae5", - "sha256:a315edef5c5610b0c75790142f49487e89ea34397fc247ae8aa890fe6d6dd057", - "sha256:a755cca2dcf023130b03bb671670301a992157d5c3151d838c0b68ef89894536", - "sha256:b1b20208ecdfffd7ca027955c4fe8972b28b30a4b3b80cf25099a08d3b20ed7c", - "sha256:b26d6f416891cef93411d6d478a25db275766081a5fb66368248293ef459f3be", - "sha256:b4ba4c30af7044ee987e61c88a5ffb76031ca0c53666bc85d823b7de55ddbc75", - "sha256:b71faf3b6e4d7058e1af1b8afedaf39a962db4a219affc8177009d8244ec10d4", - "sha256:cfa854bea525f8c913cb77e2bda724d94b965a0eb3bcfc4a645a9baa29bb86e2", - "sha256:dd9687359e466086b9f6fe6d8069034017f8b6ca3080944fae5709767ca6814e", - "sha256:de0c675fc2998a7eaa929c356ba49c84f53a892e9ab25e8ee7d8ebbbdcb2ac16", - "sha256:e2b4e33fea2ce9d3a14ea39191b169e41eb2ac995274f54ac8fd27519974bce8", - "sha256:f3d4a1a273dc141e03b72a553c11bc14dd7a27ec7654a071edcf83eb04f004bc", - "sha256:ff547cf4c1de7e104cad1a378431ff81efcb03e90e40871ee686107da5b91442" + "sha256:0cf2206c73fbca752c8bd39e12bb9ad7f2d01e6fcb2b25b9eaf94ea042fe86c9", + "sha256:0d670e119d7f7a68a1136de024464999e8e3d5d1491f23cdd39d5d72481af88f", + "sha256:1656722530b3bbce012b093abf6290ab76dcba39d21f9e703310b008ddc7ffe9", + "sha256:1e41b441542881e007420530bbc028f08c0f546ecaaebdf9f065f901acdac106", + "sha256:34d827c771d6b4d7b45f7fc49a638c97fbd8a0fab6c9d3838ff04d307420b739", + "sha256:370c5225f0c395a9f1482ac8d4f974d2073548f186eaf49ceb91414f534ad4d8", + "sha256:42b90b0cb3556f4d1cc1c538345abc249b6ff58939d3af5e37f5fa8421d9ae07", + "sha256:492bd47aabeaa3215cde7a8d3c0d88c909bf7e6b63f0b511a645f1ffc1e948f6", + "sha256:4c5785b018ed6f48e762737deaa6b7528b0ba43ad67fca566bf10d0337a76dcd", + "sha256:519ef25d49fe807c6c0402abb5fe4d14b47a8e2358050d8d7673beecfbe116b2", + "sha256:51a2d5de2c605117cd25dfb3f51d1d14caf1cbed4ef6db582f085eeb0a0c922f", + "sha256:55ef4476b2cdecfa643ae4d7591aa157568f903c378c83ea544650b33b2d856d", + "sha256:5b4acfb15ca028bbc652a6c8d63073dec2a3c8c0db7585d68b96b52940f65899", + "sha256:5c483c96d4cbeb4919ad9fcf2f262e8e08e34dcbcf8d2bda16263ef002c890d4", + "sha256:5c931032aa955431c808e469eb0780ca7d12b39228a02ae7ea09f63d47b1e260", + "sha256:6a3119d0e985e5c7dadfcf29fb79bbab19806b08ad901622b23f5868c0221fce", + "sha256:72bb5417f198eb059f01d5a9e1ef80f2fbaf3eaa4cd63e9a681bbbd0ed9fcdf9", + "sha256:8cd355f8a4c7c126a246f4b4a9803c80498939709bb37d3db4f8dbee1eb7d8f0", + "sha256:9517f26a512a62d49fc4800222b306e21a14ceec8bd82c93182313ef1eefaa7a", + "sha256:9945e80a0a6e370f90a23907cc70a0811e808f79420fb9051e26d9c79eb8e26b", + "sha256:9989737a409235a734ec783b0545f2966247b26ff555e847f3d0f945e5a11493", + "sha256:9c0d71aef4fb5d30dc6ebd08a2bce317a7eaf37d468f85320947eb580daea90a", + "sha256:9d48fd4a1c2d98ec6686511717f0980d36f5590e038d5afe4e5241f328f06e38", + "sha256:af12fbff15a9652ef117456d1d6a4d6fade8fdc02670d6fd31212402e9d03559", + "sha256:b2b72a0742a493979c348dc3c9a329bd5b87e4243ffecf837b1c8739d58410ba", + "sha256:bda784ebb116d56d3e7133c8e0942cf68cb7fd58bdccf57231dbe56b6430eb01", + "sha256:df2784a474028b15a723f6b347625f1f91740de418bed4a0a2694c954de34dd7", + "sha256:e2b47a8e0126ec0a3820a2e299a94a6fc29ba132249957dd32c447d380eaae5f", + "sha256:e4b9b443e88735be4927529d66d9e1164b4fbd6a882e90114967eedc6ad608e7" ], "index": "pypi", - "version": "==3.5.59" + "version": "==3.5.67" }, "requests": { "extras": [ @@ -1288,42 +1196,48 @@ }, "requests-cache": { "hashes": [ - "sha256:813023269686045f8e01e2289cc1e7e9ae5ab22ddd1e2849a9093ab3ab7270eb", - "sha256:81e13559baee64677a7d73b85498a5a8f0639e204517b5d05ff378e44a57831a" + "sha256:1102daa13a804abe23fad62d694e7dee58d6063a35d94bf6e8c9821e22e5a78b", + "sha256:dd9120a4ab7b8128cba9b6b120d8b5560d566a3cd0f828cced3d3fd60a42ec40" ], - "index": "pypi", - "version": "==0.5.2" + "markers": "python_version >= '3.6'", + "version": "==0.6.4" + }, + "requests-file": { + "hashes": [ + "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e", + "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953" + ], + "version": "==1.5.1" }, "rtfde": { "hashes": [ "sha256:18386e4f060cee12a2a8035b0acf0cc99689f5dff1bf347bab7e92351860a21d", "sha256:b86b5d734950fe8745a5b89133f50554252dbd67c6d1b9265e23ee140e7ea8a2" ], - "index": "pypi", "version": "==0.0.2" }, "shodan": { "hashes": [ - "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" + "sha256:7e2bddbc1b60bf620042d0010f4b762a80b43111dbea9c041d72d4325e260c23" ], "index": "pypi", - "version": "==1.24.0" + "version": "==1.25.0" }, "sigmatools": { "hashes": [ - "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", - "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" + "sha256:0c30884589dc4b3fd30ae7f4e335a0d1dc284ddf0998983c4736176bc9087447", + "sha256:841136694829069c92a21b6b9d6d9cef4bd53b4d25e50d35da863a2e5601f71d" ], "index": "pypi", - "version": "==0.18.1" + "version": "==0.19.1" }, "six": { "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "index": "pypi", - "version": "==1.15.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.16.0" }, "socialscan": { "hashes": [ @@ -1337,16 +1251,15 @@ "hashes": [ "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" ], - "index": "pypi", "version": "==0.5.7.4" }, "soupsieve": { "hashes": [ - "sha256:4bb21a6ee4707bf43b61230e80740e71bfe56e55d1f1f50924b087bb2975c851", - "sha256:6dc52924dc0bc710a5d16794e6b3480b2c7c08b07729505feab2b2c16661ff6e" + "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc", + "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b" ], - "index": "pypi", - "version": "==2.1" + "markers": "python_version >= '3.0'", + "version": "==2.2.1" }, "sparqlwrapper": { "hashes": [ @@ -1369,11 +1282,18 @@ }, "tabulate": { "hashes": [ - "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", - "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" + "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", + "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" ], - "index": "pypi", - "version": "==0.8.7" + "version": "==0.8.9" + }, + "tldextract": { + "hashes": [ + "sha256:cfae9bc8bda37c3e8c7c8639711ad20e95dc85b207a256b60b0b23d7ff5540ea", + "sha256:e57f22b6d00a28c21673d2048112f1bdcb6a14d4711568305f6bb96cf5bb53a1" + ], + "markers": "python_version >= '3.5'", + "version": "==3.1.0" }, "tornado": { "hashes": [ @@ -1419,46 +1339,43 @@ "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" ], - "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==6.1" }, "tqdm": { "hashes": [ - "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a", - "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65" + "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493", + "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042" ], - "index": "pypi", - "version": "==4.56.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==4.61.0" }, "trustar": { "hashes": [ - "sha256:2618a377e3c000a41a47eb34b31ea694215eed4a1d2e3cfca1801ac6baebd958" + "sha256:e2988cb892103b58a8a22aae232518cb3c7d3899fa90408bc7958d3ab959af09" ], "index": "pypi", - "version": "==0.3.34" + "version": "==0.3.35" }, "typing-extensions": { "hashes": [ - "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", - "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", - "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" + "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", + "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", + "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" ], - "index": "pypi", - "version": "==3.7.4.3" + "version": "==3.10.0.0" }, "tzlocal": { "hashes": [ "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4" ], - "index": "pypi", "version": "==2.1" }, "unicodecsv": { "hashes": [ "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" ], - "index": "pypi", "version": "==0.14.1" }, "url-normalize": { @@ -1466,7 +1383,7 @@ "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2", "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.4.3" }, "urlarchiver": { @@ -1478,63 +1395,54 @@ }, "urllib3": { "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" + "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", + "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" ], - "index": "pypi", - "version": "==1.26.2" - }, - "uwhois": { - "editable": true, - "git": "https://github.com/Rafiot/uwhoisd.git", - "ref": "783bba09b5a6964f25566089826a1be4b13f2a22", - "subdirectory": "client" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", + "version": "==1.26.5" }, "validators": { "hashes": [ "sha256:f0ac832212e3ee2e9b10e156f19b106888cf1429c291fbc5297aae87685014ae" ], - "index": "pypi", "version": "==0.14.0" }, "vt-graph-api": { "hashes": [ - "sha256:200c4f5a7c0a518502e890c4f4508a5ea042af9407d2889ef16a17ef11b7d25c", - "sha256:223c1cf32d69e10b5d3e178ec315589c7dfa7d43ccff6630a11ed5c5f498715c" + "sha256:3b13ce6e460aadd9917e883a8fc205f491ba09107963c9ebd3f5df4a8b3e67b7", + "sha256:d766285b06b854da04dd26cdb0ad3613fa17a935c00825b3dc04ea2b307381a6" ], "index": "pypi", - "version": "==1.0.1" + "version": "==1.1.2" }, "vulners": { "hashes": [ - "sha256:065aa63d5626d51cf45260bc6cc3a6ea682977689c036a6daba695905e881ba7", - "sha256:0e1356040f456f87841ccfe9f2f6ed36a256370606d530679d5d9993fe91386c", - "sha256:ab9ed8fbf1d3c80f0d066b13ac9d70d11dc9cb0b77568be65396117a4245e916" + "sha256:146305b799a991961dde97735d00605b9c335c15e0168050a5953ff9d69bdc28", + "sha256:d09b360549550abe669d70f962f60c696eae889c4ad7d5e8b9b47e71f1b81fb3", + "sha256:fa5a85d969734a58d9bedfba459002c272c6414196ab54207a05ef394af064c3" ], "index": "pypi", - "version": "==1.5.9" + "version": "==1.5.11" }, "wand": { "hashes": [ - "sha256:473af4a143d2c87693cc43dbd6f64d91ccfd7f0506cf4da53851cd34f114b39d", - "sha256:ec981b4f07f7582fc564aba8b57763a549392e9ef8b6a338e9da54cdd229cf95" + "sha256:540a2da5fb3ada1f0abf6968e0fa01ca7de6cd517f3be5c52d03a4fc8d54d75e", + "sha256:b752b2c2ee6ce04210da4b2e591013a4d9303fbed3fcbd3fb450930777dcb117" ], "index": "pypi", - "version": "==0.6.5" + "version": "==0.6.6" }, "websocket-client": { "hashes": [ - "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549", - "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010" + "sha256:3e2bf58191d4619b161389a95bdce84ce9e0b24eb8107e7e590db682c2d0ca81", + "sha256:abf306dc6351dcef07f4d40453037e51cc5d9da2ef60d0fc5d0fe3bcda255372" ], - "index": "pypi", - "version": "==0.57.0" + "version": "==1.0.1" }, "wrapt": { "hashes": [ "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" ], - "index": "pypi", "version": "==1.12.1" }, "xlrd": { @@ -1547,11 +1455,10 @@ }, "xlsxwriter": { "hashes": [ - "sha256:9b1ade2d1ba5d9b40a6d1de1d55ded4394ab8002718092ae80a08532c2add2e6", - "sha256:b807c2d3e379bf6a925f472955beef3e07495c1bac708640696876e68675b49b" + "sha256:1a7fac99687020e76aa7dd0d7de4b9b576547ed748e5cd91a99d52a6df54ca16", + "sha256:641db6e7b4f4982fd407a3f372f45b878766098250d26963e95e50121168cbe2" ], - "index": "pypi", - "version": "==1.3.7" + "version": "==1.4.3" }, "yara-python": { "hashes": [ @@ -1610,42 +1517,33 @@ "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" ], - "index": "pypi", - "version": "==1.6.3" - }, - "zipp": { - "hashes": [ - "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", - "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" - ], "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "version": "==1.6.3" } }, "develop": { "attrs": { "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" + "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", + "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" ], - "index": "pypi", - "version": "==20.3.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==21.2.0" }, "certifi": { "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" ], - "index": "pypi", - "version": "==2020.12.5" + "version": "==2021.5.30" }, "chardet": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" ], - "index": "pypi", - "version": "==3.0.4" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==4.0.0" }, "codecov": { "hashes": [ @@ -1716,28 +1614,20 @@ }, "flake8": { "hashes": [ - "sha256:12d05ab02614b6aee8df7c36b97d1a3b2372761222b19b58621355e82acddcff", - "sha256:78873e372b12b093da7b5e5ed302e8ad9e988b38b063b61ad937f26ca58fc5f0" + "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", + "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" ], "index": "pypi", - "version": "==3.9.0" + "version": "==3.9.2" }, "idna": { "hashes": [ "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.10" }, - "importlib-metadata": { - "hashes": [ - "sha256:c9db46394197244adf2f0b08ec5bc3cf16757e9590b02af1fca085c16c0d600a", - "sha256:d2d46ef77ffc85cbf7dac7e81dd663fde71c45326131bea8033b9bad42268ebe" - ], - "markers": "python_version < '3.8'", - "version": "==3.10.0" - }, "iniconfig": { "hashes": [ "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", @@ -1806,16 +1696,16 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "index": "pypi", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634", - "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc" + "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", + "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" ], "index": "pypi", - "version": "==6.2.3" + "version": "==6.2.4" }, "requests": { "extras": [ @@ -1833,33 +1723,16 @@ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.10.2" }, - "typing-extensions": { - "hashes": [ - "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", - "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", - "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" - ], - "index": "pypi", - "version": "==3.7.4.3" - }, "urllib3": { "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" + "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", + "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" ], - "index": "pypi", - "version": "==1.26.2" - }, - "zipp": { - "hashes": [ - "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", - "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" - ], - "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", + "version": "==1.26.5" } } } From 99b13eed43f6995ca8806da44b5b6950a9f53bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Wed, 9 Jun 2021 14:42:49 -0700 Subject: [PATCH 297/476] chg: Bump deps --- Pipfile | 1 + Pipfile.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Pipfile b/Pipfile index 98a6f18..f445eb0 100644 --- a/Pipfile +++ b/Pipfile @@ -64,6 +64,7 @@ markdownify = "==0.5.3" socialscan = "*" dnsdb2 = "*" clamd = "*" +aiohttp = ">=3.7.4" [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index e649998..94f7879 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "7a06c4c5e7971831c0908f2db178124724b73d092f902d03f004bd928a3f2c94" + "sha256": "f466a54a3a73ee9c0475f4955d374184cac4e3b799fea8ca4ead77f2e526cb9a" }, "pipfile-spec": 6, "requires": { @@ -56,7 +56,7 @@ "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a", "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95" ], - "markers": "python_version >= '3.6'", + "index": "pypi", "version": "==3.7.4.post0" }, "antlr4-python3-runtime": { @@ -354,7 +354,7 @@ "hashes": [ "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.18.2" }, "futures": { @@ -558,7 +558,7 @@ "sha256:234f85ef59945fa1ebb618ca029f31f0cb43a637344dbda5c1bb8578b2d96a68", "sha256:7f04b621365e3753f8cef8ba40536acc23d0d201c0ad2dcb1b3d82c83056b7ff" ], - "markers": "platform_python_implementation != 'PyPy' or (python_version >= '3' and platform_system != 'Windows' and platform_system != 'Darwin')", + "markers": "python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin')", "version": "==4.12.0" }, "multidict": { @@ -982,7 +982,7 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.4.7" }, "pypdns": { @@ -1026,7 +1026,7 @@ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.1" }, "python-docx": { @@ -1236,7 +1236,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "socialscan": { @@ -1258,7 +1258,7 @@ "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc", "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b" ], - "markers": "python_version >= '3.0'", + "markers": "python_version >= '3'", "version": "==2.2.1" }, "sparqlwrapper": { @@ -1696,7 +1696,7 @@ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.4.7" }, "pytest": { @@ -1723,7 +1723,7 @@ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "urllib3": { From cb12d8a055bce4757df71fe081341836ac4329a3 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Thu, 10 Jun 2021 07:04:18 +0200 Subject: [PATCH 298/476] chg: [travis] remove old docker before install --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index dca4f44..47fb784 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,9 +11,6 @@ python: - "3.7-dev" - "3.8-dev" -before_install: - - docker build -t misp-modules --build-arg BUILD_DATE=$(date -u +"%Y-%m-%d") docker/ - install: - sudo apt-get install libzbar0 libzbar-dev libpoppler-cpp-dev tesseract-ocr libfuzzy-dev libcaca-dev liblua5.3-dev - pip install pipenv From f422463f7034cf1170e5d2da8d4e6733384df71b Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 11 Jun 2021 11:19:57 +0200 Subject: [PATCH 299/476] chg: [tests] btc_steroid not working via CI --- tests/test_expansions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_expansions.py b/tests/test_expansions.py index 1bcc93e..838c39b 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -110,6 +110,9 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_object(response), 'asn') def test_btc_steroids(self): + if LiveCI: + return True + query = {"module": "btc_steroids", "btc": "1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA"} response = self.misp_modules_post(query) try: From 7248eb72e5bfe2bd172e0aed09ccfdb7284e0ad2 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 11 Jun 2021 11:22:25 +0200 Subject: [PATCH 300/476] chg: [requirements] remove the pypi index from the requirements This fixes #505 but we need to find a clean solution for Pipfile generating it. --- REQUIREMENTS | 1 - 1 file changed, 1 deletion(-) diff --git a/REQUIREMENTS b/REQUIREMENTS index 0fcfcb2..120d7c1 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -5,7 +5,6 @@ # pipenv lock --requirements # --i https://pypi.org/simple -e . -e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client -e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client From 94795e49936e555040a2f13e61dfa8a43a25f360 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 11 Jun 2021 14:51:30 +0200 Subject: [PATCH 301/476] chg: [virustotal] make flake8 happy --- misp_modules/modules/expansion/virustotal.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index 2922417..2c82787 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -215,9 +215,10 @@ class VirusTotalParser(object): 'http': f'{scheme}://{host}', 'https': f'{scheme}://{host}' } - self.proxies=proxies + self.proxies = proxies return True + def parse_error(status_code): status_mapping = {204: 'VirusTotal request rate limit exceeded.', 400: 'Incorrect request, please check the arguments.', From 3e53398dee88f9663dca43d8ff4caad07201dfdf Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 11 Jun 2021 14:52:28 +0200 Subject: [PATCH 302/476] chg: [travis] flake8 updated --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 47fb784..9332806 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,7 @@ script: - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid - pip install flake8 - - flake8 --ignore=E501,W503,E226 misp_modules + - flake8 --ignore=E501,W503,E226,E126 misp_modules after_success: - coverage combine .coverage* From 605231e089c5d5a3a65972a55785ed94981b57fc Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Fri, 11 Jun 2021 14:54:07 +0200 Subject: [PATCH 303/476] chg :[virustotal_public] make flake8 happy --- misp_modules/modules/expansion/virustotal_public.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index 12aba9f..c10f4d2 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -17,6 +17,7 @@ moduleconfig = ['apikey', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_p LOGGER = logging.getLogger('virus_total_public') LOGGER.setLevel(logging.INFO) + class VirusTotalParser(): def __init__(self): super(VirusTotalParser, self).__init__() @@ -107,9 +108,10 @@ class VirusTotalParser(): 'http': f'{scheme}://{host}', 'https': f'{scheme}://{host}' } - self.proxies=proxies + self.proxies = proxies return True + class DomainQuery(VirusTotalParser): def __init__(self, apikey, attribute): super(DomainQuery, self).__init__() From d1aeafb3aebd6b4d4e3a909b01c05947e3118860 Mon Sep 17 00:00:00 2001 From: Aaron Kaplan Date: Thu, 17 Jun 2021 14:33:15 +0000 Subject: [PATCH 304/476] unit test for dnsdbflex in lib/cof.py --- misp_modules/lib/cof2misp/cof.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py index 7b8d35c..d7420a0 100644 --- a/misp_modules/lib/cof2misp/cof.py +++ b/misp_modules/lib/cof2misp/cof.py @@ -125,6 +125,9 @@ if __name__ == "__main__": assert is_valid_ip("2a0c:88:77:6::1") # COF validation + print(80 * "=", file = sys.stderr) + print("COF unit tests....", file = sys.stderr) + mock_input = """{"count":1909,"rdata":["cpa.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1315586409","time_last":"1449566799"} {"count":2560,"rdata":["cpab.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1449584660","time_last":"1617676151"}""" @@ -139,5 +142,24 @@ if __name__ == "__main__": for entry in ndjson.loads(test2): assert validate_cof(entry) + # dnsdbflex validation + print(80 * "=", file = sys.stderr) + print("dnsdbflex unit tests....", file = sys.stderr) + + mock_input = """{"rrname":"labs.deep-insights.ai.","rrtype":"A"} +{"rrname":"www.deep-insights.ca.","rrtype":"CNAME"} +{"rrname":"mail.deep-insights.ca.","rrtype":"CNAME"} +{"rrname":"cpanel.deep-insights.ca.","rrtype":"A"} +{"rrname":"webdisk.deep-insights.ca.","rrtype":"A"} +{"rrname":"webmail.deep-insights.ca.","rrtype":"A"}""" + + i = 0 + for entry in ndjson.loads(mock_input): + retval = validate_dnsdbflex(entry, strict = False) + assert retval + print("dnsdbflex line %d is valid: %s" % (i, retval)) + i += 1 + + print(80 * "=", file = sys.stderr) print("Unit Tests DONE", file = sys.stderr) From 4078119db099986c5505baa3ad6a7041975b6363 Mon Sep 17 00:00:00 2001 From: Aaron Kaplan Date: Thu, 17 Jun 2021 14:36:27 +0000 Subject: [PATCH 305/476] fix the last issues of #493 (https://github.com/MISP/misp-modules/issues/493) --- misp_modules/modules/import_mod/cof2misp.py | 36 +++++++++++---------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py index 90998ec..841da09 100755 --- a/misp_modules/modules/import_mod/cof2misp.py +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -82,7 +82,7 @@ def parse_and_insert_cof(data: str) -> dict: # o.add_tag('tlp:amber') # FIXME: we'll want to add a tlp: tag to the object if 'bailiwick' in entry: - o.add_attribute('bailiwick', value=entry['bailiwick'].rstrip('.')) + o.add_attribute('bailiwick', value=entry['bailiwick'].rstrip('.'), distribution=0) # # handle the combinations of rrtype (domain, ip) on both left and right side @@ -91,26 +91,26 @@ def parse_and_insert_cof(data: str) -> dict: if create_specific_attributes: if rrtype in ['A', 'AAAA', 'A6']: # address type # address type - o.add_attribute('rrname_domain', value=rrname) + o.add_attribute('rrname_domain', value=rrname, distribution=0) for r in rdata: - o.add_attribute('rdata_ip', value=r) + o.add_attribute('rdata_ip', value=r, distribution=0) elif rrtype in ['CNAME', 'DNAME', 'NS']: # both sides are domains - o.add_attribute('rrname_domain', value=rrname) + o.add_attribute('rrname_domain', value=rrname, distribution=0) for r in rdata: - o.add_attribute('rdata_domain', value=r) + o.add_attribute('rdata_domain', value=r, distribution=0) elif rrtype in ['SOA']: # left side is a domain, right side is text - o.add_attribute('rrname_domain', value=rrname) + o.add_attribute('rrname_domain', value=rrname, distribution=0) # # now do the regular filling up of rrname, rrtype, time_first, etc. # - o.add_attribute('rrname', value=rrname) - o.add_attribute('rrtype', value=rrtype) + o.add_attribute('rrname', value=rrname, distribution=0) + o.add_attribute('rrtype', value=rrtype, distribution=0) for r in rdata: - o.add_attribute('rdata', value=r) - o.add_attribute('raw_rdata', value=json.dumps(rdata)) # FIXME: do we need to hex encode it? - o.add_attribute('time_first', value=entry['time_first']) - o.add_attribute('time_last', value=entry['time_last']) + o.add_attribute('rdata', value=r, distribution=0) + o.add_attribute('raw_rdata', value=json.dumps(rdata), distribution=0) # FIXME: do we need to hex encode it? + o.add_attribute('time_first', value=entry['time_first'], distribution=0) + o.add_attribute('time_last', value=entry['time_last'], distribution=0) o.first_seen = entry['time_first'] # is this redundant? o.last_seen = entry['time_last'] @@ -119,7 +119,7 @@ def parse_and_insert_cof(data: str) -> dict: # for k in ['count', 'sensor_id', 'origin', 'text', 'time_first_ms', 'time_last_ms', 'zone_time_first', 'zone_time_last']: if k in entry and entry[k]: - o.add_attribute(k, value=entry[k]) + o.add_attribute(k, value=entry[k], distribution=0) # # add COF entry to MISP object @@ -152,7 +152,6 @@ def parse_and_insert_dnsdbflex(data: str): try: entries = ndjson.loads(data) for entry in entries: # iterate over all ndjson lines - # validate here (simple validation or full JSON Schema validation) if not validate_dnsdbflex(entry): return {"error": "Could not validate the dnsdbflex input '%s'" % entry} @@ -162,9 +161,12 @@ def parse_and_insert_dnsdbflex(data: str): rrname = entry['rrname'].rstrip('.') # create a new MISP object, based on the passive-dns object for each nd-JSON line - o = MISPObject(name='passive-dns-dnsdbflex', standalone=False, comment='created by cof2misp') - o.add_attribute('rrname', value=rrname) - o.add_attribute('rrtype', value=rrtype) + try: + o = MISPObject(name='passive-dns', standalone=False, distribution=0, comment='DNSDBFLEX import by cof2misp') + o.add_attribute('rrtype', value=rrtype, distribution=0, comment='DNSDBFLEX import by cof2misp') + o.add_attribute('rrname', value=rrname, distribution=0, comment='DNSDBFLEX import by cof2misp') + except Exception as ex: + print("could not create object. Reason: %s" % str(ex)) # # add dnsdbflex entry to MISP object From 83fd44ed1347880efe52e233f52d74201cd5d24f Mon Sep 17 00:00:00 2001 From: Jason Zhang Date: Thu, 29 Jul 2021 12:13:31 +0100 Subject: [PATCH 306/476] add vmware_nsx module --- Pipfile | 2 + README.md | 1 + documentation/logos/vmware_nsx.png | Bin 0 -> 53372 bytes .../website/expansion/lastline_query.json | 2 +- .../website/expansion/lastline_submit.json | 2 +- .../website/expansion/vmware_nsx.json | 14 + .../website/import_mod/lastline_import.json | 2 +- .../modules/expansion/lastline_query.py | 2 + .../modules/expansion/lastline_submit.py | 2 + misp_modules/modules/expansion/vmware_nsx.py | 615 ++++++++++++++++++ .../modules/import_mod/lastline_import.py | 2 + 11 files changed, 641 insertions(+), 3 deletions(-) create mode 100644 documentation/logos/vmware_nsx.png create mode 100644 documentation/website/expansion/vmware_nsx.json create mode 100644 misp_modules/modules/expansion/vmware_nsx.py diff --git a/Pipfile b/Pipfile index f445eb0..4057e4f 100644 --- a/Pipfile +++ b/Pipfile @@ -65,6 +65,8 @@ socialscan = "*" dnsdb2 = "*" clamd = "*" aiohttp = ">=3.7.4" +tau-clients = "*" +vt-py = ">=0.7.1" [requires] python_version = "3" diff --git a/README.md b/README.md index 3d21bef..777fd8d 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [virustotal](misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) * [virustotal_public](misp_modules/modules/expansion/virustotal_public.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a public key and a low request rate limit. (More details about the API: [here](https://developers.virustotal.com/reference)) * [VMray](misp_modules/modules/expansion/vmray_submit.py) - a module to submit a sample to VMray. +* [VMware NSX](misp_modules/modules/expansion/vmware_nsx.py) - a module to enrich a file or URL with VMware NSX Defender. * [VulnDB](misp_modules/modules/expansion/vulndb.py) - a module to query [VulnDB](https://www.riskbasedsecurity.com/). * [Vulners](misp_modules/modules/expansion/vulners.py) - an expansion module to expand information about CVEs using Vulners API. * [whois](misp_modules/modules/expansion/whois.py) - a module to query a local instance of [uwhois](https://github.com/rafiot/uwhoisd). diff --git a/documentation/logos/vmware_nsx.png b/documentation/logos/vmware_nsx.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4ba96e16ffdded17202903cda9962ce13e6d44 GIT binary patch literal 53372 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 c_qI>ZYy_l9G?%w&a pymisp.MISPEvent: + """ + Parse the analysis result into a MISP event. + + :param str analysis_link: the analysis link + :param dict[str, any] result: the JSON returned by the analysis client. + :rtype: pymisp.MISPEvent + :return: a MISP event + """ + misp_event = pymisp.MISPEvent() + + # Add analysis subject info + if "url" in result["analysis_subject"]: + o = pymisp.MISPObject("url") + o.add_attribute("url", result["analysis_subject"]["url"]) + else: + o = pymisp.MISPObject("file") + o.add_attribute("md5", type="md5", value=result["analysis_subject"]["md5"]) + o.add_attribute("sha1", type="sha1", value=result["analysis_subject"]["sha1"]) + o.add_attribute("sha256", type="sha256", value=result["analysis_subject"]["sha256"]) + o.add_attribute( + "mimetype", + category="Payload delivery", + type="mime-type", + value=result["analysis_subject"]["mime_type"] + ) + misp_event.add_object(o) + + # Add HTTP requests from url analyses + network_dict = result.get("report", {}).get("analysis", {}).get("network", {}) + for request in network_dict.get("requests", []): + parsed_uri = parse.urlparse(request["url"]) + o = pymisp.MISPObject(name="http-request") + o.add_attribute("host", parsed_uri.netloc) + o.add_attribute("method", "GET") + o.add_attribute("uri", request["url"]) + o.add_attribute("ip-dst", request["ip"]) + misp_event.add_object(o) + + # Add network behaviors from files + for subject in result.get("report", {}).get("analysis_subjects", []): + + # Add DNS requests + for dns_query in subject.get("dns_queries", []): + hostname = dns_query.get("hostname") + # Skip if it is an IP address + try: + if hostname == "wpad" or hostname == "localhost": + continue + # Invalid hostname, e.g., hostname: '2.2.0.10.in-addr.arpa. + if hostname[-1] == ".": + continue + _ = ipaddress.ip_address(hostname) + continue + except ValueError: + pass + + o = pymisp.MISPObject(name="domain-ip") + o.add_attribute("hostname", type="hostname", value=hostname) + for ip in dns_query.get("results", []): + o.add_attribute("ip", type="ip-dst", value=ip) + + misp_event.add_object(o) + + # Add HTTP conversations (as network connection and as http request) + for http_conversation in subject.get("http_conversations", []): + o = pymisp.MISPObject(name="network-connection") + o.add_attribute("ip-src", http_conversation["src_ip"]) + o.add_attribute("ip-dst", http_conversation["dst_ip"]) + o.add_attribute("src-port", http_conversation["src_port"]) + o.add_attribute("dst-port", http_conversation["dst_port"]) + o.add_attribute("hostname-dst", http_conversation["dst_host"]) + o.add_attribute("layer3-protocol", "IP") + o.add_attribute("layer4-protocol", "TCP") + o.add_attribute("layer7-protocol", "HTTP") + misp_event.add_object(o) + + method, path, http_version = http_conversation["url"].split(" ") + if http_conversation["dst_port"] == 80: + uri = "http://{}{}".format(http_conversation["dst_host"], path) + else: + uri = "http://{}:{}{}".format( + http_conversation["dst_host"], + http_conversation["dst_port"], + path + ) + o = pymisp.MISPObject(name="http-request") + o.add_attribute("host", http_conversation["dst_host"]) + o.add_attribute("method", method) + o.add_attribute("uri", uri) + o.add_attribute("ip-dst", http_conversation["dst_ip"]) + misp_event.add_object(o) + + # Add sandbox info like score and sandbox type + o = pymisp.MISPObject(name="sandbox-report") + sandbox_type = "saas" if tau_clients.is_task_hosted(analysis_link) else "on-premise" + o.add_attribute("score", result["score"]) + o.add_attribute("sandbox-type", sandbox_type) + o.add_attribute("{}-sandbox".format(sandbox_type), "vmware-nsx-defender") + o.add_attribute("permalink", analysis_link) + misp_event.add_object(o) + + # Add behaviors + o = pymisp.MISPObject(name="sb-signature") + o.add_attribute("software", "VMware NSX Defender") + for activity in result.get("malicious_activity", []): + a = pymisp.MISPAttribute() + a.from_dict(type="text", value=activity) + o.add_attribute("signature", **a) + misp_event.add_object(o) + + # Add mitre techniques + for techniques in result.get("activity_to_mitre_techniques", {}).values(): + for technique in techniques: + for misp_technique_id, misp_technique_name in self.techniques_galaxy.items(): + if technique["id"].casefold() in misp_technique_id.casefold(): + # If report details a sub-technique, trust the match + # Otherwise trust it only if the MISP technique is not a sub-technique + if "." in technique["id"] or "." not in misp_technique_id: + misp_event.add_tag(misp_technique_name) + break + return misp_event + + +def _parse_submission_response(response: Dict[str, Any]) -> Tuple[str, List[str]]: + """ + Parse the response from "submit_*" methods. + + :param dict[str, any] response: the client response + :rtype: tuple(str, list[str]) + :return: the task_uuid and whether the analysis is available + :raises ValueError: in case of any error + """ + task_uuid = response.get("task_uuid") + if not task_uuid: + raise ValueError("Submission failed, unable to process the data") + if response.get("score") is not None: + tags = [WORKFLOW_COMPLETE_TAG] + else: + tags = [WORKFLOW_INCOMPLETE_TAG] + return task_uuid, tags + + +def _unzip(zipped_data: bytes, password: bytes = DEFAULT_ZIP_PASSWORD) -> bytes: + """ + Unzip the data. + + :param bytes zipped_data: the zipped data + :param bytes password: the password + :rtype: bytes + :return: the unzipped data + :raises ValueError: in case of any error + """ + try: + data_file_object = io.BytesIO(zipped_data) + with zipfile.ZipFile(data_file_object) as zip_file: + sample_hash_name = zip_file.namelist()[0] + return zip_file.read(sample_hash_name, password) + except (IOError, ValueError) as e: + raise ValueError(str(e)) + + +def _download_from_vt(client: vt.Client, file_hash: str) -> bytes: + """ + Download file from VT. + + :param vt.Client client: the VT client + :param str file_hash: the file hash + :rtype: bytes + :return: the downloaded data + :raises ValueError: in case of any error + """ + try: + buffer = io.BytesIO() + client.download_file(file_hash, buffer) + buffer.seek(0, 0) + return buffer.read() + except (IOError, vt.APIError) as e: + raise ValueError(str(e)) + finally: + # vt.Client likes to free resources at shutdown, and it can be used as context to ease that + # Since the structure of the module does not play well with how MISP modules are organized + # let's play nice and close connections pro-actively (opened by "download_file") + if client: + client.close() + + +def _get_analysis_tags( + clients: Dict[str, nsx_defender.AnalysisClient], + task_uuid: str, +) -> List[str]: + """ + Get the analysis tags of a task. + + :param dict[str, nsx_defender.AnalysisClient] clients: the analysis clients + :param str task_uuid: the task uuid + :rtype: list[str] + :return: the analysis tags + :raises exceptions.ApiError: in case of client errors + :raises exceptions.CommunicationError: in case of client communication errors + """ + client = clients[DEFAULT_ENDPOINT] + response = client.get_analysis_tags(task_uuid) + tags = set([]) + for tag in response.get("analysis_tags", []): + tag_header = None + tag_type = tag["data"]["type"] + if tag_type == "av_family": + tag_header = "av-fam" + elif tag_type == "av_class": + tag_header = "av-cls" + elif tag_type == "lastline_malware": + tag_header = "nsx" + if tag_header: + tags.add("{}:{}".format(tag_header, tag["data"]["value"])) + return sorted(tags) + + +def _get_latest_analysis( + clients: Dict[str, nsx_defender.AnalysisClient], + file_hash: str, +) -> Optional[str]: + """ + Get the latest analysis. + + :param dict[str, nsx_defender.AnalysisClient] clients: the analysis clients + :param str file_hash: the hash of the file + :rtype: str|None + :return: the task uuid if present, None otherwise + :raises exceptions.ApiError: in case of client errors + :raises exceptions.CommunicationError: in case of client communication errors + """ + def _parse_expiration(task_info: Dict[str, str]) -> datetime.datetime: + """ + Parse expiration time of a task + + :param dict[str, str] task_info: the task + :rtype: datetime.datetime + :return: the parsed datetime object + """ + return datetime.datetime.strptime(task_info["expires"], "%Y-%m-%d %H:%M:%S") + results = [] + for data_center, client in clients.items(): + response = client.query_file_hash(file_hash=file_hash) + for task in response.get("tasks", []): + results.append(task) + if results: + return sorted(results, key=_parse_expiration)[-1]["task_uuid"] + else: + return None + + +def _get_mitre_techniques_galaxy(misp_client: pymisp.PyMISP) -> Dict[str, str]: + """ + Get all the MITRE techniques from the MISP galaxy. + + :param pymisp.PyMISP misp_client: the MISP client + :rtype: dict[str, str] + :return: all techniques indexed by their id + """ + galaxy_attack_patterns = misp_client.get_galaxy( + galaxy=GALAXY_ATTACK_PATTERNS_UUID, + withCluster=True, + pythonify=True, + ) + ret = {} + for cluster in galaxy_attack_patterns.clusters: + ret[cluster.value] = cluster.tag_name + return ret + + +def introspection() -> Dict[str, Union[str, List[str]]]: + """ + Implement interface. + + :return: the supported MISP attributes + :rtype: dict[str, list[str]] + """ + return mispattributes + + +def version() -> Dict[str, Union[str, List[str]]]: + """ + Implement interface. + + :return: the module config inside another dictionary + :rtype: dict[str, list[str]] + """ + moduleinfo["config"] = moduleconfig + return moduleinfo + + +def handler(q: Union[bool, str] = False) -> Union[bool, Dict[str, Any]]: + """ + Implement interface. + + :param bool|str q: the input received + :rtype: bool|dict[str, any] + """ + if q is False: + return False + + request = json.loads(q) + config = request.get("config", {}) + + # Load the client to connect to VMware NSX ATA (hard-fail) + try: + analysis_url = config.get("analysis_url") + login_params = { + "key": config["analysis_key"], + "api_token": config["analysis_api_token"], + } + # If 'analysis_url' is specified we are connecting on-premise + if analysis_url: + analysis_clients = { + DEFAULT_ENDPOINT: nsx_defender.AnalysisClient( + api_url=analysis_url, + login_params=login_params, + verify_ssl=bool(config.get("analysis_verify_ssl", True)), + ) + } + logger.info("Connected NSX AnalysisClient to on-premise infrastructure") + else: + analysis_clients = { + data_center: nsx_defender.AnalysisClient( + api_url=tau_clients.NSX_DEFENDER_ANALYSIS_URLS[data_center], + login_params=login_params, + verify_ssl=bool(config.get("analysis_verify_ssl", True)), + ) for data_center in [ + tau_clients.NSX_DEFENDER_DC_WESTUS, + tau_clients.NSX_DEFENDER_DC_NLEMEA, + ] + } + logger.info("Connected NSX AnalysisClient to hosted infrastructure") + except KeyError as ke: + logger.error("Integration with VMware NSX ATA failed to connect: %s", str(ke)) + return {"error": "Error connecting to VMware NSX ATA: {}".format(ke)} + + # Load the client to connect to MISP (soft-fail) + try: + misp_client = pymisp.PyMISP( + url=config["misp_url"], + key=config["misp_key"], + ssl=bool(config.get("misp_verify_ssl", True)), + ) + except (KeyError, pymisp.PyMISPError): + logger.error("Integration with pyMISP disabled: no MITRE techniques tags") + misp_client = None + + # Load the client to connect to VT (soft-fail) + try: + vt_client = vt.Client(apikey=config["vt_key"]) + except (KeyError, ValueError): + logger.error("Integration with VT disabled: no automatic download of samples") + vt_client = None + + # Decode and issue the request + try: + if request["attribute"]["type"] == "url": + sample_url = request["attribute"]["value"] + response = analysis_clients[DEFAULT_ENDPOINT].submit_url(sample_url) + task_uuid, tags = _parse_submission_response(response) + else: + if request["attribute"]["type"] == "malware-sample": + # Raise TypeError + file_data = _unzip(base64.b64decode(request["attribute"]["data"])) + file_name = request["attribute"]["value"].split("|", 1)[0] + hash_value = hashlib.sha1(file_data).hexdigest() + elif request["attribute"]["type"] == "attachment": + # Raise TypeError + file_data = base64.b64decode(request["attribute"]["data"]) + file_name = request["attribute"].get("value") + hash_value = hashlib.sha1(file_data).hexdigest() + else: + hash_value = request["attribute"]["value"] + file_data = None + file_name = "{}.bin".format(hash_value) + # Check whether we have a task for that file + tags = [] + task_uuid = _get_latest_analysis(analysis_clients, hash_value) + if not task_uuid: + # If we have no analysis, download the sample from VT + if not file_data: + if not vt_client: + raise ValueError("No file available locally and VT is disabled") + file_data = _download_from_vt(vt_client, hash_value) + tags.append(VT_DOWNLOAD_TAG) + # ... and submit it (_download_from_vt fails if no sample availabe) + response = analysis_clients[DEFAULT_ENDPOINT].submit_file(file_data, file_name) + task_uuid, _tags = _parse_submission_response(response) + tags.extend(_tags) + except KeyError as e: + logger.error("Error parsing input: %s", request["attribute"]) + return {"error": "Error parsing input: {}".format(e)} + except TypeError as e: + logger.error("Error decoding input: %s", request["attribute"]) + return {"error": "Error decoding input: {}".format(e)} + except ValueError as e: + logger.error("Error processing input: %s", request["attribute"]) + return {"error": "Error processing input: {}".format(e)} + except (exceptions.CommunicationError, exceptions.ApiError) as e: + logger.error("Error issuing API call: %s", str(e)) + return {"error": "Error issuing API call: {}".format(e)} + else: + analysis_link = tau_clients.get_task_link( + uuid=task_uuid, + analysis_url=analysis_clients[DEFAULT_ENDPOINT].base, + prefer_load_balancer=True, + ) + + # Return partial results if the analysis has yet to terminate + try: + tags.extend(_get_analysis_tags(analysis_clients, task_uuid)) + report = analysis_clients[DEFAULT_ENDPOINT].get_result(task_uuid) + except (exceptions.CommunicationError, exceptions.ApiError) as e: + logger.error("Error retrieving the report: %s", str(e)) + return { + "results": { + "types": "link", + "categories": ["External analysis"], + "values": analysis_link, + "tags": tags, + } + } + + # Return the enrichment + try: + techniques_galaxy = None + if misp_client: + techniques_galaxy = _get_mitre_techniques_galaxy(misp_client) + result_parser = ResultParser(techniques_galaxy=techniques_galaxy) + misp_event = result_parser.parse(analysis_link, report) + for tag in tags: + if tag not in frozenset([WORKFLOW_COMPLETE_TAG]): + misp_event.add_tag(tag) + return { + "results": { + key: json.loads(misp_event.to_json())[key] + for key in ("Attribute", "Object", "Tag") + if (key in misp_event and misp_event[key]) + } + } + except pymisp.PyMISPError as e: + logger.error("Error parsing the report: %s", str(e)) + return {"error": "Error parsing the report: {}".format(e)} + + +def main(): + """Main function used to test basic functionalities of the module.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config-file", + dest="config_file", + required=True, + help="the configuration file used for testing", + ) + parser.add_argument( + "-t", + "--test-attachment", + dest="test_attachment", + default=None, + help="the path to a test attachment", + ) + args = parser.parse_args() + conf = configparser.ConfigParser() + conf.read(args.config_file) + config = { + "analysis_verify_ssl": conf.getboolean("analysis", "analysis_verify_ssl"), + "analysis_key": conf.get("analysis", "analysis_key"), + "analysis_api_token": conf.get("analysis", "analysis_api_token"), + "vt_key": conf.get("vt", "vt_key"), + "misp_url": conf.get("misp", "misp_url"), + "misp_verify_ssl": conf.getboolean("misp", "misp_verify_ssl"), + "misp_key": conf.get("misp", "misp_key"), + } + + # TEST 1: submit a URL + j = json.dumps( + { + "config": config, + "attribute": { + "type": "url", + "value": "https://www.google.com", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 2: submit a file attachment + if args.test_attachment: + with open(args.test_attachment, "rb") as f: + data = f.read() + j = json.dumps( + { + "config": config, + "attribute": { + "type": "attachment", + "value": "test.docx", + "data": base64.b64encode(data).decode("utf-8"), + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 3: submit a file hash that is known by NSX ATA + j = json.dumps( + { + "config": config, + "attribute": { + "type": "md5", + "value": "002c56165a0e78369d0e1023ce044bf0", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 4 : submit a file hash that is NOT known byt NSX ATA + j = json.dumps( + { + "config": config, + "attribute": { + "type": "sha1", + "value": "2aac25ecdccf87abf6f1651ef2ffb30fcf732250", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/misp_modules/modules/import_mod/lastline_import.py b/misp_modules/modules/import_mod/lastline_import.py index 37f6249..3307852 100644 --- a/misp_modules/modules/import_mod/lastline_import.py +++ b/misp_modules/modules/import_mod/lastline_import.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 """ +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module (type "import") to import a Lastline report from an analysis link. """ import json From b3daa138f107cc68625628ecbf0442df8cde0870 Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Mon, 9 Aug 2021 15:37:37 -0400 Subject: [PATCH 307/476] add cve support and enhance ip lookups --- misp_modules/modules/expansion/greynoise.py | 272 +++++++++++++++----- 1 file changed, 207 insertions(+), 65 deletions(-) diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index 19b4653..a2ccf13 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -1,10 +1,12 @@ -import requests import json +import requests +from pymisp import MISPEvent, MISPObject + misperrors = {"error": "Error"} -mispattributes = {"input": ["ip-dst", "ip-src"], "output": ["text"]} +mispattributes = {"input": ["ip-dst", "ip-src", "vulnerability"], "output": ["text"]} moduleinfo = { - "version": "1.0", + "version": "1.1", "author": "Brad Chiappetta ", "description": "Module to access GreyNoise.io API.", "module-type": ["hover"], @@ -15,16 +17,71 @@ codes_mapping = { "0x01": "The IP has been observed by the GreyNoise sensor network", "0x02": "The IP has been observed scanning the GreyNoise sensor network, " "but has not completed a full connection, meaning this can be spoofed", - "0x03": "The IP is adjacent to another host that has been directly observed by " - "the GreyNoise sensor network", + "0x03": "The IP is adjacent to another host that has been directly observed by the GreyNoise sensor network", "0x04": "Reserved", "0x05": "This IP is commonly spoofed in Internet-scan activity", - "0x06": "This IP has been observed as noise, but this host belongs to a cloud " - "provider where IPs can be cycled frequently", + "0x06": "This IP has been observed as noise, but this host belongs to a cloud provider where IPs can be " + "cycled frequently", "0x07": "This IP is invalid", - "0x08": "This IP was classified as noise, but has not been observed engaging in " - "Internet-wide scans or attacks in over 60 days", + "0x08": "This IP was classified as noise, but has not been observed engaging in Internet-wide scans or " + "attacks in over 90 days", + "0x09": "IP was found in RIOT", + "0x10": "IP has been observed by the GreyNoise sensor network and is in RIOT", } +vulnerability_mapping = { + "id": ("vulnerability", "CVE #"), + "details": ("text", "Details"), + "count": ("text", "Total Scanner Count"), +} +enterprise_context_basic_mapping = {"ip": ("text", "IP Address"), "code_message": ("text", "Code Message")} +enterprise_context_advanced_mapping = { + "noise": ("text", "Is Internet Background Noise"), + "link": ("link", "Visualizer Link"), + "classification": ("text", "Classification"), + "actor": ("text", "Actor"), + "tags": ("text", "Tags"), + "cve": ("text", "CVEs"), + "first_seen": ("text", "First Seen Scanning"), + "last_seen": ("text", "Last Seen Scanning"), + "vpn": ("text", "Known VPN Service"), + "vpn_service": ("text", "VPN Service Name"), + "bot": ("text", "Known BOT"), +} +enterprise_context_advanced_metadata_mapping = { + "asn": ("text", "ASN"), + "rdns": ("text", "rDNS"), + "category": ("text", "Category"), + "tor": ("text", "Known Tor Exit Node"), + "region": ("text", "Region"), + "city": ("text", "City"), + "country": ("text", "Country"), + "country_code": ("text", "Country Code"), + "organization": ("text", "Organization"), +} +enterprise_riot_mapping = { + "riot": ("text", "Is Common Business Service"), + "link": ("link", "Visualizer Link"), + "category": ("text", "RIOT Category"), + "name": ("text", "Provider Name"), + "trust_level": ("text", "RIOT Trust Level"), + "last_updated": ("text", "Last Updated"), +} +community_found_mapping = { + "ip": ("text", "IP Address"), + "noise": ("text", "Is Internet Background Noise"), + "riot": ("text", "Is Common Business Service"), + "classification": ("text", "Classification"), + "last_seen": ("text", "Last Seen"), + "name": ("text", "Name"), + "link": ("link", "Visualizer Link"), +} +community_not_found_mapping = { + "ip": ("text", "IP Address"), + "noise": ("text", "Is Internet Background Noise"), + "riot": ("text", "Is Common Business Service"), + "message": ("text", "Message"), +} +misp_event = MISPEvent() def handler(q=False): # noqa: C901 @@ -33,66 +90,153 @@ def handler(q=False): # noqa: C901 request = json.loads(q) if not request.get("config") or not request["config"].get("api_key"): return {"error": "Missing Greynoise API key."} - if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": - greynoise_api_url = "https://api.greynoise.io/v2/noise/quick/" - else: - greynoise_api_url = "https://api.greynoise.io/v3/community/" headers = { "Accept": "application/json", "key": request["config"]["api_key"], "User-Agent": "greynoise-misp-module-{}".format(moduleinfo["version"]), } - for input_type in mispattributes["input"]: - if input_type in request: - ip = request[input_type] - break - else: - misperrors["error"] = "Unsupported attributes type." + + if not (request.get("vulnerability") or request.get("ip-dst") or request.get("ip-src")): + misperrors["error"] = "Vulnerability id missing" return misperrors - response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) # Real request - if response.status_code == 200: - if request["config"]["api_type"] == "enterprise": - return { - "results": [ - { - "types": ["text"], - "values": codes_mapping[response.json()["code"]], - } - ] - } - elif response.json()["noise"]: - return { - "results": [ - { - "types": ["text"], - "values": "IP Address ({}) has been observed by GreyNoise " - "scanning the internet in the last 90 days. GreyNoise has " - "classified it as {} and it was last seen on {}. For more " - "information visit {}".format( - response.json()["ip"], - response.json()["classification"], - response.json()["last_seen"], - response.json()["link"], - ), - } - ] - } - elif response.json()["riot"]: - return { - "results": [ - { - "types": ["text"], - "values": "IP Address ({}) is part of GreyNoise Project RIOT " - "and likely belongs to a benign service from {}. For more " - "information visit {}".format( - response.json()["ip"], - response.json()["name"], - response.json()["link"], - ), - } - ] - } + + ip = "" + vulnerability = "" + + if request.get("ip-dst"): + ip = request.get("ip-dst") + elif request.get("ip-src"): + ip = request.get("ip-src") + else: + vulnerability = request.get("vulnerability") + + if ip: + if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": + greynoise_api_url = "https://api.greynoise.io/v2/noise/quick/" + else: + greynoise_api_url = "https://api.greynoise.io/v3/community/" + + response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) # Real request for IP Query + if response.status_code == 200: + if request["config"]["api_type"] == "enterprise": + response = response.json() + enterprise_context_object = MISPObject("greynoise-ip-context") + for feature in ("ip", "code_message"): + if feature == "code_message": + value = codes_mapping[response.get("code")] + else: + value = response.get(feature) + if value: + attribute_type, relation = enterprise_context_basic_mapping[feature] + enterprise_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if response["noise"]: + greynoise_api_url = "https://api.greynoise.io/v2/noise/context/" + context_response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) + context_response = context_response.json() + context_response["link"] = "https://www.greynoise.io/viz/ip/" + ip + if "tags" in context_response: + context_response["tags"] = ",".join(context_response["tags"]) + if "cve" in context_response: + context_response["cve"] = ",".join(context_response["cve"]) + for feature in enterprise_context_advanced_mapping.keys(): + value = context_response.get(feature) + if value: + attribute_type, relation = enterprise_context_advanced_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + for feature in enterprise_context_advanced_metadata_mapping.keys(): + value = context_response["metadata"].get(feature) + if value: + attribute_type, relation = enterprise_context_advanced_metadata_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + + if response["riot"]: + greynoise_api_url = "https://api.greynoise.io/v2/riot/" + riot_response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) + riot_response = riot_response.json() + riot_response["link"] = "https://www.greynoise.io/viz/riot/" + ip + for feature in enterprise_riot_mapping.keys(): + value = riot_response.get(feature) + if value: + attribute_type, relation = enterprise_riot_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + misp_event.add_object(enterprise_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + else: + response = response.json() + community_context_object = MISPObject("greynoise-community-ip-context") + for feature in community_found_mapping.keys(): + value = response.get(feature) + if value: + attribute_type, relation = community_found_mapping[feature] + community_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(community_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + if response.status_code == 404 and request["config"]["api_type"] != "enterprise": + response = response.json() + community_context_object = MISPObject("greynoise-community-ip-context") + for feature in community_not_found_mapping.keys(): + value = response.get(feature) + if value: + attribute_type, relation = community_not_found_mapping[feature] + community_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(community_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + + if vulnerability: + if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": + greynoise_api_url = "https://api.greynoise.io/v2/experimental/gnql/stats" + querystring = {"query": f"last_seen:1w cve:{vulnerability}"} + else: + misperrors["error"] = "Vulnerability Not Supported with Community API Key" + return misperrors + + response = requests.get(f"{greynoise_api_url}", headers=headers, params=querystring) # Real request + + if response.status_code == 200: + response = response.json() + vulnerability_object = MISPObject("greynoise-vuln-info") + response["details"] = ( + "The IP count below reflects the number of IPs seen " + "by GreyNoise in the last 7 days scanning for this CVE." + ) + response["id"] = vulnerability + for feature in ("id", "details", "count"): + value = response.get(feature) + if value: + attribute_type, relation = vulnerability_mapping[feature] + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + classifications = response["stats"].get("classifications") + for item in classifications: + if item["classification"] == "benign": + value = item["count"] + attribute_type, relation = ("text", "Benign Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if item["classification"] == "unknown": + value = item["count"] + attribute_type, relation = ("text", "Unknown Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if item["classification"] == "malicious": + value = item["count"] + attribute_type, relation = ("text", "Malicious Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(vulnerability_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + # There is an error errors = { 400: "Bad request.", @@ -103,9 +247,7 @@ def handler(q=False): # noqa: C901 try: misperrors["error"] = errors[response.status_code] except KeyError: - misperrors[ - "error" - ] = f"GreyNoise API not accessible (HTTP {response.status_code})" + misperrors["error"] = f"GreyNoise API not accessible (HTTP {response.status_code})" return misperrors From baa31c464c8eebe4d81a09659c34670995b4b259 Mon Sep 17 00:00:00 2001 From: Brad Chiappetta Date: Mon, 9 Aug 2021 15:52:49 -0400 Subject: [PATCH 308/476] documenation updates --- documentation/README.md | 16 +++++++++++----- documentation/logos/greynoise.png | Bin 114641 -> 92083 bytes 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index b25258a..6eefef5 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -608,16 +608,22 @@ Module to query a local copy of Maxmind's Geolite database. Module to access GreyNoise.io API - **features**: ->The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. +> - Query an IP from GreyNoise to see if it is internet background noise or a common business service +> - Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days +> - Supports Enterprise (Paid) and Community API for IP lookup +> - CVE Lookup is only supported with an Enterprise API Key - **input**: ->An IP address. +>An IP address or CVE ID. - **output**: ->Additional information about the IP fetched from Greynoise API. +> - For IPs: IP Lookup Details +> - FOR CVEs: Scanner Count for last 7 days - **references**: > - https://greynoise.io/ -> - https://github.com/GreyNoise-Intelligence/api.greynoise.io +> - https://docs.greyniose.io/ +> - https://www.greynoise.io/viz/account/ - **requirements**: ->A Greynoise API key. +> - A Greynoise API key. +> - Selection of API Key type: `enterprise` (for Paid users) or `community` (for Free users) ----- diff --git a/documentation/logos/greynoise.png b/documentation/logos/greynoise.png index b4d4f9167a556040a6191b4dfd6d82e27f6e2713..0c57e64567d59019bb24e5d6ce882496674bf2a2 100644 GIT binary patch literal 92083 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 )nTE=3zb*}Z|b1~rxS8uFuf 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