parent
1349d00466
commit
ea9b08c550
@ -0,0 +1,72 @@
|
||||
import csv
|
||||
import re
|
||||
from netaddr import *
|
||||
import xml.etree.ElementTree as ET
|
||||
import pandas as pd
|
||||
from datetime import datetime , timezone
|
||||
from evtx import PyEvtxParser
|
||||
from dateutil.parser import parse
|
||||
from dateutil.parser import isoparse
|
||||
from pytz import timezone
|
||||
minlength=1000
|
||||
|
||||
Hunting_events=[{'Date and Time':[],'timestamp':[],'Channel':[],'Computer':[],'Event ID':[],'Original Event Log':[]}]
|
||||
|
||||
EventID_rex = re.compile('<EventID.*>(.*)<\/EventID>', re.IGNORECASE)
|
||||
Channel_rex = re.compile('<Channel.*>(.*)<\/Channel>', re.IGNORECASE)
|
||||
Computer_rex = re.compile('<Computer.*>(.*)<\/Computer>', re.IGNORECASE)
|
||||
def Evtx_hunt(files,str_regexes,eid,input_timzone,output,timestart,timeend):
|
||||
|
||||
for file in files:
|
||||
file=str(file)
|
||||
print("Analyzing "+file)
|
||||
try:
|
||||
parser = PyEvtxParser(file)
|
||||
except:
|
||||
print("Issue analyzing "+file +"\nplease check if its not corrupted")
|
||||
continue
|
||||
try:
|
||||
|
||||
for record in parser.records():
|
||||
|
||||
EventID = EventID_rex.findall(record['data'])
|
||||
|
||||
if timestart is not None and timeend is not None:
|
||||
timestamp = datetime.timestamp(isoparse(parse(record["timestamp"]).astimezone(input_timzone).isoformat()))
|
||||
if not (timestamp > timestart and timestamp < timeend):
|
||||
return
|
||||
if len(EventID) > 0:
|
||||
if eid is not None and EventID[0]!=eid:
|
||||
continue
|
||||
|
||||
Computer = Computer_rex.findall(record['data'])
|
||||
Channel = Channel_rex.findall(record['data'])
|
||||
if len(Channel)>0:
|
||||
channel=Channel[0]
|
||||
else:
|
||||
channel=" "
|
||||
#print(record['data'])
|
||||
# if record['data'].lower().find(str_regex.lower())>-1:
|
||||
#print(str_regexes)
|
||||
for str_regex in str_regexes:
|
||||
rex=re.compile(str_regex, re.IGNORECASE)
|
||||
#print(rex)
|
||||
#print(rex.findall(record['data']))
|
||||
if rex.findall(record['data']):
|
||||
#print("EventID : "+EventID[0]+" , Data : "+record['data'])
|
||||
Hunting_events[0]['timestamp'].append(datetime.timestamp(isoparse(parse(record["timestamp"]).astimezone(input_timzone).isoformat())))
|
||||
Hunting_events[0]['Date and Time'].append(parse(record["timestamp"]).astimezone(input_timzone).isoformat())
|
||||
Hunting_events[0]['Channel'].append(channel)
|
||||
Hunting_events[0]['Event ID'].append(EventID[0])
|
||||
Hunting_events[0]['Computer'].append(Computer[0])
|
||||
Hunting_events[0]['Original Event Log'].append(str(record['data']).replace("\r", " ").replace("\n", " "))
|
||||
except Exception as e:
|
||||
print("issue searching log : "+record['data']+"\n Error : "+print(e))
|
||||
hunt_report(output)
|
||||
|
||||
|
||||
def hunt_report(output):
|
||||
global Hunting_events
|
||||
Events = pd.DataFrame(Hunting_events[0])
|
||||
print("Found "+str(len(Hunting_events[0]["timestamp"]))+" Events")
|
||||
Events.to_csv(output+"_hunting.csv", index=False)
|
Loading…
Reference in new issue