Compare commits

..

3 Commits

Author SHA1 Message Date
d62fa3b79f Add manual blacklist functionality 2022-11-22 20:45:29 -06:00
86eeb716ac fix macos invalid data temporarily 2022-11-22 19:32:01 -06:00
f6cc6b6fef testing- add blacklist button 2022-11-22 19:14:21 -06:00
6 changed files with 73 additions and 25 deletions

View File

@ -8,7 +8,7 @@ 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"
#return True
#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)

View File

@ -57,7 +57,9 @@ def block_conn(config, datafile, res):
continue continue
srcip = line[2].split(":")[0] srcip = line[2].split(":")[0]
srcport = line[2].split(":")[1]
destip = line[3].split(":")[0] destip = line[3].split(":")[0]
destport = line[3].split(":")[1]
pid = line[5] pid = line[5]
try: try:
pid = int(pid) pid = int(pid)
@ -67,10 +69,12 @@ def block_conn(config, datafile, res):
for line in baddata: for line in baddata:
#fprint(destip + " " + line[4]) #fprint(destip + " " + line[4])
badsrcip = line[2] badsrcip = line[2]
badsrcport = line[3]
baddestip = line[4] baddestip = line[4]
baddestport = line[5]
badpid = line[11] badpid = line[11]
if srcip == badsrcip or destip == baddestip and not pid in badapps: if ((srcip == badsrcip and srcport == badsrcport) or (destip == baddestip and destport == baddestport)) and not pid in badapps:
found = True found = True
fprint("FLAG " + srcip + " " + destip + " " + str(pid)) fprint("FLAG " + srcip + " " + destip + " " + str(pid))
badapps.append(pid) badapps.append(pid)

View File

@ -1,8 +1,8 @@
core: core:
autostart: true autostart: true
clockspeed: 20 clockspeed: 20
interval: 5 interval: 10
level: 3 level: 2
localadmin: true localadmin: true
sftp: sftp:
filepath: filepath:
@ -16,4 +16,4 @@ sftp:
port: 22 port: 22
user: ec2-user user: ec2-user
ui: ui:
darkmode: true darkmode: false

View File

@ -18,8 +18,7 @@ import auth
import panel import panel
import block import block
badapps = [756, 278670] history = list()
badips = ["208.59.79.12",]
displaydata = None displaydata = None
settings = None settings = None
netdata_res = None netdata_res = None
@ -66,7 +65,7 @@ def netstat_done(res):
def process_done(res): def process_done(res):
if settings["running"] == True: if settings["running"] == True:
fprint("uploading to sftp...") fprint("uploading to sftp...")
#ssh.sftp_send_data(res, config, datafile) #ssh.sftp_send_data(config, datafile, 'send')
procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done) procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done)
@ -229,12 +228,15 @@ def mainloop(pool):
badip = line[4] badip = line[4]
badport = line[5] badport = line[5]
fprint("Firewalling " + badip + ":" + str(badport)) fprint("Firewalling " + badip + ":" + str(badport))
if (badip, badport) not in history:
if win32: if win32:
cmd = 'New-NetFirewallRule -DisplayName "IPPigeon Security Rule ' + badip + ':' + str(badport) + '" -Group "IPPigeon" -Direction Outbound -LocalPort Any -Protocol ' + badproto + ' -Action Block -RemoteAddress ' + badip + ' -RemotePort ' + str(badport) cmd = 'New-NetFirewallRule -DisplayName "IPPigeon Security Rule ' + badip + ':' + str(badport) + '" -Group "IPPigeon" -Direction Outbound -LocalPort Any -Protocol ' + badproto + ' -Action Block -RemoteAddress ' + badip + ' -RemotePort ' + str(badport)
run_cmd(cmd) run_cmd(cmd)
if linux: if linux:
cmd = "nft add rule ip ippigeon output ip daddr " + badip + " " + badproto.lower() + " dport " + str(badport) + " drop" cmd = "nft add rule ip ippigeon output ip daddr " + badip + " " + badproto.lower() + " dport " + str(badport) + " drop"
run_cmd(cmd) run_cmd(cmd)
else:
history.append((badip, badport))
if settings["applyconfig"] == True: if settings["applyconfig"] == True:

View File

@ -149,6 +149,7 @@ class ServerPanel(wx.Panel):
self.sub_sizer_left = wx.BoxSizer(wx.VERTICAL) self.sub_sizer_left = wx.BoxSizer(wx.VERTICAL)
self.sub_sizer_right = wx.BoxSizer(wx.VERTICAL) self.sub_sizer_right = wx.BoxSizer(wx.VERTICAL)
self.sub_sizer_stats = wx.BoxSizer(wx.VERTICAL) self.sub_sizer_stats = wx.BoxSizer(wx.VERTICAL)
self.sub_sizer_filter = wx.BoxSizer(wx.VERTICAL)
self.row_obj_dict = {} self.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl( self.list_ctrl = wx.ListCtrl(
self, size=(-1, 400), self, size=(-1, 400),
@ -184,6 +185,7 @@ class ServerPanel(wx.Panel):
self.main_sizer.Add(self.secondary_sizer, 0, wx.ALL | wx.EXPAND, 20) self.main_sizer.Add(self.secondary_sizer, 0, wx.ALL | wx.EXPAND, 20)
self.secondary_sizer.Add(self.sub_sizer_left, 0, wx.ALL | wx.CENTER, 20) self.secondary_sizer.Add(self.sub_sizer_left, 0, wx.ALL | wx.CENTER, 20)
self.secondary_sizer.Add(self.sub_sizer_right, 0, wx.ALL | wx.CENTER, 20) self.secondary_sizer.Add(self.sub_sizer_right, 0, wx.ALL | wx.CENTER, 20)
self.secondary_sizer.Add(self.sub_sizer_filter, 0, wx.ALL | wx.CENTER, 20)
self.secondary_sizer.Add(self.sub_sizer_stats, 0, wx.ALL | wx.CENTER, 20) self.secondary_sizer.Add(self.sub_sizer_stats, 0, wx.ALL | wx.CENTER, 20)
self.start_button = wx.Button(self, label='Start IPPigeon') self.start_button = wx.Button(self, label='Start IPPigeon')
self.start_button.SetBackgroundColour((205, 215, 206)) self.start_button.SetBackgroundColour((205, 215, 206))
@ -203,6 +205,10 @@ class ServerPanel(wx.Panel):
#self.login_button.SetBackgroundColour((205, 215, 206)) #self.login_button.SetBackgroundColour((205, 215, 206))
self.quit_button.Bind(wx.EVT_BUTTON, self.on_quit) self.quit_button.Bind(wx.EVT_BUTTON, self.on_quit)
self.blacklist_button = wx.Button(self, label='Add to blacklist')
#self.login_button.SetBackgroundColour((205, 215, 206))
self.blacklist_button.Bind(wx.EVT_BUTTON, self.on_blacklist)
self.sub_sizer_right.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_right.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_right.Add(self.logintext, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_right.Add(self.logintext, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_left.Add(self.start_button, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_left.Add(self.start_button, 0, wx.CENTER | wx.ALL | 100, 5)
@ -211,6 +217,7 @@ class ServerPanel(wx.Panel):
self.sub_sizer_right.Add(self.login_button, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_right.Add(self.login_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_right.Add(self.quit_button, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_right.Add(self.quit_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_stats.Add(self.stattext, 0, wx.CENTER | wx.ALL | 100, 5) self.sub_sizer_stats.Add(self.stattext, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_filter.Add(self.blacklist_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.SetSizer(self.main_sizer) self.SetSizer(self.main_sizer)
self.start_button.Enable(enable=settings["loggedin"]) self.start_button.Enable(enable=settings["loggedin"])
self.stop_button.Enable(enable=settings["loggedin"]) self.stop_button.Enable(enable=settings["loggedin"])
@ -229,13 +236,16 @@ class ServerPanel(wx.Panel):
self.stop_button.Enable(enable=settings["loggedin"]) self.stop_button.Enable(enable=settings["loggedin"])
self.secondary_frame_button.Enable(enable=settings["loggedin"]) self.secondary_frame_button.Enable(enable=settings["loggedin"])
self.quit_button.Enable(enable=settings["loggedin"]) self.quit_button.Enable(enable=settings["loggedin"])
if self.list_ctrl.GetFirstSelected() < 0:
self.blacklist_button.Enable(enable=False)
else:
self.blacklist_button.Enable(enable=settings["loggedin"])
def updatedata(self): def updatedata(self):
global settings global settings
if settings["running"] == True: if settings["running"] == True:
txt = "Status: Running (" + str(settings["config"]["core"]["level"]) + ")" txt = "Status: Running (" + str(settings["config"]["core"]["level"]) + ")"
else: else:
txt = "Status: Not running" txt = "Status: Not running"
#self.list_ctrl.SetSize(self.GetSize()[0] - 50, self.GetSize()[1] - 200) #self.list_ctrl.SetSize(self.GetSize()[0] - 50, self.GetSize()[1] - 200)
self.checklogin() self.checklogin()
if settings["loggedin"] == True: if settings["loggedin"] == True:
@ -257,6 +267,10 @@ class ServerPanel(wx.Panel):
return return
fprint("updatedata called") fprint("updatedata called")
loaddata() loaddata()
list_total = self.list_ctrl.GetItemCount()
list_top = self.list_ctrl.GetTopItem()
list_pp = self.list_ctrl.GetCountPerPage()
list_bottom = min(list_top + list_pp, list_total - 1)
if self.list_ctrl.DeleteAllItems(): if self.list_ctrl.DeleteAllItems():
fprint("Items deleted") fprint("Items deleted")
else: else:
@ -265,10 +279,11 @@ class ServerPanel(wx.Panel):
if str(TEST_FILE.iloc[i, 4]).find("TIME_WAIT") >= 0 or str(TEST_FILE.iloc[i, 4]).find("FIN_WAIT_2") >= 0: if str(TEST_FILE.iloc[i, 4]).find("TIME_WAIT") >= 0 or str(TEST_FILE.iloc[i, 4]).find("FIN_WAIT_2") >= 0:
continue continue
idx = 0 idx = 0
for ip in settings["badips"]: for app in settings["badapps"]:
#fprint(pid) #fprint(pid)
idx = i 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 if TEST_FILE.iloc[i, 5] == app: # "bad" pid, highlight in red at the top
fprint("BAD APP UI: " + str(app))
idx = self.list_ctrl.InsertItem(0, TEST_FILE.iloc[i, 0]) idx = self.list_ctrl.InsertItem(0, TEST_FILE.iloc[i, 0])
self.list_ctrl.SetItemBackgroundColour(idx, wx.Colour(200, 51, 51)) self.list_ctrl.SetItemBackgroundColour(idx, wx.Colour(200, 51, 51))
break break
@ -282,9 +297,11 @@ class ServerPanel(wx.Panel):
#fprint(str(idx) + " " + str(TEST_FILE.iloc[i, 0])) #fprint(str(idx) + " " + str(TEST_FILE.iloc[i, 0]))
self.list_ctrl.SetItem(idx, j, str(TEST_FILE.iloc[i, j])) self.list_ctrl.SetItem(idx, j, str(TEST_FILE.iloc[i, j]))
#fprint(i, j, TEST_FILE.iloc[i, j]) #fprint(i, j, TEST_FILE.iloc[i, j])
#self.SetSizer(self.main_sizer) #self.SetSizer(self.main_sizer)
self.list_ctrl.EnsureVisible((list_bottom - 1))
wx.CallLater(100, self.updatedata) wx.CallLater(100, self.updatedata)
def on_start(self, event): def on_start(self, event):
@ -312,7 +329,21 @@ class ServerPanel(wx.Panel):
def on_quit(self, event): def on_quit(self, event):
global killme global killme
killme.value += 1 killme.value += 1
self.close_popup() self.Close()
self.Parent.Close()
def on_blacklist(self, event):
global settings
tmp = settings["appendbad"]
idx = self.list_ctrl.GetFirstSelected()
if idx < 0:
return
proto = self.list_ctrl.GetItem(idx, 1).GetText()
dest = self.list_ctrl.GetItem(idx, 3).GetText()
destip, destport = dest.split(":")
fprint([proto, destip, destport])
tmp.append(["N/A", proto, "N/A", "N/A", destip, destport, "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"])
settings["appendbad"] = tmp
def ShowImage(self, imageFile): def ShowImage(self, imageFile):
if imageFile == "": if imageFile == "":

11
ssh.py
View File

@ -3,13 +3,20 @@ from fabric import Connection
from util import find_data_file from util import find_data_file
from util import setup_child from util import setup_child
from util import fprint from util import fprint
from util import macos
from invoke import exceptions from invoke import exceptions
import sys import sys
c = None
def sftp_send_data(config, filename, filetype): def sftp_send_data(config, filename, filetype):
setup_child() setup_child()
if not macos:
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'])
global c
if c is None:
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),})
fprint("Sending data over SFTP: " + filename) fprint("Sending data over SFTP: " + filename)
fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype])) fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype]))
fprint("Data sent over SFTP successfully") fprint("Data sent over SFTP successfully")
@ -19,6 +26,8 @@ def sftp_send_data(config, filename, filetype):
def check_for_file(config, filename, location): def check_for_file(config, filename, location):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'])
global c
if c is None:
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),})
fprint("Checking for existence of file " + config['sftp']['filepath'][location] + "/" + filename) fprint("Checking for existence of file " + config['sftp']['filepath'][location] + "/" + filename)
try: try:
@ -31,6 +40,8 @@ def check_for_file(config, filename, location):
def run_ssh(config, command, location): def run_ssh(config, command, location):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'])
global c
if c is None:
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),})
fprint("cd to " + config['sftp']['filepath'][location]) fprint("cd to " + config['sftp']['filepath'][location])
with c.cd(config['sftp']['filepath'][location]): with c.cd(config['sftp']['filepath'][location]):