From 7a85f8bb35aa2f0985331151bdafb3109af53350 Mon Sep 17 00:00:00 2001 From: "Jordan Chatha (chathaj)" Date: Fri, 15 Nov 2024 18:46:15 +0000 Subject: [PATCH] Add files via upload --- .../Programming and Algorithms 2 CW2.docx | Bin 0 -> 30183 bytes Enumerating a System over the Network/README | 41 ++++ .../config_handler.cpython-312.pyc | Bin 0 -> 1981 bytes .../controller_app.cpython-312.pyc | Bin 0 -> 7914 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 724 bytes .../clientkali.py | 80 +++++++ .../clientwindows.py | 81 +++++++ .../clientwindowsvm.py | 78 +++++++ .../config_handler.py | 35 +++ .../controller.py | 217 ++++++++++++++++++ .../controller_app.py | 95 ++++++++ Enumerating a System over the Network/main.py | 12 + .../requirements.txt | Bin 0 -> 32 bytes .../unit_test.py | 55 +++++ .../utilities.py | 6 + .../vm2_Display_computer_name_(hostname).txt | 59 +++++ .../vm2_List_of_processes_(tasklist).txt | 54 +++++ .../vm2_List_user_accounts_(net_user).txt | 53 +++++ .../vm2_System_information_(systeminfo).txt | 53 +++++ 19 files changed, 919 insertions(+) create mode 100644 Enumerating a System over the Network/Programming and Algorithms 2 CW2.docx create mode 100644 Enumerating a System over the Network/README create mode 100644 Enumerating a System over the Network/__pycache__/config_handler.cpython-312.pyc create mode 100644 Enumerating a System over the Network/__pycache__/controller_app.cpython-312.pyc create mode 100644 Enumerating a System over the Network/__pycache__/utilities.cpython-312.pyc create mode 100644 Enumerating a System over the Network/clientkali.py create mode 100644 Enumerating a System over the Network/clientwindows.py create mode 100644 Enumerating a System over the Network/clientwindowsvm.py create mode 100644 Enumerating a System over the Network/config_handler.py create mode 100644 Enumerating a System over the Network/controller.py create mode 100644 Enumerating a System over the Network/controller_app.py create mode 100644 Enumerating a System over the Network/main.py create mode 100644 Enumerating a System over the Network/requirements.txt create mode 100644 Enumerating a System over the Network/unit_test.py create mode 100644 Enumerating a System over the Network/utilities.py create mode 100644 Enumerating a System over the Network/vm2_Display_computer_name_(hostname).txt create mode 100644 Enumerating a System over the Network/vm2_List_of_processes_(tasklist).txt create mode 100644 Enumerating a System over the Network/vm2_List_user_accounts_(net_user).txt create mode 100644 Enumerating a System over the Network/vm2_System_information_(systeminfo).txt diff --git a/Enumerating a System over the Network/Programming and Algorithms 2 CW2.docx b/Enumerating a System over the Network/Programming and Algorithms 2 CW2.docx new file mode 100644 index 0000000000000000000000000000000000000000..e73622c354f6019bed6230745d5f28a9110aae06 GIT binary patch literal 30183 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 b5DV_RuoiA6gR-9x1mSOSLMR;~5MjVSKQ}L~ literal 0 HcmV?d00001 diff --git a/Enumerating a System over the Network/__pycache__/controller_app.cpython-312.pyc b/Enumerating a System over the Network/__pycache__/controller_app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de8a9dec0aecb261428588d2483c3d2fff406203 GIT binary patch literal 7914 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 literal 0 HcmV?d00001 diff --git a/Enumerating a System over the Network/__pycache__/utilities.cpython-312.pyc b/Enumerating a System over the Network/__pycache__/utilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..136096996a9083e198c22ef8d746f2338b89994a GIT binary patch literal 724 zcmYjP&ubGw6rR~1`DN3TR8V4sfr54~fflSFMF@CM4^^n8Mpl+JJ83rV?u401(u6Ja z;6XvKw?<0Qi=gz;nh908c;{8cJ22X5^6&TjJqo;r2lY4uAtg*odn|G&V0+|m7{5A2pnCmxCR2AjCoEXR1d)6f84IV0G0rQ z9R-34fMUJAyscJ12O7!V;=0|&4DmWfq{W*pjz|sJs7id_4jjaZ05#Xcr3hLhha>wr_d%GwemlsX&yN zs75I%64<^dl{Y5ekED&P>Me7FVam(~p^k0dA=Q?T1J2Biz-^1T%e!ck(C20a+Y~LE z4=LHAw(q;a7P^MY-WCy4)O{vWk1*pRY__=Tx!lF9)a*v{@&(p(AZs!YofG=SJkv#ROdhcdLg7QcJga`0)ytQXYX%&ve*#01 i05m7uD7ESnr{&?>bY8&mVDi^IRUw2!MTZ8>3-}k0wzbXx literal 0 HcmV?d00001 diff --git a/Enumerating a System over the Network/clientkali.py b/Enumerating a System over the Network/clientkali.py new file mode 100644 index 0000000..4627724 --- /dev/null +++ b/Enumerating a System over the Network/clientkali.py @@ -0,0 +1,80 @@ +import socket +import subprocess + +class CommandExecutor: + """ + Class to execute commands and return their output. + """ + @staticmethod + def execute(command): + """ + Execute a command and return its output. + + Parameters: + command (str): The command to execute. + + Returns: + str: The output of the executed command. + """ + try: + output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT) + return output.decode() + except subprocess.CalledProcessError as e: + return e.output.decode() + +class Server: + """ + Class to handle server functionality. + """ + def __init__(self, host, port): + """ + Initialize the server. + + Parameters: + host (str): The host IP on which the server will listen. + port (int): The port number on which the server will listen. + """ + self.host = host + self.port = port + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def start(self): + """ + Start the server and listen for incoming connections. + """ + try: + self.server_socket.bind((self.host, self.port)) + self.server_socket.listen(1) # Limit to 1 pending connection + print("Server is listening on {}:{}".format(self.host, self.port)) + + while True: + client_socket, client_address = self.server_socket.accept() + print("Connection established with:", client_address) + + while True: + command = client_socket.recv(1024).decode().strip() + print("Received command:", command) + + if command == 'exit': + break + else: + output = CommandExecutor.execute(command) + client_socket.sendall(output.encode()) + + except Exception as e: + print("Error:", e) + finally: + client_socket.close() + self.server_socket.close() + +def main(): + """ + Main function to start the server. + """ + host = '0.0.0.0' # Listen on all available network interfaces + port = 12345 # Use a custom port (you can change it as needed) + server = Server(host, port) + server.start() + +if __name__ == "__main__": + main() diff --git a/Enumerating a System over the Network/clientwindows.py b/Enumerating a System over the Network/clientwindows.py new file mode 100644 index 0000000..1829f93 --- /dev/null +++ b/Enumerating a System over the Network/clientwindows.py @@ -0,0 +1,81 @@ +import socket +import subprocess +import os + +class CommandExecutor: + """ + Class to execute commands and return their output. + """ + @staticmethod + def execute(command): + """ + Execute a command and return its output. + + Parameters: + command (str): The command to execute. + + Returns: + str: The output of the executed command. + """ + try: + if os.name == 'nt': + # For Windows, ensure cmd is used to execute the command + output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, text=True, executable='/bin/sh') + else: + # For Unix-like systems + output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, text=True) + return output + except subprocess.CalledProcessError as e: + return e.output + +class Server: + """ + Class to handle server functionality. + """ + def __init__(self, host, port): + """ + Initialize the server. + + Parameters: + host (str): The host IP on which the server will listen. + port (int): The port number on which the server will listen. + """ + self.host = host + self.port = port + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def start(self): + """ + Start the server and listen for incoming connections. + """ + try: + self.server_socket.bind((self.host, self.port)) + self.server_socket.listen(1) + print(f"Server listening on {self.host}:{self.port}") + + while True: + client_socket, address = self.server_socket.accept() + print(f"Connection from {address} has been established.") + + while True: + command = client_socket.recv(1024).decode().strip() + if not command or command.lower() == 'exit': + break # Exit the loop if command is empty or 'exit' + print(f"Executing command: {command}") + output = CommandExecutor.execute(command) + client_socket.sendall(output.encode()) + + finally: + self.server_socket.close() + +def main(): + """ + Main function to start the server. + """ + host = '0.0.0.0' # Listen on all available network interfaces + port = 12345 # Port number should match the one used in the controller.py + server = Server(host, port) + server.start() + +if __name__ == "__main__": + main() diff --git a/Enumerating a System over the Network/clientwindowsvm.py b/Enumerating a System over the Network/clientwindowsvm.py new file mode 100644 index 0000000..b06b907 --- /dev/null +++ b/Enumerating a System over the Network/clientwindowsvm.py @@ -0,0 +1,78 @@ +import socket +import subprocess + +class CommandExecutor: + """ + Class to execute commands and return their output. + """ + @staticmethod + def execute(command): + """ + Execute a command and return its output. + + Parameters: + command (str): The command to execute. + + Returns: + str: The output of the executed command. + """ + try: + output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT) + return output.decode() + except subprocess.CalledProcessError as e: + return e.output.decode() + +class Server: + """ + Class to handle server functionality. + """ + def __init__(self, host, port): + """ + Initialize the server. + + Parameters: + host (str): The host IP on which the server will listen. + port (int): The port number on which the server will listen. + """ + self.host = host + self.port = port + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def start(self): + """ + Start the server and listen for incoming connections. + """ + try: + self.server_socket.bind((self.host, self.port)) + self.server_socket.listen(1) + print(f"Server is listening on {self.host}:{self.port}") + + while True: + client_socket, client_address = self.server_socket.accept() + print(f"Connection established with: {client_address}") + + while True: + command = client_socket.recv(1024).decode().strip() + if not command: + break # Connection closed by the client + print(f"Received command: {command}") + if command.lower() == 'exit': + break + output = CommandExecutor.execute(command) + client_socket.sendall(output.encode()) + except Exception as e: + print(f"Server error: {e}") + finally: + self.server_socket.close() + +def main(): + """ + Main function to start the server. + """ + host = '0.0.0.0' # Listen on all network interfaces + port = 12345 # The port on which to listen + server = Server(host, port) + server.start() + +if __name__ == "__main__": + main() diff --git a/Enumerating a System over the Network/config_handler.py b/Enumerating a System over the Network/config_handler.py new file mode 100644 index 0000000..09e0db5 --- /dev/null +++ b/Enumerating a System over the Network/config_handler.py @@ -0,0 +1,35 @@ +class ConfigHandler: + """Handles configurations for virtual machines and command sets.""" + def __init__(self): + self.vm_configs = { + 'vm1': {'ip': '192.168.0.37', 'port': 12345}, + 'vm2': {'ip': '192.168.31.137', 'port': 12345}, + 'vm3': {'ip': '192.168.0.196', 'port': 12345}, + } + self.commands = { + 'Linux': { + 'Get Users (cat /etc/passwd)': 'cat /etc/passwd', + 'Finding open Ports (nmap localhost)': 'nmap localhost', + 'List running processes (ps aux)': 'ps aux', + 'System information (uname -a)': 'uname -a', + 'Network information (ifconfig)': 'ifconfig', + 'Disk usage (df -h)': 'df -h', + }, + 'Windows': { + 'Display network info (ipconfig)': 'ipconfig', + 'Display network stats (netstat)': 'netstat', + 'List of processes (tasklist)': 'tasklist', + 'System information (systeminfo)': 'systeminfo', + 'List user accounts (net user)': 'net user', + 'List open ports (netstat -a -n)': 'netstat -a -n', + 'Display computer name (hostname)': 'hostname', + }, + } + + def get_vm_config(self, vm_name): + """Retrieves the configuration for a specified VM.""" + return self.vm_configs.get(vm_name, {}) + + def get_commands(self, os_type): + """Retrieves the command set for the specified OS type.""" + return self.commands.get(os_type, {}) diff --git a/Enumerating a System over the Network/controller.py b/Enumerating a System over the Network/controller.py new file mode 100644 index 0000000..4c4c202 --- /dev/null +++ b/Enumerating a System over the Network/controller.py @@ -0,0 +1,217 @@ +import socket # Import the socket module for networking functionality +import tkinter as tk # Import the tkinter module for GUI +from tkinter import scrolledtext, ttk # Import specific components from tkinter + +class ConfigHandler: + """ + Handles configurations for virtual machines (VMs) and commands for different operating systems. + """ + def __init__(self): + """ + Initializes the ConfigHandler class with predefined VM configurations and commands for Linux and Windows. + """ + # Define VM configurations and commands for Linux and Windows + self.vm_configs = { + 'vm1': {'ip': '192.168.0.37', 'port': 12345}, + 'vm2': {'ip': '192.168.31.137', 'port': 12345}, + 'vm3': {'ip': '192.168.0.196', 'port': 12345}, + } + self.commands = { + 'Linux': { + 'Get Users (cat /etc/passwd)': 'cat /etc/passwd', + 'Finding open Ports (nmap localhost)': 'nmap localhost', + 'List running processes (ps aux)': 'ps aux', + 'System information (uname -a)': 'uname -a', + 'Network information (ifconfig)': 'ifconfig', + 'Disk usage (df -h)': 'df -h', + }, + 'Windows': { + 'Display network info (ipconfig)': 'ipconfig', + 'Display network stats (netstat)': 'netstat', + 'List of processes (tasklist)': 'tasklist', + 'System information (systeminfo)': 'systeminfo', + 'List user accounts (net user)': 'net user', + 'List open ports (netstat -a -n)': 'netstat -a -n', + 'Display computer name (hostname)': 'hostname', + }, + } + + def get_vm_config(self, vm_name): + """ + Retrieve configuration for a specific VM. + + Parameters: + vm_name (str): Name of the VM. + + Returns: + dict: Configuration of the specified VM. + """ + return self.vm_configs.get(vm_name, {}) + + def get_commands(self, os_type): + """ + Retrieve commands for a specific operating system. + + Parameters: + os_type (str): Type of operating system ('Linux' or 'Windows'). + + Returns: + dict: Dictionary containing commands for the specified OS. + """ + return self.commands.get(os_type, {}) + +def save_command_output(vm_label, command, output): + """ + Save command output to a file. + + Parameters: + vm_label (str): Label identifying the VM. + command (str): Command executed on the VM. + output (str): Output of the executed command. + """ + # Generate filename based on VM label and command + filename = f"{vm_label}_{command.replace(' ', '_')}.txt" + # Write output to file + with open(filename, 'w') as file: + file.write(output) + # Print confirmation message + print(f"Output saved to {filename}") + +class ControllerApp: + """ + Main application class for controlling VMs. + """ + def __init__(self, master): + """ + Initialize the ControllerApp class. + + Parameters: + master: Parent tkinter widget. + """ + # Initialize ConfigHandler and tkinter window + self.config_handler = ConfigHandler() + self.master = master + master.title("VM Controller") + + # Initialize lists to store connection labels and sockets + self.connection_labels = [] + self.sockets = {} + # Connect to VMs and set up UI + self.connect_to_vms() + self.setup_ui() + + def connect_to_vms(self): + """ + Connect to VMs using sockets and display connection status. + """ + # Iterate over VM configurations + for vm_name, config in self.config_handler.vm_configs.items(): + try: + # Create socket and connect to VM + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((config['ip'], config['port'])) + # Store socket in dictionary + self.sockets[vm_name] = sock + # Create label indicating successful connection + self.connection_labels.append(tk.Label(self.master, text=f"Connected to {vm_name}.")) + except Exception as e: + # Create label indicating connection error + self.connection_labels.append(tk.Label(self.master, text=f"Error connecting to {vm_name}: {e}")) + + # Display connection labels + for label in self.connection_labels: + label.pack() + + def setup_ui(self): + """ + Set up the user interface (UI) for the application. + """ + # Set up radio buttons for selecting VM and operating system + self.vm_selection_var = tk.StringVar(value="vm1") + self.os_selection_var = tk.StringVar(value="Linux") + + for vm_name in self.config_handler.vm_configs.keys(): + tk.Radiobutton(self.master, text=vm_name.upper(), variable=self.vm_selection_var, value=vm_name).pack() + + tk.Radiobutton(self.master, text="Linux", variable=self.os_selection_var, value="Linux", command=self.update_command_list).pack() + tk.Radiobutton(self.master, text="Windows", variable=self.os_selection_var, value="Windows", command=self.update_command_list).pack() + + # Set up dropdown menu for selecting commands + self.command_var = tk.StringVar() + self.command_dropdown = ttk.Combobox(self.master, textvariable=self.command_var, width=50) + self.update_command_list() + self.command_dropdown['state'] = 'readonly' + self.command_dropdown.pack() + + # Set up buttons for sending commands + tk.Button(self.master, text="Send Command", command=self.send_command).pack() + tk.Button(self.master, text="Send to All VMs", command=self.send_command_to_all).pack() + + # Set up scrolled text widget for displaying command output + self.output_text = scrolledtext.ScrolledText(self.master, height=10) + self.output_text.pack() + + def update_command_list(self): + """ + Update the command dropdown list based on the selected operating system. + """ + # Retrieve commands for selected operating system + os_selected = self.os_selection_var.get() + commands = self.config_handler.get_commands(os_selected) + # Update dropdown values with commands + self.command_dropdown['values'] = list(commands.keys()) + self.command_dropdown.set('') + + def send_command(self): + """ + Send a command to a selected VM and display the output. + """ + # Get selected VM, command, and command text + vm_selected = self.vm_selection_var.get() + command_text = self.command_var.get() + command = self.config_handler.get_commands(self.os_selection_var.get()).get(command_text, "") + # Send command to VM if it's connected + if vm_selected in self.sockets: + sock = self.sockets[vm_selected] + sock.sendall(command.encode()) + output = sock.recv(4096).decode() + # Display output and save to file + self.output_text.delete('1.0', tk.END) + self.output_text.insert(tk.INSERT, output) + save_command_output(vm_selected, command_text, output) + + def send_command_to_all(self): + """ + Send a command to all connected VMs and display the output. + """ + # Get selected command and command text + command_text = self.command_var.get() + command = self.config_handler.get_commands(self.os_selection_var.get()).get(command_text, "") + outputs = [] + # Send command to each connected VM + for vm_name, sock in self.sockets.items(): + sock.sendall(command.encode()) + output = sock.recv(4096).decode() + outputs.append(f"{vm_name.upper()}:\n{output}") + # Save output to file + save_command_output(vm_name, command_text, output) + # Display combined output + self.output_text.delete('1.0', tk.END) + self.output_text.insert(tk.INSERT, "\n\n".join(outputs)) + +def on_closing(): + """ + Handle closing event of the application. + """ + # Close sockets and destroy tkinter window + for sock in app.sockets.values(): + sock.close() + app.master.destroy() + +# Create tkinter window and ControllerApp instance +root = tk.Tk() +app = ControllerApp(root) +# Register closing event handler +root.protocol("WM_DELETE_WINDOW", on_closing) +# Start the main event loop +root.mainloop() diff --git a/Enumerating a System over the Network/controller_app.py b/Enumerating a System over the Network/controller_app.py new file mode 100644 index 0000000..dcc15d5 --- /dev/null +++ b/Enumerating a System over the Network/controller_app.py @@ -0,0 +1,95 @@ +import tkinter as tk +from tkinter import scrolledtext, ttk +from config_handler import ConfigHandler +from utilities import save_command_output +import socket + +class ControllerApp: + """The main application class for controlling virtual machines via a GUI.""" + def __init__(self, master): + self.config_handler = ConfigHandler() + self.master = master + master.title("VM Controller") + + self.sockets = {} + self.connect_to_vms() + self.setup_ui() + + def connect_to_vms(self): + """Establishes socket connections to VMs based on configuration.""" + for vm_name, config in self.config_handler.vm_configs.items(): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((config['ip'], config['port'])) + self.sockets[vm_name] = sock + print(f"Connected to {vm_name}.") + except Exception as e: + print(f"Error connecting to {vm_name}: {e}") + + def setup_ui(self): + """Sets up the UI elements of the application.""" + # VM selection + self.vm_selection_var = tk.StringVar(value="vm1") + for vm_name in self.config_handler.vm_configs.keys(): + tk.Radiobutton(self.master, text=vm_name.upper(), variable=self.vm_selection_var, value=vm_name).pack() + + # OS selection + self.os_selection_var = tk.StringVar(value="Linux") + tk.Radiobutton(self.master, text="Linux", variable=self.os_selection_var, value="Linux", command=self.update_command_list).pack() + tk.Radiobutton(self.master, text="Windows", variable=self.os_selection_var, value="Windows", command=self.update_command_list).pack() + + # Command selection dropdown + self.command_var = tk.StringVar() + self.command_dropdown = ttk.Combobox(self.master, textvariable=self.command_var, width=50) + self.command_dropdown['values'] = list(self.config_handler.get_commands('Linux').keys()) + self.command_dropdown['state'] = 'readonly' + self.command_dropdown.pack() + + # Send command button + tk.Button(self.master, text="Send Command", command=self.send_command).pack() + + # Send to all VMs button + tk.Button(self.master, text="Send to All VMs", command=self.send_command_to_all).pack() + + # Output text area + self.output_text = scrolledtext.ScrolledText(self.master, height=10) + self.output_text.pack() + + def update_command_list(self): + """Updates the command list based on the selected OS.""" + os_selected = self.os_selection_var.get() + commands = self.config_handler.get_commands(os_selected) + self.command_dropdown['values'] = list(commands.keys()) + self.command_dropdown.set('') # Reset the dropdown + + def send_command(self): + """Sends the selected command to the chosen VM.""" + vm_selected = self.vm_selection_var.get() + command_text = self.command_var.get() + command = self.config_handler.get_commands(self.os_selection_var.get()).get(command_text, "") + if vm_selected in self.sockets: + sock = self.sockets[vm_selected] + sock.sendall(command.encode()) + output = sock.recv(4096).decode() + self.output_text.delete('1.0', tk.END) + self.output_text.insert(tk.INSERT, output) + save_command_output(vm_selected, command_text, output) + + def send_command_to_all(self): + """Sends the selected command to all VMs and displays their outputs.""" + command_text = self.command_var.get() + command = self.config_handler.get_commands(self.os_selection_var.get()).get(command_text, "") + outputs = [] + for vm_name, sock in self.sockets.items(): + sock.sendall(command.encode()) + output = sock.recv(4096).decode() + outputs.append(f"{vm_name.upper()}:\n{output}") + save_command_output(vm_name, command_text, output) + self.output_text.delete('1.0', tk.END) + self.output_text.insert(tk.INSERT, "\n\n".join(outputs)) + + def on_closing(self): + """Handles the closing event of the application.""" + for sock in self.sockets.values(): + sock.close() + self.master.destroy() diff --git a/Enumerating a System over the Network/main.py b/Enumerating a System over the Network/main.py new file mode 100644 index 0000000..8e37a06 --- /dev/null +++ b/Enumerating a System over the Network/main.py @@ -0,0 +1,12 @@ +import tkinter as tk +from controller_app import ControllerApp + +def main(): + """Main function to run the application.""" + root = tk.Tk() + app = ControllerApp(root) + root.protocol("WM_DELETE_WINDOW", app.on_closing) + root.mainloop() + +if __name__ == "__main__": + main() diff --git a/Enumerating a System over the Network/requirements.txt b/Enumerating a System over the Network/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..79dc36987b878bea3430bbcaf245e7f7aae34934 GIT binary patch literal 32 kcmezWuYjSLp_HM7A(J78!4?Qj8T1$|f!Kn9mw}4`0FxL7G5`Po literal 0 HcmV?d00001 diff --git a/Enumerating a System over the Network/unit_test.py b/Enumerating a System over the Network/unit_test.py new file mode 100644 index 0000000..3f63d7c --- /dev/null +++ b/Enumerating a System over the Network/unit_test.py @@ -0,0 +1,55 @@ +import unittest +from config_handler import ConfigHandler +from utilities import save_command_output +import os + +class TestConfigHandler(unittest.TestCase): + def setUp(self): + """Initialize ConfigHandler before each test.""" + self.config = ConfigHandler() + + def test_get_vm_config_exists(self): + """Test retrieving existing VM configuration.""" + vm1_config = self.config.get_vm_config('vm1') + self.assertEqual(vm1_config['ip'], '192.168.0.37') + + def test_get_vm_config_not_exists(self): + """Test retrieving non-existing VM configuration.""" + vm_config = self.config.get_vm_config('vm_nonexistent') + self.assertEqual(vm_config, {}) + + def test_get_commands_linux(self): + """Test retrieving Linux commands.""" + linux_commands = self.config.get_commands('Linux') + self.assertIn('Get Users (cat /etc/passwd)', linux_commands) + + def test_get_commands_windows(self): + """Test retrieving Windows commands.""" + windows_commands = self.config.get_commands('Windows') + self.assertIn('Display network info (ipconfig)', windows_commands) + + def test_get_commands_no_os(self): + """Test retrieving commands for an unsupported OS type.""" + no_os_commands = self.config.get_commands('NoOS') + self.assertEqual(no_os_commands, {}) + +class TestUtilities(unittest.TestCase): + def test_save_command_output_content(self): + """Test saving command output to a file and verify content.""" + test_vm_label = "test_vm" + test_command = "echo_Hello" + test_output = "Hello World" + save_command_output(test_vm_label, test_command, test_output) + expected_filename = f"{test_vm_label}_{test_command}.txt" + + # Verify file content + with open(expected_filename, 'r') as file: + content = file.read() + self.assertEqual(content, test_output) + + # Cleanup + if os.path.exists(expected_filename): + os.remove(expected_filename) + +if __name__ == "__main__": + unittest.main() diff --git a/Enumerating a System over the Network/utilities.py b/Enumerating a System over the Network/utilities.py new file mode 100644 index 0000000..307d646 --- /dev/null +++ b/Enumerating a System over the Network/utilities.py @@ -0,0 +1,6 @@ +def save_command_output(vm_label, command, output): + """Saves the output of a command to a file.""" + filename = f"{vm_label}_{command.replace(' ', '_')}.txt" + with open(filename, 'w') as file: + file.write(output) + print(f"Output saved to {filename}") diff --git a/Enumerating a System over the Network/vm2_Display_computer_name_(hostname).txt b/Enumerating a System over the Network/vm2_Display_computer_name_(hostname).txt new file mode 100644 index 0000000..64012f7 --- /dev/null +++ b/Enumerating a System over the Network/vm2_Display_computer_name_(hostname).txt @@ -0,0 +1,59 @@ +WmiPrvSE.exe 4788 Services 0 14,552 K +WmiPrvSE.exe 1180 Services 0 8,472 K +TrustedInstaller.exe 8516 Services 0 7,252 K +TiWorker.exe 8964 Services 0 10,180 K +cmd.exe 8928 Console 2 3,900 K +tasklist.exe 3496 Console 2 8,792 K + +Host Name: DESKTOP-GKBPAO7 +OS Name: Microsoft Windows 10 Home +OS Version: 10.0.19045 N/A Build 19045 +OS Manufacturer: Microsoft Corporation +OS Configuration: Standalone Workstation +OS Build Type: Multiprocessor Free +Registered Owner: jordanchatha@gmail.com +Registered Organization: +Product ID: 00326-10000-00000-AA995 +Original Install Date: 04/04/2024, 16:13:48 +System Boot Time: 04/04/2024, 16:13:27 +System Manufacturer: VMware, Inc. +System Model: VMware20,1 +System Type: x64-based PC +Processor(s): 1 Processor(s) Installed. + [01]: Intel64 Family 6 Model 165 Stepping 2 GenuineIntel ~2304 Mhz +BIOS Version: VMware, Inc. VMW201.00V.21805430.B64.2305221830, 22/05/2023 +Windows Directory: C:\Windows +System Directory: C:\Windows\system32 +Boot Device: \Device\HarddiskVolume1 +System Locale: en-gb;English (United Kingdom) +Input Locale: en-gb;English (United Kingdom) +Time Zone: (UTC+00:00) Dublin, Edinburgh, Lisbon, London +Total Physical Memory: 2,047 MB +Available Physical Memory: 339 MB +Virtual Memory: Max Size: 5,840 MB +Virtual Memory: Available: 1,100 MB +Virtual Memory: In Use: 4,740 MB +Page File Location(s): C:\pagefile.sys +Domain: WORKGROUP +Logon Server: \\WIN-VAODCDP5ECI +Hotfix(s): 8 Hotfix(s) Installed. + [01]: KB5031988 + [02]: KB5034468 + [03]: KB5011048 + [04]: KB5015684 + [05]: KB5035845 + [06]: KB5014032 + [07]: KB5032907 + [08]: KB5036447 +Network Card(s): 2 NIC(s) Installed. + [01]: Bluetooth Device (Personal Area Network) + Connection Name: Bluetooth Network Connection + Status: Media disconnected + [02]: Intel(R) 82574L Gigabit Network Connection + Connection Name: Ethernet0 + DHCP Enabled: Yes + DHCP Server: 192.168.31.254 + IP address(es) + [01]: 192.168.31.137 + [02]: fe80::632d:64c9:5b6d:248e +Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed. diff --git a/Enumerating a System over the Network/vm2_List_of_processes_(tasklist).txt b/Enumerating a System over the Network/vm2_List_of_processes_(tasklist).txt new file mode 100644 index 0000000..81c9ee5 --- /dev/null +++ b/Enumerating a System over the Network/vm2_List_of_processes_(tasklist).txt @@ -0,0 +1,54 @@ + +Image Name PID Session Name Session# Mem Usage +========================= ======== ================ =========== ============ +System Idle Process 0 Services 0 8 K +System 4 Services 0 N/A +Registry 72 Services 0 4,960 K +smss.exe 532 Services 0 N/A +csrss.exe 632 Services 0 576 K +wininit.exe 748 Services 0 N/A +services.exe 808 Services 0 3,528 K +lsass.exe 816 Services 0 5,028 K +fontdrvhost.exe 932 Services 0 N/A +svchost.exe 968 Services 0 5,660 K +svchost.exe 556 Services 0 6,476 K +svchost.exe 1036 Services 0 18,424 K +svchost.exe 1052 Services 0 2,980 K +svchost.exe 1136 Services 0 3,508 K +svchost.exe 1268 Services 0 984 K +svchost.exe 1300 Services 0 N/A +svchost.exe 1356 Services 0 1,104 K +svchost.exe 1436 Services 0 4,560 K +svchost.exe 1496 Services 0 4,100 K +svchost.exe 1744 Services 0 N/A +Memory Compression 1312 Services 0 620,976 K +svchost.exe 1568 Services 0 8 K +svchost.exe 1480 Services 0 20 K +spoolsv.exe 2064 Services 0 N/A +svchost.exe 2092 Services 0 1,388 K +svchost.exe 2228 Services 0 3,368 K +SearchIndexer.exe 2512 Services 0 2,452 K +svchost.exe 3224 Services 0 1,204 K +svchost.exe 4120 Services 0 44 K +svchost.exe 1276 Services 0 N/A +SgrmBroker.exe 1220 Services 0 2,384 K +svchost.exe 1456 Services 0 N/A +SecurityHealthService.exe 408 Services 0 312 K +csrss.exe 1552 Console 2 1,084 K +winlogon.exe 2608 Console 2 464 K +dwm.exe 3812 Console 2 14,568 K +fontdrvhost.exe 4400 Console 2 N/A +sihost.exe 3060 Console 2 1,872 K +svchost.exe 1216 Console 2 1,552 K +ctfmon.exe 4812 Console 2 260 K +explorer.exe 1376 Console 2 19,188 K +smartscreen.exe 4184 Console 2 220 K +dllhost.exe 4424 Console 2 2,268 K +svchost.exe 3704 Console 2 2,148 K +StartMenuExperienceHost.e 3240 Console 2 4,240 K +RuntimeBroker.exe 2680 Console 2 1,628 K +SearchApp.exe 848 Console 2 N/A +RuntimeBroker.exe 548 Console 2 2,328 K +RuntimeBroker.exe 5176 Console 2 772 K +svchost.exe 5244 Services 0 1,216 K +SettingSyncHost.exe 5828 Con \ No newline at end of file diff --git a/Enumerating a System over the Network/vm2_List_user_accounts_(net_user).txt b/Enumerating a System over the Network/vm2_List_user_accounts_(net_user).txt new file mode 100644 index 0000000..9d00d3d --- /dev/null +++ b/Enumerating a System over the Network/vm2_List_user_accounts_(net_user).txt @@ -0,0 +1,53 @@ +sole 2 840 K +taskhostw.exe 6044 Console 2 600 K +ShellExperienceHost.exe 308 Console 2 N/A +RuntimeBroker.exe 6404 Console 2 368 K +SecurityHealthSystray.exe 6972 Console 2 2,340 K +OneDrive.exe 6332 Console 2 1,472 K +TextInputHost.exe 3616 Console 2 976 K +ApplicationFrameHost.exe 572 Console 2 N/A +svchost.exe 6620 Services 0 600 K +dllhost.exe 7028 Console 2 N/A +taskhostw.exe 7212 Console 2 N/A +msedge.exe 5576 Console 2 53,796 K +msedge.exe 1520 Console 2 N/A +msedge.exe 1408 Console 2 21,084 K +msedge.exe 6548 Console 2 16,224 K +msedge.exe 3744 Console 2 1,652 K +msedge.exe 5764 Console 2 228 K +msedge.exe 6792 Console 2 5,756 K +Code.exe 7632 Console 2 19,836 K +Code.exe 1740 Console 2 N/A +Code.exe 1504 Console 2 13,460 K +Code.exe 2296 Console 2 6,416 K +Code.exe 2468 Console 2 78,592 K +Code.exe 3032 Console 2 3,884 K +Code.exe 6300 Console 2 2,040 K +Code.exe 7652 Console 2 7,436 K +Code.exe 7696 Console 2 17,892 K +conhost.exe 6000 Console 2 N/A +powershell.exe 4564 Console 2 592 K +Code.exe 5836 Console 2 2,364 K +SkypeBridge.exe 4992 Console 2 14,572 K +msedge.exe 5508 Console 2 3,312 K +msedge.exe 3800 Console 2 4,228 K +msedge.exe 1584 Console 2 1,096 K +msedge.exe 432 Console 2 77,404 K +msedge.exe 6780 Console 2 852 K +MsMpEng.exe 5644 Services 0 61,856 K +NisSrv.exe 6156 Services 0 2,264 K +msedge.exe 4880 Console 2 76,092 K +msedge.exe 4932 Console 2 76,960 K +msedge.exe 2816 Console 2 68,492 K +msedge.exe 2328 Console 2 73,444 K +msedge.exe 4616 Console 2 77,064 K +CodeSetup-stable-5c3e652f 2648 Console 2 N/A +CodeSetup-stable-5c3e652f 4144 Console 2 400 K +taskhostw.exe 3588 Console 2 N/A +MusNotifyIcon.exe 5704 Console 2 N/A +SearchApp.exe 10024 Console 2 N/A +msedge.exe 5416 Console 2 460 K +svchost.exe 8892 Services 0 848 K +conhost.exe 6536 Console 2 2,160 K +powershell.exe 8208 Console 2 41,600 K +backgroundTaskHost.exe 8496 Console 2 8 K diff --git a/Enumerating a System over the Network/vm2_System_information_(systeminfo).txt b/Enumerating a System over the Network/vm2_System_information_(systeminfo).txt new file mode 100644 index 0000000..331a8a9 --- /dev/null +++ b/Enumerating a System over the Network/vm2_System_information_(systeminfo).txt @@ -0,0 +1,53 @@ +sole 2 N/A +taskhostw.exe 6044 Console 2 588 K +ShellExperienceHost.exe 308 Console 2 N/A +RuntimeBroker.exe 6404 Console 2 752 K +SecurityHealthSystray.exe 6972 Console 2 692 K +OneDrive.exe 6332 Console 2 1,896 K +TextInputHost.exe 3616 Console 2 2,080 K +ApplicationFrameHost.exe 572 Console 2 N/A +svchost.exe 6620 Services 0 N/A +dllhost.exe 7028 Console 2 N/A +taskhostw.exe 7212 Console 2 456 K +msedge.exe 5576 Console 2 56,676 K +msedge.exe 1520 Console 2 N/A +msedge.exe 1408 Console 2 20,764 K +msedge.exe 6548 Console 2 16,216 K +msedge.exe 3744 Console 2 1,380 K +msedge.exe 5764 Console 2 696 K +msedge.exe 6792 Console 2 1,992 K +Code.exe 7632 Console 2 9,000 K +Code.exe 1740 Console 2 N/A +Code.exe 1504 Console 2 12,936 K +Code.exe 2296 Console 2 3,088 K +Code.exe 2468 Console 2 40,008 K +Code.exe 3032 Console 2 3,636 K +Code.exe 6300 Console 2 2,060 K +Code.exe 7652 Console 2 4,696 K +Code.exe 7696 Console 2 10,880 K +conhost.exe 6000 Console 2 N/A +powershell.exe 4564 Console 2 588 K +Code.exe 5836 Console 2 2,280 K +SkypeBridge.exe 4992 Console 2 3,636 K +msedge.exe 5508 Console 2 4,280 K +msedge.exe 3800 Console 2 5,252 K +msedge.exe 1584 Console 2 1,080 K +msedge.exe 432 Console 2 74,168 K +msedge.exe 6780 Console 2 216 K +MsMpEng.exe 5644 Services 0 47,680 K +NisSrv.exe 6156 Services 0 2,128 K +msedge.exe 4880 Console 2 70,392 K +msedge.exe 4932 Console 2 72,084 K +msedge.exe 2816 Console 2 59,500 K +msedge.exe 2328 Console 2 69,652 K +msedge.exe 4616 Console 2 137,364 K +CodeSetup-stable-5c3e652f 2648 Console 2 N/A +CodeSetup-stable-5c3e652f 4144 Console 2 400 K +MusNotifyIcon.exe 5704 Console 2 N/A +SearchApp.exe 10024 Console 2 N/A +msedge.exe 5416 Console 2 1,524 K +svchost.exe 5792 Services 0 N/A +WmiPrvSE.exe 7440 Services 0 172 K +conhost.exe 5916 Console 2 996 K +powershell.exe 8952 Console 2 1,616 K +python3.11.exe 3904 Console 2 5,140 K