#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Export IOC's from MISP in CEF format
# Based on cef_export.py MISP module by Hannah Ward

import sys
import datetime
from pymisp import PyMISP, MISPAttribute
from keys import misp_url, misp_key, misp_verifycert

cefconfig  = {"Default_Severity":1, "Device_Vendor":"MISP", "Device_Product":"MISP", "Device_Version":1}

cefmapping = {"ip-src":"src", "ip-dst":"dst", "hostname":"dhost", "domain":"destinationDnsDomain",
              "md5":"fileHash", "sha1":"fileHash", "sha256":"fileHash",
              "filename|md5":"fileHash", "filename|sha1":"fileHash", "filename|sha256":"fileHash",
              "url":"request"}

mispattributes = {'input':list(cefmapping.keys())}


def make_cef(event):
  for attr in event["Attribute"]:
    if attr["to_ids"] and attr["type"] in cefmapping:
      if '|' in attr["type"] and '|' in attr["value"]:
        value = attr["value"].split('|')[1]
      else:
        value = attr["value"]
      response = "{} host CEF:0|{}|{}|{}|{}|{}|{}|msg={} customerURI={} externalId={} {}={}".format(
                      datetime.datetime.fromtimestamp(int(attr["timestamp"])).strftime("%b %d %H:%M:%S"),
                      cefconfig["Device_Vendor"],
                      cefconfig["Device_Product"],
                      cefconfig["Device_Version"],
                      attr["category"],
                      attr["category"],
                      cefconfig["Default_Severity"],
                      event["info"].replace("\\","\\\\").replace("=","\\=").replace('\n','\\n') + "(MISP Event #" + event["id"] + ")",
                      misp_url + 'events/view/' + event["id"],
                      attr["uuid"],
                      cefmapping[attr["type"]],
                      value,
               )
      print(str(bytes(response, 'utf-8'), 'utf-8'))
                        

def init_misp():
  global mymisp
  mymisp = PyMISP(misp_url, misp_key, misp_verifycert)


def echeck(r):
  if r.get('errors'):
    if r.get('message') == 'No matches.':
      return
    else:
      print(r['errors'])
      sys.exit(1)


def find_events():
  r = mymisp.search(controller='events', published=True, to_ids=True)
  echeck(r)
  if not r.get('response'):
    return
  for ev in r['response']:
    make_cef(ev['Event'])


if __name__ == '__main__':
  init_misp()
  find_events()