Compare commits

..

27 Commits

Author SHA1 Message Date
02175cc67e Install into subfolder 2022-10-10 23:15:54 -05:00
c9de444432 Add exe installer builder 2022-10-10 23:13:30 -05:00
a83e4016ab Fix program quit, enable debug mode 2022-10-10 22:35:52 -05:00
d069196887 actually figure out tags now 2022-10-10 22:25:10 -05:00
ffefad5db5 Actually build before release 2022-10-10 22:13:31 -05:00
f0121274a6 Add notifications 2022-10-10 22:10:58 -05:00
302dcd5529 figure out how tags work 2022-10-10 22:08:54 -05:00
0a55b3ae8c Fix branch tag for release 2022-10-10 22:05:45 -05:00
494afed4ae Actually push commits 2022-10-10 22:03:07 -05:00
b12902183d Unique release tag 2022-10-10 22:01:36 -05:00
f3822c32f2 Publish release 2022-10-10 21:56:38 -05:00
8c5004c24d reformat curl 2022-10-10 21:51:34 -05:00
fb7544fe98 fix release script 2022-10-10 21:50:47 -05:00
0cf55aef93 split up files, add release script 2022-10-10 21:49:28 -05:00
45e1204397 Switch to paramiko; log output 2022-10-10 19:19:00 -05:00
d38e1384a6 add sftp 2022-09-27 21:04:49 -05:00
faafcf8505 update gitignore 2022-09-27 20:26:10 -05:00
0483147207 latest changes 2022-09-27 20:14:23 -05:00
3afe7faf7c add changes from last week 2022-09-27 18:30:27 -05:00
166aa5d93a simplify OS detection 2022-09-19 23:30:59 -05:00
e043a03890 add additional comments 2022-09-19 23:26:29 -05:00
8b005d0ece make more stuff win32 specific 2022-09-19 23:17:28 -05:00
ca3e489adb Add advanced windows netstat parser 2022-09-19 23:14:02 -05:00
159bbf2130 test data collection 2022-09-19 21:00:48 -05:00
b4aecb1974 test modules 2022-09-13 20:59:07 -05:00
f415fe7a6d add icon 2022-09-06 20:21:07 -05:00
c25f517aab add tray icon test 2022-09-06 20:21:02 -05:00
18 changed files with 12606 additions and 241 deletions

8
.gitignore vendored
View File

@ -1,2 +1,8 @@
build/
__pycache__/ __pycache__/
build/
config.yaml
0xf44ee3942e7dgendata.csv
0xf44ee3942e7agendata.csv
admin-key.ppk
token.txt
*.zip

BIN
IPPigeon.lnk Normal file

Binary file not shown.

Binary file not shown.

17
config.yml Normal file
View File

@ -0,0 +1,17 @@
sftp:
host: ec2-34-232-29-46.compute-1.amazonaws.com
user: ec2-user
port: 22
keyfile: keyfile-admin.pem
filepath:
send: /home/ec2-user/Incoming/Incoming_Data
login: /home/ec2-user/Incoming/Login
recieve: /home/ec2-user/Outgoing
ui:
darkmode: true
core:
autokill: false
localadmin: true
interval: 10

View File

@ -1,187 +1,138 @@
import glob import glob
import wx import wx
import wx.lib.buttons as buttons import wx.adv
import numpy as np import os
import pandas as pd from time import sleep
from multiprocessing import Process, Pipe
BG_IMG = 'icon.png' from sys import platform
COLUMN_NAMES = np.flip(['Server name', 'Port number', 'Status', 'Source IP', 'Destination IP', 'Source port number', 'Destination port number', 'Number of requests made since flag', 'Date', 'Process Name', 'Address hostname', 'Refresh rate'])
TEST_FILE = pd.read_csv('out.csv', )
TEST_FILE = TEST_FILE.iloc[1:, :]
TEST_FILE.columns = ['Server name', 'Port number', 'Status', 'Source IP', 'Destination IP', 'Source port']
print(TEST_FILE)
print(len(TEST_FILE))
print(TEST_FILE.iloc[1, 1])
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))
panel = ServerPanel(self)
self.Show()
def on_edit(self, event):
print('in on_edit')
def update_mp3_listing(self, folder_path): TRAY_TOOLTIP = 'IP Pigeon'
print(folder_path) TRAY_ICON = 'icon.png'
def on_window(self, event):
return
class HelpFrame(wx.Frame):
"""
Class used for creating frames other than the main one
"""
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Help', size=(600, 250))
panel = HelpPanel(self)
self.Show()
# Panel with all the login widgets
class LoginPanel(wx.Panel):
def __init__(self, parent):
super(LoginPanel, self).__init__(parent)
self.SetBackgroundColour((44, 51, 51))
basicLabel = wx.StaticText(self, -1, "Username")
basicLabel.SetForegroundColour((255,255,255))
basicText = wx.TextCtrl(self, -1, "", size=(175, -1))
# basicText.SetInsertionPoint(0)
pwdLabel = wx.StaticText(self, -1, "Password")
pwdText = wx.TextCtrl(self, -1, "", size=(175, -1), style=wx.TE_PASSWORD)
pwdLabel.SetForegroundColour((255, 255, 255))
vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(basicLabel, 0, wx.ALIGN_CENTER | 100, 5)
vbox.Add(basicText, 0, wx.ALIGN_CENTER | 100, 5)
vbox.Add(pwdLabel, 0, wx.ALIGN_CENTER | 100, 5)
vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5)
login_button = wx.Button(self, label='Login')
login_button.Bind(wx.EVT_BUTTON, self.on_login)
help_button = wx.Button(self, label='Help')
help_button.Bind(wx.EVT_BUTTON, self.on_help)
# signup_button = wx.Button(self, label='Sign Up')
hbox.Add(login_button, 0, wx.ALL | 200, 20)
# hbox.Add(signup_button, 0, wx.ALL | 200, 20)
hbox.Add(help_button, 0, wx.ALL | 200, 20)
vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5)
self.SetSizer(vbox)
def on_login(self, event):
OtherFrame()
def on_help(self, event):
HelpFrame()
# Panel with all the login widgets
class HelpPanel(wx.Panel):
def __init__(self, parent):
super(HelpPanel, self).__init__(parent)
self.SetBackgroundColour((44, 51, 51))
# basicLabel = wx.StaticText(self, -1, "Username")
# basicLabel.SetForegroundColour((255,255,255))
# basicText = wx.TextCtrl(self, -1, "", size=(175, -1))
#
# # basicText.SetInsertionPoint(0)
# pwdLabel = wx.StaticText(self, -1, "Password")
# pwdText = wx.TextCtrl(self, -1, "", size=(175, -1), style=wx.TE_PASSWORD)
# pwdLabel.SetForegroundColour((255, 255, 255))
# vbox = wx.BoxSizer(wx.VERTICAL)
# hbox = wx.BoxSizer(wx.HORIZONTAL)
# vbox.Add(basicLabel, 0, wx.ALIGN_CENTER | 100, 5)
# vbox.Add(basicText, 0, wx.ALIGN_CENTER | 100, 5)
# vbox.Add(pwdLabel, 0, wx.ALIGN_CENTER | 100, 5)
# vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5)
# login_button = wx.Button(self, label='Login')
# login_button.Bind(wx.EVT_BUTTON, self.on_login)
# help_button = wx.Button(self, label='Help')
# # signup_button = wx.Button(self, label='Sign Up')
# hbox.Add(login_button, 0, wx.ALL | 200, 20)
# # hbox.Add(signup_button, 0, wx.ALL | 200, 20)
# hbox.Add(help_button, 0, wx.ALL | 200, 20)
# vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5)
# self.SetSizer(vbox)
"""if platform == "linux" or platform == "linux2":
# linux
elif platform == "darwin":
# OS X
elif platform == "win32":
# Windows...
"""
displaydata = None
settings = None
class ServerPanel(wx.Panel): class ServerPanel(wx.Panel):
def __init__(self, parent): def __init__(self, parent):
super().__init__(parent, size=(500, 500)) super().__init__(parent)
self.SetBackgroundColour((44, 51, 51))
# self.toolbar = self.CreateToolBar()
# tb = wx.ToolBar(self, -1)
main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer = wx.BoxSizer(wx.VERTICAL)
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, 75), self, size=(-1, 100),
style=wx.LC_REPORT | wx.BORDER_SUNKEN style=wx.LC_REPORT | wx.BORDER_SUNKEN
) )
self.list_ctrl.InsertColumn(0, 'Server name', width=140)
# self.pnl1.SetBackgroundColour(wx.BLACK) self.list_ctrl.InsertColumn(1, 'Port number', width=140)
self.handle_columns() self.list_ctrl.InsertColumn(2, 'Status', width=200)
for i in range(len(TEST_FILE)): main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 5)
self.list_ctrl.InsertItem(i, TEST_FILE.iloc[i, 0])
for j in range(1, 5):
self.list_ctrl.SetItem(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.Bind(wx.EVT_BUTTON, self.on_edit) start_button.Bind(wx.EVT_BUTTON, self.on_edit)
start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_edit)
stop_button = wx.Button(self, label='Stop') 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) stop_button.Bind(wx.EVT_BUTTON, self.on_edit)
main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5) main_sizer.Add(start_button, 0, wx.ALL | 100, 5)
main_sizer.Add(stop_button, 0, wx.CENTER | 100, 5) main_sizer.Add(stop_button, 0, wx.ALL | 100, 5)
main_sizer.Add(secondary_frame_button, 0, wx.CENTER | 100, 5)
self.SetSizer(main_sizer) self.SetSizer(main_sizer)
def handle_columns(self):
for col in COLUMN_NAMES:
self.list_ctrl.InsertColumn(0, col, width=200)
def on_edit(self, event): def on_edit(self, event):
print('in on_edit') print('in on_edit')
def update_mp3_listing(self, folder_path): def update_mp3_listing(self, folder_path):
print(folder_path) print(folder_path)
def on_window(self, event):
OtherFrame()
def ShowImage(self, imageFile):
if imageFile == "":
self.bitmap = wx.StaticBitmap(self, -1, size=(0, 0))
else:
bmp = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0))
class ServerFrame(wx.Frame): class ServerFrame(wx.Frame):
def __init__(self): def __init__(self):
super().__init__(parent=None, super().__init__(parent=None,
title='Server Dashboard') title='Server Dashboard')
self.panel = ServerPanel(self)
self.panel = LoginPanel(self)
# image = wx.StaticBitmap(self, wx.ID_ANY)
# image.SetBitmap(wx.Bitmap('WXPython.png'))
self.Show() self.Show()
### Taskbar Icon
def create_menu_item(menu, label, func):
item = wx.MenuItem(menu, -1, label)
menu.Bind(wx.EVT_MENU, func, id=item.GetId())
menu.Append(item)
return item
class TaskBarIcon(wx.adv.TaskBarIcon):
def __init__(self, frame):
self.frame = frame
super(TaskBarIcon, self).__init__()
self.set_icon(TRAY_ICON)
self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
def CreatePopupMenu(self):
menu = wx.Menu()
create_menu_item(menu, 'Control Panel', self.on_open)
menu.AppendSeparator()
create_menu_item(menu, 'Exit', self.on_exit)
return menu
def set_icon(self, path):
icon = wx.Icon(path)
self.SetIcon(icon, TRAY_TOOLTIP)
def on_left_down(self, event):
print ('Tray icon was left-clicked.')
def on_open(self, event):
foreground()
#self.close_popup()
def on_exit(self, event):
wx.CallAfter(self.Destroy)
self.close_popup()
def close_popup(self):
self.frame.Close()
class TaskbarApp(wx.App):
def OnInit(self):
frame=wx.Frame(None)
self.SetTopWindow(frame)
TaskBarIcon(frame)
return True
class FullApp(wx.App):
def OnInit(self):
fullframe=ServerFrame()
return True
def background():
app = TaskbarApp(False)
#with Manager() as manager:
app.MainLoop()
#displaydata = manager.list()
#settings = manager.list()
#rawdata = manager.list()
#logdata = manager.list()
#uploaddata = manager.list()
#downloaddata = manager.list()
def open_fg(outputdata, uisettings):
app = FullApp(False)
app.MainLoop()
def foreground():
# Open the foreground in a separate process so that UI acts independently of the taskbar icon
p = Process(target=open_fg, args=(displaydata, settings))
p.start()
#p.join()
print("Launched foreground")
if __name__ == '__main__': if __name__ == '__main__':
app = wx.App(False) background()
frame = ServerFrame()
app.MainLoop()

139
ippigeon.py Normal file
View File

@ -0,0 +1,139 @@
import os
import sys
import subprocess
from multiprocessing import Process, Manager, Pool, TimeoutError, freeze_support, active_children
from sys import platform
from time import sleep
import uuid
import yaml
from util import find_data_file
from util import fprint
import taskbartool
import util
import netstat
import ssh
displaydata = None
settings = None
netdata_res = None
procdata_res = None
killme = None
datafile = ""
#print(datafile)
config = None
interval = 10
win32 = platform == "win32"
linux = platform == "linux" or platform == "linux2"
macos = platform == "darwin"
# Get unique system values
if win32:
sysid = hex(uuid.getnode())
datafile += sysid
datafile += "gendata.csv"
# Python is running as Administrator (so netstat can get filename, to block, etc),
# so we use this to see who is actually logged in
# it's very hacky
startupinfo = subprocess.STARTUPINFO()
#if not getattr(sys, "frozen", False):
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # hide powershell window
res = subprocess.check_output(["WMIC", "ComputerSystem", "GET", "UserName"], universal_newlines=True, startupinfo=startupinfo)
_, username = res.strip().rsplit("\n", 1)
userid, sysdom = username.rsplit("\\", 1)
def netstat_done(res):
fprint("netstat done, processing")
procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done)
#netstat.process(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, (res, config, datafile))
def killall():
kids = active_children()
for kid in kids:
kid.kill()
fprint("Every child has been killed")
os.kill(os.getpid(), 9) # dirty kill of self
def mainloop(pool):
# worker pool: netstat, netstat cleanup, upload, download, ui tasks
fprint("start loop")
global netdata_res
global procdata_res
global rawdata
global killme
#print(killme)
if killme.value > 0:
#print("killing")
killall()
#print(res.get(timeout=1))
if netdata_res is None or netdata_res.ready():
#rawdata = netdata_res.get()
#procdata_res = pool.apply_async(process_netstat, (rawdata))
fprint("netstat starting")
netdata_res = pool.apply_async(netstat.start, callback=netstat_done)
#fprint(netdata_res.successful())
sleep(interval)
class Logger(object):
def __init__(self, filename="output.log"):
self.log = open(filename, "a")
self.terminal = sys.stdout
def write(self, message):
self.log.write(message)
#close(filename)
#self.log = open(filename, "a")
try:
self.terminal.write(message)
except:
sleep(0)
def flush(self):
print("")
if __name__ == '__main__':
freeze_support() # required if packaged into single EXE
# create manager to share data to me, background, foreground
# create worker pool
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 open(find_data_file('config.yml'), 'r') as file:
#global config
config = yaml.safe_load(file)
#print(config['sftp']['host'])
interval = config['core']['interval']
displaydata = manager.list(range(2)) # data to be printed
settings = manager.list(range(20)) # configuration
killme = manager.Value('d', 0)
#killme = False
# launch background UI app as process
p = Process(target=taskbartool.background, args=(displaydata,settings,killme))
p.start()
#p.join() # not a foreground job, so let's not join it
keeprunning = True
# initial setup
#netdata_res = pool.apply_async(netstat, callback=netstat_done)
# launch loop - non-blocking!
while(keeprunning):
mainloop(pool)

27
keyfile-admin.pem Normal file
View File

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAkKf5kPTTHIvL44Tfe7QO13K/JVfD+DbIwWQBURqa60ohVldN
mWg7dngpMeHcr27JXLHfAT1c2ztbZR13ZZzKTpu1IbUtecVhCsduNtMzLehB8seQ
0lPLAUeE76IK7KfYBUXNXnA5n9oFTS2DJwnYgSqAODbILOxbUpdRajTbacE3Mo0p
nMLwvqcCwXXfKEhlcccclckDKkZYpwLfmuw7veD007NlBfq/lOezdFBERezEUIgr
+A22JP5KCsVeuQBJuuRrXdz8p334n2xaR4RDjN3p0cmMi2Oohm7M7MbhAImC/J+P
HXOJMQpdEgD6Ea17Jr9ORPf08HrrjaZzA/SW7QIDAQABAoIBAEe07LKdmjTxW42a
JUpl9GF6gSRawEs/pP6wuzJgFOGD6sipGE9uauOMJyeSBdp0+Z5YkepEZ85JO0IB
fFlDgsm6x+xAqp1NaZB1Ub4draYZFu/pW3HXla85q706P14Wya+7bVVeHkKOSch7
QiNM7yUAU3UKOuqB87caSYJzVzyxhUd5S6/ro2VNbXT/7vHSsKCja2scy+JaRhKn
m4cc3P+ggI06JLfZsMZY1zJKDhbWiHGmB5ZdzqAJsu/bAtXWY25QsHowYAqPG7Uq
7rcJlbbdkCASE4MXqi427uJfeqBB0vfykttSriBpQVBKus5wpcCEOMkpEho0zU0Z
yx9bdeECgYEA9d0PDjAqIwrVSxjeOd6eXcSwmMzaK5fc5beptKRQA0U/O4swhn2+
NOio6v6fTWuDwNHAsMZiDvW3boO357GCm2N7YkqvdarydfOt7IccsUnEROaAxOqx
1wlnl0NkVIwaTo3XoRSWIcIqE3mCAaz8peqtRmIcXcQ/S9RGm3QeiAUCgYEAlp67
vmn6Z1U0XLILnf4i9D3ECJlwJXEP64pB4XnXiHU/StaXY7CSRaCX+SxfgUR8pATQ
ySYDRY1Ag6cHxSVIo1vkotT3P11x7/8yWnomvnEwRJqTMdN+/VuTi4tPzU1ScNXX
F7aRqkNoGEkmsmi2wdszbJcruI74k4TGLcbNj8kCgYEAgG37AVRTjn6IMHRLETui
yiSGgyrvBDqN30lzUrNKQIsZnsb0kCx7ATRPmIFtQYnaBw0KdM0MR/g+23HezR7C
tNzghNWyleq4QLkLrzRc3pdD+SHXPgXC5Cs7e55ueGO/Ei2x56jTS8sbI5UjPjDY
wOq3nL5/RtPOpJO8VlPv5ukCgYEAjytM/D9SdNyJzD61SjWiVhVL/HyVHBHvdw3R
d5jQZfZE9kcqWekh8KspKgGiuoY2D9Y/+6N1YqxUkY+4lA3PkPAtURYr+wBA6Ebk
PxpzL3z5y4w+tBL8V6mvguomLdj8ryKktPamWXh/Pu5xqQ5eAcDxjZvYRDMqV1bS
5fpdtPkCgYEAoRVdlDSaj9u3NPoFkschl1bOZlJpm9tJVU+LoWxRe8tuLIwVDvXP
JsZMcpfinEPWSrJN+hlGDuaq7k5LtSNeQoruaafhlE+CV54G7J2Khn8pRKWT+n/p
36PfgGbhuLsZl8KDy+PXjS+L5A1kuTxB4rOBdHXIHm60aNCqB0BRcTM=
-----END RSA PRIVATE KEY-----

1
known_hosts Normal file
View File

@ -0,0 +1 @@
ec2-34-232-29-46.compute-1.amazonaws.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBM8sLlu0mu1PqYXk+a9XYHXXFiOaxk/2tIS5O3q+3ah13bd5Iz+NSxS0bXT7TdMTA/lD1kWMUXROEauADgIfT98=

View File

80
netstat.py Normal file
View File

@ -0,0 +1,80 @@
from util import find_data_file
from util import setup_child
from util import fprint
from util import run_ps
from util import win32
import util
import time
import csv
def process(data):
setup_child()
fprint("netstat processing")
if win32:
#output = data.stdout
#print(output)
output = data.stdout.decode().split('\r\n') # split stdout into lines
#print(output)
if output[0].find("The requested operation requires elevation.") >= 0:
#print("test3")
raise PermissionError("Unable to acquire netstat data without admin!")
#print("test2")
output2 = list()
output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata
#print(output2)
procname = ""
"""for x in range(4, len(output)):
tmp = output[x].split(" ")
print(tmp)
tmp = [i for i in output[x] if i]
print(tmp)
print(len(tmp))
if len(len(tmp) == 1):
procname = tmp[0]
print(x)
else:
print(x)
output2[x] = list()
output2[x].append(procname)
output2[x].append(output[x].split(" "))
output2[x] = [i for i in output2[x] if i]
output2 = [i for i in output2 if i]
print(output2)"""
x = len(output) - 1 # start at the end because filename comes after connection
procname = "Unknown" # if the very last connection happens to have no file (yes, it's possible), we can say unknown
while x > 3:
string = output[x]
#print("LINE: ", string)
string_split = string.split(" ")
string_split = [i for i in string_split if i]
if string.find("Can not obtain ownership information") >= 0: # Higher privilige than us, must be system
procname = "Windows System"
elif string.find("]") >= 0 and string.find("[") == 1: # generic [file.exe]
procname = string[2:-1]
elif len(string_split) == 5: # actual netstat line
tmp = [procname,] # add executable name first
tmp.extend(string.split(" "))
tmp = [i for i in tmp if i]
#print(tmp)
output2.append(tmp)
#else: # In case of an extra line above file, or an empty line, ignore it
#print("Garbage data", string)
x = x - 1
#output2 = output2[2:]
#print(output2)
with open(find_data_file(util.datafile), "w", newline="") as f:
writer = csv.writer(f)
writer.writerows(output2)
fprint("done creating csv")
def start():
fprint("netstat started")
setup_child()
if win32:
data = run_ps("netstat -n -o -b")
fprint("data acquired")
return data

165
out.csv
View File

@ -1,84 +1,81 @@
firefox.exe,TCP,[2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53338,[2607:f518:5::4816:b9c7]:80,ESTABLISHED,8008 0xf44ee3942e7d,FRAMEWORKWIN,Cole,1664323651
firefox.exe,TCP,[2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53301,[2607:f8b0:4009:817::200e]:443,ESTABLISHED,8008 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54350,[2600:9000:2026:d600:a:da5e:7900:93a1]:443,ESTABLISHED,16812
firefox.exe,TCP,[2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53292,[2607:f8b0:4009:808::2003]:80,TIME_WAIT,0 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54323,[2606:4700::6812:c039]:443,TIME_WAIT,0
firefox.exe,TCP,[2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53285,[2606:4700:4400::6812:2962]:443,TIME_WAIT,0 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54295,[2606:4700::6812:8b2f]:443,TIME_WAIT,0
python.exe,TCP,127.0.0.1:51987,127.0.0.1:51986,ESTABLISHED,17244 tailscale-ipn.exe,TCP,127.0.0.1:63227,127.0.0.1:41112,ESTABLISHED,13244
python.exe,TCP,127.0.0.1:51986,127.0.0.1:51987,ESTABLISHED,17244 nxnode.bin,TCP,127.0.0.1:63192,127.0.0.1:22753,ESTABLISHED,11476
VSCodium.exe,TCP,127.0.0.1:51978,127.0.0.1:51977,ESTABLISHED,17828 nxnode.bin,TCP,127.0.0.1:63191,127.0.0.1:1550,ESTABLISHED,11476
VSCodium.exe,TCP,127.0.0.1:51977,127.0.0.1:51978,ESTABLISHED,17828 nxnode.bin,TCP,127.0.0.1:63190,127.0.0.1:21667,ESTABLISHED,11476
firefox.exe,TCP,127.0.0.1:51761,127.0.0.1:51760,ESTABLISHED,10420 nxclient.bin,TCP,127.0.0.1:62772,127.0.0.1:15334,ESTABLISHED,12168
firefox.exe,TCP,127.0.0.1:51760,127.0.0.1:51761,ESTABLISHED,10420 nxclient.bin,TCP,127.0.0.1:62771,127.0.0.1:14346,ESTABLISHED,12168
firefox.exe,TCP,127.0.0.1:51759,127.0.0.1:51758,ESTABLISHED,8008 nxclient.bin,TCP,127.0.0.1:62770,127.0.0.1:32580,ESTABLISHED,12168
firefox.exe,TCP,127.0.0.1:51758,127.0.0.1:51759,ESTABLISHED,8008 nxnode.bin,TCP,127.0.0.1:62769,127.0.0.1:25001,ESTABLISHED,11476
nxserver.bin,TCP,127.0.0.1:50792,127.0.0.1:22890,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:62767,127.0.0.1:24790,ESTABLISHED,11476
nxserver.bin,TCP,127.0.0.1:50778,127.0.0.1:4742,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:62764,127.0.0.1:4831,ESTABLISHED,11476
tailscale-ipn.exe,TCP,127.0.0.1:50530,127.0.0.1:41112,ESTABLISHED,14552 firefox.exe,TCP,127.0.0.1:54101,127.0.0.1:54100,ESTABLISHED,2220
nxclient.bin,TCP,127.0.0.1:50409,127.0.0.1:19231,ESTABLISHED,11836 firefox.exe,TCP,127.0.0.1:54100,127.0.0.1:54101,ESTABLISHED,2220
nxclient.bin,TCP,127.0.0.1:50408,127.0.0.1:26068,ESTABLISHED,11836 firefox.exe,TCP,127.0.0.1:54099,127.0.0.1:54098,ESTABLISHED,16812
nxclient.bin,TCP,127.0.0.1:50407,127.0.0.1:10632,ESTABLISHED,11836 firefox.exe,TCP,127.0.0.1:54098,127.0.0.1:54099,ESTABLISHED,16812
nxnode.bin,TCP,127.0.0.1:50406,127.0.0.1:25001,ESTABLISHED,11608 python.exe,TCP,127.0.0.1:53388,127.0.0.1:53387,ESTABLISHED,6380
nxnode.bin,TCP,127.0.0.1:50405,127.0.0.1:23938,ESTABLISHED,11608 python.exe,TCP,127.0.0.1:53387,127.0.0.1:53388,ESTABLISHED,6380
nxnode.bin,TCP,127.0.0.1:50402,127.0.0.1:28488,ESTABLISHED,11608 VSCodium.exe,TCP,127.0.0.1:53380,127.0.0.1:53379,ESTABLISHED,9272
nxnode.bin,TCP,127.0.0.1:50397,127.0.0.1:17311,ESTABLISHED,11608 VSCodium.exe,TCP,127.0.0.1:53379,127.0.0.1:53380,ESTABLISHED,9272
nxnode.bin,TCP,127.0.0.1:50395,127.0.0.1:21968,ESTABLISHED,11608 nxserver.bin,TCP,127.0.0.1:53359,127.0.0.1:17141,ESTABLISHED,7620
nxnode.bin,TCP,127.0.0.1:50174,127.0.0.1:10055,ESTABLISHED,11608 nxserver.bin,TCP,127.0.0.1:53352,127.0.0.1:25137,ESTABLISHED,7620
nxservice64.exe,TCP,127.0.0.1:50160,127.0.0.1:19492,ESTABLISHED,5544 nxservice64.exe,TCP,127.0.0.1:49777,127.0.0.1:19492,ESTABLISHED,5244
nxserver.bin,TCP,127.0.0.1:49772,127.0.0.1:16950,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49772,127.0.0.1:7426,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49767,127.0.0.1:16619,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49768,127.0.0.1:15484,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49766,127.0.0.1:31770,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49767,127.0.0.1:7973,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49765,127.0.0.1:7039,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49766,127.0.0.1:4362,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49762,127.0.0.1:22921,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49765,127.0.0.1:5244,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49761,127.0.0.1:6363,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49764,127.0.0.1:2739,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:49698,127.0.0.1:15907,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:49704,127.0.0.1:32876,ESTABLISHED,7620
AppleMobileDeviceService.exe,TCP,127.0.0.1:49674,127.0.0.1:5354,ESTABLISHED,4280 AppleMobileDeviceService.exe,TCP,127.0.0.1:49674,127.0.0.1:5354,ESTABLISHED,4888
AppleMobileDeviceService.exe,TCP,127.0.0.1:49670,127.0.0.1:5354,ESTABLISHED,4280 AppleMobileDeviceService.exe,TCP,127.0.0.1:49670,127.0.0.1:5354,ESTABLISHED,4888
tailscaled.exe,TCP,127.0.0.1:41112,127.0.0.1:50530,ESTABLISHED,8076 tailscaled.exe,TCP,127.0.0.1:41112,127.0.0.1:63227,ESTABLISHED,7688
nxserver.bin,TCP,127.0.0.1:31770,127.0.0.1:49766,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:32876,127.0.0.1:49704,ESTABLISHED,7620
nxnode.bin,TCP,127.0.0.1:28488,127.0.0.1:50402,ESTABLISHED,11608 nxclient.bin,TCP,127.0.0.1:32580,127.0.0.1:62770,ESTABLISHED,12168
nxclient.bin,TCP,127.0.0.1:26068,127.0.0.1:50408,ESTABLISHED,11836 nxserver.bin,TCP,127.0.0.1:25137,127.0.0.1:53352,ESTABLISHED,7620
nxclient.bin,TCP,127.0.0.1:25001,127.0.0.1:50406,ESTABLISHED,11836 nxclient.bin,TCP,127.0.0.1:25001,127.0.0.1:62769,ESTABLISHED,12168
nxnode.bin,TCP,127.0.0.1:23938,127.0.0.1:50405,ESTABLISHED,11608 nxserver.bin,TCP,127.0.0.1:24790,127.0.0.1:62767,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:22921,127.0.0.1:49762,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:22753,127.0.0.1:63192,ESTABLISHED,11476
nxserver.bin,TCP,127.0.0.1:22890,127.0.0.1:50792,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:21667,127.0.0.1:63190,ESTABLISHED,11476
nxserver.bin,TCP,127.0.0.1:21968,127.0.0.1:50395,ESTABLISHED,8116 nxservice64.exe,TCP,127.0.0.1:19492,127.0.0.1:49777,ESTABLISHED,5244
nxservice64.exe,TCP,127.0.0.1:19492,127.0.0.1:50160,ESTABLISHED,5544 nxserver.bin,TCP,127.0.0.1:17141,127.0.0.1:53359,ESTABLISHED,7620
nxclient.bin,TCP,127.0.0.1:19231,127.0.0.1:50409,ESTABLISHED,11836 nxserver.bin,TCP,127.0.0.1:15484,127.0.0.1:49768,ESTABLISHED,7620
nxnode.bin,TCP,127.0.0.1:17311,127.0.0.1:50397,ESTABLISHED,11608 nxclient.bin,TCP,127.0.0.1:15334,127.0.0.1:62772,ESTABLISHED,12168
nxserver.bin,TCP,127.0.0.1:16950,127.0.0.1:49772,ESTABLISHED,8116 nxclient.bin,TCP,127.0.0.1:14346,127.0.0.1:62771,ESTABLISHED,12168
nxserver.bin,TCP,127.0.0.1:16619,127.0.0.1:49767,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:7973,127.0.0.1:49767,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:15907,127.0.0.1:49698,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:7426,127.0.0.1:49772,ESTABLISHED,7620
nxclient.bin,TCP,127.0.0.1:10632,127.0.0.1:50407,ESTABLISHED,11836 mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49674,ESTABLISHED,4948
nxnode.bin,TCP,127.0.0.1:10055,127.0.0.1:50174,ESTABLISHED,11608 mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49670,ESTABLISHED,4948
nxserver.bin,TCP,127.0.0.1:7039,127.0.0.1:49765,ESTABLISHED,8116 nxserver.bin,TCP,127.0.0.1:5244,127.0.0.1:49765,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:6363,127.0.0.1:49761,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:4831,127.0.0.1:62764,ESTABLISHED,11476
mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49674,ESTABLISHED,4076 nxserver.bin,TCP,127.0.0.1:4362,127.0.0.1:49766,ESTABLISHED,7620
mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49670,ESTABLISHED,4076 nxserver.bin,TCP,127.0.0.1:2739,127.0.0.1:49764,ESTABLISHED,7620
nxserver.bin,TCP,127.0.0.1:4742,127.0.0.1:50778,ESTABLISHED,8116 nxnode.bin,TCP,127.0.0.1:1550,127.0.0.1:63191,ESTABLISHED,11476
nxserver.bin,TCP,104.194.122.206:53343,208.59.79.12:443,TIME_WAIT,0 nxnode.bin,TCP,104.194.96.68:54361,208.59.79.12:443,TIME_WAIT,0
nxserver.bin,TCP,104.194.122.206:53340,54.212.237.219:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54352,52.84.125.26:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53339,54.212.237.219:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54348,35.244.181.201:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53337,54.212.237.219:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54347,52.84.52.31:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53335,208.59.79.12:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54346,52.84.52.31:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53334,208.59.79.12:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54345,52.84.52.31:443,ESTABLISHED,16812
VSCodium.exe,TCP,104.194.122.206:53314,76.76.21.61:443,ESTABLISHED,3816 firefox.exe,TCP,104.194.96.68:54344,52.84.52.31:443,ESTABLISHED,16812
VSCodium.exe,TCP,104.194.122.206:53313,76.76.21.164:443,ESTABLISHED,3816 firefox.exe,TCP,104.194.96.68:54343,52.84.52.31:443,ESTABLISHED,16812
VSCodium.exe,TCP,104.194.122.206:53312,76.76.21.164:443,CLOSE_WAIT,3816 firefox.exe,TCP,104.194.96.68:54342,52.84.52.31:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53307,104.192.142.9:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54341,52.84.52.87:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53300,54.201.164.58:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54340,54.185.157.183:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53299,35.186.227.140:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54339,35.186.227.140:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53298,162.159.130.232:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54338,54.201.164.58:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53297,162.159.128.232:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54330,52.84.125.36:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53290,162.159.138.232:443,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54293,141.193.213.11:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53289,162.159.135.234:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54276,104.21.42.46:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53284,72.21.91.29:80,TIME_WAIT,0 firefox.exe,TCP,104.194.96.68:54271,104.21.42.46:443,TIME_WAIT,0
firefox.exe,TCP,104.194.122.206:53160,142.250.191.106:443,ESTABLISHED,8008 firefox.exe,TCP,104.194.96.68:54110,52.41.253.170:443,ESTABLISHED,16812
firefox.exe,TCP,104.194.122.206:53154,142.250.191.106:443,ESTABLISHED,8008 syncthing.exe,TCP,104.194.96.68:53909,128.173.88.78:22067,ESTABLISHED,6668
firefox.exe,TCP,104.194.122.206:52525,104.192.142.11:443,ESTABLISHED,8008 tailscaled.exe,TCP,104.194.96.68:53392,18.156.90.224:80,ESTABLISHED,7688
syncthing.exe,TCP,104.194.122.206:51451,172.245.94.35:22067,ESTABLISHED,8896 tailscaled.exe,TCP,104.194.96.68:53214,199.38.182.118:443,ESTABLISHED,7688
tailscaled.exe,TCP,104.194.122.206:51107,18.156.90.224:80,ESTABLISHED,8076 svchost.exe,TCP,104.194.96.68:49420,13.64.180.106:443,ESTABLISHED,5456
firefox.exe,TCP,104.194.122.206:50786,54.148.242.254:443,ESTABLISHED,8008 VcomSvc.exe,TCP,100.106.209.107:63898,192.168.1.173:5000,ESTABLISHED,5424
tailscaled.exe,TCP,104.194.122.206:50750,199.38.182.118:443,ESTABLISHED,8076 Windows System,TCP,100.106.209.107:53857,192.168.1.11:445,ESTABLISHED,4
svchost.exe,TCP,104.194.122.206:49413,40.83.240.146:443,ESTABLISHED,6108 Windows System,TCP,100.106.209.107:53856,192.168.1.216:445,ESTABLISHED,4
VcomSvc.exe,TCP,100.106.209.107:56843,192.168.1.173:5000,ESTABLISHED,5936
Windows System,TCP,100.106.209.107:52378,192.168.1.11:445,ESTABLISHED,4
Windows System,TCP,100.106.209.107:52377,192.168.1.216:445,ESTABLISHED,4

1 firefox.exe 0xf44ee3942e7d,FRAMEWORKWIN,Cole,1664323651 TCP [2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53338 [2607:f518:5::4816:b9c7]:80 ESTABLISHED 8008
2 firefox.exe firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54350,[2600:9000:2026:d600:a:da5e:7900:93a1]:443,ESTABLISHED,16812 TCP [2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53301 [2607:f8b0:4009:817::200e]:443 ESTABLISHED 8008
3 firefox.exe firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54323,[2606:4700::6812:c039]:443,TIME_WAIT,0 TCP [2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53292 [2607:f8b0:4009:808::2003]:80 TIME_WAIT 0
4 firefox.exe firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54295,[2606:4700::6812:8b2f]:443,TIME_WAIT,0 TCP [2620:f3:8000:5060:5939:a4c0:4f5b:113f]:53285 [2606:4700:4400::6812:2962]:443 TIME_WAIT 0
5 python.exe tailscale-ipn.exe,TCP,127.0.0.1:63227,127.0.0.1:41112,ESTABLISHED,13244 TCP 127.0.0.1:51987 127.0.0.1:51986 ESTABLISHED 17244
6 python.exe nxnode.bin,TCP,127.0.0.1:63192,127.0.0.1:22753,ESTABLISHED,11476 TCP 127.0.0.1:51986 127.0.0.1:51987 ESTABLISHED 17244
7 VSCodium.exe nxnode.bin,TCP,127.0.0.1:63191,127.0.0.1:1550,ESTABLISHED,11476 TCP 127.0.0.1:51978 127.0.0.1:51977 ESTABLISHED 17828
8 VSCodium.exe nxnode.bin,TCP,127.0.0.1:63190,127.0.0.1:21667,ESTABLISHED,11476 TCP 127.0.0.1:51977 127.0.0.1:51978 ESTABLISHED 17828
9 firefox.exe nxclient.bin,TCP,127.0.0.1:62772,127.0.0.1:15334,ESTABLISHED,12168 TCP 127.0.0.1:51761 127.0.0.1:51760 ESTABLISHED 10420
10 firefox.exe nxclient.bin,TCP,127.0.0.1:62771,127.0.0.1:14346,ESTABLISHED,12168 TCP 127.0.0.1:51760 127.0.0.1:51761 ESTABLISHED 10420
11 firefox.exe nxclient.bin,TCP,127.0.0.1:62770,127.0.0.1:32580,ESTABLISHED,12168 TCP 127.0.0.1:51759 127.0.0.1:51758 ESTABLISHED 8008
12 firefox.exe nxnode.bin,TCP,127.0.0.1:62769,127.0.0.1:25001,ESTABLISHED,11476 TCP 127.0.0.1:51758 127.0.0.1:51759 ESTABLISHED 8008
13 nxserver.bin nxnode.bin,TCP,127.0.0.1:62767,127.0.0.1:24790,ESTABLISHED,11476 TCP 127.0.0.1:50792 127.0.0.1:22890 ESTABLISHED 8116
14 nxserver.bin nxnode.bin,TCP,127.0.0.1:62764,127.0.0.1:4831,ESTABLISHED,11476 TCP 127.0.0.1:50778 127.0.0.1:4742 ESTABLISHED 8116
15 tailscale-ipn.exe firefox.exe,TCP,127.0.0.1:54101,127.0.0.1:54100,ESTABLISHED,2220 TCP 127.0.0.1:50530 127.0.0.1:41112 ESTABLISHED 14552
16 nxclient.bin firefox.exe,TCP,127.0.0.1:54100,127.0.0.1:54101,ESTABLISHED,2220 TCP 127.0.0.1:50409 127.0.0.1:19231 ESTABLISHED 11836
17 nxclient.bin firefox.exe,TCP,127.0.0.1:54099,127.0.0.1:54098,ESTABLISHED,16812 TCP 127.0.0.1:50408 127.0.0.1:26068 ESTABLISHED 11836
18 nxclient.bin firefox.exe,TCP,127.0.0.1:54098,127.0.0.1:54099,ESTABLISHED,16812 TCP 127.0.0.1:50407 127.0.0.1:10632 ESTABLISHED 11836
19 nxnode.bin python.exe,TCP,127.0.0.1:53388,127.0.0.1:53387,ESTABLISHED,6380 TCP 127.0.0.1:50406 127.0.0.1:25001 ESTABLISHED 11608
20 nxnode.bin python.exe,TCP,127.0.0.1:53387,127.0.0.1:53388,ESTABLISHED,6380 TCP 127.0.0.1:50405 127.0.0.1:23938 ESTABLISHED 11608
21 nxnode.bin VSCodium.exe,TCP,127.0.0.1:53380,127.0.0.1:53379,ESTABLISHED,9272 TCP 127.0.0.1:50402 127.0.0.1:28488 ESTABLISHED 11608
22 nxnode.bin VSCodium.exe,TCP,127.0.0.1:53379,127.0.0.1:53380,ESTABLISHED,9272 TCP 127.0.0.1:50397 127.0.0.1:17311 ESTABLISHED 11608
23 nxnode.bin nxserver.bin,TCP,127.0.0.1:53359,127.0.0.1:17141,ESTABLISHED,7620 TCP 127.0.0.1:50395 127.0.0.1:21968 ESTABLISHED 11608
24 nxnode.bin nxserver.bin,TCP,127.0.0.1:53352,127.0.0.1:25137,ESTABLISHED,7620 TCP 127.0.0.1:50174 127.0.0.1:10055 ESTABLISHED 11608
25 nxservice64.exe nxservice64.exe,TCP,127.0.0.1:49777,127.0.0.1:19492,ESTABLISHED,5244 TCP 127.0.0.1:50160 127.0.0.1:19492 ESTABLISHED 5544
26 nxserver.bin nxserver.bin,TCP,127.0.0.1:49772,127.0.0.1:7426,ESTABLISHED,7620 TCP 127.0.0.1:49772 127.0.0.1:16950 ESTABLISHED 8116
27 nxserver.bin nxserver.bin,TCP,127.0.0.1:49768,127.0.0.1:15484,ESTABLISHED,7620 TCP 127.0.0.1:49767 127.0.0.1:16619 ESTABLISHED 8116
28 nxserver.bin nxserver.bin,TCP,127.0.0.1:49767,127.0.0.1:7973,ESTABLISHED,7620 TCP 127.0.0.1:49766 127.0.0.1:31770 ESTABLISHED 8116
29 nxserver.bin nxserver.bin,TCP,127.0.0.1:49766,127.0.0.1:4362,ESTABLISHED,7620 TCP 127.0.0.1:49765 127.0.0.1:7039 ESTABLISHED 8116
30 nxserver.bin nxserver.bin,TCP,127.0.0.1:49765,127.0.0.1:5244,ESTABLISHED,7620 TCP 127.0.0.1:49762 127.0.0.1:22921 ESTABLISHED 8116
31 nxserver.bin nxserver.bin,TCP,127.0.0.1:49764,127.0.0.1:2739,ESTABLISHED,7620 TCP 127.0.0.1:49761 127.0.0.1:6363 ESTABLISHED 8116
32 nxserver.bin nxserver.bin,TCP,127.0.0.1:49704,127.0.0.1:32876,ESTABLISHED,7620 TCP 127.0.0.1:49698 127.0.0.1:15907 ESTABLISHED 8116
33 AppleMobileDeviceService.exe AppleMobileDeviceService.exe,TCP,127.0.0.1:49674,127.0.0.1:5354,ESTABLISHED,4888 TCP 127.0.0.1:49674 127.0.0.1:5354 ESTABLISHED 4280
34 AppleMobileDeviceService.exe AppleMobileDeviceService.exe,TCP,127.0.0.1:49670,127.0.0.1:5354,ESTABLISHED,4888 TCP 127.0.0.1:49670 127.0.0.1:5354 ESTABLISHED 4280
35 tailscaled.exe tailscaled.exe,TCP,127.0.0.1:41112,127.0.0.1:63227,ESTABLISHED,7688 TCP 127.0.0.1:41112 127.0.0.1:50530 ESTABLISHED 8076
36 nxserver.bin nxserver.bin,TCP,127.0.0.1:32876,127.0.0.1:49704,ESTABLISHED,7620 TCP 127.0.0.1:31770 127.0.0.1:49766 ESTABLISHED 8116
37 nxnode.bin nxclient.bin,TCP,127.0.0.1:32580,127.0.0.1:62770,ESTABLISHED,12168 TCP 127.0.0.1:28488 127.0.0.1:50402 ESTABLISHED 11608
38 nxclient.bin nxserver.bin,TCP,127.0.0.1:25137,127.0.0.1:53352,ESTABLISHED,7620 TCP 127.0.0.1:26068 127.0.0.1:50408 ESTABLISHED 11836
39 nxclient.bin nxclient.bin,TCP,127.0.0.1:25001,127.0.0.1:62769,ESTABLISHED,12168 TCP 127.0.0.1:25001 127.0.0.1:50406 ESTABLISHED 11836
40 nxnode.bin nxserver.bin,TCP,127.0.0.1:24790,127.0.0.1:62767,ESTABLISHED,7620 TCP 127.0.0.1:23938 127.0.0.1:50405 ESTABLISHED 11608
41 nxserver.bin nxnode.bin,TCP,127.0.0.1:22753,127.0.0.1:63192,ESTABLISHED,11476 TCP 127.0.0.1:22921 127.0.0.1:49762 ESTABLISHED 8116
42 nxserver.bin nxnode.bin,TCP,127.0.0.1:21667,127.0.0.1:63190,ESTABLISHED,11476 TCP 127.0.0.1:22890 127.0.0.1:50792 ESTABLISHED 8116
43 nxserver.bin nxservice64.exe,TCP,127.0.0.1:19492,127.0.0.1:49777,ESTABLISHED,5244 TCP 127.0.0.1:21968 127.0.0.1:50395 ESTABLISHED 8116
44 nxservice64.exe nxserver.bin,TCP,127.0.0.1:17141,127.0.0.1:53359,ESTABLISHED,7620 TCP 127.0.0.1:19492 127.0.0.1:50160 ESTABLISHED 5544
45 nxclient.bin nxserver.bin,TCP,127.0.0.1:15484,127.0.0.1:49768,ESTABLISHED,7620 TCP 127.0.0.1:19231 127.0.0.1:50409 ESTABLISHED 11836
46 nxnode.bin nxclient.bin,TCP,127.0.0.1:15334,127.0.0.1:62772,ESTABLISHED,12168 TCP 127.0.0.1:17311 127.0.0.1:50397 ESTABLISHED 11608
47 nxserver.bin nxclient.bin,TCP,127.0.0.1:14346,127.0.0.1:62771,ESTABLISHED,12168 TCP 127.0.0.1:16950 127.0.0.1:49772 ESTABLISHED 8116
48 nxserver.bin nxserver.bin,TCP,127.0.0.1:7973,127.0.0.1:49767,ESTABLISHED,7620 TCP 127.0.0.1:16619 127.0.0.1:49767 ESTABLISHED 8116
49 nxserver.bin nxserver.bin,TCP,127.0.0.1:7426,127.0.0.1:49772,ESTABLISHED,7620 TCP 127.0.0.1:15907 127.0.0.1:49698 ESTABLISHED 8116
50 nxclient.bin mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49674,ESTABLISHED,4948 TCP 127.0.0.1:10632 127.0.0.1:50407 ESTABLISHED 11836
51 nxnode.bin mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49670,ESTABLISHED,4948 TCP 127.0.0.1:10055 127.0.0.1:50174 ESTABLISHED 11608
52 nxserver.bin nxserver.bin,TCP,127.0.0.1:5244,127.0.0.1:49765,ESTABLISHED,7620 TCP 127.0.0.1:7039 127.0.0.1:49765 ESTABLISHED 8116
53 nxserver.bin nxnode.bin,TCP,127.0.0.1:4831,127.0.0.1:62764,ESTABLISHED,11476 TCP 127.0.0.1:6363 127.0.0.1:49761 ESTABLISHED 8116
54 mDNSResponder.exe nxserver.bin,TCP,127.0.0.1:4362,127.0.0.1:49766,ESTABLISHED,7620 TCP 127.0.0.1:5354 127.0.0.1:49674 ESTABLISHED 4076
55 mDNSResponder.exe nxserver.bin,TCP,127.0.0.1:2739,127.0.0.1:49764,ESTABLISHED,7620 TCP 127.0.0.1:5354 127.0.0.1:49670 ESTABLISHED 4076
56 nxserver.bin nxnode.bin,TCP,127.0.0.1:1550,127.0.0.1:63191,ESTABLISHED,11476 TCP 127.0.0.1:4742 127.0.0.1:50778 ESTABLISHED 8116
57 nxserver.bin nxnode.bin,TCP,104.194.96.68:54361,208.59.79.12:443,TIME_WAIT,0 TCP 104.194.122.206:53343 208.59.79.12:443 TIME_WAIT 0
58 nxserver.bin firefox.exe,TCP,104.194.96.68:54352,52.84.125.26:443,ESTABLISHED,16812 TCP 104.194.122.206:53340 54.212.237.219:443 TIME_WAIT 0
59 firefox.exe firefox.exe,TCP,104.194.96.68:54348,35.244.181.201:443,ESTABLISHED,16812 TCP 104.194.122.206:53339 54.212.237.219:443 ESTABLISHED 8008
60 firefox.exe firefox.exe,TCP,104.194.96.68:54347,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53337 54.212.237.219:443 ESTABLISHED 8008
61 firefox.exe firefox.exe,TCP,104.194.96.68:54346,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53335 208.59.79.12:443 TIME_WAIT 0
62 firefox.exe firefox.exe,TCP,104.194.96.68:54345,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53334 208.59.79.12:443 ESTABLISHED 8008
63 VSCodium.exe firefox.exe,TCP,104.194.96.68:54344,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53314 76.76.21.61:443 ESTABLISHED 3816
64 VSCodium.exe firefox.exe,TCP,104.194.96.68:54343,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53313 76.76.21.164:443 ESTABLISHED 3816
65 VSCodium.exe firefox.exe,TCP,104.194.96.68:54342,52.84.52.31:443,ESTABLISHED,16812 TCP 104.194.122.206:53312 76.76.21.164:443 CLOSE_WAIT 3816
66 firefox.exe firefox.exe,TCP,104.194.96.68:54341,52.84.52.87:443,ESTABLISHED,16812 TCP 104.194.122.206:53307 104.192.142.9:443 ESTABLISHED 8008
67 firefox.exe firefox.exe,TCP,104.194.96.68:54340,54.185.157.183:443,TIME_WAIT,0 TCP 104.194.122.206:53300 54.201.164.58:443 TIME_WAIT 0
68 firefox.exe firefox.exe,TCP,104.194.96.68:54339,35.186.227.140:443,ESTABLISHED,16812 TCP 104.194.122.206:53299 35.186.227.140:443 ESTABLISHED 8008
69 firefox.exe firefox.exe,TCP,104.194.96.68:54338,54.201.164.58:443,TIME_WAIT,0 TCP 104.194.122.206:53298 162.159.130.232:443 TIME_WAIT 0
70 firefox.exe firefox.exe,TCP,104.194.96.68:54330,52.84.125.36:443,TIME_WAIT,0 TCP 104.194.122.206:53297 162.159.128.232:443 TIME_WAIT 0
71 firefox.exe firefox.exe,TCP,104.194.96.68:54293,141.193.213.11:443,TIME_WAIT,0 TCP 104.194.122.206:53290 162.159.138.232:443 TIME_WAIT 0
72 firefox.exe firefox.exe,TCP,104.194.96.68:54276,104.21.42.46:443,TIME_WAIT,0 TCP 104.194.122.206:53289 162.159.135.234:443 ESTABLISHED 8008
73 firefox.exe firefox.exe,TCP,104.194.96.68:54271,104.21.42.46:443,TIME_WAIT,0 TCP 104.194.122.206:53284 72.21.91.29:80 TIME_WAIT 0
74 firefox.exe firefox.exe,TCP,104.194.96.68:54110,52.41.253.170:443,ESTABLISHED,16812 TCP 104.194.122.206:53160 142.250.191.106:443 ESTABLISHED 8008
75 firefox.exe syncthing.exe,TCP,104.194.96.68:53909,128.173.88.78:22067,ESTABLISHED,6668 TCP 104.194.122.206:53154 142.250.191.106:443 ESTABLISHED 8008
76 firefox.exe tailscaled.exe,TCP,104.194.96.68:53392,18.156.90.224:80,ESTABLISHED,7688 TCP 104.194.122.206:52525 104.192.142.11:443 ESTABLISHED 8008
77 syncthing.exe tailscaled.exe,TCP,104.194.96.68:53214,199.38.182.118:443,ESTABLISHED,7688 TCP 104.194.122.206:51451 172.245.94.35:22067 ESTABLISHED 8896
78 tailscaled.exe svchost.exe,TCP,104.194.96.68:49420,13.64.180.106:443,ESTABLISHED,5456 TCP 104.194.122.206:51107 18.156.90.224:80 ESTABLISHED 8076
79 firefox.exe VcomSvc.exe,TCP,100.106.209.107:63898,192.168.1.173:5000,ESTABLISHED,5424 TCP 104.194.122.206:50786 54.148.242.254:443 ESTABLISHED 8008
80 tailscaled.exe Windows System,TCP,100.106.209.107:53857,192.168.1.11:445,ESTABLISHED,4 TCP 104.194.122.206:50750 199.38.182.118:443 ESTABLISHED 8076
81 svchost.exe Windows System,TCP,100.106.209.107:53856,192.168.1.216:445,ESTABLISHED,4 TCP 104.194.122.206:49413 40.83.240.146:443 ESTABLISHED 6108
VcomSvc.exe TCP 100.106.209.107:56843 192.168.1.173:5000 ESTABLISHED 5936
Windows System TCP 100.106.209.107:52378 192.168.1.11:445 ESTABLISHED 4
Windows System TCP 100.106.209.107:52377 192.168.1.216:445 ESTABLISHED 4

11831
output.log Normal file

File diff suppressed because it is too large Load Diff

54
release.sh Normal file
View File

@ -0,0 +1,54 @@
#!/bin/bash
#set -x
TOKEN=$(< token.txt)
EDITOR=nano git commit -a
git push
COMMIT=$(git log | head -n 1 | cut -d' ' -f2)
echo $COMMIT
export PATH=$PATH:"C:\Program Files\7-Zip"
TAG=$(date +%s)
"C:/Program Files/Python310/python.exe" setup.py build
sleep 2
mv ./build/exe.win-amd64-3.10/ ./build/ippigeon-win
7z a -r release-$COMMIT.zip ./build/ippigeon-win
7z a -sfx7z.sfx IPPigeon-install.exe ./build/ippigeon-win
mv ./build/ippigeon-win/ ./build/exe.win-amd64-3.10
#sleep 30
DATA='{
"body": "Autogenerated release",
"draft": false,
"name": "Development release",
"prerelease": true,
"tag_name": "'$TAG'",
"target_commitish": "'$COMMIT'"
}'
OUT=$(curl -X 'POST' \
'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases?token='$TOKEN'' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d "$DATA")
ID=$(echo $OUT | cut -d',' -f 1 | cut -d':' -f 2)
OUT=$(curl -X 'POST' \
'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases/'$ID'/assets?token='$TOKEN'' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'attachment=@IPPigeon-install.exe;type=application/octet-stream')
URL=$(echo $OUT | cut -d',' -f 7 | cut -d\" -f4)
curl -d "$URL" https://notify.deck.sh/ipro-release
echo $URL
OUT=$(curl -X 'POST' \
'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases/'$ID'/assets?token='$TOKEN'' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'attachment=@'release-$COMMIT.zip';type=application/x-zip-compressed')
rm release-$COMMIT.zip
rm IPPigeon-install.exe

21
setup.py Normal file
View File

@ -0,0 +1,21 @@
import sys
from cx_Freeze import setup, Executable
debug = True
#debug = not debug
# Dependencies are automatically detected, but it might need fine tuning.
# "packages": ["os"] is used as example only
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"], "include_msvcr": True, "include_files": ["icon.png", "IPPigeon.lnk", "config.yml", "keyfile-admin.pem"], "optimize": 2}
# base="Win32GUI" should be used only for Windows GUI app
base = None
if sys.platform == "win32" and not debug:
base = "Win32GUI"
setup(
name="IP Pigeon",
version="0.2.4",
description="IP Pigeon client application",
options={"build_exe": build_exe_options},
executables=[Executable("ippigeon.py", base=base)],
)

14
ssh.py Normal file
View File

@ -0,0 +1,14 @@
from fabric import Connection
from util import find_data_file
from util import setup_child
from util import fprint
def sftp_send_data(res, config, filename):
setup_child()
fprint("Connecting over SSH to " + config['sftp']['host'])
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(c.put(find_data_file(filename), remote=config['sftp']['filepath']['send']))
fprint("Data sent over SFTP sucessfully")
#command = 'ls ' + config['sftp']['filepath']['send']
#fprint(c.run(command))

74
taskbartool.py Normal file
View File

@ -0,0 +1,74 @@
import glob
import wx
import wx.adv
import os
from time import sleep
from sys import platform
import sys
from util import find_data_file
from util import fprint
TRAY_TOOLTIP = 'IP Pigeon'
displaydata = None
settings = None
killme = False
def create_menu_item(menu, label, func):
item = wx.MenuItem(menu, -1, label)
menu.Bind(wx.EVT_MENU, func, id=item.GetId())
menu.Append(item)
return item
class TaskBarIcon(wx.adv.TaskBarIcon):
def __init__(self, frame):
self.frame = frame
super(TaskBarIcon, self).__init__()
self.set_icon(TRAY_ICON)
self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
def CreatePopupMenu(self):
menu = wx.Menu()
create_menu_item(menu, 'Control Panel', self.on_open)
menu.AppendSeparator()
create_menu_item(menu, 'Exit', self.on_exit)
return menu
def set_icon(self, path):
icon = wx.Icon(path)
self.SetIcon(icon, TRAY_TOOLTIP)
def on_left_down(self, event):
fprint ('Tray icon was left-clicked.')
def on_open(self, event):
foreground()
#self.close_popup()
def on_exit(self, event):
wx.CallAfter(self.Destroy)
self.close_popup()
#print("kill cmd")
global killme
killme.value += 1
def close_popup(self):
self.frame.Close()
class TaskbarApp(wx.App):
def OnInit(self):
frame=wx.Frame(None)
self.SetTopWindow(frame)
TaskBarIcon(frame)
return True
def background(data, sets, kill):
global killme
killme = kill
app = TaskbarApp(False)
displaydata = data
settings = sets
app.MainLoop()
TRAY_ICON = find_data_file('icon.png')

55
tray-icon-working.py Normal file
View File

@ -0,0 +1,55 @@
import wx.adv
import wx
TRAY_TOOLTIP = 'Name'
TRAY_ICON = 'icon.png'
def create_menu_item(menu, label, func):
item = wx.MenuItem(menu, -1, label)
menu.Bind(wx.EVT_MENU, func, id=item.GetId())
menu.Append(item)
return item
class TaskBarIcon(wx.adv.TaskBarIcon):
def __init__(self, frame):
self.frame = frame
super(TaskBarIcon, self).__init__()
self.set_icon(TRAY_ICON)
self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
def CreatePopupMenu(self):
menu = wx.Menu()
create_menu_item(menu, 'Site', self.on_hello)
menu.AppendSeparator()
create_menu_item(menu, 'Exit', self.on_exit)
return menu
def set_icon(self, path):
icon = wx.Icon(path)
self.SetIcon(icon, TRAY_TOOLTIP)
def on_left_down(self, event):
print ('Tray icon was left-clicked.')
def on_hello(self, event):
print ('Hello, world!')
def on_exit(self, event):
wx.CallAfter(self.Destroy)
self.frame.Close()
class App(wx.App):
def OnInit(self):
frame=wx.Frame(None)
self.SetTopWindow(frame)
TaskBarIcon(frame)
return True
def main():
app = App(False)
app.MainLoop()
if __name__ == '__main__':
main()

98
util.py Normal file
View File

@ -0,0 +1,98 @@
import inspect
import sys
import subprocess
import os
from sys import platform
import time as t
import uuid
win32 = platform == "win32"
linux = platform == "linux" or platform == "linux2"
macos = platform == "darwin"
datafile = ""
if win32:
sysid = hex(uuid.getnode())
datafile += sysid
datafile += "gendata.csv"
# Python is running as Administrator (so netstat can get filename, to block, etc),
# so we use this to see who is actually logged in
# it's very hacky
startupinfo = subprocess.STARTUPINFO()
#if not getattr(sys, "frozen", False):
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # hide powershell window
res = subprocess.check_output(["WMIC", "ComputerSystem", "GET", "UserName"], universal_newlines=True, startupinfo=startupinfo)
_, username = res.strip().rsplit("\n", 1)
userid, sysdom = username.rsplit("\\", 1)
def time():
return int(t.time())
def fprint(msg):
#if not getattr(sys, "frozen", False):
setup_child()
try:
frm = inspect.stack()[1]
mod = inspect.getmodule(frm[0])
print('[' + mod.__name__ + ":" + frm.function + ']:', msg)
except Exception as e:
try:
print('[????:' + frm.function + ']:', msg)
except:
print('[????]:', msg)
# else:
#print(msg)
def find_data_file(filename):
if getattr(sys, "frozen", False):
# The application is frozen
datadir = os.path.dirname(sys.executable)
else:
# The application is not frozen
# Change this bit to match where you store your data files:
datadir = os.path.dirname(__file__)
return os.path.join(datadir, filename)
def run_ps(cmd):
fprint("init PS")
if win32:
startupinfo = subprocess.STARTUPINFO()
#print("DICKS")
#if not getattr(sys, "frozen", False):
# print("test")
#
#completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True, startupinfo=startupinfo)
#else:
# print("alt")
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # , "-WindowStyle", "hidden"
fprint("running PS command: " + cmd)
completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True, startupinfo=startupinfo)
fprint("ran PS command sucessfully")
#completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo)
return completed
def setup_child():
if not getattr(sys, "frozen", False):
sys.stdout = Logger(filename=find_data_file("output.log"))
sys.stderr = Logger(filename=find_data_file("output.log"))
class Logger(object):
def __init__(self, filename="output.log"):
self.log = open(filename, "a")
self.terminal = sys.stdout
def write(self, message):
self.log.write(message)
#close(filename)
#self.log = open(filename, "a")
try:
self.terminal.write(message)
except:
sleep(0)
def flush(self):
print("")