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 find_data_file
from time import sleep
import bcrypt
def login(config, user, password, sysid):
fprint("Attempting to login as " + user)
filename = sysid + "login.csv"
#hashpasswd = bcrypt.hashpw(password.encode('utf-8'), user).decode()
with open(find_data_file(filename), "w", newline="") as f:
writer = csv.writer(f)
writer.writerows([[user,password,sysid],])
fprint("done creating csv")
#return True
ssh.sftp_send_data(config, filename, 'sendlogin')
command = "python3 login_service.py " + sysid
ssh.run_ssh(config, command, 'scripts')

View File

@ -4,6 +4,7 @@ from util import fprint
from util import run_cmd
from util import win32
from util import linux
from util import kill
import util
import time
import csv
@ -12,5 +13,62 @@ import ssh
def get_blocklist(config):
setup_child()
fprint("Downloading deny list from server")
data = check_for_file(config, "BadIPs.csv", "receive")
fprint(data.stdout)
data = ssh.check_for_file(config, "BadIPs.csv", "receive")
#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
from util import find_data_file
from util import fprint
from util import kill
import taskbartool
import util
import netstat
@ -17,6 +18,7 @@ import panel
import block
badapps = [756, 278670]
badips = ["208.59.79.12",]
displaydata = None
settings = None
netdata_res = None
@ -63,7 +65,10 @@ def netstat_done(res):
def process_done(res):
fprint("uploading to sftp...")
#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):
if not res:
@ -74,6 +79,31 @@ def login_done(res):
settings["loggedin"] = res
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():
kids = active_children()
@ -82,11 +112,7 @@ def killall():
fprint("Every child has been killed")
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):
# worker pool: netstat, netstat cleanup, upload, download, ui tasks
@ -103,7 +129,7 @@ def mainloop(pool):
killall()
#print(res.get(timeout=1))
if counter == 0: # runs every INTERVAL
fprint("start loop")
#fprint("start loop")
if netdata_res is None or netdata_res.ready():
#rawdata = netdata_res.get()
#procdata_res = pool.apply_async(process_netstat, (rawdata))
@ -133,14 +159,16 @@ def mainloop(pool):
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
#fprint(settings["killbox"])
if len(settings["killbox"]) > 0:
fprint("Kill opportunity!")
for proc in settings["killbox"]:
pool.apply_async(kill, (proc,))
settings["killbox"].remove(proc)
if settings["kill"] == True:
tmplist = settings["badapps"]
settings["badapps"] = list()
for x in tmplist:
kill(x)
sleep(interval / (interval * config["core"]["clockspeed"]))
counter += 1
@ -172,9 +200,9 @@ if __name__ == '__main__':
sys.stdout = Logger(filename=find_data_file("output.log"))
sys.stderr = Logger(filename=find_data_file("output.log"))
with Pool(processes=5) as pool:
with Manager() as manager:
with Pool(processes=5) as pool:
with open(find_data_file('config.yml'), 'r') as file:
#global config
config = yaml.safe_load(file)
@ -187,8 +215,10 @@ if __name__ == '__main__':
settings["showui"] = False
settings["continueui"] = False
settings["killbox"] = list()
settings["badapps"] = badapps
settings["block"] = True
settings["badapps"] = list()
settings["badips"] = list()
settings["block"] = False
settings["kill"] = False
killme = manager.Value('d', 0)
#killme = False
# launch background UI app as process

567313
output.log

File diff suppressed because one or more lines are too long

111
panel.py
View File

@ -11,7 +11,7 @@ from util import find_data_file
BG_IMG = 'icon.png'
filename = sysid + "gendata.csv"
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
displaydata = None
@ -19,12 +19,26 @@ settings = None
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 used for creating frames other than the main one
"""
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)
self.Show()
@ -122,12 +136,11 @@ class ServerPanel(wx.Panel):
def __init__(self, parent):
super().__init__(parent, size=(500, 500))
#self.SetBackgroundColour((44, 51, 51))
main_sizer = wx.BoxSizer(wx.VERTICAL)
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl(
self, size=(-1, 200),
self, size=(-1, 400),
style=wx.LC_REPORT | wx.BORDER_SUNKEN
)
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("settings_30x30.png")))
tb.Realize()
main_sizer.Add(tb)
self.main_sizer.Add(tb)
#main_sizer.SetBackgroundColour((44, 51, 51))
# self.pnl1.SetBackgroundColour(wx.BLACK)
self.handle_columns()
global settings
for i in range(len(TEST_FILE)):
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"]:
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]))
#self.updatedata()
wx.CallAfter(self.updatedata)
#fprint(i, j, TEST_FILE.iloc[i, j])
main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
wx.GetApp().ProcessPendingEvents()
self.main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
start_button = wx.Button(self, label='Start')
start_button.SetBackgroundColour((205, 215, 206))
start_button.Bind(wx.EVT_BUTTON, self.on_edit)
start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_edit)
start_button.Bind(wx.EVT_BUTTON, self.on_start)
#start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_start)
stop_button = wx.Button(self, label='Stop')
stop_button.SetBackgroundColour('#F08080')
secondary_frame_button = wx.Button(self, label='Window')
secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window)
# wx.BORDER(stop_button, wx.BORDER_NONE)
stop_button.Bind(wx.EVT_BUTTON, self.on_edit)
main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5)
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.SetSizer(main_sizer)
stop_button.Bind(wx.EVT_BUTTON, self.on_stop)
self.main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.SetSizer(self.main_sizer)
def handle_columns(self):
for col in range(len(COLUMN_NAMES)):
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"]:
def on_edit(self, event):
fprint('in on_edit')
#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_start(self, event):
fprint('in on_start')
settings["kill"] = True
def on_stop(self, event):
fprint('in on_stop')
settings["kill"] = False
def on_window(self, event):
OtherFrame()
@ -194,6 +229,7 @@ class ServerPanel(wx.Panel):
self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0))
class ServerFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None,
@ -214,16 +250,7 @@ def openwindow(data, sets, kill):
settings = sets
if settings["loggedin"]:
fprint("Creating server panel")
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
loaddata()
app = wx.App(False)
frame = OtherFrame()
app.MainLoop()

View File

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

View File

@ -4,6 +4,7 @@ import subprocess
import os
from sys import platform
import time as t
from time import sleep
import uuid
win32 = platform == "win32"
@ -39,6 +40,13 @@ if linux:
def 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):
#if not getattr(sys, "frozen", False):
setup_child()