Compare commits

..

4 Commits

Author SHA1 Message Date
def22643f6 fix UI data for blocked connections 2022-10-24 22:35:35 -05:00
f64ff86d83 More UI functionality 2022-10-24 22:13:29 -05:00
ae230af4fc continue work on blocking 2022-10-18 21:01:34 -05:00
6f2f8fc535 add numpy dep 2022-10-18 19:32:56 -05:00
7 changed files with 194 additions and 567378 deletions

View File

@ -3,14 +3,18 @@ import csv
from util import fprint from util import fprint
from util import find_data_file from util import find_data_file
from time import sleep from time import sleep
import bcrypt
def login(config, user, password, sysid): 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()
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')

View File

@ -4,6 +4,7 @@ from util import fprint
from util import run_cmd from util import run_cmd
from util import win32 from util import win32
from util import linux from util import linux
from util import kill
import util import util
import time import time
import csv import csv
@ -12,5 +13,62 @@ import ssh
def get_blocklist(config): def get_blocklist(config):
setup_child() setup_child()
fprint("Downloading deny list from server") fprint("Downloading deny list from server")
data = check_for_file(config, "BadIPs.csv", "receive") data = ssh.check_for_file(config, "BadIPs.csv", "receive")
fprint(data.stdout) #fprint(data.stdout)
csvreader = csv.reader(data.stdout.split("\n"), delimiter=',', quotechar='|')
data2 = list()
for row in csvreader:
data2.append(row)
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)
with open(find_data_file("blocklist.csv"), "w", newline="") as f:
writer = csv.writer(f)
writer.writerows(data2)
fprint("done creating csv")
return data2
def block_conn(config, datafile, res):
setup_child()
fprint("Searching block data")
mydata = list()
badapps = list()
badips = list()
with open(find_data_file(datafile), newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in csvreader:
mydata.append(row)
baddata = res
fprint("Local loaded successfully")
#fprint(mydata)
for line in mydata:
#fprint(line)
#fprint(line)
if line[0].find("0x") >= 0:
continue
srcip = line[2].split(":")[0]
destip = line[3].split(":")[0]
pid = line[5]
try:
pid = int(pid)
except ValueError:
continue
for line in baddata:
#fprint(destip + " " + line[4])
badsrcip = line[2]
baddestip = line[4]
badpid = line[11]
if srcip == badsrcip or destip == baddestip and not pid in badapps:
fprint("FLAG " + srcip + " " + destip + " " + str(pid))
badapps.append(pid)
badips.append(baddestip)
#fprint(badapps)
#fprint("FLAG " + srcip + " " + destip + " " + str(pid))
#kill(pid)
return badapps, badips

View File

@ -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")
@ -74,7 +79,32 @@ def login_done(res):
settings["loggedin"] = res settings["loggedin"] = res
settings["continueui"] = True settings["continueui"] = True
def blockdata_done(res):
global settings
fprint("FINISHED downloading block data")
tmpkill = settings["kill"]
settings["kill"] = False
#block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings))
block_pids, block_ips = block.block_conn(config, datafile, res)
tmplist = settings["badapps"]
for x in block_pids:
fprint(x)
if not x in tmplist:
tmplist.append(x)
settings["badapps"] = tmplist
fprint(settings["badapps"])
tmplist = settings["badips"]
for x in block_ips:
fprint(x)
if not x in tmplist:
tmplist.append(x)
settings["badips"] = tmplist
fprint(settings["badips"])
settings["kill"] = tmpkill
def killall(): def killall():
kids = active_children() kids = active_children()
for kid in kids: for kid in kids:
@ -82,11 +112,7 @@ def killall():
fprint("Every child has been killed") fprint("Every child has been killed")
os.kill(os.getpid(), 9) # dirty kill of self os.kill(os.getpid(), 9) # dirty kill of self
def kill(pid):
setup_child()
fprint("Killing PID " + str(pid))
#os.kill(pid, 9)
fprint("Signal 9 sent to PID " + str(pid))
def mainloop(pool): def mainloop(pool):
# worker pool: netstat, netstat cleanup, upload, download, ui tasks # worker pool: netstat, netstat cleanup, upload, download, ui tasks
@ -103,7 +129,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))
@ -133,14 +159,16 @@ def mainloop(pool):
if settings["block"] == True: if settings["block"] == True:
blockdata_res = pool.apply_async(block.get_blocklist, (config,)) #, callback=blockdata_done) blockdata_res = pool.apply_async(block.get_blocklist, (config,), callback=blockdata_done)
#block.get_blocklist(config)
settings["block"] = False settings["block"] = False
#fprint(settings["killbox"])
if len(settings["killbox"]) > 0: if settings["kill"] == True:
fprint("Kill opportunity!") tmplist = settings["badapps"]
for proc in settings["killbox"]: settings["badapps"] = list()
pool.apply_async(kill, (proc,))
settings["killbox"].remove(proc) for x in tmplist:
kill(x)
sleep(interval / (interval * config["core"]["clockspeed"])) sleep(interval / (interval * config["core"]["clockspeed"]))
counter += 1 counter += 1
@ -172,9 +200,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)
@ -187,8 +215,10 @@ 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["badips"] = list()
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

567313
output.log

File diff suppressed because one or more lines are too long

113
panel.py
View File

@ -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,74 @@ 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 ip in settings["badips"]:
#fprint(pid)
idx = i
if str(TEST_FILE.iloc[i, 3]).find(ip) >= 0 and str(TEST_FILE.iloc[i, 4]).find("TIME_WAIT") < 0: # "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[i, j]))
#fprint(i, j, TEST_FILE.iloc[i, j])
#self.SetSizer(self.main_sizer)
wx.CallLater(5000, self.updatedata)
def on_edit(self, event): def on_start(self, event):
fprint('in on_edit') fprint('in on_start')
settings["kill"] = True
def on_stop(self, event):
fprint('in on_stop')
settings["kill"] = False
def on_window(self, event): def on_window(self, event):
OtherFrame() OtherFrame()
@ -192,6 +227,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 +250,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()

View File

@ -3,4 +3,6 @@ paramiko
wxpython wxpython
cx_Freeze cx_Freeze
pandas pandas
pyyaml pyyaml
numpy
bcrypt

View File

@ -4,6 +4,7 @@ import subprocess
import os import os
from sys import platform from sys import platform
import time as t import time as t
from time import sleep
import uuid import uuid
win32 = platform == "win32" win32 = platform == "win32"
@ -39,6 +40,13 @@ if linux:
def time(): def time():
return int(t.time()) return int(t.time())
def kill(pid):
setup_child()
if pid > 0:
fprint("Killing PID " + str(pid))
os.kill(int(pid), 9)
fprint("Signal 9 sent to PID " + str(pid))
def fprint(msg): def fprint(msg):
#if not getattr(sys, "frozen", False): #if not getattr(sys, "frozen", False):
setup_child() setup_child()