mirror of https://github.com/MISP/misp-modules
				
				
				
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
# -*- 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'}
 | 
						|
 | 
						|
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_executable', 'import_mitre_attack']
 | 
						|
 | 
						|
 | 
						|
def handler(q=False):
 | 
						|
    if q is False:
 | 
						|
        return False
 | 
						|
    request = json.loads(q)
 | 
						|
    apiurl = request['config'].get('apiurl') or 'https://jbxcloud.joesecurity.org/api'
 | 
						|
    apikey = request['config'].get('apikey')
 | 
						|
    parser_config = {
 | 
						|
        "import_executable": request["config"].get('import_executable', "false") == "true",
 | 
						|
        "mitre_attack": request["config"].get('import_mitre_attack', "false") == "true",
 | 
						|
    }
 | 
						|
 | 
						|
    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."}
 | 
						|
 | 
						|
    submission_id = url.split('/')[-1]  # The URL has the format https://example.net/submissions/12345
 | 
						|
    joe = jbxapi.JoeSandbox(apiurl=apiurl, apikey=apikey, user_agent='MISP joesandbox_query')
 | 
						|
 | 
						|
    try:
 | 
						|
        joe_info = joe.submission_info(submission_id)
 | 
						|
    except jbxapi.ApiError as e:
 | 
						|
        return {'error': str(e)}
 | 
						|
 | 
						|
    if joe_info["status"] != "finished":
 | 
						|
        return {'error': "The analysis has not finished yet."}
 | 
						|
 | 
						|
    if joe_info['most_relevant_analysis'] is None:
 | 
						|
        return {'error': "No analysis belongs to this submission."}
 | 
						|
 | 
						|
    analysis_webid = joe_info['most_relevant_analysis']['webid']
 | 
						|
 | 
						|
    joe_parser = JoeParser(parser_config)
 | 
						|
    joe_data = json.loads(joe.analysis_download(analysis_webid, 'jsonfixed')[1])
 | 
						|
    joe_parser.parse_data(joe_data['analysis'])
 | 
						|
    joe_parser.finalize_results()
 | 
						|
 | 
						|
    return {'results': joe_parser.results}
 | 
						|
 | 
						|
 | 
						|
def introspection():
 | 
						|
    modulesetup = {}
 | 
						|
    try:
 | 
						|
        userConfig
 | 
						|
        modulesetup['userConfig'] = userConfig
 | 
						|
    except NameError:
 | 
						|
        pass
 | 
						|
    try:
 | 
						|
        inputSource
 | 
						|
        modulesetup['input'] = inputSource
 | 
						|
    except NameError:
 | 
						|
        pass
 | 
						|
    modulesetup['format'] = 'misp_standard'
 | 
						|
    return modulesetup
 | 
						|
 | 
						|
 | 
						|
def version():
 | 
						|
    moduleinfo['config'] = moduleconfig
 | 
						|
    return moduleinfo
 |