2020-03-18 18:05:57 +01:00
|
|
|
import json
|
|
|
|
import requests
|
2020-07-28 11:47:53 +02:00
|
|
|
from . import check_input_attribute, checking_error, standard_error_message
|
2020-03-18 18:05:57 +01:00
|
|
|
from pymisp import MISPEvent, MISPObject
|
|
|
|
|
|
|
|
mispattributes = {'input': ['md5', 'sha1', 'sha256'],
|
|
|
|
'format': 'misp_standard'}
|
|
|
|
moduleinfo = {'version': '0.1', 'author': 'Christian Studer',
|
|
|
|
'description': 'Query Malware Bazaar to get additional information about the input hash.',
|
|
|
|
'module-type': ['expansion', 'hover']}
|
|
|
|
moduleconfig = []
|
|
|
|
|
|
|
|
|
|
|
|
def parse_response(response):
|
|
|
|
mapping = {'file_name': {'type': 'filename', 'object_relation': 'filename'},
|
|
|
|
'file_size': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'},
|
|
|
|
'file_type_mime': {'type': 'mime-type', 'object_relation': 'mimetype'},
|
|
|
|
'md5_hash': {'type': 'md5', 'object_relation': 'md5'},
|
|
|
|
'sha1_hash': {'type': 'sha1', 'object_relation': 'sha1'},
|
|
|
|
'sha256_hash': {'type': 'sha256', 'object_relation': 'sha256'},
|
|
|
|
'ssdeep': {'type': 'ssdeep', 'object_relation': 'ssdeep'}}
|
|
|
|
misp_event = MISPEvent()
|
|
|
|
for data in response:
|
|
|
|
misp_object = MISPObject('file')
|
|
|
|
for feature, attribute in mapping.items():
|
|
|
|
if feature in data:
|
|
|
|
misp_attribute = {'value': data[feature]}
|
|
|
|
misp_attribute.update(attribute)
|
|
|
|
misp_object.add_attribute(**misp_attribute)
|
|
|
|
misp_event.add_object(**misp_object)
|
|
|
|
return {'results': {'Object': [json.loads(misp_object.to_json()) for misp_object in misp_event.objects]}}
|
|
|
|
|
|
|
|
|
|
|
|
def handler(q=False):
|
|
|
|
if q is False:
|
|
|
|
return False
|
|
|
|
request = json.loads(q)
|
2020-07-28 11:47:53 +02:00
|
|
|
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.'}
|
2020-03-18 18:05:57 +01:00
|
|
|
attribute = request['attribute']
|
2020-07-28 11:47:53 +02:00
|
|
|
if attribute['type'] not in mispattributes['input']:
|
|
|
|
return {'error': 'Unsupported attribute type.'}
|
2020-03-18 18:05:57 +01:00
|
|
|
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']
|
|
|
|
if query_status == 'ok':
|
|
|
|
return parse_response(response['data'])
|
|
|
|
return {'error': 'Hash not found on MALWAREbazzar' if query_status == 'hash_not_found' else f'Problem encountered during the query: {query_status}'}
|
|
|
|
|
|
|
|
|
|
|
|
def introspection():
|
|
|
|
return mispattributes
|
|
|
|
|
|
|
|
|
|
|
|
def version():
|
|
|
|
moduleinfo['config'] = moduleconfig
|
|
|
|
return moduleinfo
|