More UI functionality

formac
Cole Deck 2 years ago
parent ae230af4fc
commit f64ff86d83

@ -9,11 +9,12 @@ def login(config, user, password, sysid):
fprint("Attempting to login as " + user) fprint("Attempting to login as " + user)
filename = sysid + "login.csv" filename = sysid + "login.csv"
hashpasswd = bcrypt.hashpw(password.encode('utf-8'), user).decode() #hashpasswd = bcrypt.hashpw(password.encode('utf-8'), user).decode()
with open(find_data_file(filename), "w", newline="") as f: with open(find_data_file(filename), "w", newline="") as f:
writer = csv.writer(f) writer = csv.writer(f)
writer.writerows([[user,password,sysid],]) writer.writerows([[user,password,sysid],])
fprint("done creating csv") fprint("done creating csv")
#return True
ssh.sftp_send_data(config, filename, 'sendlogin') ssh.sftp_send_data(config, filename, 'sendlogin')
command = "python3 login_service.py " + sysid command = "python3 login_service.py " + sysid
ssh.run_ssh(config, command, 'scripts') ssh.run_ssh(config, command, 'scripts')

@ -20,32 +20,53 @@ def get_blocklist(config):
for row in csvreader: for row in csvreader:
data2.append(row) data2.append(row)
data2 = [i for i in data2 if i] data2 = [i for i in data2 if i]
#fprint(data2)
data2.append(["N/A", "N/A", "N/A", "N/A", "100.115.71.78", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"])
fprint(data2) fprint(data2)
with open(find_data_file("blocklist.csv"), "w", newline="") as f:
writer = csv.writer(f)
writer.writerows(data2)
fprint("done creating csv")
return data2 return data2
def block_conn(config, datafile, res): def block_conn(config, datafile, res):
setup_child() setup_child()
fprint("Searching block data") fprint("Searching block data")
mydata = list() mydata = list()
badapps = list()
with open(find_data_file(datafile), newline='') as csvfile: with open(find_data_file(datafile), newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',', quotechar='|') csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in csvreader: for row in csvreader:
mydata.append(row) mydata.append(row)
baddata = res
fprint("Local loaded successfully")
#fprint(mydata) #fprint(mydata)
for line in mydata: for line in mydata:
fprint(line) #fprint(line)
fprint(line) #fprint(line)
if line[0].find("0x") >= 0:
continue
srcip = line[2].split(":")[0] srcip = line[2].split(":")[0]
destip = line[4].split(":")[0] destip = line[3].split(":")[0]
pid = line[5] pid = line[5]
for line in res: try:
fprint(line) pid = int(pid)
except ValueError:
continue
for line in baddata:
#fprint(destip + " " + line[4])
badsrcip = line[2] badsrcip = line[2]
baddestip = line[4] baddestip = line[4]
badpid = line[11] badpid = line[11]
if srcip == badsrcip or destip == baddestip: if srcip == badsrcip or destip == baddestip and not pid in badapps:
fprint("FLAG " + srcip + " " + destip + " " + pid) fprint("FLAG " + srcip + " " + destip + " " + str(pid))
kill(pid) badapps.append(pid)
#fprint(badapps)
#fprint("FLAG " + srcip + " " + destip + " " + str(pid))
#kill(pid)
return badapps

@ -8,6 +8,7 @@ import uuid
import yaml import yaml
from util import find_data_file from util import find_data_file
from util import fprint from util import fprint
from util import kill
import taskbartool import taskbartool
import util import util
import netstat import netstat
@ -17,6 +18,7 @@ import panel
import block import block
badapps = [756, 278670] badapps = [756, 278670]
badips = ["208.59.79.12",]
displaydata = None displaydata = None
settings = None settings = None
netdata_res = None netdata_res = None
@ -63,8 +65,11 @@ def netstat_done(res):
def process_done(res): def process_done(res):
fprint("uploading to sftp...") fprint("uploading to sftp...")
#ssh.sftp_send_data(res, config, datafile) #ssh.sftp_send_data(res, config, datafile)
procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send')) procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done)
def upload_done(res):
settings["block"] = True
def login_done(res): def login_done(res):
if not res: if not res:
fprint("Login failure") fprint("Login failure")
@ -75,10 +80,18 @@ def login_done(res):
settings["continueui"] = True settings["continueui"] = True
def blockdata_done(res): def blockdata_done(res):
global settings
fprint("FINISHED downloading block data") fprint("FINISHED downloading block data")
#block_res = pool.apply_async(block.block_conn, (config, datafile, res)) #block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings))
block.block_conn(config, datafile, res) block_res = block.block_conn(config, datafile, res)
tmplist = settings["badapps"]
for x in block_res:
fprint(x)
if not x in tmplist:
tmplist.append(x)
settings["badapps"] = tmplist
fprint(settings["badapps"])
def killall(): def killall():
kids = active_children() kids = active_children()
@ -104,7 +117,7 @@ def mainloop(pool):
killall() killall()
#print(res.get(timeout=1)) #print(res.get(timeout=1))
if counter == 0: # runs every INTERVAL if counter == 0: # runs every INTERVAL
fprint("start loop") #fprint("start loop")
if netdata_res is None or netdata_res.ready(): if netdata_res is None or netdata_res.ready():
#rawdata = netdata_res.get() #rawdata = netdata_res.get()
#procdata_res = pool.apply_async(process_netstat, (rawdata)) #procdata_res = pool.apply_async(process_netstat, (rawdata))
@ -138,12 +151,10 @@ def mainloop(pool):
#block.get_blocklist(config) #block.get_blocklist(config)
settings["block"] = False settings["block"] = False
#fprint(settings["killbox"]) if settings["kill"] == True:
if len(settings["killbox"]) > 0: for x in settings["badapps"]:
fprint("Kill opportunity!") kill(x)
for proc in settings["killbox"]: settings["badapps"] = list()
pool.apply_async(kill, (proc,))
settings["killbox"].remove(proc)
sleep(interval / (interval * config["core"]["clockspeed"])) sleep(interval / (interval * config["core"]["clockspeed"]))
counter += 1 counter += 1
@ -175,9 +186,9 @@ if __name__ == '__main__':
sys.stdout = Logger(filename=find_data_file("output.log")) sys.stdout = Logger(filename=find_data_file("output.log"))
sys.stderr = Logger(filename=find_data_file("output.log")) sys.stderr = Logger(filename=find_data_file("output.log"))
with Manager() as manager:
with Pool(processes=5) as pool: with Pool(processes=5) as pool:
with Manager() as manager:
with open(find_data_file('config.yml'), 'r') as file: with open(find_data_file('config.yml'), 'r') as file:
#global config #global config
config = yaml.safe_load(file) config = yaml.safe_load(file)
@ -190,8 +201,9 @@ if __name__ == '__main__':
settings["showui"] = False settings["showui"] = False
settings["continueui"] = False settings["continueui"] = False
settings["killbox"] = list() settings["killbox"] = list()
settings["badapps"] = badapps settings["badapps"] = list()
settings["block"] = True settings["block"] = False
settings["kill"] = False
killme = manager.Value('d', 0) killme = manager.Value('d', 0)
#killme = False #killme = False
# launch background UI app as process # launch background UI app as process

594715
output.log

File diff suppressed because one or more lines are too long

@ -11,7 +11,7 @@ from util import find_data_file
BG_IMG = 'icon.png' BG_IMG = 'icon.png'
filename = sysid + "gendata.csv" filename = sysid + "gendata.csv"
COLUMN_NAMES = np.flip(['Executable', 'Proto', 'Source IP', 'Destination IP', 'Status', 'PID']) COLUMN_NAMES = np.flip(['Executable', 'Proto', 'Source IP', 'Destination IP', 'Status', 'PID'])
COLUMN_SIZES = np.flip([150, 50, 200, 200, 110, 65]) COLUMN_SIZES = np.flip([200, 50, 200, 200, 140, 100])
TEST_FILE = None TEST_FILE = None
displaydata = None displaydata = None
@ -19,12 +19,26 @@ settings = None
killme = False killme = False
def loaddata():
global TEST_FILE
try:
TEST_FILE = pd.read_csv(find_data_file(filename), skiprows=1)
TEST_FILE = TEST_FILE.iloc[1:, :]
TEST_FILE.columns = ['Executable', 'Protocol', 'Source IP', 'Destination IP', 'Status', 'PID']
#fprint(TEST_FILE)
#fprint(len(TEST_FILE))
#fprint(TEST_FILE.iloc[1, 1])
except FileNotFoundError:
pass
class OtherFrame(wx.Frame): class OtherFrame(wx.Frame):
""" """
Class used for creating frames other than the main one Class used for creating frames other than the main one
""" """
def __init__(self): def __init__(self):
wx.Frame.__init__(self, None, -1, 'Server Panel', size=(600, 250)) wx.Frame.__init__(self, None, -1, 'Server Panel', size=(1000, 700))
panel = ServerPanel(self) panel = ServerPanel(self)
self.Show() self.Show()
@ -122,12 +136,11 @@ class ServerPanel(wx.Panel):
def __init__(self, parent): def __init__(self, parent):
super().__init__(parent, size=(500, 500)) super().__init__(parent, size=(500, 500))
#self.SetBackgroundColour((44, 51, 51)) #self.SetBackgroundColour((44, 51, 51))
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer = wx.BoxSizer(wx.VERTICAL)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.row_obj_dict = {} self.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl( self.list_ctrl = wx.ListCtrl(
self, size=(-1, 200), self, size=(-1, 400),
style=wx.LC_REPORT | wx.BORDER_SUNKEN style=wx.LC_REPORT | wx.BORDER_SUNKEN
) )
tb = wx.ToolBar( self, -1) tb = wx.ToolBar( self, -1)
@ -136,52 +149,73 @@ class ServerPanel(wx.Panel):
tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("WXPython_30x30.png")),) tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("WXPython_30x30.png")),)
tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("settings_30x30.png"))) tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("settings_30x30.png")))
tb.Realize() tb.Realize()
main_sizer.Add(tb) self.main_sizer.Add(tb)
#main_sizer.SetBackgroundColour((44, 51, 51)) #main_sizer.SetBackgroundColour((44, 51, 51))
# self.pnl1.SetBackgroundColour(wx.BLACK) # self.pnl1.SetBackgroundColour(wx.BLACK)
self.handle_columns() self.handle_columns()
global settings #self.updatedata()
for i in range(len(TEST_FILE)): wx.CallAfter(self.updatedata)
self.list_ctrl.InsertItem(i, TEST_FILE.iloc[i, 0])
#fprint(TEST_FILE.iloc[i, 5] + " in " + str(settings["badapps"])) wx.GetApp().ProcessPendingEvents()
#if TEST_FILE.iloc[i, 5] in settings["badapps"]: self.main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
for pid in settings["badapps"]:
#fprint(pid)
if str(TEST_FILE.iloc[i, 5]) == str(pid):
#fprint("Got " + TEST_FILE.iloc[i, 5])
settings["killbox"].append(pid)
fprint(settings["killbox"])
self.list_ctrl.SetItemBackgroundColour(i, wx.Colour(200, 51, 51))
for j in range(1, 6):
self.list_ctrl.SetItem(i, j, str(TEST_FILE.iloc[i, j]))
#fprint(i, j, TEST_FILE.iloc[i, j])
main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
start_button = wx.Button(self, label='Start') start_button = wx.Button(self, label='Start')
start_button.SetBackgroundColour((205, 215, 206)) start_button.SetBackgroundColour((205, 215, 206))
start_button.Bind(wx.EVT_BUTTON, self.on_edit) start_button.Bind(wx.EVT_BUTTON, self.on_start)
start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_edit) #start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_start)
stop_button = wx.Button(self, label='Stop') stop_button = wx.Button(self, label='Stop')
stop_button.SetBackgroundColour('#F08080') stop_button.SetBackgroundColour('#F08080')
secondary_frame_button = wx.Button(self, label='Window') secondary_frame_button = wx.Button(self, label='Window')
secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window) secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window)
# wx.BORDER(stop_button, wx.BORDER_NONE) # wx.BORDER(stop_button, wx.BORDER_NONE)
stop_button.Bind(wx.EVT_BUTTON, self.on_edit) stop_button.Bind(wx.EVT_BUTTON, self.on_stop)
main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5) self.main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5)
main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5) self.main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5)
main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5) self.main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.SetSizer(main_sizer) self.SetSizer(self.main_sizer)
def handle_columns(self): def handle_columns(self):
for col in range(len(COLUMN_NAMES)): for col in range(len(COLUMN_NAMES)):
self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col]) self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col])
def updatedata(self):
fprint("updatedata called")
loaddata()
global settings
if self.list_ctrl.DeleteAllItems():
fprint("Items deleted")
else:
fprint("Unable to delete")
for i in range(len(TEST_FILE)):
idx = 0
for pid in settings["badapps"]:
#fprint(pid)
idx = i
if str(TEST_FILE.iloc[i, 5]) == str(pid): # "bad" pid, highlight in red at the top
idx = self.list_ctrl.InsertItem(0, TEST_FILE.iloc[i, 0])
self.list_ctrl.SetItemBackgroundColour(idx, wx.Colour(200, 51, 51))
break
else:
idx = self.list_ctrl.InsertItem(i, TEST_FILE.iloc[i, 0])
#fprint(TEST_FILE.iloc[i, 5] + " in " + str(settings["badapps"]))
#if TEST_FILE.iloc[i, 5] in settings["badapps"]:
#fprint("Got " + TEST_FILE.iloc[i, 5])
for j in range(1, 6):
fprint(str(idx) + " " + str(TEST_FILE.iloc[i, 0]))
self.list_ctrl.SetItem(idx, j, str(TEST_FILE.iloc[idx, j]))
#fprint(i, j, TEST_FILE.iloc[i, j])
#self.SetSizer(self.main_sizer)
wx.CallLater(5000, self.updatedata)
def on_start(self, event):
fprint('in on_start')
settings["kill"] = True
def on_edit(self, event): def on_stop(self, event):
fprint('in on_edit') fprint('in on_stop')
settings["kill"] = False
def on_window(self, event): def on_window(self, event):
OtherFrame() OtherFrame()
@ -192,6 +226,7 @@ class ServerPanel(wx.Panel):
else: else:
bmp = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap() bmp = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0)) self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0))
class ServerFrame(wx.Frame): class ServerFrame(wx.Frame):
@ -214,16 +249,7 @@ def openwindow(data, sets, kill):
settings = sets settings = sets
if settings["loggedin"]: if settings["loggedin"]:
fprint("Creating server panel") fprint("Creating server panel")
global TEST_FILE loaddata()
try:
TEST_FILE = pd.read_csv(find_data_file(filename), skiprows=1)
TEST_FILE = TEST_FILE.iloc[1:, :]
TEST_FILE.columns = ['Executable', 'Protocol', 'Source IP', 'Destination IP', 'Status', 'PID']
fprint(TEST_FILE)
fprint(len(TEST_FILE))
#fprint(TEST_FILE.iloc[1, 1])
except FileNotFoundError:
pass
app = wx.App(False) app = wx.App(False)
frame = OtherFrame() frame = OtherFrame()
app.MainLoop() app.MainLoop()

@ -43,7 +43,7 @@ def time():
def kill(pid): def kill(pid):
setup_child() setup_child()
fprint("Killing PID " + str(pid)) fprint("Killing PID " + str(pid))
os.kill(pid, 9) os.kill(int(pid), 9)
fprint("Signal 9 sent to PID " + str(pid)) fprint("Signal 9 sent to PID " + str(pid))
def fprint(msg): def fprint(msg):

Loading…
Cancel
Save