Skip to content

Commit

Permalink
chg: [UI MISP export] export to MISP instance
Browse files Browse the repository at this point in the history
  • Loading branch information
Terrtia committed Feb 18, 2020
1 parent b0dde78 commit b8342cf
Show file tree
Hide file tree
Showing 8 changed files with 266 additions and 75 deletions.
1 change: 1 addition & 0 deletions OVERVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Redis and ARDB overview
DB 7 - Metadata
DB 8 - Statistics
DB 9 - Crawler
DB 10 - Objects

* ARDB on TCP port <year>
- DB 0 - Lines duplicate
Expand Down
21 changes: 21 additions & 0 deletions bin/export/AILObjects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env python3
# -*-coding:UTF-8 -*

import os
import sys
import uuid
import redis

sys.path.append(os.path.join(os.environ['AIL_BIN'], 'lib'))
sys.path.append(os.path.join(os.environ['AIL_BIN'], 'packages'))
import ConfigLoader

config_loader = ConfigLoader.ConfigLoader()
r_serv_objects = config_loader.get_redis_conn("ARDB_Objects")
config_loader = None

def create_map_obj_uuid_golbal_id(obj_uuid, global_id):
r_serv_objects.sadd('all_object:uuid', obj_uuid)
r_serv_objects.sadd('all_object:global_id', global_id)
r_serv_objects.sadd('object:map:uuid_id:{}'.format(obj_uuid), global_id)
r_serv_objects.sadd('object:map:id_uuid:{}'.format(global_id), obj_uuid)
73 changes: 66 additions & 7 deletions bin/export/MispExport.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@

import Correlate_object

# # TODO: # FIXME: REFRACTOR ME => use UI/Global config
sys.path.append('../../configs/keys')
from mispKEYS import misp_url, misp_key, misp_verifycert

# MISP
from pymisp import MISPEvent, MISPObject, PyMISP

Expand All @@ -38,7 +42,6 @@ def sanitize_obj_export_lvl(lvl):
return lvl

def get_export_filename(json_content):
print(json_content)
return 'ail_export.json'

def create_in_memory_file(json_content):
Expand Down Expand Up @@ -211,7 +214,7 @@ def add_obj_to_create_by_lvl(all_obj_to_export, set_relationship, dict_obj, lvl)
add_obj_to_create_by_lvl(all_obj_to_export, set_relationship, dict_obj, lvl)


def create_list_of_objs_to_export(l_obj):
def create_list_of_objs_to_export(l_obj, r_type='json'):
all_obj_to_export = set()
set_relationship = set()
for obj in l_obj:
Expand All @@ -236,10 +239,10 @@ def create_list_of_objs_to_export(l_obj):
# add object to event
event.add_object(dict_misp_obj[obj_global_id])

#misp = PyMISP('https://127.0.0.1:8443/', 'uXgcN42b7xuL88XqK5hubwD8Q8596VrrBvkHQzB0', False)
#misp.add_event(event, pythonify=True)
return event.to_json()

if r_type == 'json':
return event.to_json()
else:
return event

def create_all_misp_obj(all_obj_to_export, set_relationship):
dict_misp_obj = {}
Expand Down Expand Up @@ -322,9 +325,65 @@ def get_relationship_between_global_obj(obj_global_id_1, obj_global_id_2):
return {'relation': 'extracted-from', 'src': src, 'dest': dest} # replave by crawled-from
return None

def sanitize_event_distribution(distribution):
try:
int(distribution)
if (0 <= distribution <= 3):
return distribution
else:
return 0
except:
return 0

def sanitize_event_threat_level_id(threat_level_id):
try:
int(threat_level_id)
if (1 <= threat_level_id <= 4):
return threat_level_id
else:
return 4
except:
return 4

def sanitize_event_analysis(analysis):
try:
int(analysis)
if (0 <= analysis <= 2):
return analysis
else:
return 0
except:
return 0

def create_misp_event(event, distribution=0, threat_level_id=4, publish=False, analysis=0, event_info=None):
if event_info:
event.info = event_info
event.distribution = sanitize_event_distribution(distribution)
event.threat_level_id = sanitize_event_threat_level_id(threat_level_id)
event.analysis = sanitize_event_analysis(analysis)
if publish:
event.publish()

# # TODO: handle multiple MISP instance
misp = PyMISP(misp_url, misp_key, misp_verifycert)
misp_event = misp.add_event(event, pythonify=True)
# # TODO: handle error
event_metadata = extract_event_metadata(misp_event)
return event_metadata

def extract_event_metadata(event):
event_metadata = {}
event_metadata['uuid'] = event.uuid
event_metadata['id'] = event.id
if misp_url[-1] == '/':
event_metadata['url'] = misp_url + 'events/view/' + str(event_metadata['id'])
else:
event_metadata['url'] = misp_url + '/events/view/' + str(event_metadata['id'])
return event_metadata

######
#
# EXPORT LVL DEFINITION:
# EXPORT LVL DEFINITION: (== Correl<tion DEPTH)
#
# LVL 0 => PARTIAL Only add core item Correlation
# LVL 1 => DETAILED Also add correlated_items correlation
Expand Down
8 changes: 2 additions & 6 deletions bin/export/MispImport.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import Screenshot
import Correlate_object

import Import
import AILObjects

# MISP
from pymisp import MISPEvent, MISPObject, PyMISP
Expand Down Expand Up @@ -209,11 +209,7 @@ def create_obj_relationships(map_uuid_global_id, misp_obj):

def create_map_all_obj_uuid_golbal_id(map_uuid_global_id):
for obj_uuid in map_uuid_global_id:
create_map_objuuid_golbal_id(obj_uuid, map_uuid_global_id[obj_uuid])

def create_map_objuuid_golbal_id(obj_uuid, global_id):
print(obj_uuid)
print(global_id)
AILObjects.create_map_obj_uuid_golbal_id(obj_uuid, map_uuid_global_id[obj_uuid])

def import_objs_from_file(filepath):
map_uuid_global_id = {}
Expand Down
5 changes: 5 additions & 0 deletions configs/core.cfg.sample
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,11 @@ host = localhost
port = 6382
db = 9

[ARDB_Objects]
host = localhost
port = 6382
db = 10

[Url]
cc_critical = DE

Expand Down
33 changes: 27 additions & 6 deletions var/www/blueprints/import_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ def export_object():
def export_object_file():
l_obj_to_export = []
l_obj_invalid = []

export_to_misp = False
dict_misp_event_export = {}

for obj_tuple in list(request.form):
l_input = request.form.getlist(obj_tuple)
if len(l_input) == 3:
Expand All @@ -114,6 +118,13 @@ def export_object_file():
else:
if obj_id:
l_obj_invalid.append(obj_dict)
else:
dict_misp_event_export[str(obj_tuple)] = request.form.get(obj_tuple)

if dict_misp_event_export.get('export_to_misp', None):
export_to_misp = True
else:
dict_misp_event_export = None

if l_obj_invalid:
for obj_dict in l_obj_to_export:
Expand All @@ -124,10 +135,20 @@ def export_object_file():
obj_dict['type'] = Correlate_object.get_obj_str_type_subtype(obj_dict['type'], obj_dict.get('subtype', None))

return render_template("export_object.html", l_obj_to_export=l_obj_to_export,
l_obj_invalid=l_obj_invalid)
l_obj_invalid=l_obj_invalid, dict_misp_event_export=dict_misp_event_export)
else:

json_export = MispExport.create_list_of_objs_to_export(l_obj_to_export)
export_filename = MispExport.get_export_filename(json_export)
json_export = MispExport.create_in_memory_file(json_export)
return send_file(json_export, as_attachment=True, attachment_filename=export_filename)
if export_to_misp:
event = MispExport.create_list_of_objs_to_export(l_obj_to_export, r_type='event')
event_metadata = MispExport.create_misp_event(event, distribution=dict_misp_event_export.get('export_to_misp', None),
threat_level_id=dict_misp_event_export.get('misp_threat_level_id', None),
publish=dict_misp_event_export.get('misp_publish', None),
analysis=dict_misp_event_export.get('misp_event_analysis', None),
event_info=dict_misp_event_export.get('misp_event_info', None))
return render_template("export_object.html", l_obj_to_export=l_obj_to_export,
event_metadata=event_metadata,
l_obj_invalid=[], dict_misp_event_export=[])
else:
json_export = MispExport.create_list_of_objs_to_export(l_obj_to_export)
export_filename = MispExport.get_export_filename(json_export)
json_export = MispExport.create_in_memory_file(json_export)
return send_file(json_export, as_attachment=True, attachment_filename=export_filename)
46 changes: 46 additions & 0 deletions var/www/templates/import_export/block_create_misp_event.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<div class="form-group row">
<label class="col-form-labe col-sm-2" for="EventDistribution">Distribution: </label>
<div class="col-sm-10">
<select name="misp_event_distribution" id="EventDistribution">
<option value="0" selected="selected">Your organisation only</option>
<option value="1">This community only</option>
<option value="2">Connected communities</option>
<option value="3">All communities</option>
</select>
</div>
</div>

<div class="form-group row">
<label class="col-form-label col-sm-2" for="EventThreatLevelId">Threat Level: </label>
<div class="col-sm-10">
<select name="misp_threat_level_id" id="EventThreatLevelId">
<option value="1">High</option>
<option value="2" selected="selected">Medium</option>
<option value="3">Low</option>
<option value="4">Undefined</option>
</select>
</div>
</div>

<div class="form-group row">
<label class="col-form-label col-sm-2" for="EventAnalysis">Analysis: </label>
<div class="col-sm-10">
<select name="misp_event_analysis" id="EventAnalysis">
<option value="0">Initial</option>
<option value="1">Ongoing</option>
<option value="2">Completed</option>
</select>
</div>
</div>

<div class="form-group row">
<label class="col-form-label col-sm-2" for="EventInfo">Event Info: </label>
<div class="col-sm-10">
<input name="misp_event_info" class="form-control" placeholder="Quick Event Description or Tracking Info" type="text" id="EventInfo">
</div>
</div>

<div>
<label class="col-form-label" for="EventInfo">Publish Event </label>
<input type="checkbox" value="True" id="misp_publish" name="misp_publish">
</div>
Loading

0 comments on commit b8342cf

Please sign in to comment.