More UI functionality
This commit is contained in:
		
							
								
								
									
										3
									
								
								auth.py
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								auth.py
									
									
									
									
									
								
							@@ -9,11 +9,12 @@ 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()
 | 
			
		||||
    #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')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								block.py
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								block.py
									
									
									
									
									
								
							@@ -20,32 +20,53 @@ def get_blocklist(config):
 | 
			
		||||
    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()
 | 
			
		||||
    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)
 | 
			
		||||
        #fprint(line)
 | 
			
		||||
        #fprint(line)
 | 
			
		||||
        if line[0].find("0x") >= 0:
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        srcip = line[2].split(":")[0]
 | 
			
		||||
        destip = line[4].split(":")[0]
 | 
			
		||||
        destip = line[3].split(":")[0]
 | 
			
		||||
        pid = line[5]
 | 
			
		||||
        for line in res:
 | 
			
		||||
            fprint(line)
 | 
			
		||||
        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:
 | 
			
		||||
                fprint("FLAG " + srcip + " " + destip + " " + pid)
 | 
			
		||||
                kill(pid)
 | 
			
		||||
 | 
			
		||||
            if srcip == badsrcip or destip == baddestip and not pid in badapps:
 | 
			
		||||
                fprint("FLAG " + srcip + " " + destip + " " + str(pid))
 | 
			
		||||
                badapps.append(pid)
 | 
			
		||||
                #fprint(badapps)
 | 
			
		||||
                #fprint("FLAG " + srcip + " " + destip + " " + str(pid))
 | 
			
		||||
                #kill(pid)
 | 
			
		||||
    return badapps
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								ippigeon.py
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								ippigeon.py
									
									
									
									
									
								
							@@ -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:
 | 
			
		||||
@@ -75,10 +80,18 @@ def login_done(res):
 | 
			
		||||
        settings["continueui"] = True
 | 
			
		||||
 | 
			
		||||
def blockdata_done(res):
 | 
			
		||||
    global settings
 | 
			
		||||
    fprint("FINISHED downloading block data")
 | 
			
		||||
    #block_res = pool.apply_async(block.block_conn, (config, datafile, res))
 | 
			
		||||
    block.block_conn(config, datafile, res)
 | 
			
		||||
    #block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings))
 | 
			
		||||
    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():
 | 
			
		||||
    kids = active_children()
 | 
			
		||||
@@ -104,7 +117,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))
 | 
			
		||||
@@ -138,12 +151,10 @@ def mainloop(pool):
 | 
			
		||||
        #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:
 | 
			
		||||
        for x in settings["badapps"]:
 | 
			
		||||
            kill(x)
 | 
			
		||||
        settings["badapps"] = list()
 | 
			
		||||
 | 
			
		||||
    sleep(interval / (interval * config["core"]["clockspeed"]))
 | 
			
		||||
    counter += 1
 | 
			
		||||
@@ -175,9 +186,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)
 | 
			
		||||
@@ -190,8 +201,9 @@ if __name__ == '__main__':
 | 
			
		||||
            settings["showui"] = False
 | 
			
		||||
            settings["continueui"] = False
 | 
			
		||||
            settings["killbox"] = list()
 | 
			
		||||
            settings["badapps"] = badapps
 | 
			
		||||
            settings["block"] = True
 | 
			
		||||
            settings["badapps"] = list()
 | 
			
		||||
            settings["block"] = False
 | 
			
		||||
            settings["kill"] = False
 | 
			
		||||
            killme = manager.Value('d', 0)
 | 
			
		||||
            #killme = False
 | 
			
		||||
            # launch background UI app as process
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										594715
									
								
								output.log
									
									
									
									
									
								
							
							
						
						
									
										594715
									
								
								output.log
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										110
									
								
								panel.py
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								panel.py
									
									
									
									
									
								
							@@ -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,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("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 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]))
 | 
			
		||||
 | 
			
		||||
    def on_edit(self, event):
 | 
			
		||||
        fprint('in on_edit')
 | 
			
		||||
                #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 +228,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 +249,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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user