Skip to content
This repository has been archived by the owner on Jun 17, 2023. It is now read-only.

Commit

Permalink
add option for zeek in addition to bro (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
sfinlon authored and wesyoung committed Jun 20, 2019
1 parent 919a25a commit 50012b9
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions csirtg_indicator/format/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .zcsv import Csv
from .zjson import Json
from .zbro import Bro
from .zzeek import Zeek
from .zsnort import Snort
from .zbind import Bind
from .zbindrpz import BindRPZ
Expand All @@ -11,6 +12,7 @@
'csv': Csv,
'json': Json,
'bro': Bro,
'zeek': Zeek,
'snort': Snort,
'bind': Bind,
'bindrpz': BindRPZ,
Expand Down
97 changes: 97 additions & 0 deletions csirtg_indicator/format/zzeek.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from .plugin import Plugin
import re
from csirtg_indicator import Indicator
from csirtg_indicator.constants import PYVERSION
try:
from StringIO import StringIO
except ImportError:
from io import StringIO


from pprint import pprint

itype = {
'ipv4': 'ADDR',
'ipv6': 'ADDR',
'url': 'URL',
'fqdn': 'DOMAIN',
'md5': 'FILE_HASH',
'sha1': 'FILE_HASH',
'sha256': 'FILE_HASH',
}

COLUMNS = ['fields', 'indicator', 'indicator_type', 'meta.cif_tags', 'meta.cif_confidence', 'meta.cif_source', 'meta.do_notice']

HEADER = '#' + '\t'.join(COLUMNS)
SEP = '|'


def _i_to_zeek(i, cols):
if isinstance(i, Indicator):
i = i.__dict__()

cols = ['indicator', 'itype', 'tags', 'confidence', 'provider']
r = []

if i['itype'] is 'url':
i['indicator'] = re.sub(r'(https?\:\/\/)', '', i['indicator'])

for c in cols:
y = i.get(c, '-')

if type(y) is list:
y = SEP.join(y)

if isinstance(y, int):
y = str(y)

if PYVERSION == 2:
if isinstance(y, unicode):
y = y.encode('utf-8')
else:
if isinstance(y, bytes):
y = y.encode('utf-8')

if c is 'itype':
y = 'Intel::{0}'.format(itype[i[c]])

r.append(str(y))

r.append('T')
return "\t".join(r)


def get_lines(data, cols=COLUMNS):
output = StringIO()
output.write("{0}\n".format(HEADER))
cols = ['indicator', 'itype', 'tags', 'confidence', 'provider']

for i in data:
i = _i_to_zeek(i, cols)

output.write(i)
output.write("\n")
yield output.getvalue()

if isinstance(output, StringIO):
output.truncate(0)


class Zeek(Plugin):
__name__ = 'zeek'

def __init__(self, *args, **kwargs):
super(Zeek, self).__init__(*args, **kwargs)

self.cols = COLUMNS

def __repr__(self):
text = []
for i in self.data:
i = _i_to_zeek(i, self.cols)
text.append(i)

text = "\n".join(text)

text = "{0}\n{1}".format(HEADER, text)
return text

0 comments on commit 50012b9

Please sign in to comment.