From b4f3bacb9980a9e3719236921ad3c391b9f130d7 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Fri, 17 Nov 2023 16:55:57 -0500 Subject: [PATCH 01/56] refactor(nxcdb): move shared fdatabase functions to single file --- nxc/database.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++ nxc/nxcdb.py | 93 +++++-------------------------------------------- 2 files changed, 99 insertions(+), 84 deletions(-) create mode 100644 nxc/database.py diff --git a/nxc/database.py b/nxc/database.py new file mode 100644 index 00000000..556e192a --- /dev/null +++ b/nxc/database.py @@ -0,0 +1,90 @@ +import sys +import configparser +import shutil +from sqlalchemy import create_engine +from sqlite3 import connect +from os import mkdir +from os.path import exists +from os.path import join as path_join + +from nxc.loaders.protocolloader import ProtocolLoader +from nxc.paths import WS_PATH, WORKSPACE_DIR + +def create_db_engine(db_path): + return create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) + + +def open_config(config_path): + try: + config = configparser.ConfigParser() + config.read(config_path) + except Exception as e: + print(f"[-] Error reading nxc.conf: {e}") + sys.exit(1) + return config + + +def get_workspace(config): + return config.get("nxc", "workspace") + + +def get_db(config): + return config.get("nxc", "last_used_db") + + +def write_configfile(config, config_path): + with open(config_path, "w") as configfile: + config.write(configfile) + + +def create_workspace(workspace_name, p_loader, protocols): + mkdir(path_join(WORKSPACE_DIR, workspace_name)) + + for protocol in protocols: + protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) + proto_db_path = path_join(WORKSPACE_DIR, workspace_name, f"{protocol}.db") + + if not exists(proto_db_path): + print(f"[*] Initializing {protocol.upper()} protocol database") + conn = connect(proto_db_path) + c = conn.cursor() + + # try to prevent some weird sqlite I/O errors + c.execute("PRAGMA journal_mode = OFF") + c.execute("PRAGMA foreign_keys = 1") + + protocol_object.database.db_schema(c) + + # commit the changes and close everything off + conn.commit() + conn.close() + + +def delete_workspace(workspace_name): + shutil.rmtree(path_join(WORKSPACE_DIR, workspace_name)) + + +def initialize_db(logger): + if not exists(path_join(WS_PATH, "default")): + logger.debug("Creating default workspace") + mkdir(path_join(WS_PATH, "default")) + + p_loader = ProtocolLoader() + protocols = p_loader.get_protocols() + for protocol in protocols: + protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) + proto_db_path = path_join(WS_PATH, "default", f"{protocol}.db") + + if not exists(proto_db_path): + logger.debug(f"Initializing {protocol.upper()} protocol database") + conn = connect(proto_db_path) + c = conn.cursor() + # try to prevent some weird sqlite I/O errors + c.execute("PRAGMA journal_mode = OFF") # could try setting to PERSIST if DB corruption starts occurring + c.execute("PRAGMA foreign_keys = 1") + # set a small timeout (5s) so if another thread is writing to the database, the entire program doesn't crash + c.execute("PRAGMA busy_timeout = 5000") + protocol_object.database.db_schema(c) + # commit the changes and close everything off + conn.commit() + conn.close() \ No newline at end of file diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index 0c9f4c28..27ce0c7f 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -1,31 +1,23 @@ import cmd -import configparser import csv +import sys import os from os import listdir from os.path import exists from os.path import join as path_join -import shutil -from sqlite3 import connect -import sys from textwrap import dedent - from requests import get, post, ConnectionError -from sqlalchemy import create_engine from terminaltables import AsciiTable from nxc.loaders.protocolloader import ProtocolLoader -from nxc.paths import CONFIG_PATH, WS_PATH, WORKSPACE_DIR +from nxc.paths import CONFIG_PATH, WORKSPACE_DIR +from nxc.database import create_db_engine, open_config, get_workspace, get_db, write_configfile, create_workspace class UserExitedProto(Exception): pass -def create_db_engine(db_path): - return create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) - - def print_table(data, title=None): print() table = AsciiTable(data) @@ -446,29 +438,15 @@ class NXCDBMenu(cmd.Cmd): def __init__(self, config_path): cmd.Cmd.__init__(self) self.config_path = config_path - - try: - self.config = configparser.ConfigParser() - self.config.read(self.config_path) - except Exception as e: - print(f"[-] Error reading nxc.conf: {e}") - sys.exit(1) - self.conn = None self.p_loader = ProtocolLoader() self.protocols = self.p_loader.get_protocols() - self.workspace = self.config.get("nxc", "workspace") + self.config = open_config(self.config_path) + self.workspace = get_workspace(self.config) + self.db = get_db(self.config) self.do_workspace(self.workspace) - self.db = self.config.get("nxc", "last_used_db") - if self.db: - self.do_proto(self.db) - - def write_configfile(self): - with open(self.config_path, "w") as configfile: - self.config.write(configfile) - def do_proto(self, proto): if not proto: return @@ -479,7 +457,7 @@ class NXCDBMenu(cmd.Cmd): db_nav_object = self.p_loader.load_protocol(self.protocols[proto]["nvpath"]) db_object = self.p_loader.load_protocol(self.protocols[proto]["dbpath"]) self.config.set("nxc", "last_used_db", proto) - self.write_configfile() + write_configfile(self.config, self.config_path) try: proto_menu = db_nav_object.navigator(self, db_object.database(self.conn), proto) proto_menu.cmdloop() @@ -506,7 +484,7 @@ class NXCDBMenu(cmd.Cmd): if subcommand == "create": new_workspace = line.split()[1].strip() print(f"[*] Creating workspace '{new_workspace}'") - self.create_workspace(new_workspace, self.p_loader, self.protocols) + create_workspace(new_workspace, self.p_loader, self.protocols) self.do_workspace(new_workspace) elif subcommand == "list": print("[*] Enumerating Workspaces") @@ -517,7 +495,7 @@ class NXCDBMenu(cmd.Cmd): print(workspace) elif exists(path_join(WORKSPACE_DIR, line)): self.config.set("nxc", "workspace", line) - self.write_configfile() + write_configfile(self.config, self.config_path) self.workspace = line self.prompt = f"nxcdb ({line}) > " @@ -539,59 +517,6 @@ class NXCDBMenu(cmd.Cmd): """ print_help(help_string) - @staticmethod - def create_workspace(workspace_name, p_loader, protocols): - os.mkdir(path_join(WORKSPACE_DIR, workspace_name)) - - for protocol in protocols: - protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) - proto_db_path = path_join(WORKSPACE_DIR, workspace_name, f"{protocol}.db") - - if not exists(proto_db_path): - print(f"[*] Initializing {protocol.upper()} protocol database") - conn = connect(proto_db_path) - c = conn.cursor() - - # try to prevent some weird sqlite I/O errors - c.execute("PRAGMA journal_mode = OFF") - c.execute("PRAGMA foreign_keys = 1") - - protocol_object.database.db_schema(c) - - # commit the changes and close everything off - conn.commit() - conn.close() - - -def delete_workspace(workspace_name): - shutil.rmtree(path_join(WORKSPACE_DIR, workspace_name)) - - -def initialize_db(logger): - if not exists(path_join(WS_PATH, "default")): - logger.debug("Creating default workspace") - os.mkdir(path_join(WS_PATH, "default")) - - p_loader = ProtocolLoader() - protocols = p_loader.get_protocols() - for protocol in protocols: - protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) - proto_db_path = path_join(WS_PATH, "default", f"{protocol}.db") - - if not exists(proto_db_path): - logger.debug(f"Initializing {protocol.upper()} protocol database") - conn = connect(proto_db_path) - c = conn.cursor() - # try to prevent some weird sqlite I/O errors - c.execute("PRAGMA journal_mode = OFF") # could try setting to PERSIST if DB corruption starts occurring - c.execute("PRAGMA foreign_keys = 1") - # set a small timeout (5s) so if another thread is writing to the database, the entire program doesn't crash - c.execute("PRAGMA busy_timeout = 5000") - protocol_object.database.db_schema(c) - # commit the changes and close everything off - conn.commit() - conn.close() - def main(): if not exists(CONFIG_PATH): From 861626d06127976a4dc25ce170ede3e01286614c Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Fri, 17 Nov 2023 21:24:03 -0500 Subject: [PATCH 02/56] refactor: deduplicate code and simplify initial db setup --- nxc/database.py | 51 +++++++++++++++++++++++------------------------- nxc/first_run.py | 4 ++-- nxc/netexec.py | 7 +------ nxc/nxcdb.py | 2 +- nxc/paths.py | 2 +- 5 files changed, 29 insertions(+), 37 deletions(-) diff --git a/nxc/database.py b/nxc/database.py index 556e192a..45ddc241 100644 --- a/nxc/database.py +++ b/nxc/database.py @@ -8,7 +8,9 @@ from os.path import exists from os.path import join as path_join from nxc.loaders.protocolloader import ProtocolLoader -from nxc.paths import WS_PATH, WORKSPACE_DIR +from nxc.paths import WORKSPACE_DIR +from nxc.logger import nxc_logger + def create_db_engine(db_path): return create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) @@ -37,8 +39,25 @@ def write_configfile(config, config_path): config.write(configfile) -def create_workspace(workspace_name, p_loader, protocols): - mkdir(path_join(WORKSPACE_DIR, workspace_name)) +def create_workspace(workspace_name, p_loader=None): + """ + Create a new workspace with the given name. + + Args: + ---- + workspace_name (str): The name of the workspace. + + Returns: + ------- + None + """ + if not exists(path_join(WORKSPACE_DIR, workspace_name)): + nxc_logger.debug(f"Creating {workspace_name} workspace") + mkdir(path_join(WORKSPACE_DIR, workspace_name)) + + if p_loader is None: + p_loader = ProtocolLoader() + protocols = p_loader.get_protocols() for protocol in protocols: protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) @@ -64,27 +83,5 @@ def delete_workspace(workspace_name): shutil.rmtree(path_join(WORKSPACE_DIR, workspace_name)) -def initialize_db(logger): - if not exists(path_join(WS_PATH, "default")): - logger.debug("Creating default workspace") - mkdir(path_join(WS_PATH, "default")) - - p_loader = ProtocolLoader() - protocols = p_loader.get_protocols() - for protocol in protocols: - protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) - proto_db_path = path_join(WS_PATH, "default", f"{protocol}.db") - - if not exists(proto_db_path): - logger.debug(f"Initializing {protocol.upper()} protocol database") - conn = connect(proto_db_path) - c = conn.cursor() - # try to prevent some weird sqlite I/O errors - c.execute("PRAGMA journal_mode = OFF") # could try setting to PERSIST if DB corruption starts occurring - c.execute("PRAGMA foreign_keys = 1") - # set a small timeout (5s) so if another thread is writing to the database, the entire program doesn't crash - c.execute("PRAGMA busy_timeout = 5000") - protocol_object.database.db_schema(c) - # commit the changes and close everything off - conn.commit() - conn.close() \ No newline at end of file +def initialize_db(): + create_workspace("default") \ No newline at end of file diff --git a/nxc/first_run.py b/nxc/first_run.py index e60979bc..c3b55f14 100755 --- a/nxc/first_run.py +++ b/nxc/first_run.py @@ -3,7 +3,7 @@ from os.path import exists from os.path import join as path_join import shutil from nxc.paths import NXC_PATH, CONFIG_PATH, TMP_PATH, DATA_PATH -from nxc.nxcdb import initialize_db +from nxc.database import initialize_db from nxc.logger import nxc_logger @@ -29,7 +29,7 @@ def first_run_setup(logger=nxc_logger): logger.display(f"Creating missing folder {folder}") mkdir(path_join(NXC_PATH, folder)) - initialize_db(logger) + initialize_db() if not exists(CONFIG_PATH): logger.display("Copying default configuration file") diff --git a/nxc/netexec.py b/nxc/netexec.py index e09e249e..d41dbc77 100755 --- a/nxc/netexec.py +++ b/nxc/netexec.py @@ -12,6 +12,7 @@ from nxc.paths import NXC_PATH from nxc.console import nxc_console from nxc.logger import nxc_logger from nxc.config import nxc_config, nxc_workspace, config_log, ignore_opsec +from nxc.database import create_db_engine from concurrent.futures import ThreadPoolExecutor, as_completed import asyncio from nxc.helpers import powershell @@ -21,7 +22,6 @@ from os.path import exists from os.path import join as path_join from sys import exit import logging -import sqlalchemy from rich.progress import Progress import platform @@ -38,11 +38,6 @@ if platform.system() != "Windows": resource.setrlimit(resource.RLIMIT_NOFILE, file_limit) - -def create_db_engine(db_path): - return sqlalchemy.create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) - - async def start_run(protocol_obj, args, db, targets): nxc_logger.debug("Creating ThreadPoolExecutor") if args.no_progress or len(targets) == 1: diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index 27ce0c7f..db89cd58 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -484,7 +484,7 @@ class NXCDBMenu(cmd.Cmd): if subcommand == "create": new_workspace = line.split()[1].strip() print(f"[*] Creating workspace '{new_workspace}'") - create_workspace(new_workspace, self.p_loader, self.protocols) + create_workspace(new_workspace, self.p_loader) self.do_workspace(new_workspace) elif subcommand == "list": print("[*] Enumerating Workspaces") diff --git a/nxc/paths.py b/nxc/paths.py index 5b16c191..5ebed0e8 100644 --- a/nxc/paths.py +++ b/nxc/paths.py @@ -8,7 +8,7 @@ if os.name == "nt": TMP_PATH = os.getenv("LOCALAPPDATA") + "\\Temp\\nxc_hosted" if hasattr(sys, "getandroidapilevel"): TMP_PATH = os.path.join("/data", "data", "com.termux", "files", "usr", "tmp", "nxc_hosted") -WS_PATH = os.path.join(NXC_PATH, "workspaces") + CERT_PATH = os.path.join(NXC_PATH, "nxc.pem") CONFIG_PATH = os.path.join(NXC_PATH, "nxc.conf") WORKSPACE_DIR = os.path.join(NXC_PATH, "workspaces") From d0c996fc056ff81157857539e65b848eb9866116 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Fri, 17 Nov 2023 22:51:43 -0500 Subject: [PATCH 03/56] feat(nxcdb): add functionality to create and set workspaces without entering interactive console --- nxc/database.py | 14 ++++++++++++-- nxc/nxcdb.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/nxc/database.py b/nxc/database.py index 45ddc241..bcae9cec 100644 --- a/nxc/database.py +++ b/nxc/database.py @@ -30,6 +30,13 @@ def get_workspace(config): return config.get("nxc", "workspace") +def set_workspace(config_path, workspace_name): + config = open_config(config_path) + config.set("nxc", "workspace", workspace_name) + write_configfile(config, config_path) + print(f"[*] Workspace set to {workspace_name}") + + def get_db(config): return config.get("nxc", "last_used_db") @@ -51,8 +58,10 @@ def create_workspace(workspace_name, p_loader=None): ------- None """ - if not exists(path_join(WORKSPACE_DIR, workspace_name)): - nxc_logger.debug(f"Creating {workspace_name} workspace") + if exists(path_join(WORKSPACE_DIR, workspace_name)): + print(f"[-] Workspace {workspace_name} already exists") + else: + print(f"[*] Creating {workspace_name} workspace") mkdir(path_join(WORKSPACE_DIR, workspace_name)) if p_loader is None: @@ -81,6 +90,7 @@ def create_workspace(workspace_name, p_loader=None): def delete_workspace(workspace_name): shutil.rmtree(path_join(WORKSPACE_DIR, workspace_name)) + print(f"[*] Workspace {workspace_name} deleted") def initialize_db(): diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index db89cd58..5527e7c6 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -2,6 +2,7 @@ import cmd import csv import sys import os +import argparse from os import listdir from os.path import exists from os.path import join as path_join @@ -11,7 +12,7 @@ from terminaltables import AsciiTable from nxc.loaders.protocolloader import ProtocolLoader from nxc.paths import CONFIG_PATH, WORKSPACE_DIR -from nxc.database import create_db_engine, open_config, get_workspace, get_db, write_configfile, create_workspace +from nxc.database import create_db_engine, open_config, get_workspace, get_db, write_configfile, create_workspace, set_workspace class UserExitedProto(Exception): @@ -516,12 +517,35 @@ class NXCDBMenu(cmd.Cmd): Exits """ print_help(help_string) - + def main(): if not exists(CONFIG_PATH): print("[-] Unable to find config file") sys.exit(1) + + parser = argparse.ArgumentParser( + description="NXCDB is a database navigator for NXC", + ) + parser.add_argument( + "-cw", + "--create-workspace", + help="create a new workspace", + ) + parser.add_argument( + "-ws", + "--set-workspace", + help="set the current workspace", + ) + args = parser.parse_args() + + if args.create_workspace: + create_workspace(args.create_workspace) + sys.exit() + if args.set_workspace: + set_workspace(CONFIG_PATH, args.set_workspace) + sys.exit() + try: nxcdbnav = NXCDBMenu(CONFIG_PATH) nxcdbnav.cmdloop() From e02fabc6b4a11a39351c6ef6fb0c4d2a2a85f903 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Fri, 17 Nov 2023 22:56:32 -0500 Subject: [PATCH 04/56] ruff: remove unused import --- nxc/database.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nxc/database.py b/nxc/database.py index bcae9cec..f3d5509a 100644 --- a/nxc/database.py +++ b/nxc/database.py @@ -9,7 +9,6 @@ from os.path import join as path_join from nxc.loaders.protocolloader import ProtocolLoader from nxc.paths import WORKSPACE_DIR -from nxc.logger import nxc_logger def create_db_engine(db_path): From f08b58de8a3bb4d954fbe212107facbbdc1d5c16 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Fri, 24 Nov 2023 19:42:24 -0500 Subject: [PATCH 05/56] Add cli option to get current workspace --- nxc/nxcdb.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index 5527e7c6..08daa16d 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -527,6 +527,12 @@ def main(): parser = argparse.ArgumentParser( description="NXCDB is a database navigator for NXC", ) + parser.add_argument( + "-gw", + "--get-workspace", + action="store_true", + help="get the current workspace", + ) parser.add_argument( "-cw", "--create-workspace", @@ -545,6 +551,10 @@ def main(): if args.set_workspace: set_workspace(CONFIG_PATH, args.set_workspace) sys.exit() + if args.get_workspace: + config = open_config(CONFIG_PATH) + print(f"Current workspace: {get_workspace(config)}") + sys.exit() try: nxcdbnav = NXCDBMenu(CONFIG_PATH) From 7c3e9a22da1e09cf15a44aff2f847342a216f202 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Fri, 24 Nov 2023 19:55:16 -0500 Subject: [PATCH 06/56] Cli command now lists all workspaces and changed workspaces output to match git style --- nxc/nxcdb.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index 08daa16d..8dafd027 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -9,6 +9,7 @@ from os.path import join as path_join from textwrap import dedent from requests import get, post, ConnectionError from terminaltables import AsciiTable +from termcolor import colored from nxc.loaders.protocolloader import ProtocolLoader from nxc.paths import CONFIG_PATH, WORKSPACE_DIR @@ -491,9 +492,9 @@ class NXCDBMenu(cmd.Cmd): print("[*] Enumerating Workspaces") for workspace in listdir(path_join(WORKSPACE_DIR)): if workspace == self.workspace: - print("==> " + workspace) + print(f" * {colored(workspace, 'green')}") else: - print(workspace) + print(f" {workspace}") elif exists(path_join(WORKSPACE_DIR, line)): self.config.set("nxc", "workspace", line) write_configfile(self.config, self.config_path) @@ -552,8 +553,12 @@ def main(): set_workspace(CONFIG_PATH, args.set_workspace) sys.exit() if args.get_workspace: - config = open_config(CONFIG_PATH) - print(f"Current workspace: {get_workspace(config)}") + current_workspace = get_workspace(open_config(CONFIG_PATH)) + for workspace in listdir(path_join(WORKSPACE_DIR)): + if workspace == current_workspace: + print(f" * {colored(workspace, 'green')}") + else: + print(f" {workspace}") sys.exit() try: From e48a02d7d84195da8c7f2bf96142639a3b393621 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Fri, 24 Nov 2023 19:58:49 -0500 Subject: [PATCH 07/56] Switch command line short form to match syntax --- nxc/nxcdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nxc/nxcdb.py b/nxc/nxcdb.py index 8dafd027..7bf7dcd1 100644 --- a/nxc/nxcdb.py +++ b/nxc/nxcdb.py @@ -540,7 +540,7 @@ def main(): help="create a new workspace", ) parser.add_argument( - "-ws", + "-sw", "--set-workspace", help="set the current workspace", ) From b59246da68f92d6c2c994e56dec3e013d9c08c1e Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Fri, 24 Nov 2023 19:59:58 -0500 Subject: [PATCH 08/56] Replace old WS_PATH variable --- tests/test_smb_database.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_smb_database.py b/tests/test_smb_database.py index a1d7592b..f4da5c09 100644 --- a/tests/test_smb_database.py +++ b/tests/test_smb_database.py @@ -7,13 +7,13 @@ from nxc.nxcdb import delete_workspace, NXCDBMenu from nxc.first_run import first_run_setup from nxc.loaders.protocolloader import ProtocolLoader from nxc.logger import NXCAdapter -from nxc.paths import WS_PATH +from nxc.paths import WORKSPACE_DIR from sqlalchemy.dialects.sqlite import Insert @pytest.fixture(scope="session") def db_engine(): - db_path = os.path.join(WS_PATH, "test/smb.db") + db_path = os.path.join(WORKSPACE_DIR, "test/smb.db") db_engine = create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) yield db_engine db_engine.dispose() From 9e01b9769439e03ea74d5930f0a02846aece6dfa Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:41:14 +0800 Subject: [PATCH 09/56] [mssql] bye bye SMB :) Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 91 ++- nxc/protocols/mssql/mssql_ntlm_parser.py | 99 +++ poetry.lock | 828 +++++++++++++---------- 3 files changed, 598 insertions(+), 420 deletions(-) create mode 100644 nxc/protocols/mssql/mssql_ntlm_parser.py diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 97daf0fc..772a8cbc 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -1,15 +1,18 @@ import os +import random +import contextlib from nxc.config import process_secret from nxc.connection import connection from nxc.connection import requires_admin from nxc.logger import NXCAdapter -from nxc.protocols.mssql.mssqlexec import MSSQLEXEC from nxc.helpers.bloodhound import add_user_bh from nxc.helpers.powershell import create_ps_command -from impacket import tds +from nxc.protocols.mssql.mssqlexec import MSSQLEXEC +from nxc.protocols.mssql.mssql_ntlm_parser import parse_challenge + +from impacket import tds, ntlm from impacket.krb5.ccache import CCache -from impacket.smbconnection import SMBConnection, SessionError from impacket.tds import ( SQLErrorException, TDS_LOGINACK_TOKEN, @@ -22,12 +25,10 @@ from impacket.tds import ( TDS_ENVCHANGE_CHARSET, TDS_ENVCHANGE_PACKETSIZE, ) -import contextlib - class mssql(connection): def __init__(self, args, db, host): - self.mssql_instances = None + self.mssql_instances = [] self.domain = None self.server_os = None self.hash = None @@ -36,17 +37,6 @@ class mssql(connection): connection.__init__(self, args, db, host) - def proto_flow(self): - self.proto_logger() - if self.create_conn_obj(): - self.enum_host_info() - self.print_host_info() - if self.login(): - if hasattr(self.args, "module") and self.args.module: - self.call_modules() - else: - self.call_cmd_args() - def proto_logger(self): self.logger = NXCAdapter( extra={ @@ -58,41 +48,40 @@ class mssql(connection): ) def enum_host_info(self): - # this try pass breaks module http server, more info https://github.com/byt3bl33d3r/CrackMapExec/issues/363 - try: # noqa: SIM105 - # Probably a better way of doing this, grab our IP from the socket - self.local_ip = str(self.conn.socket).split()[2].split("=")[1].split(":")[0] - except Exception: - pass + challenge = None + try: + login = tds.TDS_LOGIN() + login["HostName"] = "" + login["AppName"] = "" + login["ServerName"] = self.conn.server.encode("utf-16le") + login["CltIntName"] = login["AppName"] + login["ClientPID"] = random.randint(0, 1024) + login["PacketSize"] = self.conn.packetSize + login["OptionFlags2"] = tds.TDS_INIT_LANG_FATAL | tds.TDS_ODBC_ON | tds.TDS_INTEGRATED_SECURITY_ON + + # NTLMSSP Negotiate + auth = ntlm.getNTLMSSPType1("", "") + login["SSPI"] = auth.getData() + login["Length"] = len(login.getData()) - if self.args.no_smb: - self.domain = self.args.domain + # Get number of mssql instance + self.mssql_instances = self.conn.getInstances(0) + + # Send the NTLMSSP Negotiate or SQL Auth Packet + self.conn.sendTDS(tds.TDS_LOGIN7, login.getData()) + + tdsx = self.conn.recvTDS() + challenge = tdsx["Data"][3:] + self.logger.info(f"NTLM challenge: {challenge!s}") + except Exception as e: + self.logger.info(f"Failed to receive NTLM challenge, reason: {e!s}") else: - try: - smb_conn = SMBConnection(self.host, self.host, None) - try: - smb_conn.login("", "") - except SessionError as e: - if "STATUS_ACCESS_DENIED" in e.getErrorString(): - pass + ntlm_info = parse_challenge(challenge) + self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] + self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] + self.server_os = f'Windows NT {ntlm_info["version"]}' + self.logger.extra["hostname"] = self.hostname - self.domain = smb_conn.getServerDNSDomainName() - self.hostname = smb_conn.getServerName() - self.server_os = smb_conn.getServerOS() - self.logger.extra["hostname"] = self.hostname - - with contextlib.suppress(Exception): - smb_conn.logoff() - - if self.args.domain: - self.domain = self.args.domain - - if self.args.local_auth: - self.domain = self.hostname - except Exception as e: - self.logger.fail(f"Error retrieving host domain: {e} specify one manually with the '-d' flag") - - self.mssql_instances = self.conn.getInstances(0) self.db.add_host( self.host, self.hostname, @@ -106,9 +95,7 @@ class mssql(connection): def print_host_info(self): self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") - # if len(self.mssql_instances) > 0: - # for i, instance in enumerate(self.mssql_instances): - # for key in instance.keys(): + return True def create_conn_obj(self): try: diff --git a/nxc/protocols/mssql/mssql_ntlm_parser.py b/nxc/protocols/mssql/mssql_ntlm_parser.py new file mode 100644 index 00000000..2ca8ea55 --- /dev/null +++ b/nxc/protocols/mssql/mssql_ntlm_parser.py @@ -0,0 +1,99 @@ +# Original from here: https://github.com/nopfor/ntlm_challenger + +import datetime + +def decoder(byte_string, decode_type): + if decode_type == "byte": + return byte_string.decode("UTF-8").replace("\x00", "") + else: + return int.from_bytes(byte_string, "little") + +def parse_version(version_bytes): + major_version = version_bytes[0] + minor_version = version_bytes[1] + product_build = decoder(version_bytes[2:4], "int") + return f"{major_version}.{minor_version}.{product_build}" + +def parse_target_info(target_info_bytes): + MsvAvEOL = 0x0000 + MsvAvNbComputerName = 0x0001 + MsvAvNbDomainName = 0x0002 + MsvAvDnsComputerName = 0x0003 + MsvAvDnsDomainName = 0x0004 + MsvAvDnsTreeName = 0x0005 + MsvAvFlags = 0x0006 + MsvAvTimestamp = 0x0007 + MsvAvSingleHost = 0x0008 + MsvAvTargetName = 0x0009 + MsvAvChannelBindings = 0x000A + + target_info = { + "MsvAvNbComputerName": None, + "MsvAvDnsDomainName": None, + } + info_offset = 0 + + while info_offset < len(target_info_bytes): + av_id = decoder(target_info_bytes[info_offset:info_offset + 2], "int") + av_len = decoder(target_info_bytes[info_offset + 2:info_offset + 4], "int") + av_value = target_info_bytes[info_offset + 4:info_offset + 4 + av_len] + + info_offset = info_offset + 4 + av_len + + if av_id == MsvAvEOL: + pass + elif av_id == MsvAvNbComputerName: + target_info["MsvAvNbComputerName"] = decoder(av_value, "byte") + elif av_id == MsvAvNbDomainName: + target_info["MsvAvNbDomainName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsComputerName: + target_info["MsvAvDnsComputerName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsDomainName: + target_info["MsvAvDnsDomainName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsTreeName: + target_info["MsvAvDnsTreeName"] = decoder(av_value, "byte") + elif av_id == MsvAvFlags: + pass + elif av_id == MsvAvTimestamp: + filetime = decoder(av_value, "int") + microseconds = (filetime - 116444736000000000) / 10 + time = datetime.datetime(1970, 1, 1) + datetime.timedelta(microseconds=microseconds) + target_info["MsvAvTimestamp"] = time.strftime("%b %d, %Y %H:%M:%S.%f") + elif av_id == MsvAvSingleHost: + target_info["MsvAvSingleHost"] = decoder(av_value, "byte") + elif av_id == MsvAvTargetName: + target_info["MsvAvTargetName"] = decoder(av_value, "byte") + elif av_id == MsvAvChannelBindings: + target_info["MsvAvChannelBindings"] = av_value + return target_info + +def parse_challenge(challenge_message): + # TargetNameFields + target_name_fields = challenge_message[12:20] + target_name_len = decoder(target_name_fields[0:2], "int") + target_name_offset = decoder(target_name_fields[4:8], "int") + + # TargetInfoFields + target_info_fields = challenge_message[40:48] + target_info_len = decoder(target_info_fields[0:2], "int") + target_info_offset = decoder(target_info_fields[4:8], "int") + + # Version + version = None + version_bytes = challenge_message[48:56] + version = parse_version(version_bytes) + + # TargetName + target_name = challenge_message[target_name_offset:target_name_offset + target_name_len] + target_name = decoder(target_name, "byte") + + # TargetInfo + target_info_bytes = challenge_message[target_info_offset:target_info_offset + target_info_len] + + target_info = parse_target_info(target_info_bytes) + + return { + "target_name": target_name, + "version": version, + "target_info": target_info + } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 0fe3c160..21cdd169 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aardwolf" @@ -59,13 +59,13 @@ files = [ [[package]] name = "aiosmb" -version = "0.4.8" +version = "0.4.10" description = "Asynchronous SMB protocol implementation" optional = false python-versions = ">=3.7" files = [ - {file = "aiosmb-0.4.8-py3-none-any.whl", hash = "sha256:a0121de29d04750fc3591b4a60fb24b9676e4a3f9bc0734dea09d1907579cd42"}, - {file = "aiosmb-0.4.8.tar.gz", hash = "sha256:b2257672bf18b94e245913471a5576f518de1f10a4ea671b2bb275e4b660ba5b"}, + {file = "aiosmb-0.4.10-py3-none-any.whl", hash = "sha256:8b6f4c586fcd4e757e31aa3ea5a17060d9355d8994011ff6040acc18c578c023"}, + {file = "aiosmb-0.4.10.tar.gz", hash = "sha256:b8de656e1b8fb7d6b1a766534f10e01ee0d1c254235c03449063e04092f5a3dd"}, ] [package.dependencies] @@ -79,7 +79,7 @@ six = "*" tqdm = "*" unicrypto = ">=0.0.10" wcwidth = "*" -winacl = ">=0.1.7" +winacl = ">=0.1.8" [[package]] name = "aiosqlite" @@ -195,13 +195,13 @@ unicrypto = ">=0.0.10" [[package]] name = "asysocks" -version = "0.2.9" +version = "0.2.11" description = "" optional = false python-versions = ">=3.6" files = [ - {file = "asysocks-0.2.9-py3-none-any.whl", hash = "sha256:81c5432a00f671dda47916f581b9c22448d9eb03e2227ed3c2691f640d0d6daf"}, - {file = "asysocks-0.2.9.tar.gz", hash = "sha256:ce0df112f7b210e8ac93cb3847fdfa2f2f491f9c43bd5b234b81592311ce959f"}, + {file = "asysocks-0.2.11-py3-none-any.whl", hash = "sha256:578b38d053dfc475114f5b773c561897328102520c4b6e16b5fce8ef7b0c1a4a"}, + {file = "asysocks-0.2.11.tar.gz", hash = "sha256:1709bcf7c994ef0bc7e4e918554af0deb2f8553e72cafa07c55b5f72e2fee1b4"}, ] [package.dependencies] @@ -232,32 +232,28 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "bcrypt" -version = "4.0.1" +version = "4.1.1" description = "Modern password hashing for your software and your servers" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, + {file = "bcrypt-4.1.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:196008d91201bbb1aa4e666fee5e610face25d532e433a560cabb33bfdff958b"}, + {file = "bcrypt-4.1.1-cp37-abi3-macosx_13_0_universal2.whl", hash = "sha256:2e197534c884336f9020c1f3a8efbaab0aa96fc798068cb2da9c671818b7fbb0"}, + {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d573885b637815a7f3a3cd5f87724d7d0822da64b0ab0aa7f7c78bae534e86dc"}, + {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab33473f973e8058d1b2df8d6e095d237c49fbf7a02b527541a86a5d1dc4444"}, + {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fb931cd004a7ad36a89789caf18a54c20287ec1cd62161265344b9c4554fdb2e"}, + {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:12f40f78dcba4aa7d1354d35acf45fae9488862a4fb695c7eeda5ace6aae273f"}, + {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2ade10e8613a3b8446214846d3ddbd56cfe9205a7d64742f0b75458c868f7492"}, + {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f33b385c3e80b5a26b3a5e148e6165f873c1c202423570fdf45fe34e00e5f3e5"}, + {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:755b9d27abcab678e0b8fb4d0abdebeea1f68dd1183b3f518bad8d31fa77d8be"}, + {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a7a7b8a87e51e5e8ca85b9fdaf3a5dc7aaf123365a09be7a27883d54b9a0c403"}, + {file = "bcrypt-4.1.1-cp37-abi3-win32.whl", hash = "sha256:3d6c4e0d6963c52f8142cdea428e875042e7ce8c84812d8e5507bd1e42534e07"}, + {file = "bcrypt-4.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:14d41933510717f98aac63378b7956bbe548986e435df173c841d7f2bd0b2de7"}, + {file = "bcrypt-4.1.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24c2ebd287b5b11016f31d506ca1052d068c3f9dc817160628504690376ff050"}, + {file = "bcrypt-4.1.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:476aa8e8aca554260159d4c7a97d6be529c8e177dbc1d443cb6b471e24e82c74"}, + {file = "bcrypt-4.1.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12611c4b0a8b1c461646228344784a1089bc0c49975680a2f54f516e71e9b79e"}, + {file = "bcrypt-4.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6450538a0fc32fb7ce4c6d511448c54c4ff7640b2ed81badf9898dcb9e5b737"}, + {file = "bcrypt-4.1.1.tar.gz", hash = "sha256:df37f5418d4f1cdcff845f60e747a015389fa4e63703c918330865e06ad80007"}, ] [package.extras] @@ -284,23 +280,65 @@ lxml = ["lxml"] [[package]] name = "bitstruct" -version = "8.17.0" +version = "8.19.0" description = "This module performs conversions between Python values and C bit field structs represented as Python byte strings." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "bitstruct-8.17.0.tar.gz", hash = "sha256:eb94b40e4218a23aa8f90406b836a9e6ed83e48b8d112ce3f96408463bd1b874"}, + {file = "bitstruct-8.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d1f3eb18ddc33ba73f5cbb55c885584bcec51c421ac3551b79edc0ffeaecc3d"}, + {file = "bitstruct-8.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a35e0b267d12438e6a7b28850a15d4cffe767db6fc443a406d0ead97fa1d7d5b"}, + {file = "bitstruct-8.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5732aff5c8eb3a572f7b20d09fc4c213215f9e60c0e66f2910b31eb65b457744"}, + {file = "bitstruct-8.19.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc8f1871b42b705eb34b8722c3ec358fbf1b97fd37a62693564ee72648afb100"}, + {file = "bitstruct-8.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:01bdfc3adbe15b05ba27ab6dce7959caa29a000f066201944b29c64bb8888f03"}, + {file = "bitstruct-8.19.0-cp310-cp310-win32.whl", hash = "sha256:961845a29333119b70dd9aab54bc714bf9ba5efefc55cb4c747c35c1390b8842"}, + {file = "bitstruct-8.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:9fbe12d464db909f58d5e2a2485b3047a488fa1373e8f74b22d6759ee6b2437a"}, + {file = "bitstruct-8.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1300cd635814e40b1f4105aa4f404cb5d1b8cc54e06e267ba1616725f9c2beea"}, + {file = "bitstruct-8.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2fb23b5973ce1e9f349c4dc90873eeff9800fe917ffd345f39b9b964f6d119"}, + {file = "bitstruct-8.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e0c18d557474d8452c4f8b59320fd4d9efcf52eae2144bdf317d25c64dcf85"}, + {file = "bitstruct-8.19.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bba06607f956cc39ceee19fd11b542e8e66a43180d48fa36c4609443893c273e"}, + {file = "bitstruct-8.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f2fa607d111077145e6374d49be6098f33e7cee0967b42cfc117df53eee13332"}, + {file = "bitstruct-8.19.0-cp311-cp311-win32.whl", hash = "sha256:abdb7bdb5b04c2f1bbda0eae828c627252243ddc042aea6b72af8fcc63696598"}, + {file = "bitstruct-8.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:464f102999402a2624ee3106dbfa1f3745810036814a33e6bc706b7d312c480f"}, + {file = "bitstruct-8.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:55768b1f5e33594178f0b3e1596b89d831b006713a60caa09de61fd385bf22b1"}, + {file = "bitstruct-8.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c026a7cf8d954ef53cf4d0ae5ee3dd1ac66e24e9a474c5afe55467ab7d609f2e"}, + {file = "bitstruct-8.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7488fd4e2fde3d8111971e2040cd5b008be918381afc80387d3fdf047c801293"}, + {file = "bitstruct-8.19.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:45b66e20633f1e083e37fa396c81761e0fc688ffa06ff5559e990e37234f9e18"}, + {file = "bitstruct-8.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1542d5ae888ebc31614775938bfd13454f0d897dc2515363a4607efadc990b"}, + {file = "bitstruct-8.19.0-cp312-cp312-win32.whl", hash = "sha256:7ea57e4e793b595cd3e037920852f2c676b4f5f1734c41985db3f48783928e2c"}, + {file = "bitstruct-8.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:1c4d9b75248adee84e7e6c95bf95966f152b78363cb20a81920da2aeadc4375f"}, + {file = "bitstruct-8.19.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7b4745b099d3d85307495e25ff0f265deeea675621dcecb25ba059ee68ce88d5"}, + {file = "bitstruct-8.19.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645da560acd20dd73a1ef220e3ddc08e108866e30a708ef2f6193e0a3725113e"}, + {file = "bitstruct-8.19.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01402fbc3dba2286b3ac9b74d5936dd984736f928aacd371458a4b0cf95f0755"}, + {file = "bitstruct-8.19.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2c5eda42d55db67072c6cf7cc79b1df1074269004bad119b79e4ad38cfa61877"}, + {file = "bitstruct-8.19.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2ea093522b12ce714a3a95851a8c3dd97f620126bbe983eb261b3bf18ac945e7"}, + {file = "bitstruct-8.19.0-cp37-cp37m-win32.whl", hash = "sha256:da00da004830800323554e7a83f1f32a1f49345f5379476de4b5f6ae227ee962"}, + {file = "bitstruct-8.19.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a0ca55fba25d6c631e17933f20cf87f553d7bceec7659e3de9ef48dc85ced2bf"}, + {file = "bitstruct-8.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3f6e3aeb598215062c505a06135fbdfa3bb4eeb249b55f87e865a86b3fd9e99"}, + {file = "bitstruct-8.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df74c72feba80014b05ab6f1e1a0bb90be9f9e7eb60a9bab1e00728f7f46d79d"}, + {file = "bitstruct-8.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:976c39ad771c6773d6fbd14d71e62242d5b3bca7b72428fd183e1f1085d5e858"}, + {file = "bitstruct-8.19.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d2c176ff6727206805760f45c2151468aed843256aa239c14f4730b9e1d84fc7"}, + {file = "bitstruct-8.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7774e2a51e254ef1ba98a1ee38573c819d4ee7e396d5121c5ecae17df927501"}, + {file = "bitstruct-8.19.0-cp38-cp38-win32.whl", hash = "sha256:b86d192d658eaf35f10efb2e1940ec755cc28e081f46de294a2e91a74ea298aa"}, + {file = "bitstruct-8.19.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e7f78aedec2881017026eb7f7ab79514aef09a24afd8acf5fa8c73b1cd0e9f4"}, + {file = "bitstruct-8.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bb49acc2ccc6efd3c9613cae8f7e1316c92f832bff860a6fcb78a4275974e90"}, + {file = "bitstruct-8.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bed7b2761c18a515298145a4f67b6c71ce302453fe7d87ec6b7d2e77fd3c22b"}, + {file = "bitstruct-8.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d0cafd2e2974c4bbe349fb67951d43d221ea304218c2ee65f9fe4c62acabc2f"}, + {file = "bitstruct-8.19.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d9ba0299f624e7c8ea1eec926fc77741f82ffc5b3c3ba4f89303d33d5605f4d8"}, + {file = "bitstruct-8.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfa0326057c9b02c4e65e74e45b9914a7f8c59590a8e718e20a899a02b41f2e6"}, + {file = "bitstruct-8.19.0-cp39-cp39-win32.whl", hash = "sha256:14c3ebdec92c486142327d934cb451d96b411543ec6f72aeb2b4b4334e9408bf"}, + {file = "bitstruct-8.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:7836852d5c15444e87a2029f922b48717e6e199d2332d55e8738e92d8590987e"}, + {file = "bitstruct-8.19.0.tar.gz", hash = "sha256:d75ba9dded85c17e885a209a00eb8e248ee40762149f2f2a79360ca857467dac"}, ] [[package]] name = "bloodhound" -version = "1.6.1" +version = "1.7.0" description = "Python based ingestor for BloodHound" optional = false python-versions = "*" files = [ - {file = "bloodhound-1.6.1-py3-none-any.whl", hash = "sha256:616bbf5c27e5ed9562e157293eaa595c5804507e4493bc08b5f9b061b2ff431a"}, - {file = "bloodhound-1.6.1.tar.gz", hash = "sha256:4913fbe08e5eb8a244ae74a49ba392740c339effd941e12d346e17a1f9c811e7"}, + {file = "bloodhound-1.7.0-py3-none-any.whl", hash = "sha256:489f65d759a3349d5373f7090701d5c543c677e90da6293f3ef16ec3b5b253e3"}, + {file = "bloodhound-1.7.0.tar.gz", hash = "sha256:d0eb0e3e5b0576a83b3d5ee7924540368d3264c4b77f5efd8b2e9476aebe7b06"}, ] [package.dependencies] @@ -309,6 +347,7 @@ future = "*" impacket = ">=0.9.17" ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" pyasn1 = ">=0.4" +pycryptodome = "*" [[package]] name = "bs4" @@ -325,13 +364,13 @@ beautifulsoup4 = "*" [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] @@ -412,101 +451,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -598,19 +637,19 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] [[package]] name = "dploot" -version = "2.2.2" +version = "2.2.4" description = "DPAPI looting remotely in Python" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "dploot-2.2.2-py3-none-any.whl", hash = "sha256:d6fe84ae7e3f1135333e73974059493601d6e343859bd5c920d0597d4dadc118"}, - {file = "dploot-2.2.2.tar.gz", hash = "sha256:7413cc18ebfc7a92522945480583f8899df212fb416b2385bb0fae46a97bec44"}, + {file = "dploot-2.2.4-py3-none-any.whl", hash = "sha256:a70c8280972a1fb7150093560093e46a9bb5936396f563ae9050a20dcf1ad96e"}, + {file = "dploot-2.2.4.tar.gz", hash = "sha256:e34ff928e94416f3cbf688427d1de4aa88a4a4a15f24edb6313a2adc685a98a3"}, ] [package.dependencies] cryptography = ">=40.0.1,<41.0.0" impacket = ">=0.10.0" -lxml = "4.9.2" +lxml = "4.9.3" pyasn1 = ">=0.4.8,<0.5.0" [[package]] @@ -625,13 +664,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -688,73 +727,68 @@ files = [ [[package]] name = "greenlet" -version = "3.0.0" +version = "3.0.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, - {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, - {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, - {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, - {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, - {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, - {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, - {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, - {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, - {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, - {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, - {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, - {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, - {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, - {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, - {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, - {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, - {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, ] [package.extras] @@ -777,18 +811,18 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "impacket" -version = "0.12.0.dev1+20230919.145657.cdf867fa" +version = "0.12.0.dev1+20231130.165011.d370e635" description = "Network protocols Constructors and Dissectors" optional = false python-versions = "*" @@ -796,7 +830,7 @@ files = [] develop = false [package.dependencies] -charset-normalizer = "*" +charset_normalizer = "*" dsinternals = "*" flask = ">=1.0" ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" @@ -811,7 +845,7 @@ six = "*" type = "git" url = "https://github.com/Pennyw0rth/impacket.git" reference = "gkdi" -resolved_reference = "cdf867faa6b9db1bd19b44ec7a53d7e40b95e3a5" +resolved_reference = "d370e6359a410063b2c9c68f6572c3b5fb178a38" [[package]] name = "importlib-metadata" @@ -970,13 +1004,13 @@ ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" [[package]] name = "lsassy" -version = "3.1.8" +version = "3.1.9" description = "Python library to extract credentials from lsass remotely" optional = false python-versions = ">=3.6" files = [ - {file = "lsassy-3.1.8-py3-none-any.whl", hash = "sha256:1b3f6220bc18c8ce751b7f3e790385434cba5593376f3b44b56cc46e2f5bfda0"}, - {file = "lsassy-3.1.8.tar.gz", hash = "sha256:95e13d9ec2f0c2b3450ea5499b04c4dcd231aa6a5f13cf066d9354db36c70b28"}, + {file = "lsassy-3.1.9-py3-none-any.whl", hash = "sha256:8497168efe43147d639671c5ea3d4b04b7d8c4336f77286b767fca0edca6c830"}, + {file = "lsassy-3.1.9.tar.gz", hash = "sha256:75d7038915dea31b6380488befedb4081e1fdade9a68d6f7cb5b4cf6c93b9970"}, ] [package.dependencies] @@ -987,95 +1021,110 @@ rich = "*" [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] name = "markdown-it-py" @@ -1213,24 +1262,24 @@ files = [ [[package]] name = "minidump" -version = "0.0.21" +version = "0.0.22" description = "Python library to parse Windows minidump file format" optional = false python-versions = ">=3.6" files = [ - {file = "minidump-0.0.21-py3-none-any.whl", hash = "sha256:6a9d2152f76ae633c609e09b48b42f55bd5a6b65f920dbbec756e5d9134a6201"}, - {file = "minidump-0.0.21.tar.gz", hash = "sha256:83d612afb6c57727ebf38aca433b550f83f9f8c7c3b6562ad2ab97071fd85f3a"}, + {file = "minidump-0.0.22-py3-none-any.whl", hash = "sha256:71a0bd07d6cd8f34d0d45b2f696bf8b4ba902ebe94903dcd57ae00c10e40a2dd"}, + {file = "minidump-0.0.22.tar.gz", hash = "sha256:3cfbefbc7cf7580ebb567d8fecc218f828648d7ac23ae4e08f4297af8076999d"}, ] [[package]] name = "minikerberos" -version = "0.4.2" +version = "0.4.3" description = "Kerberos manipulation library in pure Python" optional = false python-versions = ">=3.6" files = [ - {file = "minikerberos-0.4.2-py3-none-any.whl", hash = "sha256:0e20d0221022988f3916f4fd4e9e362964087fdafc227c717067ccee33736f69"}, - {file = "minikerberos-0.4.2.tar.gz", hash = "sha256:04408a586e67c4808e49f40981726a0a48b681cbff651ac3168e7b9d71ef868b"}, + {file = "minikerberos-0.4.3-py3-none-any.whl", hash = "sha256:cce9c537a45574bd0fb052bab1c10a24b3b4937c4c9814355e813962355e3096"}, + {file = "minikerberos-0.4.3.tar.gz", hash = "sha256:f553cad791883dc1be51cc948a77af2b2128a26ea6340f7d34a2f45d677d1bf3"}, ] [package.dependencies] @@ -1362,7 +1411,7 @@ files = [ [[package]] name = "oscrypto" version = "1.3.0" -description = "" +description = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD." optional = false python-versions = "*" files = [] @@ -1490,13 +1539,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "pip" -version = "23.3" +version = "23.3.1" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.7" files = [ - {file = "pip-23.3-py3-none-any.whl", hash = "sha256:bc38bb52bc286514f8f7cb3a1ba5ed100b76aaef29b521d48574329331c5ae7b"}, - {file = "pip-23.3.tar.gz", hash = "sha256:bb7d4f69f488432e4e96394612f43ab43dd478d073ef7422604a570f7157561e"}, + {file = "pip-23.3.1-py3-none-any.whl", hash = "sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b"}, + {file = "pip-23.3.1.tar.gz", hash = "sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"}, ] [[package]] @@ -1530,13 +1579,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -1589,6 +1638,47 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] +[[package]] +name = "pycryptodome" +version = "3.19.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.19.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3006c44c4946583b6de24fe0632091c2653d6256b99a02a3db71ca06472ea1e4"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c760c8a0479a4042111a8dd2f067d3ae4573da286c53f13cf6f5c53a5c1f631"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:08ce3558af5106c632baf6d331d261f02367a6bc3733086ae43c0f988fe042db"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45430dfaf1f421cf462c0dd824984378bef32b22669f2635cb809357dbaab405"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:a9bcd5f3794879e91970f2bbd7d899780541d3ff439d8f2112441769c9f2ccea"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win32.whl", hash = "sha256:190c53f51e988dceb60472baddce3f289fa52b0ec38fbe5fd20dd1d0f795c551"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win_amd64.whl", hash = "sha256:22e0ae7c3a7f87dcdcf302db06ab76f20e83f09a6993c160b248d58274473bfa"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7822f36d683f9ad7bc2145b2c2045014afdbbd1d9922a6d4ce1cbd6add79a01e"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:05e33267394aad6db6595c0ce9d427fe21552f5425e116a925455e099fdf759a"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:829b813b8ee00d9c8aba417621b94bc0b5efd18c928923802ad5ba4cf1ec709c"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:fc7a79590e2b5d08530175823a242de6790abc73638cc6dc9d2684e7be2f5e49"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:542f99d5026ac5f0ef391ba0602f3d11beef8e65aae135fa5b762f5ebd9d3bfb"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:61bb3ccbf4bf32ad9af32da8badc24e888ae5231c617947e0f5401077f8b091f"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d49a6c715d8cceffedabb6adb7e0cbf41ae1a2ff4adaeec9432074a80627dea1"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e249a784cc98a29c77cea9df54284a44b40cafbfae57636dd2f8775b48af2434"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d033947e7fd3e2ba9a031cb2d267251620964705a013c5a461fa5233cc025270"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:84c3e4fffad0c4988aef0d5591be3cad4e10aa7db264c65fadbc633318d20bde"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:139ae2c6161b9dd5d829c9645d781509a810ef50ea8b657e2257c25ca20efe33"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5b1986c761258a5b4332a7f94a83f631c1ffca8747d75ab8395bf2e1b93283d9"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win32.whl", hash = "sha256:536f676963662603f1f2e6ab01080c54d8cd20f34ec333dcb195306fa7826997"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win_amd64.whl", hash = "sha256:04dd31d3b33a6b22ac4d432b3274588917dcf850cc0c51c84eca1d8ed6933810"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:8999316e57abcbd8085c91bc0ef75292c8618f41ca6d2b6132250a863a77d1e7"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-win32.whl", hash = "sha256:a0ab84755f4539db086db9ba9e9f3868d2e3610a3948cbd2a55e332ad83b01b0"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0101f647d11a1aae5a8ce4f5fad6644ae1b22bb65d05accc7d322943c69a74a6"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1601e04d32087591d78e0b81e1e520e57a92796089864b20e5f18c9564b3fa"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:506c686a1eee6c00df70010be3b8e9e78f406af4f21b23162bbb6e9bdf5427bc"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7919ccd096584b911f2a303c593280869ce1af9bf5d36214511f5e5a1bed8c34"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560591c0777f74a5da86718f70dfc8d781734cf559773b64072bbdda44b3fc3e"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cc2f2ae451a676def1a73c1ae9120cd31af25db3f381893d45f75e77be2400"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17940dcf274fcae4a54ec6117a9ecfe52907ed5e2e438fe712fe7ca502672ed5"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d04f5f623a280fbd0ab1c1d8ecbd753193ab7154f09b6161b0f857a1a676c15f"}, + {file = "pycryptodome-3.19.0.tar.gz", hash = "sha256:bc35d463222cdb4dbebd35e0784155c81e161b9284e567e7e933d722e533331e"}, +] + [[package]] name = "pycryptodomex" version = "3.19.0" @@ -1643,17 +1733,18 @@ files = [ [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylnk3" @@ -1854,13 +1945,13 @@ yaml = ["ruamel.yaml"] [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -2028,13 +2119,13 @@ python-easyconfig = ">=0.1.0" [[package]] name = "rich" -version = "13.6.0" +version = "13.7.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.6.0-py3-none-any.whl", hash = "sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"}, - {file = "rich-13.6.0.tar.gz", hash = "sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef"}, + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, ] [package.dependencies] @@ -2127,60 +2218,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.22" +version = "2.0.23" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f146c61ae128ab43ea3a0955de1af7e1633942c2b2b4985ac51cc292daf33222"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:875de9414393e778b655a3d97d60465eb3fae7c919e88b70cc10b40b9f56042d"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13790cb42f917c45c9c850b39b9941539ca8ee7917dacf099cc0b569f3d40da7"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e04ab55cf49daf1aeb8c622c54d23fa4bec91cb051a43cc24351ba97e1dd09f5"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a42c9fa3abcda0dcfad053e49c4f752eef71ecd8c155221e18b99d4224621176"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:14cd3bcbb853379fef2cd01e7c64a5d6f1d005406d877ed9509afb7a05ff40a5"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-win32.whl", hash = "sha256:d143c5a9dada696bcfdb96ba2de4a47d5a89168e71d05a076e88a01386872f97"}, - {file = "SQLAlchemy-2.0.22-cp310-cp310-win_amd64.whl", hash = "sha256:ccd87c25e4c8559e1b918d46b4fa90b37f459c9b4566f1dfbce0eb8122571547"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f6ff392b27a743c1ad346d215655503cec64405d3b694228b3454878bf21590"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f776c2c30f0e5f4db45c3ee11a5f2a8d9de68e81eb73ec4237de1e32e04ae81c"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8f1792d20d2f4e875ce7a113f43c3561ad12b34ff796b84002a256f37ce9437"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80eeb5189d7d4b1af519fc3f148fe7521b9dfce8f4d6a0820e8f5769b005051"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69fd9e41cf9368afa034e1c81f3570afb96f30fcd2eb1ef29cb4d9371c6eece2"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54bcceaf4eebef07dadfde424f5c26b491e4a64e61761dea9459103ecd6ccc95"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-win32.whl", hash = "sha256:7ee7ccf47aa503033b6afd57efbac6b9e05180f492aeed9fcf70752556f95624"}, - {file = "SQLAlchemy-2.0.22-cp311-cp311-win_amd64.whl", hash = "sha256:b560f075c151900587ade06706b0c51d04b3277c111151997ea0813455378ae0"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2c9bac865ee06d27a1533471405ad240a6f5d83195eca481f9fc4a71d8b87df8"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:625b72d77ac8ac23da3b1622e2da88c4aedaee14df47c8432bf8f6495e655de2"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39a6e21110204a8c08d40ff56a73ba542ec60bab701c36ce721e7990df49fb9"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a766cb0b468223cafdf63e2d37f14a4757476157927b09300c8c5832d88560"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0e1ce8ebd2e040357dde01a3fb7d30d9b5736b3e54a94002641dfd0aa12ae6ce"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:505f503763a767556fa4deae5194b2be056b64ecca72ac65224381a0acab7ebe"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-win32.whl", hash = "sha256:154a32f3c7b00de3d090bc60ec8006a78149e221f1182e3edcf0376016be9396"}, - {file = "SQLAlchemy-2.0.22-cp312-cp312-win_amd64.whl", hash = "sha256:129415f89744b05741c6f0b04a84525f37fbabe5dc3774f7edf100e7458c48cd"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3940677d341f2b685a999bffe7078697b5848a40b5f6952794ffcf3af150c301"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55914d45a631b81a8a2cb1a54f03eea265cf1783241ac55396ec6d735be14883"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2096d6b018d242a2bcc9e451618166f860bb0304f590d205173d317b69986c95"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:19c6986cf2fb4bc8e0e846f97f4135a8e753b57d2aaaa87c50f9acbe606bd1db"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ac28bd6888fe3c81fbe97584eb0b96804bd7032d6100b9701255d9441373ec1"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-win32.whl", hash = "sha256:cb9a758ad973e795267da334a92dd82bb7555cb36a0960dcabcf724d26299db8"}, - {file = "SQLAlchemy-2.0.22-cp37-cp37m-win_amd64.whl", hash = "sha256:40b1206a0d923e73aa54f0a6bd61419a96b914f1cd19900b6c8226899d9742ad"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3aa1472bf44f61dd27987cd051f1c893b7d3b17238bff8c23fceaef4f1133868"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:56a7e2bb639df9263bf6418231bc2a92a773f57886d371ddb7a869a24919face"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccca778c0737a773a1ad86b68bda52a71ad5950b25e120b6eb1330f0df54c3d0"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6c3e9350f9fb16de5b5e5fbf17b578811a52d71bb784cc5ff71acb7de2a7f9"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:564e9f9e4e6466273dbfab0e0a2e5fe819eec480c57b53a2cdee8e4fdae3ad5f"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af66001d7b76a3fab0d5e4c1ec9339ac45748bc4a399cbc2baa48c1980d3c1f4"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-win32.whl", hash = "sha256:9e55dff5ec115316dd7a083cdc1a52de63693695aecf72bc53a8e1468ce429e5"}, - {file = "SQLAlchemy-2.0.22-cp38-cp38-win_amd64.whl", hash = "sha256:4e869a8ff7ee7a833b74868a0887e8462445ec462432d8cbeff5e85f475186da"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9886a72c8e6371280cb247c5d32c9c8fa141dc560124348762db8a8b236f8692"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a571bc8ac092a3175a1d994794a8e7a1f2f651e7c744de24a19b4f740fe95034"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db5ba8b7da759b727faebc4289a9e6a51edadc7fc32207a30f7c6203a181592"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0b3f2686c3f162123adba3cb8b626ed7e9b8433ab528e36ed270b4f70d1cdb"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c1fea8c0abcb070ffe15311853abfda4e55bf7dc1d4889497b3403629f3bf00"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4bb062784f37b2d75fd9b074c8ec360ad5df71f933f927e9e95c50eb8e05323c"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-win32.whl", hash = "sha256:58a3aba1bfb32ae7af68da3f277ed91d9f57620cf7ce651db96636790a78b736"}, - {file = "SQLAlchemy-2.0.22-cp39-cp39-win_amd64.whl", hash = "sha256:92e512a6af769e4725fa5b25981ba790335d42c5977e94ded07db7d641490a85"}, - {file = "SQLAlchemy-2.0.22-py3-none-any.whl", hash = "sha256:3076740335e4aaadd7deb3fe6dcb96b3015f1613bd190a4e1634e1b99b02ec86"}, - {file = "SQLAlchemy-2.0.22.tar.gz", hash = "sha256:5434cc601aa17570d79e5377f5fd45ff92f9379e2abed0be5e8c2fba8d353d2b"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, + {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, + {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, ] [package.dependencies] @@ -2190,6 +2281,7 @@ typing-extensions = ">=4.2.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -2200,7 +2292,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx-oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -2325,13 +2417,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.8" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, - {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] @@ -2353,13 +2445,13 @@ watchdog = ["watchdog"] [[package]] name = "winacl" -version = "0.1.7" +version = "0.1.8" description = "ACL/ACE/Security Descriptor manipulation library in pure Python" optional = false python-versions = ">=3.6" files = [ - {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, - {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, + {file = "winacl-0.1.8-py3-none-any.whl", hash = "sha256:f17028422c0b2dc6752c801350d37878919804728b776289521dc83622982a45"}, + {file = "winacl-0.1.8.tar.gz", hash = "sha256:44271a302562de51629f68ef1540d40f3a26e7bc0173646b01a6779cedad644c"}, ] [package.dependencies] From 6f1bcaaf46d219b693c7365c9ff4928d31dd8744 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:27:12 +0800 Subject: [PATCH 10/56] [mssql] Enhance the error message Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 99 ++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 38 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 772a8cbc..5c849034 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -145,6 +145,7 @@ class mssql(connection): hashes = f":{ntlm_hash}" kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" + used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" try: res = self.conn.kerberosLogin( None, @@ -157,9 +158,24 @@ class mssql(connection): useCache=useCache, ) if res is not True: - self.conn.printReplies() + error_msg = self.conn.printReplies() + self.logger.fail( + "{}\\{}:{} {}".format( + domain, + username, + used_ccache, + error_msg if error_msg else "" + ) + ) return False - + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception as e: + domain = f"{domain}\\" if not self.args.local_auth else "" + self.logger.fail(f"{domain}{username}{used_ccache} ({e!s})") + return False + else: self.password = password if username == "" and useCache: ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) @@ -171,7 +187,6 @@ class mssql(connection): self.domain = domain self.check_if_admin() - used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" domain = f"{domain}\\" if not self.args.local_auth else "" self.logger.success(f"{domain}{username}{used_ccache} {self.mark_pwned()}") @@ -180,11 +195,6 @@ class mssql(connection): if self.admin_privs: add_user_bh(f"{self.hostname}$", domain, self.logger, self.config) return True - except Exception as e: - used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" - domain = f"{domain}\\" if not self.args.local_auth else "" - self.logger.fail(f"{domain}\\{username}{used_ccache} {e}") - return False def plaintext_login(self, domain, username, password): with contextlib.suppress(Exception): @@ -192,14 +202,26 @@ class mssql(connection): self.create_conn_obj() try: - # this is to prevent a decoding issue in impacket/ntlm.py:617 where it attempts to decode the domain - if not domain: - domain = "" - res = self.conn.login(None, username, password, domain, None, not self.args.local_auth) + # domain = "" is to prevent a decoding issue in impacket/ntlm.py:617 where it attempts to decode the domain + res = self.conn.login(None, username, password, domain if domain else "", None, not self.args.local_auth) if res is not True: - self.handle_mssql_reply() + error_msg = self.handle_mssql_reply() + self.logger.fail( + "{}\\{}:{} {}".format( + domain, + username, + process_secret(password), + error_msg if error_msg else "" + ) + ) return False - + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception as e: + self.logger.fail(f"{domain}\\{username}:{process_secret(password)} ({e!s})") + return False + else: self.password = password self.username = username self.domain = domain @@ -216,15 +238,12 @@ class mssql(connection): if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) return True - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - return False - except Exception as e: - self.logger.fail(f"{domain}\\{username}:{process_secret(password)}") - self.logger.exception(e) - return False def hash_login(self, domain, username, ntlm_hash): + with contextlib.suppress(Exception): + self.conn.disconnect() + self.create_conn_obj() + lmhash = "" nthash = "" @@ -234,10 +253,6 @@ class mssql(connection): else: nthash = ntlm_hash - with contextlib.suppress(Exception): - self.conn.disconnect() - self.create_conn_obj() - try: res = self.conn.login( None, @@ -248,9 +263,23 @@ class mssql(connection): not self.args.local_auth, ) if res is not True: - self.conn.printReplies() + error_msg = self.conn.printReplies() + self.logger.fail( + "{}\\{}:{} {}".format( + domain, + username, + process_secret(nthash), + error_msg if error_msg else "" + ) + ) return False - + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception as e: + self.logger.fail(f"{domain}\\{username}:{process_secret(ntlm_hash)} ({e!s})") + return False + else: self.hash = ntlm_hash self.username = username self.domain = domain @@ -266,12 +295,6 @@ class mssql(connection): if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) return True - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - return False - except Exception as e: - self.logger.fail(f"{domain}\\{username}:{process_secret(ntlm_hash)} {e}") - return False def mssql_query(self): if self.conn.lastError: @@ -381,13 +404,13 @@ class mssql(connection): for keys in self.conn.replies: for _i, key in enumerate(self.conn.replies[keys]): if key["TokenType"] == TDS_ERROR_TOKEN: - error = f"ERROR({key['ServerName'].decode('utf-16le')}): Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}" + error_msg = f"{key['MsgText'].decode('utf-16le')} Please try again with or without '--local-auth'" self.conn.lastError = SQLErrorException(f"ERROR: Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}") - self.logger.fail(error) + return error_msg elif key["TokenType"] == TDS_INFO_TOKEN: - self.logger.display(f"INFO({key['ServerName'].decode('utf-16le')}): Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}") + return f"{key['MsgText'].decode('utf-16le')}" elif key["TokenType"] == TDS_LOGINACK_TOKEN: - self.logger.display(f"ACK: Result: {key['Interface']} - {key['ProgName'].decode('utf-16le')} ({key['MajorVer']:d}{key['MinorVer']:d} {key['BuildNumHi']:d}{key['BuildNumLow']:d}) ") + return f"ACK: Result: {key['Interface']} - {key['ProgName'].decode('utf-16le')} ({key['MajorVer']:d}{key['MinorVer']:d} {key['BuildNumHi']:d}{key['BuildNumLow']:d}) " elif key["TokenType"] == TDS_ENVCHANGE_TOKEN and key["Type"] in ( TDS_ENVCHANGE_DATABASE, TDS_ENVCHANGE_LANGUAGE, @@ -409,4 +432,4 @@ class mssql(connection): _type = "PACKETSIZE" else: _type = f"{key['Type']:d}" - self.logger.display(f"ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')}") + return f"ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')}" From 750d35e7475333dfb4c293119cb11813c7c81974 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 00:53:00 +0800 Subject: [PATCH 11/56] [mssql] revert pyproject.toml Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- pyproject.toml | 127 +------------------------------------------------ 1 file changed, 1 insertion(+), 126 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ef0f03bd..47e3af77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,126 +1 @@ -[tool.poetry] -name = "netexec" -version = "1.1.0" -description = "The Network Execution tool" -authors = [ - "Marshall Hallenbeck ", - "Alexander Neff ", - "Thomas Seigneuret " -] -readme = "README.md" -homepage = "https://github.com/Pennyw0rth/NetExec" -repository = "https://github.com/Pennyw0rth/NetExec" -exclude = [] -include = [ - "nxc/data/*", - "nxc/modules/*" -] -license = "BSD-2-Clause" -classifiers = [ - 'Environment :: Console', - 'License :: OSI Approved :: BSD License', - 'Programming Language :: Python :: 3', - 'Topic :: Security', -] -packages = [ - { include = "nxc"} -] - -[tool.poetry.scripts] -nxc = 'nxc.netexec:main' -netexec = 'nxc.netexec:main' -NetExec = 'nxc.netexec:main' -nxcdb = 'nxc.nxcdb:main' - -[tool.poetry.dependencies] -python = "^3.7.0" -requests = ">=2.27.1" -beautifulsoup4 = ">=4.11,<5" -lsassy = ">=3.1.8" -termcolor = "2.0.1" -msgpack = "^1.0.0" -neo4j = "^4.1.1" # do not upgrade this until performance regression issues in 5 are fixed (as of 9/23) -pylnk3 = "^0.4.2" -pypsrp = "^0.8.1" -paramiko = "^3.3.1" -impacket = { git = "https://github.com/Pennyw0rth/impacket.git", branch = "gkdi" } -dsinternals = "^1.2.4" -xmltodict = "^0.13.0" -terminaltables = "^3.1.0" -aioconsole = "^0.6.2" -pywerview = "^0.3.3" # pywerview 5 requires libkrb5-dev installed which is not default on kali (as of 9/23) -minikerberos = "^0.4.1" -pypykatz = "^0.6.8" -aardwolf = "^0.2.7" -dploot = "^2.2.1" -bloodhound = "^1.6.1" -asyauth = "~0.0.14" -masky = "^0.2.0" -sqlalchemy = "^2.0.4" -aiosqlite = "^0.19.0" -pyasn1-modules = "^0.3.0" -rich = "^13.3.5" -python-libnmap = "^0.7.3" -resource = "^0.2.1" -oscrypto = { git = "https://github.com/Pennyw0rth/oscrypto" } # Pypi version currently broken, see: https://github.com/wbond/oscrypto/issues/78 (as of 9/23) -pyreadline = "^2.1" # for the build - impacket imports its hidden from the builder so an error occurs -ruff = "=0.0.292" - -[tool.poetry.group.dev.dependencies] -flake8 = "*" -shiv = "*" -pytest = "^7.2.2" - -[build-system] -requires = ["poetry-core>=1.2.0"] -build-backend = "poetry.core.masonry.api" - -[tool.ruff] -# Ruff doesn't enable pycodestyle warnings (`W`) or -# McCabe complexity (`C901`) by default. -# Other options: pep8-naming (N), flake8-annotations (ANN), flake8-blind-except (BLE), flake8-commas (COM), flake8-pyi (PYI), flake8-pytest-style (PT), flake8-unused-arguments (ARG), etc -# Should tackle flake8-use-pathlib (PTH) at some point -select = ["E", "F", "D", "UP", "YTT", "ASYNC", "B", "A", "C4", "ISC", "ICN", "PIE", "PT", "Q", "RSE", "RET", "SIM", "TID", "ERA", "FLY", "PERF", "FURB", "LOG", "RUF"] -ignore = [ "E501", "F405", "D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107", "D203", "D204", "D205", "D212", "D213", "D400", "D401", "D415", "D417", "D419", "RET503", "RET505", "RET506", "RET507", "RET508", "PERF203", "RUF012"] - -# Allow autofix for all enabled rules (when `--fix`) is provided. -fixable = ["ALL"] -unfixable = [] - -# Exclude a variety of commonly ignored directories. -exclude = [ - ".bzr", - ".direnv", - ".eggs", - ".git", - ".git-rewrite", - ".hg", - ".mypy_cache", - ".nox", - ".pants.d", - ".pytype", - ".ruff_cache", - ".svn", - ".tox", - ".venv", - "__pypackages__", - "_build", - "buck-out", - "build", - "dist", - "node_modules", - "venv", -] -per-file-ignores = {} - -line-length = 65000 - -# Allow unused variables when underscore-prefixed. -dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" - -target-version = "py37" - -[tool.ruff.flake8-quotes] -docstring-quotes = "double" -inline-quotes = "double" -multiline-quotes = "double" \ No newline at end of file +{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"nxc","path":"nxc","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Dockerfile","path":"Dockerfile","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Makefile","path":"Makefile","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"build_collector.py","path":"build_collector.py","contentType":"file"},{"name":"netexec.spec","path":"netexec.spec","contentType":"file"},{"name":"poetry.lock","path":"poetry.lock","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"shell.nix","path":"shell.nix","contentType":"file"}],"totalCount":16}},"fileTreeProcessingTime":6.85647,"foldersToFetch":[],"reducedMotionEnabled":null,"repo":{"id":689013903,"defaultBranch":"main","name":"NetExec","ownerLogin":"Pennyw0rth","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-09-08T15:36:00.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/144470396?v=4","public":true,"private":false,"isOrgOwned":true},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"main","listCacheKey":"v0:1701702489.0","canEdit":false,"refType":"branch","currentOid":"388208d4eadfb05da0239855297ed9de1c970b2c"},"path":"pyproject.toml","currentUser":null,"blob":{"rawLines":["[tool.poetry]\r","name = \"netexec\"\r","version = \"1.1.0\"\r","description = \"The Network Execution tool\"\r","authors = [\r"," \"Marshall Hallenbeck \",\r"," \"Alexander Neff \",\r"," \"Thomas Seigneuret \"\r","]\r","readme = \"README.md\"\r","homepage = \"https://github.com/Pennyw0rth/NetExec\"\r","repository = \"https://github.com/Pennyw0rth/NetExec\"\r","exclude = []\r","include = [\r"," \"nxc/data/*\",\r"," \"nxc/modules/*\"\r","]\r","license = \"BSD-2-Clause\"\r","classifiers = [\r"," 'Environment :: Console',\r"," 'License :: OSI Approved :: BSD License',\r"," 'Programming Language :: Python :: 3',\r"," 'Topic :: Security',\r","]\r","packages = [\r"," { include = \"nxc\"}\r","]\r","\r","[tool.poetry.scripts]\r","nxc = 'nxc.netexec:main'\r","netexec = 'nxc.netexec:main'\r","NetExec = 'nxc.netexec:main'\r","nxcdb = 'nxc.nxcdb:main'\r","\r","[tool.poetry.dependencies]\r","python = \"^3.7.0\"\r","requests = \">=2.27.1\"\r","beautifulsoup4 = \">=4.11,<5\"\r","lsassy = \">=3.1.8\"\r","termcolor = \"2.0.1\"\r","msgpack = \"^1.0.0\"\r","neo4j = \"^4.1.1\" # do not upgrade this until performance regression issues in 5 are fixed (as of 9/23)\r","pylnk3 = \"^0.4.2\"\r","pypsrp = \"^0.8.1\"\r","paramiko = \"^3.3.1\"\r","impacket = { git = \"https://github.com/Pennyw0rth/impacket.git\", branch = \"gkdi\" }\r","dsinternals = \"^1.2.4\"\r","xmltodict = \"^0.13.0\"\r","terminaltables = \"^3.1.0\"\r","aioconsole = \"^0.6.2\"\r","pywerview = \"^0.3.3\" # pywerview 5 requires libkrb5-dev installed which is not default on kali (as of 9/23)\r","minikerberos = \"^0.4.1\"\r","pypykatz = \"^0.6.8\"\r","aardwolf = \"^0.2.7\"\r","dploot = \"^2.2.1\"\r","bloodhound = \"^1.6.1\"\r","asyauth = \"~0.0.14\"\r","masky = \"^0.2.0\"\r","sqlalchemy = \"^2.0.4\"\r","aiosqlite = \"^0.19.0\"\r","pyasn1-modules = \"^0.3.0\"\r","rich = \"^13.3.5\"\r","python-libnmap = \"^0.7.3\"\r","resource = \"^0.2.1\"\r","oscrypto = { git = \"https://github.com/Pennyw0rth/oscrypto\" } # Pypi version currently broken, see: https://github.com/wbond/oscrypto/issues/78 (as of 9/23)\r","pyreadline = \"^2.1\" # for the build - impacket imports its hidden from the builder so an error occurs\r","ruff = \"=0.0.292\"\r","\r","[tool.poetry.group.dev.dependencies]\r","flake8 = \"*\"\r","shiv = \"*\"\r","pytest = \"^7.2.2\"\r","\r","[build-system]\r","requires = [\"poetry-core>=1.2.0\"]\r","build-backend = \"poetry.core.masonry.api\"\r","\r","[tool.ruff]\r","# Ruff doesn't enable pycodestyle warnings (`W`) or\r","# McCabe complexity (`C901`) by default.\r","# Other options: pep8-naming (N), flake8-annotations (ANN), flake8-blind-except (BLE), flake8-commas (COM), flake8-pyi (PYI), flake8-pytest-style (PT), flake8-unused-arguments (ARG), etc\r","# Should tackle flake8-use-pathlib (PTH) at some point\r","select = [\"E\", \"F\", \"D\", \"UP\", \"YTT\", \"ASYNC\", \"B\", \"A\", \"C4\", \"ISC\", \"ICN\", \"PIE\", \"PT\", \"Q\", \"RSE\", \"RET\", \"SIM\", \"TID\", \"ERA\", \"FLY\", \"PERF\", \"FURB\", \"LOG\", \"RUF\"]\r","ignore = [ \"E501\", \"F405\", \"D100\", \"D101\", \"D102\", \"D103\", \"D104\", \"D105\", \"D106\", \"D107\", \"D203\", \"D204\", \"D205\", \"D212\", \"D213\", \"D400\", \"D401\", \"D415\", \"D417\", \"D419\", \"RET503\", \"RET505\", \"RET506\", \"RET507\", \"RET508\", \"PERF203\", \"RUF012\"]\r","\r","# Allow autofix for all enabled rules (when `--fix`) is provided.\r","fixable = [\"ALL\"]\r","unfixable = []\r","\r","# Exclude a variety of commonly ignored directories.\r","exclude = [\r"," \".bzr\",\r"," \".direnv\",\r"," \".eggs\",\r"," \".git\",\r"," \".git-rewrite\",\r"," \".hg\",\r"," \".mypy_cache\",\r"," \".nox\",\r"," \".pants.d\",\r"," \".pytype\",\r"," \".ruff_cache\",\r"," \".svn\",\r"," \".tox\",\r"," \".venv\",\r"," \"__pypackages__\",\r"," \"_build\",\r"," \"buck-out\",\r"," \"build\",\r"," \"dist\",\r"," \"node_modules\",\r"," \"venv\",\r","]\r","per-file-ignores = {}\r","\r","line-length = 65000\r","\r","# Allow unused variables when underscore-prefixed.\r","dummy-variable-rgx = \"^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$\"\r","\r","target-version = \"py37\"\r","\r","[tool.ruff.flake8-quotes]\r","docstring-quotes = \"double\"\r","inline-quotes = \"double\"\r","multiline-quotes = \"double\""],"stylingDirectives":[[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":17,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":42,"cssClass":"pl-s"},{"start":14,"end":15,"cssClass":"pl-pds"},{"start":41,"end":42,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":57,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":56,"end":57,"cssClass":"pl-pds"}],[{"start":4,"end":41,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[{"start":4,"end":49,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":48,"end":49,"cssClass":"pl-pds"}],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":20,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":50,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":49,"end":50,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":52,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":51,"end":52,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":16,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":4,"end":19,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":24,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"}],[{"start":4,"end":28,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":4,"end":44,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":43,"end":44,"cssClass":"pl-pds"}],[{"start":4,"end":41,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[{"start":4,"end":23,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[],[{"start":0,"end":8,"cssClass":"pl-smi"}],[{"start":6,"end":13,"cssClass":"pl-smi"},{"start":16,"end":21,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":20,"cssClass":"pl-en"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":6,"end":24,"cssClass":"pl-s"},{"start":6,"end":7,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":28,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":28,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":24,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":25,"cssClass":"pl-en"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":21,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":28,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":18,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":19,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":18,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":16,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":17,"end":102,"cssClass":"pl-c"},{"start":17,"end":18,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":14,"end":17,"cssClass":"pl-smi"},{"start":20,"end":64,"cssClass":"pl-s"},{"start":20,"end":21,"cssClass":"pl-pds"},{"start":63,"end":64,"cssClass":"pl-pds"},{"start":66,"end":72,"cssClass":"pl-smi"},{"start":75,"end":81,"cssClass":"pl-s"},{"start":75,"end":76,"cssClass":"pl-pds"},{"start":80,"end":81,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":22,"cssClass":"pl-s"},{"start":14,"end":15,"cssClass":"pl-pds"},{"start":21,"end":22,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":21,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":20,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":21,"end":107,"cssClass":"pl-c"},{"start":21,"end":22,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-smi"},{"start":15,"end":23,"cssClass":"pl-s"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":16,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":21,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":13,"end":16,"cssClass":"pl-smi"},{"start":19,"end":59,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":58,"end":59,"cssClass":"pl-pds"},{"start":62,"end":156,"cssClass":"pl-c"},{"start":62,"end":63,"cssClass":"pl-c"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":19,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"},{"start":20,"end":101,"cssClass":"pl-c"},{"start":20,"end":21,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":17,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":18,"cssClass":"pl-en"},{"start":19,"end":22,"cssClass":"pl-en"},{"start":23,"end":35,"cssClass":"pl-en"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":12,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":11,"end":12,"cssClass":"pl-pds"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[],[{"start":1,"end":13,"cssClass":"pl-en"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":12,"end":32,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":31,"end":32,"cssClass":"pl-pds"}],[{"start":0,"end":13,"cssClass":"pl-smi"},{"start":16,"end":41,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":10,"cssClass":"pl-en"}],[{"start":0,"end":51,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":186,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":10,"end":13,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":15,"end":18,"cssClass":"pl-s"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":20,"end":23,"cssClass":"pl-s"},{"start":20,"end":21,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"},{"start":25,"end":29,"cssClass":"pl-s"},{"start":25,"end":26,"cssClass":"pl-pds"},{"start":28,"end":29,"cssClass":"pl-pds"},{"start":31,"end":36,"cssClass":"pl-s"},{"start":31,"end":32,"cssClass":"pl-pds"},{"start":35,"end":36,"cssClass":"pl-pds"},{"start":38,"end":45,"cssClass":"pl-s"},{"start":38,"end":39,"cssClass":"pl-pds"},{"start":44,"end":45,"cssClass":"pl-pds"},{"start":47,"end":50,"cssClass":"pl-s"},{"start":47,"end":48,"cssClass":"pl-pds"},{"start":49,"end":50,"cssClass":"pl-pds"},{"start":52,"end":55,"cssClass":"pl-s"},{"start":52,"end":53,"cssClass":"pl-pds"},{"start":54,"end":55,"cssClass":"pl-pds"},{"start":57,"end":61,"cssClass":"pl-s"},{"start":57,"end":58,"cssClass":"pl-pds"},{"start":60,"end":61,"cssClass":"pl-pds"},{"start":63,"end":68,"cssClass":"pl-s"},{"start":63,"end":64,"cssClass":"pl-pds"},{"start":67,"end":68,"cssClass":"pl-pds"},{"start":70,"end":75,"cssClass":"pl-s"},{"start":70,"end":71,"cssClass":"pl-pds"},{"start":74,"end":75,"cssClass":"pl-pds"},{"start":77,"end":82,"cssClass":"pl-s"},{"start":77,"end":78,"cssClass":"pl-pds"},{"start":81,"end":82,"cssClass":"pl-pds"},{"start":84,"end":88,"cssClass":"pl-s"},{"start":84,"end":85,"cssClass":"pl-pds"},{"start":87,"end":88,"cssClass":"pl-pds"},{"start":90,"end":93,"cssClass":"pl-s"},{"start":90,"end":91,"cssClass":"pl-pds"},{"start":92,"end":93,"cssClass":"pl-pds"},{"start":95,"end":100,"cssClass":"pl-s"},{"start":95,"end":96,"cssClass":"pl-pds"},{"start":99,"end":100,"cssClass":"pl-pds"},{"start":102,"end":107,"cssClass":"pl-s"},{"start":102,"end":103,"cssClass":"pl-pds"},{"start":106,"end":107,"cssClass":"pl-pds"},{"start":109,"end":114,"cssClass":"pl-s"},{"start":109,"end":110,"cssClass":"pl-pds"},{"start":113,"end":114,"cssClass":"pl-pds"},{"start":116,"end":121,"cssClass":"pl-s"},{"start":116,"end":117,"cssClass":"pl-pds"},{"start":120,"end":121,"cssClass":"pl-pds"},{"start":123,"end":128,"cssClass":"pl-s"},{"start":123,"end":124,"cssClass":"pl-pds"},{"start":127,"end":128,"cssClass":"pl-pds"},{"start":130,"end":135,"cssClass":"pl-s"},{"start":130,"end":131,"cssClass":"pl-pds"},{"start":134,"end":135,"cssClass":"pl-pds"},{"start":137,"end":143,"cssClass":"pl-s"},{"start":137,"end":138,"cssClass":"pl-pds"},{"start":142,"end":143,"cssClass":"pl-pds"},{"start":145,"end":151,"cssClass":"pl-s"},{"start":145,"end":146,"cssClass":"pl-pds"},{"start":150,"end":151,"cssClass":"pl-pds"},{"start":153,"end":158,"cssClass":"pl-s"},{"start":153,"end":154,"cssClass":"pl-pds"},{"start":157,"end":158,"cssClass":"pl-pds"},{"start":160,"end":165,"cssClass":"pl-s"},{"start":160,"end":161,"cssClass":"pl-pds"},{"start":164,"end":165,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":11,"end":17,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":19,"end":25,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"},{"start":27,"end":33,"cssClass":"pl-s"},{"start":27,"end":28,"cssClass":"pl-pds"},{"start":32,"end":33,"cssClass":"pl-pds"},{"start":35,"end":41,"cssClass":"pl-s"},{"start":35,"end":36,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"},{"start":43,"end":49,"cssClass":"pl-s"},{"start":43,"end":44,"cssClass":"pl-pds"},{"start":48,"end":49,"cssClass":"pl-pds"},{"start":51,"end":57,"cssClass":"pl-s"},{"start":51,"end":52,"cssClass":"pl-pds"},{"start":56,"end":57,"cssClass":"pl-pds"},{"start":59,"end":65,"cssClass":"pl-s"},{"start":59,"end":60,"cssClass":"pl-pds"},{"start":64,"end":65,"cssClass":"pl-pds"},{"start":67,"end":73,"cssClass":"pl-s"},{"start":67,"end":68,"cssClass":"pl-pds"},{"start":72,"end":73,"cssClass":"pl-pds"},{"start":75,"end":81,"cssClass":"pl-s"},{"start":75,"end":76,"cssClass":"pl-pds"},{"start":80,"end":81,"cssClass":"pl-pds"},{"start":83,"end":89,"cssClass":"pl-s"},{"start":83,"end":84,"cssClass":"pl-pds"},{"start":88,"end":89,"cssClass":"pl-pds"},{"start":91,"end":97,"cssClass":"pl-s"},{"start":91,"end":92,"cssClass":"pl-pds"},{"start":96,"end":97,"cssClass":"pl-pds"},{"start":99,"end":105,"cssClass":"pl-s"},{"start":99,"end":100,"cssClass":"pl-pds"},{"start":104,"end":105,"cssClass":"pl-pds"},{"start":107,"end":113,"cssClass":"pl-s"},{"start":107,"end":108,"cssClass":"pl-pds"},{"start":112,"end":113,"cssClass":"pl-pds"},{"start":115,"end":121,"cssClass":"pl-s"},{"start":115,"end":116,"cssClass":"pl-pds"},{"start":120,"end":121,"cssClass":"pl-pds"},{"start":123,"end":129,"cssClass":"pl-s"},{"start":123,"end":124,"cssClass":"pl-pds"},{"start":128,"end":129,"cssClass":"pl-pds"},{"start":131,"end":137,"cssClass":"pl-s"},{"start":131,"end":132,"cssClass":"pl-pds"},{"start":136,"end":137,"cssClass":"pl-pds"},{"start":139,"end":145,"cssClass":"pl-s"},{"start":139,"end":140,"cssClass":"pl-pds"},{"start":144,"end":145,"cssClass":"pl-pds"},{"start":147,"end":153,"cssClass":"pl-s"},{"start":147,"end":148,"cssClass":"pl-pds"},{"start":152,"end":153,"cssClass":"pl-pds"},{"start":155,"end":161,"cssClass":"pl-s"},{"start":155,"end":156,"cssClass":"pl-pds"},{"start":160,"end":161,"cssClass":"pl-pds"},{"start":163,"end":169,"cssClass":"pl-s"},{"start":163,"end":164,"cssClass":"pl-pds"},{"start":168,"end":169,"cssClass":"pl-pds"},{"start":171,"end":179,"cssClass":"pl-s"},{"start":171,"end":172,"cssClass":"pl-pds"},{"start":178,"end":179,"cssClass":"pl-pds"},{"start":181,"end":189,"cssClass":"pl-s"},{"start":181,"end":182,"cssClass":"pl-pds"},{"start":188,"end":189,"cssClass":"pl-pds"},{"start":191,"end":199,"cssClass":"pl-s"},{"start":191,"end":192,"cssClass":"pl-pds"},{"start":198,"end":199,"cssClass":"pl-pds"},{"start":201,"end":209,"cssClass":"pl-s"},{"start":201,"end":202,"cssClass":"pl-pds"},{"start":208,"end":209,"cssClass":"pl-pds"},{"start":211,"end":219,"cssClass":"pl-s"},{"start":211,"end":212,"cssClass":"pl-pds"},{"start":218,"end":219,"cssClass":"pl-pds"},{"start":221,"end":230,"cssClass":"pl-s"},{"start":221,"end":222,"cssClass":"pl-pds"},{"start":229,"end":230,"cssClass":"pl-pds"},{"start":232,"end":240,"cssClass":"pl-s"},{"start":232,"end":233,"cssClass":"pl-pds"},{"start":239,"end":240,"cssClass":"pl-pds"}],[],[{"start":0,"end":65,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":11,"end":16,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"}],[],[{"start":0,"end":52,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":13,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":4,"end":9,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":8,"end":9,"cssClass":"pl-pds"}],[{"start":4,"end":17,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":14,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":13,"end":14,"cssClass":"pl-pds"}],[{"start":4,"end":13,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"}],[{"start":4,"end":17,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":20,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"}],[{"start":4,"end":12,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":11,"end":12,"cssClass":"pl-pds"}],[{"start":4,"end":14,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":13,"end":14,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[],[{"start":0,"end":16,"cssClass":"pl-smi"}],[],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":19,"cssClass":"pl-c1"}],[],[{"start":0,"end":50,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":18,"cssClass":"pl-smi"},{"start":21,"end":60,"cssClass":"pl-s"},{"start":21,"end":22,"cssClass":"pl-pds"},{"start":59,"end":60,"cssClass":"pl-pds"}],[],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":23,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":10,"cssClass":"pl-en"},{"start":11,"end":24,"cssClass":"pl-en"}],[{"start":0,"end":16,"cssClass":"pl-smi"},{"start":19,"end":27,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":26,"end":27,"cssClass":"pl-pds"}],[{"start":0,"end":13,"cssClass":"pl-smi"},{"start":16,"end":24,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":16,"cssClass":"pl-smi"},{"start":19,"end":27,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":26,"end":27,"cssClass":"pl-pds"}]],"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/Pennyw0rth/NetExec/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null,"repoAlertsPath":"/Pennyw0rth/NetExec/security/dependabot","repoSecurityAndAnalysisPath":"/Pennyw0rth/NetExec/settings/security_analysis","repoOwnerIsOrg":true,"currentUserCanAdminRepo":false},"displayName":"pyproject.toml","displayUrl":"https://github.com/Pennyw0rth/NetExec/blob/main/pyproject.toml?raw=true","headerInfo":{"blobSize":"3.69 KB","deleteInfo":{"deleteTooltip":"You must be signed in to make or propose changes"},"editInfo":{"editTooltip":"You must be signed in to make or propose changes"},"ghDesktopPath":"https://desktop.github.com","gitLfsPath":null,"onBranch":true,"shortPath":"ef0f03b","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FPennyw0rth%2FNetExec%2Fblob%2Fmain%2Fpyproject.toml","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"126","truncatedSloc":"115"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplateHelpUrl":"https://docs.github.com/articles/about-issue-and-pull-request-templates","issueTemplate":null,"discussionTemplate":null,"language":"TOML","languageID":365,"large":false,"loggedIn":false,"newDiscussionPath":"/Pennyw0rth/NetExec/discussions/new","newIssuePath":"/Pennyw0rth/NetExec/issues/new","planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/Pennyw0rth/NetExec/blob/main/pyproject.toml","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","dismissStackNoticePath":"/settings/dismiss-notice/publish_stack_from_file","releasePath":"/Pennyw0rth/NetExec/releases/new?marketplace=true","showPublishActionBanner":false,"showPublishStackBanner":false},"rawBlobUrl":"https://github.com/Pennyw0rth/NetExec/raw/main/pyproject.toml","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"repoOwner":"Pennyw0rth","repoName":"NetExec","showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","showDependabotConfigurationBanner":false,"actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timedOut":false,"notAnalyzed":true,"symbols":[]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/Pennyw0rth/NetExec/branches":{"post":"xYEs2DbxZkTI_2UVX8IS4XCKuDmDxrjE63Di1YFWd3xYQYzdY1hEhNeFEquJ3-qTs42sPtZHjWcZSscVAfQYOQ"},"/repos/preferences":{"post":"Y3fs-fSxXZlmWQVXnLdoDn7lbMQYiwuZb9RDH-wsV8kL7HM2wM0F58gXWW7eIX5m1FVC9ObRgKn9Jx1M9vdVlQ"}}},"title":"NetExec/pyproject.toml at main · Pennyw0rth/NetExec"} \ No newline at end of file From aade0332546924a503049302e05814ce2a06d7a8 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 01:16:26 +0800 Subject: [PATCH 12/56] [mssql] fix wrong things and add brackets Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 8 +- poetry.lock | 828 ++++++++++++++++++----------------------- pyproject.toml | 127 ++++++- 3 files changed, 498 insertions(+), 465 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 5c849034..bb6da7a4 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -404,13 +404,13 @@ class mssql(connection): for keys in self.conn.replies: for _i, key in enumerate(self.conn.replies[keys]): if key["TokenType"] == TDS_ERROR_TOKEN: - error_msg = f"{key['MsgText'].decode('utf-16le')} Please try again with or without '--local-auth'" + error_msg = f"({key['MsgText'].decode('utf-16le')} Please try again with or without '--local-auth')" self.conn.lastError = SQLErrorException(f"ERROR: Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}") return error_msg elif key["TokenType"] == TDS_INFO_TOKEN: - return f"{key['MsgText'].decode('utf-16le')}" + return f"({key['MsgText'].decode('utf-16le')})" elif key["TokenType"] == TDS_LOGINACK_TOKEN: - return f"ACK: Result: {key['Interface']} - {key['ProgName'].decode('utf-16le')} ({key['MajorVer']:d}{key['MinorVer']:d} {key['BuildNumHi']:d}{key['BuildNumLow']:d}) " + return f"(ACK: Result: {key['Interface']} - {key['ProgName'].decode('utf-16le')} ({key['MajorVer']:d}{key['MinorVer']:d} {key['BuildNumHi']:d}{key['BuildNumLow']:d}) )" elif key["TokenType"] == TDS_ENVCHANGE_TOKEN and key["Type"] in ( TDS_ENVCHANGE_DATABASE, TDS_ENVCHANGE_LANGUAGE, @@ -432,4 +432,4 @@ class mssql(connection): _type = "PACKETSIZE" else: _type = f"{key['Type']:d}" - return f"ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')}" + return f"(ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')})" diff --git a/poetry.lock b/poetry.lock index 21cdd169..0fe3c160 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aardwolf" @@ -59,13 +59,13 @@ files = [ [[package]] name = "aiosmb" -version = "0.4.10" +version = "0.4.8" description = "Asynchronous SMB protocol implementation" optional = false python-versions = ">=3.7" files = [ - {file = "aiosmb-0.4.10-py3-none-any.whl", hash = "sha256:8b6f4c586fcd4e757e31aa3ea5a17060d9355d8994011ff6040acc18c578c023"}, - {file = "aiosmb-0.4.10.tar.gz", hash = "sha256:b8de656e1b8fb7d6b1a766534f10e01ee0d1c254235c03449063e04092f5a3dd"}, + {file = "aiosmb-0.4.8-py3-none-any.whl", hash = "sha256:a0121de29d04750fc3591b4a60fb24b9676e4a3f9bc0734dea09d1907579cd42"}, + {file = "aiosmb-0.4.8.tar.gz", hash = "sha256:b2257672bf18b94e245913471a5576f518de1f10a4ea671b2bb275e4b660ba5b"}, ] [package.dependencies] @@ -79,7 +79,7 @@ six = "*" tqdm = "*" unicrypto = ">=0.0.10" wcwidth = "*" -winacl = ">=0.1.8" +winacl = ">=0.1.7" [[package]] name = "aiosqlite" @@ -195,13 +195,13 @@ unicrypto = ">=0.0.10" [[package]] name = "asysocks" -version = "0.2.11" +version = "0.2.9" description = "" optional = false python-versions = ">=3.6" files = [ - {file = "asysocks-0.2.11-py3-none-any.whl", hash = "sha256:578b38d053dfc475114f5b773c561897328102520c4b6e16b5fce8ef7b0c1a4a"}, - {file = "asysocks-0.2.11.tar.gz", hash = "sha256:1709bcf7c994ef0bc7e4e918554af0deb2f8553e72cafa07c55b5f72e2fee1b4"}, + {file = "asysocks-0.2.9-py3-none-any.whl", hash = "sha256:81c5432a00f671dda47916f581b9c22448d9eb03e2227ed3c2691f640d0d6daf"}, + {file = "asysocks-0.2.9.tar.gz", hash = "sha256:ce0df112f7b210e8ac93cb3847fdfa2f2f491f9c43bd5b234b81592311ce959f"}, ] [package.dependencies] @@ -232,28 +232,32 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "bcrypt" -version = "4.1.1" +version = "4.0.1" description = "Modern password hashing for your software and your servers" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "bcrypt-4.1.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:196008d91201bbb1aa4e666fee5e610face25d532e433a560cabb33bfdff958b"}, - {file = "bcrypt-4.1.1-cp37-abi3-macosx_13_0_universal2.whl", hash = "sha256:2e197534c884336f9020c1f3a8efbaab0aa96fc798068cb2da9c671818b7fbb0"}, - {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d573885b637815a7f3a3cd5f87724d7d0822da64b0ab0aa7f7c78bae534e86dc"}, - {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab33473f973e8058d1b2df8d6e095d237c49fbf7a02b527541a86a5d1dc4444"}, - {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fb931cd004a7ad36a89789caf18a54c20287ec1cd62161265344b9c4554fdb2e"}, - {file = "bcrypt-4.1.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:12f40f78dcba4aa7d1354d35acf45fae9488862a4fb695c7eeda5ace6aae273f"}, - {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2ade10e8613a3b8446214846d3ddbd56cfe9205a7d64742f0b75458c868f7492"}, - {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f33b385c3e80b5a26b3a5e148e6165f873c1c202423570fdf45fe34e00e5f3e5"}, - {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:755b9d27abcab678e0b8fb4d0abdebeea1f68dd1183b3f518bad8d31fa77d8be"}, - {file = "bcrypt-4.1.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a7a7b8a87e51e5e8ca85b9fdaf3a5dc7aaf123365a09be7a27883d54b9a0c403"}, - {file = "bcrypt-4.1.1-cp37-abi3-win32.whl", hash = "sha256:3d6c4e0d6963c52f8142cdea428e875042e7ce8c84812d8e5507bd1e42534e07"}, - {file = "bcrypt-4.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:14d41933510717f98aac63378b7956bbe548986e435df173c841d7f2bd0b2de7"}, - {file = "bcrypt-4.1.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24c2ebd287b5b11016f31d506ca1052d068c3f9dc817160628504690376ff050"}, - {file = "bcrypt-4.1.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:476aa8e8aca554260159d4c7a97d6be529c8e177dbc1d443cb6b471e24e82c74"}, - {file = "bcrypt-4.1.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12611c4b0a8b1c461646228344784a1089bc0c49975680a2f54f516e71e9b79e"}, - {file = "bcrypt-4.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6450538a0fc32fb7ce4c6d511448c54c4ff7640b2ed81badf9898dcb9e5b737"}, - {file = "bcrypt-4.1.1.tar.gz", hash = "sha256:df37f5418d4f1cdcff845f60e747a015389fa4e63703c918330865e06ad80007"}, + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, ] [package.extras] @@ -280,65 +284,23 @@ lxml = ["lxml"] [[package]] name = "bitstruct" -version = "8.19.0" +version = "8.17.0" description = "This module performs conversions between Python values and C bit field structs represented as Python byte strings." optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "bitstruct-8.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d1f3eb18ddc33ba73f5cbb55c885584bcec51c421ac3551b79edc0ffeaecc3d"}, - {file = "bitstruct-8.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a35e0b267d12438e6a7b28850a15d4cffe767db6fc443a406d0ead97fa1d7d5b"}, - {file = "bitstruct-8.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5732aff5c8eb3a572f7b20d09fc4c213215f9e60c0e66f2910b31eb65b457744"}, - {file = "bitstruct-8.19.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc8f1871b42b705eb34b8722c3ec358fbf1b97fd37a62693564ee72648afb100"}, - {file = "bitstruct-8.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:01bdfc3adbe15b05ba27ab6dce7959caa29a000f066201944b29c64bb8888f03"}, - {file = "bitstruct-8.19.0-cp310-cp310-win32.whl", hash = "sha256:961845a29333119b70dd9aab54bc714bf9ba5efefc55cb4c747c35c1390b8842"}, - {file = "bitstruct-8.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:9fbe12d464db909f58d5e2a2485b3047a488fa1373e8f74b22d6759ee6b2437a"}, - {file = "bitstruct-8.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1300cd635814e40b1f4105aa4f404cb5d1b8cc54e06e267ba1616725f9c2beea"}, - {file = "bitstruct-8.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2fb23b5973ce1e9f349c4dc90873eeff9800fe917ffd345f39b9b964f6d119"}, - {file = "bitstruct-8.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e0c18d557474d8452c4f8b59320fd4d9efcf52eae2144bdf317d25c64dcf85"}, - {file = "bitstruct-8.19.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bba06607f956cc39ceee19fd11b542e8e66a43180d48fa36c4609443893c273e"}, - {file = "bitstruct-8.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f2fa607d111077145e6374d49be6098f33e7cee0967b42cfc117df53eee13332"}, - {file = "bitstruct-8.19.0-cp311-cp311-win32.whl", hash = "sha256:abdb7bdb5b04c2f1bbda0eae828c627252243ddc042aea6b72af8fcc63696598"}, - {file = "bitstruct-8.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:464f102999402a2624ee3106dbfa1f3745810036814a33e6bc706b7d312c480f"}, - {file = "bitstruct-8.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:55768b1f5e33594178f0b3e1596b89d831b006713a60caa09de61fd385bf22b1"}, - {file = "bitstruct-8.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c026a7cf8d954ef53cf4d0ae5ee3dd1ac66e24e9a474c5afe55467ab7d609f2e"}, - {file = "bitstruct-8.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7488fd4e2fde3d8111971e2040cd5b008be918381afc80387d3fdf047c801293"}, - {file = "bitstruct-8.19.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:45b66e20633f1e083e37fa396c81761e0fc688ffa06ff5559e990e37234f9e18"}, - {file = "bitstruct-8.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1542d5ae888ebc31614775938bfd13454f0d897dc2515363a4607efadc990b"}, - {file = "bitstruct-8.19.0-cp312-cp312-win32.whl", hash = "sha256:7ea57e4e793b595cd3e037920852f2c676b4f5f1734c41985db3f48783928e2c"}, - {file = "bitstruct-8.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:1c4d9b75248adee84e7e6c95bf95966f152b78363cb20a81920da2aeadc4375f"}, - {file = "bitstruct-8.19.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7b4745b099d3d85307495e25ff0f265deeea675621dcecb25ba059ee68ce88d5"}, - {file = "bitstruct-8.19.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645da560acd20dd73a1ef220e3ddc08e108866e30a708ef2f6193e0a3725113e"}, - {file = "bitstruct-8.19.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01402fbc3dba2286b3ac9b74d5936dd984736f928aacd371458a4b0cf95f0755"}, - {file = "bitstruct-8.19.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2c5eda42d55db67072c6cf7cc79b1df1074269004bad119b79e4ad38cfa61877"}, - {file = "bitstruct-8.19.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2ea093522b12ce714a3a95851a8c3dd97f620126bbe983eb261b3bf18ac945e7"}, - {file = "bitstruct-8.19.0-cp37-cp37m-win32.whl", hash = "sha256:da00da004830800323554e7a83f1f32a1f49345f5379476de4b5f6ae227ee962"}, - {file = "bitstruct-8.19.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a0ca55fba25d6c631e17933f20cf87f553d7bceec7659e3de9ef48dc85ced2bf"}, - {file = "bitstruct-8.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3f6e3aeb598215062c505a06135fbdfa3bb4eeb249b55f87e865a86b3fd9e99"}, - {file = "bitstruct-8.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df74c72feba80014b05ab6f1e1a0bb90be9f9e7eb60a9bab1e00728f7f46d79d"}, - {file = "bitstruct-8.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:976c39ad771c6773d6fbd14d71e62242d5b3bca7b72428fd183e1f1085d5e858"}, - {file = "bitstruct-8.19.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d2c176ff6727206805760f45c2151468aed843256aa239c14f4730b9e1d84fc7"}, - {file = "bitstruct-8.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7774e2a51e254ef1ba98a1ee38573c819d4ee7e396d5121c5ecae17df927501"}, - {file = "bitstruct-8.19.0-cp38-cp38-win32.whl", hash = "sha256:b86d192d658eaf35f10efb2e1940ec755cc28e081f46de294a2e91a74ea298aa"}, - {file = "bitstruct-8.19.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e7f78aedec2881017026eb7f7ab79514aef09a24afd8acf5fa8c73b1cd0e9f4"}, - {file = "bitstruct-8.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bb49acc2ccc6efd3c9613cae8f7e1316c92f832bff860a6fcb78a4275974e90"}, - {file = "bitstruct-8.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bed7b2761c18a515298145a4f67b6c71ce302453fe7d87ec6b7d2e77fd3c22b"}, - {file = "bitstruct-8.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d0cafd2e2974c4bbe349fb67951d43d221ea304218c2ee65f9fe4c62acabc2f"}, - {file = "bitstruct-8.19.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d9ba0299f624e7c8ea1eec926fc77741f82ffc5b3c3ba4f89303d33d5605f4d8"}, - {file = "bitstruct-8.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfa0326057c9b02c4e65e74e45b9914a7f8c59590a8e718e20a899a02b41f2e6"}, - {file = "bitstruct-8.19.0-cp39-cp39-win32.whl", hash = "sha256:14c3ebdec92c486142327d934cb451d96b411543ec6f72aeb2b4b4334e9408bf"}, - {file = "bitstruct-8.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:7836852d5c15444e87a2029f922b48717e6e199d2332d55e8738e92d8590987e"}, - {file = "bitstruct-8.19.0.tar.gz", hash = "sha256:d75ba9dded85c17e885a209a00eb8e248ee40762149f2f2a79360ca857467dac"}, + {file = "bitstruct-8.17.0.tar.gz", hash = "sha256:eb94b40e4218a23aa8f90406b836a9e6ed83e48b8d112ce3f96408463bd1b874"}, ] [[package]] name = "bloodhound" -version = "1.7.0" +version = "1.6.1" description = "Python based ingestor for BloodHound" optional = false python-versions = "*" files = [ - {file = "bloodhound-1.7.0-py3-none-any.whl", hash = "sha256:489f65d759a3349d5373f7090701d5c543c677e90da6293f3ef16ec3b5b253e3"}, - {file = "bloodhound-1.7.0.tar.gz", hash = "sha256:d0eb0e3e5b0576a83b3d5ee7924540368d3264c4b77f5efd8b2e9476aebe7b06"}, + {file = "bloodhound-1.6.1-py3-none-any.whl", hash = "sha256:616bbf5c27e5ed9562e157293eaa595c5804507e4493bc08b5f9b061b2ff431a"}, + {file = "bloodhound-1.6.1.tar.gz", hash = "sha256:4913fbe08e5eb8a244ae74a49ba392740c339effd941e12d346e17a1f9c811e7"}, ] [package.dependencies] @@ -347,7 +309,6 @@ future = "*" impacket = ">=0.9.17" ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" pyasn1 = ">=0.4" -pycryptodome = "*" [[package]] name = "bs4" @@ -364,13 +325,13 @@ beautifulsoup4 = "*" [[package]] name = "certifi" -version = "2023.11.17" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] @@ -451,101 +412,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, ] [[package]] @@ -637,19 +598,19 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] [[package]] name = "dploot" -version = "2.2.4" +version = "2.2.2" description = "DPAPI looting remotely in Python" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "dploot-2.2.4-py3-none-any.whl", hash = "sha256:a70c8280972a1fb7150093560093e46a9bb5936396f563ae9050a20dcf1ad96e"}, - {file = "dploot-2.2.4.tar.gz", hash = "sha256:e34ff928e94416f3cbf688427d1de4aa88a4a4a15f24edb6313a2adc685a98a3"}, + {file = "dploot-2.2.2-py3-none-any.whl", hash = "sha256:d6fe84ae7e3f1135333e73974059493601d6e343859bd5c920d0597d4dadc118"}, + {file = "dploot-2.2.2.tar.gz", hash = "sha256:7413cc18ebfc7a92522945480583f8899df212fb416b2385bb0fae46a97bec44"}, ] [package.dependencies] cryptography = ">=40.0.1,<41.0.0" impacket = ">=0.10.0" -lxml = "4.9.3" +lxml = "4.9.2" pyasn1 = ">=0.4.8,<0.5.0" [[package]] @@ -664,13 +625,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -727,68 +688,73 @@ files = [ [[package]] name = "greenlet" -version = "3.0.1" +version = "3.0.0" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, - {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, - {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, - {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, - {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, - {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, - {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, - {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, - {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, - {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, - {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, - {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, - {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, - {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, - {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, ] [package.extras] @@ -811,18 +777,18 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "idna" -version = "3.6" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] name = "impacket" -version = "0.12.0.dev1+20231130.165011.d370e635" +version = "0.12.0.dev1+20230919.145657.cdf867fa" description = "Network protocols Constructors and Dissectors" optional = false python-versions = "*" @@ -830,7 +796,7 @@ files = [] develop = false [package.dependencies] -charset_normalizer = "*" +charset-normalizer = "*" dsinternals = "*" flask = ">=1.0" ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" @@ -845,7 +811,7 @@ six = "*" type = "git" url = "https://github.com/Pennyw0rth/impacket.git" reference = "gkdi" -resolved_reference = "d370e6359a410063b2c9c68f6572c3b5fb178a38" +resolved_reference = "cdf867faa6b9db1bd19b44ec7a53d7e40b95e3a5" [[package]] name = "importlib-metadata" @@ -1004,13 +970,13 @@ ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" [[package]] name = "lsassy" -version = "3.1.9" +version = "3.1.8" description = "Python library to extract credentials from lsass remotely" optional = false python-versions = ">=3.6" files = [ - {file = "lsassy-3.1.9-py3-none-any.whl", hash = "sha256:8497168efe43147d639671c5ea3d4b04b7d8c4336f77286b767fca0edca6c830"}, - {file = "lsassy-3.1.9.tar.gz", hash = "sha256:75d7038915dea31b6380488befedb4081e1fdade9a68d6f7cb5b4cf6c93b9970"}, + {file = "lsassy-3.1.8-py3-none-any.whl", hash = "sha256:1b3f6220bc18c8ce751b7f3e790385434cba5593376f3b44b56cc46e2f5bfda0"}, + {file = "lsassy-3.1.8.tar.gz", hash = "sha256:95e13d9ec2f0c2b3450ea5499b04c4dcd231aa6a5f13cf066d9354db36c70b28"}, ] [package.dependencies] @@ -1021,110 +987,95 @@ rich = "*" [[package]] name = "lxml" -version = "4.9.3" +version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, - {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, - {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, - {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, - {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, - {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, - {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, - {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, - {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, - {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, - {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, - {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, - {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, - {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, - {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, - {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, - {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, - {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, - {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, - {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, - {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, - {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, - {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, - {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.35)"] +source = ["Cython (>=0.29.7)"] [[package]] name = "markdown-it-py" @@ -1262,24 +1213,24 @@ files = [ [[package]] name = "minidump" -version = "0.0.22" +version = "0.0.21" description = "Python library to parse Windows minidump file format" optional = false python-versions = ">=3.6" files = [ - {file = "minidump-0.0.22-py3-none-any.whl", hash = "sha256:71a0bd07d6cd8f34d0d45b2f696bf8b4ba902ebe94903dcd57ae00c10e40a2dd"}, - {file = "minidump-0.0.22.tar.gz", hash = "sha256:3cfbefbc7cf7580ebb567d8fecc218f828648d7ac23ae4e08f4297af8076999d"}, + {file = "minidump-0.0.21-py3-none-any.whl", hash = "sha256:6a9d2152f76ae633c609e09b48b42f55bd5a6b65f920dbbec756e5d9134a6201"}, + {file = "minidump-0.0.21.tar.gz", hash = "sha256:83d612afb6c57727ebf38aca433b550f83f9f8c7c3b6562ad2ab97071fd85f3a"}, ] [[package]] name = "minikerberos" -version = "0.4.3" +version = "0.4.2" description = "Kerberos manipulation library in pure Python" optional = false python-versions = ">=3.6" files = [ - {file = "minikerberos-0.4.3-py3-none-any.whl", hash = "sha256:cce9c537a45574bd0fb052bab1c10a24b3b4937c4c9814355e813962355e3096"}, - {file = "minikerberos-0.4.3.tar.gz", hash = "sha256:f553cad791883dc1be51cc948a77af2b2128a26ea6340f7d34a2f45d677d1bf3"}, + {file = "minikerberos-0.4.2-py3-none-any.whl", hash = "sha256:0e20d0221022988f3916f4fd4e9e362964087fdafc227c717067ccee33736f69"}, + {file = "minikerberos-0.4.2.tar.gz", hash = "sha256:04408a586e67c4808e49f40981726a0a48b681cbff651ac3168e7b9d71ef868b"}, ] [package.dependencies] @@ -1411,7 +1362,7 @@ files = [ [[package]] name = "oscrypto" version = "1.3.0" -description = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD." +description = "" optional = false python-versions = "*" files = [] @@ -1539,13 +1490,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "pip" -version = "23.3.1" +version = "23.3" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.7" files = [ - {file = "pip-23.3.1-py3-none-any.whl", hash = "sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b"}, - {file = "pip-23.3.1.tar.gz", hash = "sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"}, + {file = "pip-23.3-py3-none-any.whl", hash = "sha256:bc38bb52bc286514f8f7cb3a1ba5ed100b76aaef29b521d48574329331c5ae7b"}, + {file = "pip-23.3.tar.gz", hash = "sha256:bb7d4f69f488432e4e96394612f43ab43dd478d073ef7422604a570f7157561e"}, ] [[package]] @@ -1579,13 +1530,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.41" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -1638,47 +1589,6 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -[[package]] -name = "pycryptodome" -version = "3.19.0" -description = "Cryptographic library for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pycryptodome-3.19.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3006c44c4946583b6de24fe0632091c2653d6256b99a02a3db71ca06472ea1e4"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c760c8a0479a4042111a8dd2f067d3ae4573da286c53f13cf6f5c53a5c1f631"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:08ce3558af5106c632baf6d331d261f02367a6bc3733086ae43c0f988fe042db"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45430dfaf1f421cf462c0dd824984378bef32b22669f2635cb809357dbaab405"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:a9bcd5f3794879e91970f2bbd7d899780541d3ff439d8f2112441769c9f2ccea"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-win32.whl", hash = "sha256:190c53f51e988dceb60472baddce3f289fa52b0ec38fbe5fd20dd1d0f795c551"}, - {file = "pycryptodome-3.19.0-cp27-cp27m-win_amd64.whl", hash = "sha256:22e0ae7c3a7f87dcdcf302db06ab76f20e83f09a6993c160b248d58274473bfa"}, - {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7822f36d683f9ad7bc2145b2c2045014afdbbd1d9922a6d4ce1cbd6add79a01e"}, - {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:05e33267394aad6db6595c0ce9d427fe21552f5425e116a925455e099fdf759a"}, - {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:829b813b8ee00d9c8aba417621b94bc0b5efd18c928923802ad5ba4cf1ec709c"}, - {file = "pycryptodome-3.19.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:fc7a79590e2b5d08530175823a242de6790abc73638cc6dc9d2684e7be2f5e49"}, - {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:542f99d5026ac5f0ef391ba0602f3d11beef8e65aae135fa5b762f5ebd9d3bfb"}, - {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:61bb3ccbf4bf32ad9af32da8badc24e888ae5231c617947e0f5401077f8b091f"}, - {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d49a6c715d8cceffedabb6adb7e0cbf41ae1a2ff4adaeec9432074a80627dea1"}, - {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e249a784cc98a29c77cea9df54284a44b40cafbfae57636dd2f8775b48af2434"}, - {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d033947e7fd3e2ba9a031cb2d267251620964705a013c5a461fa5233cc025270"}, - {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:84c3e4fffad0c4988aef0d5591be3cad4e10aa7db264c65fadbc633318d20bde"}, - {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:139ae2c6161b9dd5d829c9645d781509a810ef50ea8b657e2257c25ca20efe33"}, - {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5b1986c761258a5b4332a7f94a83f631c1ffca8747d75ab8395bf2e1b93283d9"}, - {file = "pycryptodome-3.19.0-cp35-abi3-win32.whl", hash = "sha256:536f676963662603f1f2e6ab01080c54d8cd20f34ec333dcb195306fa7826997"}, - {file = "pycryptodome-3.19.0-cp35-abi3-win_amd64.whl", hash = "sha256:04dd31d3b33a6b22ac4d432b3274588917dcf850cc0c51c84eca1d8ed6933810"}, - {file = "pycryptodome-3.19.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:8999316e57abcbd8085c91bc0ef75292c8618f41ca6d2b6132250a863a77d1e7"}, - {file = "pycryptodome-3.19.0-pp27-pypy_73-win32.whl", hash = "sha256:a0ab84755f4539db086db9ba9e9f3868d2e3610a3948cbd2a55e332ad83b01b0"}, - {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0101f647d11a1aae5a8ce4f5fad6644ae1b22bb65d05accc7d322943c69a74a6"}, - {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1601e04d32087591d78e0b81e1e520e57a92796089864b20e5f18c9564b3fa"}, - {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:506c686a1eee6c00df70010be3b8e9e78f406af4f21b23162bbb6e9bdf5427bc"}, - {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7919ccd096584b911f2a303c593280869ce1af9bf5d36214511f5e5a1bed8c34"}, - {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560591c0777f74a5da86718f70dfc8d781734cf559773b64072bbdda44b3fc3e"}, - {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cc2f2ae451a676def1a73c1ae9120cd31af25db3f381893d45f75e77be2400"}, - {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17940dcf274fcae4a54ec6117a9ecfe52907ed5e2e438fe712fe7ca502672ed5"}, - {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d04f5f623a280fbd0ab1c1d8ecbd753193ab7154f09b6161b0f857a1a676c15f"}, - {file = "pycryptodome-3.19.0.tar.gz", hash = "sha256:bc35d463222cdb4dbebd35e0784155c81e161b9284e567e7e933d722e533331e"}, -] - [[package]] name = "pycryptodomex" version = "3.19.0" @@ -1733,18 +1643,17 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] plugins = ["importlib-metadata"] -windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylnk3" @@ -1945,13 +1854,13 @@ yaml = ["ruamel.yaml"] [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] [package.dependencies] @@ -2119,13 +2028,13 @@ python-easyconfig = ">=0.1.0" [[package]] name = "rich" -version = "13.7.0" +version = "13.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, + {file = "rich-13.6.0-py3-none-any.whl", hash = "sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"}, + {file = "rich-13.6.0.tar.gz", hash = "sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef"}, ] [package.dependencies] @@ -2218,60 +2127,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.23" +version = "2.0.22" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, - {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, - {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f146c61ae128ab43ea3a0955de1af7e1633942c2b2b4985ac51cc292daf33222"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:875de9414393e778b655a3d97d60465eb3fae7c919e88b70cc10b40b9f56042d"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13790cb42f917c45c9c850b39b9941539ca8ee7917dacf099cc0b569f3d40da7"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e04ab55cf49daf1aeb8c622c54d23fa4bec91cb051a43cc24351ba97e1dd09f5"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a42c9fa3abcda0dcfad053e49c4f752eef71ecd8c155221e18b99d4224621176"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:14cd3bcbb853379fef2cd01e7c64a5d6f1d005406d877ed9509afb7a05ff40a5"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-win32.whl", hash = "sha256:d143c5a9dada696bcfdb96ba2de4a47d5a89168e71d05a076e88a01386872f97"}, + {file = "SQLAlchemy-2.0.22-cp310-cp310-win_amd64.whl", hash = "sha256:ccd87c25e4c8559e1b918d46b4fa90b37f459c9b4566f1dfbce0eb8122571547"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f6ff392b27a743c1ad346d215655503cec64405d3b694228b3454878bf21590"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f776c2c30f0e5f4db45c3ee11a5f2a8d9de68e81eb73ec4237de1e32e04ae81c"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8f1792d20d2f4e875ce7a113f43c3561ad12b34ff796b84002a256f37ce9437"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80eeb5189d7d4b1af519fc3f148fe7521b9dfce8f4d6a0820e8f5769b005051"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:69fd9e41cf9368afa034e1c81f3570afb96f30fcd2eb1ef29cb4d9371c6eece2"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54bcceaf4eebef07dadfde424f5c26b491e4a64e61761dea9459103ecd6ccc95"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-win32.whl", hash = "sha256:7ee7ccf47aa503033b6afd57efbac6b9e05180f492aeed9fcf70752556f95624"}, + {file = "SQLAlchemy-2.0.22-cp311-cp311-win_amd64.whl", hash = "sha256:b560f075c151900587ade06706b0c51d04b3277c111151997ea0813455378ae0"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2c9bac865ee06d27a1533471405ad240a6f5d83195eca481f9fc4a71d8b87df8"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:625b72d77ac8ac23da3b1622e2da88c4aedaee14df47c8432bf8f6495e655de2"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39a6e21110204a8c08d40ff56a73ba542ec60bab701c36ce721e7990df49fb9"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a766cb0b468223cafdf63e2d37f14a4757476157927b09300c8c5832d88560"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0e1ce8ebd2e040357dde01a3fb7d30d9b5736b3e54a94002641dfd0aa12ae6ce"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:505f503763a767556fa4deae5194b2be056b64ecca72ac65224381a0acab7ebe"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-win32.whl", hash = "sha256:154a32f3c7b00de3d090bc60ec8006a78149e221f1182e3edcf0376016be9396"}, + {file = "SQLAlchemy-2.0.22-cp312-cp312-win_amd64.whl", hash = "sha256:129415f89744b05741c6f0b04a84525f37fbabe5dc3774f7edf100e7458c48cd"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3940677d341f2b685a999bffe7078697b5848a40b5f6952794ffcf3af150c301"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55914d45a631b81a8a2cb1a54f03eea265cf1783241ac55396ec6d735be14883"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2096d6b018d242a2bcc9e451618166f860bb0304f590d205173d317b69986c95"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:19c6986cf2fb4bc8e0e846f97f4135a8e753b57d2aaaa87c50f9acbe606bd1db"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ac28bd6888fe3c81fbe97584eb0b96804bd7032d6100b9701255d9441373ec1"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-win32.whl", hash = "sha256:cb9a758ad973e795267da334a92dd82bb7555cb36a0960dcabcf724d26299db8"}, + {file = "SQLAlchemy-2.0.22-cp37-cp37m-win_amd64.whl", hash = "sha256:40b1206a0d923e73aa54f0a6bd61419a96b914f1cd19900b6c8226899d9742ad"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3aa1472bf44f61dd27987cd051f1c893b7d3b17238bff8c23fceaef4f1133868"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:56a7e2bb639df9263bf6418231bc2a92a773f57886d371ddb7a869a24919face"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccca778c0737a773a1ad86b68bda52a71ad5950b25e120b6eb1330f0df54c3d0"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6c3e9350f9fb16de5b5e5fbf17b578811a52d71bb784cc5ff71acb7de2a7f9"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:564e9f9e4e6466273dbfab0e0a2e5fe819eec480c57b53a2cdee8e4fdae3ad5f"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af66001d7b76a3fab0d5e4c1ec9339ac45748bc4a399cbc2baa48c1980d3c1f4"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-win32.whl", hash = "sha256:9e55dff5ec115316dd7a083cdc1a52de63693695aecf72bc53a8e1468ce429e5"}, + {file = "SQLAlchemy-2.0.22-cp38-cp38-win_amd64.whl", hash = "sha256:4e869a8ff7ee7a833b74868a0887e8462445ec462432d8cbeff5e85f475186da"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9886a72c8e6371280cb247c5d32c9c8fa141dc560124348762db8a8b236f8692"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a571bc8ac092a3175a1d994794a8e7a1f2f651e7c744de24a19b4f740fe95034"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db5ba8b7da759b727faebc4289a9e6a51edadc7fc32207a30f7c6203a181592"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0b3f2686c3f162123adba3cb8b626ed7e9b8433ab528e36ed270b4f70d1cdb"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c1fea8c0abcb070ffe15311853abfda4e55bf7dc1d4889497b3403629f3bf00"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4bb062784f37b2d75fd9b074c8ec360ad5df71f933f927e9e95c50eb8e05323c"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-win32.whl", hash = "sha256:58a3aba1bfb32ae7af68da3f277ed91d9f57620cf7ce651db96636790a78b736"}, + {file = "SQLAlchemy-2.0.22-cp39-cp39-win_amd64.whl", hash = "sha256:92e512a6af769e4725fa5b25981ba790335d42c5977e94ded07db7d641490a85"}, + {file = "SQLAlchemy-2.0.22-py3-none-any.whl", hash = "sha256:3076740335e4aaadd7deb3fe6dcb96b3015f1613bd190a4e1634e1b99b02ec86"}, + {file = "SQLAlchemy-2.0.22.tar.gz", hash = "sha256:5434cc601aa17570d79e5377f5fd45ff92f9379e2abed0be5e8c2fba8d353d2b"}, ] [package.dependencies] @@ -2281,7 +2190,6 @@ typing-extensions = ">=4.2.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -2292,7 +2200,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=8)"] +oracle = ["cx-oracle (>=7)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -2417,13 +2325,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.12" +version = "0.2.8" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, - {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, + {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, + {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, ] [[package]] @@ -2445,13 +2353,13 @@ watchdog = ["watchdog"] [[package]] name = "winacl" -version = "0.1.8" +version = "0.1.7" description = "ACL/ACE/Security Descriptor manipulation library in pure Python" optional = false python-versions = ">=3.6" files = [ - {file = "winacl-0.1.8-py3-none-any.whl", hash = "sha256:f17028422c0b2dc6752c801350d37878919804728b776289521dc83622982a45"}, - {file = "winacl-0.1.8.tar.gz", hash = "sha256:44271a302562de51629f68ef1540d40f3a26e7bc0173646b01a6779cedad644c"}, + {file = "winacl-0.1.7-py3-none-any.whl", hash = "sha256:5d00ed1d2378823050b4eb87ff3e69d49cb3ecb8bf1e012b69afe15e3bdb2703"}, + {file = "winacl-0.1.7.tar.gz", hash = "sha256:ca662c091471a6c629d76c5eec63d8a1bf1af7c054348f09c1242f338850b2bd"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index 47e3af77..ef0f03bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1 +1,126 @@ -{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"nxc","path":"nxc","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Dockerfile","path":"Dockerfile","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Makefile","path":"Makefile","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"build_collector.py","path":"build_collector.py","contentType":"file"},{"name":"netexec.spec","path":"netexec.spec","contentType":"file"},{"name":"poetry.lock","path":"poetry.lock","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"shell.nix","path":"shell.nix","contentType":"file"}],"totalCount":16}},"fileTreeProcessingTime":6.85647,"foldersToFetch":[],"reducedMotionEnabled":null,"repo":{"id":689013903,"defaultBranch":"main","name":"NetExec","ownerLogin":"Pennyw0rth","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-09-08T15:36:00.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/144470396?v=4","public":true,"private":false,"isOrgOwned":true},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"main","listCacheKey":"v0:1701702489.0","canEdit":false,"refType":"branch","currentOid":"388208d4eadfb05da0239855297ed9de1c970b2c"},"path":"pyproject.toml","currentUser":null,"blob":{"rawLines":["[tool.poetry]\r","name = \"netexec\"\r","version = \"1.1.0\"\r","description = \"The Network Execution tool\"\r","authors = [\r"," \"Marshall Hallenbeck \",\r"," \"Alexander Neff \",\r"," \"Thomas Seigneuret \"\r","]\r","readme = \"README.md\"\r","homepage = \"https://github.com/Pennyw0rth/NetExec\"\r","repository = \"https://github.com/Pennyw0rth/NetExec\"\r","exclude = []\r","include = [\r"," \"nxc/data/*\",\r"," \"nxc/modules/*\"\r","]\r","license = \"BSD-2-Clause\"\r","classifiers = [\r"," 'Environment :: Console',\r"," 'License :: OSI Approved :: BSD License',\r"," 'Programming Language :: Python :: 3',\r"," 'Topic :: Security',\r","]\r","packages = [\r"," { include = \"nxc\"}\r","]\r","\r","[tool.poetry.scripts]\r","nxc = 'nxc.netexec:main'\r","netexec = 'nxc.netexec:main'\r","NetExec = 'nxc.netexec:main'\r","nxcdb = 'nxc.nxcdb:main'\r","\r","[tool.poetry.dependencies]\r","python = \"^3.7.0\"\r","requests = \">=2.27.1\"\r","beautifulsoup4 = \">=4.11,<5\"\r","lsassy = \">=3.1.8\"\r","termcolor = \"2.0.1\"\r","msgpack = \"^1.0.0\"\r","neo4j = \"^4.1.1\" # do not upgrade this until performance regression issues in 5 are fixed (as of 9/23)\r","pylnk3 = \"^0.4.2\"\r","pypsrp = \"^0.8.1\"\r","paramiko = \"^3.3.1\"\r","impacket = { git = \"https://github.com/Pennyw0rth/impacket.git\", branch = \"gkdi\" }\r","dsinternals = \"^1.2.4\"\r","xmltodict = \"^0.13.0\"\r","terminaltables = \"^3.1.0\"\r","aioconsole = \"^0.6.2\"\r","pywerview = \"^0.3.3\" # pywerview 5 requires libkrb5-dev installed which is not default on kali (as of 9/23)\r","minikerberos = \"^0.4.1\"\r","pypykatz = \"^0.6.8\"\r","aardwolf = \"^0.2.7\"\r","dploot = \"^2.2.1\"\r","bloodhound = \"^1.6.1\"\r","asyauth = \"~0.0.14\"\r","masky = \"^0.2.0\"\r","sqlalchemy = \"^2.0.4\"\r","aiosqlite = \"^0.19.0\"\r","pyasn1-modules = \"^0.3.0\"\r","rich = \"^13.3.5\"\r","python-libnmap = \"^0.7.3\"\r","resource = \"^0.2.1\"\r","oscrypto = { git = \"https://github.com/Pennyw0rth/oscrypto\" } # Pypi version currently broken, see: https://github.com/wbond/oscrypto/issues/78 (as of 9/23)\r","pyreadline = \"^2.1\" # for the build - impacket imports its hidden from the builder so an error occurs\r","ruff = \"=0.0.292\"\r","\r","[tool.poetry.group.dev.dependencies]\r","flake8 = \"*\"\r","shiv = \"*\"\r","pytest = \"^7.2.2\"\r","\r","[build-system]\r","requires = [\"poetry-core>=1.2.0\"]\r","build-backend = \"poetry.core.masonry.api\"\r","\r","[tool.ruff]\r","# Ruff doesn't enable pycodestyle warnings (`W`) or\r","# McCabe complexity (`C901`) by default.\r","# Other options: pep8-naming (N), flake8-annotations (ANN), flake8-blind-except (BLE), flake8-commas (COM), flake8-pyi (PYI), flake8-pytest-style (PT), flake8-unused-arguments (ARG), etc\r","# Should tackle flake8-use-pathlib (PTH) at some point\r","select = [\"E\", \"F\", \"D\", \"UP\", \"YTT\", \"ASYNC\", \"B\", \"A\", \"C4\", \"ISC\", \"ICN\", \"PIE\", \"PT\", \"Q\", \"RSE\", \"RET\", \"SIM\", \"TID\", \"ERA\", \"FLY\", \"PERF\", \"FURB\", \"LOG\", \"RUF\"]\r","ignore = [ \"E501\", \"F405\", \"D100\", \"D101\", \"D102\", \"D103\", \"D104\", \"D105\", \"D106\", \"D107\", \"D203\", \"D204\", \"D205\", \"D212\", \"D213\", \"D400\", \"D401\", \"D415\", \"D417\", \"D419\", \"RET503\", \"RET505\", \"RET506\", \"RET507\", \"RET508\", \"PERF203\", \"RUF012\"]\r","\r","# Allow autofix for all enabled rules (when `--fix`) is provided.\r","fixable = [\"ALL\"]\r","unfixable = []\r","\r","# Exclude a variety of commonly ignored directories.\r","exclude = [\r"," \".bzr\",\r"," \".direnv\",\r"," \".eggs\",\r"," \".git\",\r"," \".git-rewrite\",\r"," \".hg\",\r"," \".mypy_cache\",\r"," \".nox\",\r"," \".pants.d\",\r"," \".pytype\",\r"," \".ruff_cache\",\r"," \".svn\",\r"," \".tox\",\r"," \".venv\",\r"," \"__pypackages__\",\r"," \"_build\",\r"," \"buck-out\",\r"," \"build\",\r"," \"dist\",\r"," \"node_modules\",\r"," \"venv\",\r","]\r","per-file-ignores = {}\r","\r","line-length = 65000\r","\r","# Allow unused variables when underscore-prefixed.\r","dummy-variable-rgx = \"^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$\"\r","\r","target-version = \"py37\"\r","\r","[tool.ruff.flake8-quotes]\r","docstring-quotes = \"double\"\r","inline-quotes = \"double\"\r","multiline-quotes = \"double\""],"stylingDirectives":[[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":17,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":42,"cssClass":"pl-s"},{"start":14,"end":15,"cssClass":"pl-pds"},{"start":41,"end":42,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":57,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":56,"end":57,"cssClass":"pl-pds"}],[{"start":4,"end":41,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[{"start":4,"end":49,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":48,"end":49,"cssClass":"pl-pds"}],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":20,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":50,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":49,"end":50,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":52,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":51,"end":52,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":16,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":4,"end":19,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":24,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"}],[{"start":4,"end":28,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":4,"end":44,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":43,"end":44,"cssClass":"pl-pds"}],[{"start":4,"end":41,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[{"start":4,"end":23,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[],[{"start":0,"end":8,"cssClass":"pl-smi"}],[{"start":6,"end":13,"cssClass":"pl-smi"},{"start":16,"end":21,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":20,"cssClass":"pl-en"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":6,"end":24,"cssClass":"pl-s"},{"start":6,"end":7,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":28,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":28,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":24,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":25,"cssClass":"pl-en"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":21,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":28,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":27,"end":28,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":18,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":19,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":18,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":16,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":17,"end":102,"cssClass":"pl-c"},{"start":17,"end":18,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":14,"end":17,"cssClass":"pl-smi"},{"start":20,"end":64,"cssClass":"pl-s"},{"start":20,"end":21,"cssClass":"pl-pds"},{"start":63,"end":64,"cssClass":"pl-pds"},{"start":66,"end":72,"cssClass":"pl-smi"},{"start":75,"end":81,"cssClass":"pl-s"},{"start":75,"end":76,"cssClass":"pl-pds"},{"start":80,"end":81,"cssClass":"pl-pds"}],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":22,"cssClass":"pl-s"},{"start":14,"end":15,"cssClass":"pl-pds"},{"start":21,"end":22,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":21,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":20,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":21,"end":107,"cssClass":"pl-c"},{"start":21,"end":22,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-smi"},{"start":15,"end":23,"cssClass":"pl-s"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":8,"end":16,"cssClass":"pl-s"},{"start":8,"end":9,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":21,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":12,"end":21,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":20,"end":21,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":25,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":13,"end":16,"cssClass":"pl-smi"},{"start":19,"end":59,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":58,"end":59,"cssClass":"pl-pds"},{"start":62,"end":156,"cssClass":"pl-c"},{"start":62,"end":63,"cssClass":"pl-c"}],[{"start":0,"end":10,"cssClass":"pl-smi"},{"start":13,"end":19,"cssClass":"pl-s"},{"start":13,"end":14,"cssClass":"pl-pds"},{"start":18,"end":19,"cssClass":"pl-pds"},{"start":20,"end":101,"cssClass":"pl-c"},{"start":20,"end":21,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":17,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":18,"cssClass":"pl-en"},{"start":19,"end":22,"cssClass":"pl-en"},{"start":23,"end":35,"cssClass":"pl-en"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":12,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":11,"end":12,"cssClass":"pl-pds"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s"},{"start":7,"end":8,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":9,"end":17,"cssClass":"pl-s"},{"start":9,"end":10,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[],[{"start":1,"end":13,"cssClass":"pl-en"}],[{"start":0,"end":8,"cssClass":"pl-smi"},{"start":12,"end":32,"cssClass":"pl-s"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":31,"end":32,"cssClass":"pl-pds"}],[{"start":0,"end":13,"cssClass":"pl-smi"},{"start":16,"end":41,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":10,"cssClass":"pl-en"}],[{"start":0,"end":51,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":186,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":10,"end":13,"cssClass":"pl-s"},{"start":10,"end":11,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"},{"start":15,"end":18,"cssClass":"pl-s"},{"start":15,"end":16,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":20,"end":23,"cssClass":"pl-s"},{"start":20,"end":21,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"},{"start":25,"end":29,"cssClass":"pl-s"},{"start":25,"end":26,"cssClass":"pl-pds"},{"start":28,"end":29,"cssClass":"pl-pds"},{"start":31,"end":36,"cssClass":"pl-s"},{"start":31,"end":32,"cssClass":"pl-pds"},{"start":35,"end":36,"cssClass":"pl-pds"},{"start":38,"end":45,"cssClass":"pl-s"},{"start":38,"end":39,"cssClass":"pl-pds"},{"start":44,"end":45,"cssClass":"pl-pds"},{"start":47,"end":50,"cssClass":"pl-s"},{"start":47,"end":48,"cssClass":"pl-pds"},{"start":49,"end":50,"cssClass":"pl-pds"},{"start":52,"end":55,"cssClass":"pl-s"},{"start":52,"end":53,"cssClass":"pl-pds"},{"start":54,"end":55,"cssClass":"pl-pds"},{"start":57,"end":61,"cssClass":"pl-s"},{"start":57,"end":58,"cssClass":"pl-pds"},{"start":60,"end":61,"cssClass":"pl-pds"},{"start":63,"end":68,"cssClass":"pl-s"},{"start":63,"end":64,"cssClass":"pl-pds"},{"start":67,"end":68,"cssClass":"pl-pds"},{"start":70,"end":75,"cssClass":"pl-s"},{"start":70,"end":71,"cssClass":"pl-pds"},{"start":74,"end":75,"cssClass":"pl-pds"},{"start":77,"end":82,"cssClass":"pl-s"},{"start":77,"end":78,"cssClass":"pl-pds"},{"start":81,"end":82,"cssClass":"pl-pds"},{"start":84,"end":88,"cssClass":"pl-s"},{"start":84,"end":85,"cssClass":"pl-pds"},{"start":87,"end":88,"cssClass":"pl-pds"},{"start":90,"end":93,"cssClass":"pl-s"},{"start":90,"end":91,"cssClass":"pl-pds"},{"start":92,"end":93,"cssClass":"pl-pds"},{"start":95,"end":100,"cssClass":"pl-s"},{"start":95,"end":96,"cssClass":"pl-pds"},{"start":99,"end":100,"cssClass":"pl-pds"},{"start":102,"end":107,"cssClass":"pl-s"},{"start":102,"end":103,"cssClass":"pl-pds"},{"start":106,"end":107,"cssClass":"pl-pds"},{"start":109,"end":114,"cssClass":"pl-s"},{"start":109,"end":110,"cssClass":"pl-pds"},{"start":113,"end":114,"cssClass":"pl-pds"},{"start":116,"end":121,"cssClass":"pl-s"},{"start":116,"end":117,"cssClass":"pl-pds"},{"start":120,"end":121,"cssClass":"pl-pds"},{"start":123,"end":128,"cssClass":"pl-s"},{"start":123,"end":124,"cssClass":"pl-pds"},{"start":127,"end":128,"cssClass":"pl-pds"},{"start":130,"end":135,"cssClass":"pl-s"},{"start":130,"end":131,"cssClass":"pl-pds"},{"start":134,"end":135,"cssClass":"pl-pds"},{"start":137,"end":143,"cssClass":"pl-s"},{"start":137,"end":138,"cssClass":"pl-pds"},{"start":142,"end":143,"cssClass":"pl-pds"},{"start":145,"end":151,"cssClass":"pl-s"},{"start":145,"end":146,"cssClass":"pl-pds"},{"start":150,"end":151,"cssClass":"pl-pds"},{"start":153,"end":158,"cssClass":"pl-s"},{"start":153,"end":154,"cssClass":"pl-pds"},{"start":157,"end":158,"cssClass":"pl-pds"},{"start":160,"end":165,"cssClass":"pl-s"},{"start":160,"end":161,"cssClass":"pl-pds"},{"start":164,"end":165,"cssClass":"pl-pds"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":11,"end":17,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":19,"end":25,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":24,"end":25,"cssClass":"pl-pds"},{"start":27,"end":33,"cssClass":"pl-s"},{"start":27,"end":28,"cssClass":"pl-pds"},{"start":32,"end":33,"cssClass":"pl-pds"},{"start":35,"end":41,"cssClass":"pl-s"},{"start":35,"end":36,"cssClass":"pl-pds"},{"start":40,"end":41,"cssClass":"pl-pds"},{"start":43,"end":49,"cssClass":"pl-s"},{"start":43,"end":44,"cssClass":"pl-pds"},{"start":48,"end":49,"cssClass":"pl-pds"},{"start":51,"end":57,"cssClass":"pl-s"},{"start":51,"end":52,"cssClass":"pl-pds"},{"start":56,"end":57,"cssClass":"pl-pds"},{"start":59,"end":65,"cssClass":"pl-s"},{"start":59,"end":60,"cssClass":"pl-pds"},{"start":64,"end":65,"cssClass":"pl-pds"},{"start":67,"end":73,"cssClass":"pl-s"},{"start":67,"end":68,"cssClass":"pl-pds"},{"start":72,"end":73,"cssClass":"pl-pds"},{"start":75,"end":81,"cssClass":"pl-s"},{"start":75,"end":76,"cssClass":"pl-pds"},{"start":80,"end":81,"cssClass":"pl-pds"},{"start":83,"end":89,"cssClass":"pl-s"},{"start":83,"end":84,"cssClass":"pl-pds"},{"start":88,"end":89,"cssClass":"pl-pds"},{"start":91,"end":97,"cssClass":"pl-s"},{"start":91,"end":92,"cssClass":"pl-pds"},{"start":96,"end":97,"cssClass":"pl-pds"},{"start":99,"end":105,"cssClass":"pl-s"},{"start":99,"end":100,"cssClass":"pl-pds"},{"start":104,"end":105,"cssClass":"pl-pds"},{"start":107,"end":113,"cssClass":"pl-s"},{"start":107,"end":108,"cssClass":"pl-pds"},{"start":112,"end":113,"cssClass":"pl-pds"},{"start":115,"end":121,"cssClass":"pl-s"},{"start":115,"end":116,"cssClass":"pl-pds"},{"start":120,"end":121,"cssClass":"pl-pds"},{"start":123,"end":129,"cssClass":"pl-s"},{"start":123,"end":124,"cssClass":"pl-pds"},{"start":128,"end":129,"cssClass":"pl-pds"},{"start":131,"end":137,"cssClass":"pl-s"},{"start":131,"end":132,"cssClass":"pl-pds"},{"start":136,"end":137,"cssClass":"pl-pds"},{"start":139,"end":145,"cssClass":"pl-s"},{"start":139,"end":140,"cssClass":"pl-pds"},{"start":144,"end":145,"cssClass":"pl-pds"},{"start":147,"end":153,"cssClass":"pl-s"},{"start":147,"end":148,"cssClass":"pl-pds"},{"start":152,"end":153,"cssClass":"pl-pds"},{"start":155,"end":161,"cssClass":"pl-s"},{"start":155,"end":156,"cssClass":"pl-pds"},{"start":160,"end":161,"cssClass":"pl-pds"},{"start":163,"end":169,"cssClass":"pl-s"},{"start":163,"end":164,"cssClass":"pl-pds"},{"start":168,"end":169,"cssClass":"pl-pds"},{"start":171,"end":179,"cssClass":"pl-s"},{"start":171,"end":172,"cssClass":"pl-pds"},{"start":178,"end":179,"cssClass":"pl-pds"},{"start":181,"end":189,"cssClass":"pl-s"},{"start":181,"end":182,"cssClass":"pl-pds"},{"start":188,"end":189,"cssClass":"pl-pds"},{"start":191,"end":199,"cssClass":"pl-s"},{"start":191,"end":192,"cssClass":"pl-pds"},{"start":198,"end":199,"cssClass":"pl-pds"},{"start":201,"end":209,"cssClass":"pl-s"},{"start":201,"end":202,"cssClass":"pl-pds"},{"start":208,"end":209,"cssClass":"pl-pds"},{"start":211,"end":219,"cssClass":"pl-s"},{"start":211,"end":212,"cssClass":"pl-pds"},{"start":218,"end":219,"cssClass":"pl-pds"},{"start":221,"end":230,"cssClass":"pl-s"},{"start":221,"end":222,"cssClass":"pl-pds"},{"start":229,"end":230,"cssClass":"pl-pds"},{"start":232,"end":240,"cssClass":"pl-s"},{"start":232,"end":233,"cssClass":"pl-pds"},{"start":239,"end":240,"cssClass":"pl-pds"}],[],[{"start":0,"end":65,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":11,"end":16,"cssClass":"pl-s"},{"start":11,"end":12,"cssClass":"pl-pds"},{"start":15,"end":16,"cssClass":"pl-pds"}],[{"start":0,"end":9,"cssClass":"pl-smi"}],[],[{"start":0,"end":52,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":13,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":4,"end":9,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":8,"end":9,"cssClass":"pl-pds"}],[{"start":4,"end":17,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":14,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":13,"end":14,"cssClass":"pl-pds"}],[{"start":4,"end":13,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":12,"end":13,"cssClass":"pl-pds"}],[{"start":4,"end":17,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":16,"end":17,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":20,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":19,"end":20,"cssClass":"pl-pds"}],[{"start":4,"end":12,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":11,"end":12,"cssClass":"pl-pds"}],[{"start":4,"end":14,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":13,"end":14,"cssClass":"pl-pds"}],[{"start":4,"end":11,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":10,"end":11,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[{"start":4,"end":18,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":17,"end":18,"cssClass":"pl-pds"}],[{"start":4,"end":10,"cssClass":"pl-s"},{"start":4,"end":5,"cssClass":"pl-pds"},{"start":9,"end":10,"cssClass":"pl-pds"}],[],[{"start":0,"end":16,"cssClass":"pl-smi"}],[],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":14,"end":19,"cssClass":"pl-c1"}],[],[{"start":0,"end":50,"cssClass":"pl-c"},{"start":0,"end":1,"cssClass":"pl-c"}],[{"start":0,"end":18,"cssClass":"pl-smi"},{"start":21,"end":60,"cssClass":"pl-s"},{"start":21,"end":22,"cssClass":"pl-pds"},{"start":59,"end":60,"cssClass":"pl-pds"}],[],[{"start":0,"end":14,"cssClass":"pl-smi"},{"start":17,"end":23,"cssClass":"pl-s"},{"start":17,"end":18,"cssClass":"pl-pds"},{"start":22,"end":23,"cssClass":"pl-pds"}],[],[{"start":1,"end":5,"cssClass":"pl-en"},{"start":6,"end":10,"cssClass":"pl-en"},{"start":11,"end":24,"cssClass":"pl-en"}],[{"start":0,"end":16,"cssClass":"pl-smi"},{"start":19,"end":27,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":26,"end":27,"cssClass":"pl-pds"}],[{"start":0,"end":13,"cssClass":"pl-smi"},{"start":16,"end":24,"cssClass":"pl-s"},{"start":16,"end":17,"cssClass":"pl-pds"},{"start":23,"end":24,"cssClass":"pl-pds"}],[{"start":0,"end":16,"cssClass":"pl-smi"},{"start":19,"end":27,"cssClass":"pl-s"},{"start":19,"end":20,"cssClass":"pl-pds"},{"start":26,"end":27,"cssClass":"pl-pds"}]],"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/Pennyw0rth/NetExec/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null,"repoAlertsPath":"/Pennyw0rth/NetExec/security/dependabot","repoSecurityAndAnalysisPath":"/Pennyw0rth/NetExec/settings/security_analysis","repoOwnerIsOrg":true,"currentUserCanAdminRepo":false},"displayName":"pyproject.toml","displayUrl":"https://github.com/Pennyw0rth/NetExec/blob/main/pyproject.toml?raw=true","headerInfo":{"blobSize":"3.69 KB","deleteInfo":{"deleteTooltip":"You must be signed in to make or propose changes"},"editInfo":{"editTooltip":"You must be signed in to make or propose changes"},"ghDesktopPath":"https://desktop.github.com","gitLfsPath":null,"onBranch":true,"shortPath":"ef0f03b","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FPennyw0rth%2FNetExec%2Fblob%2Fmain%2Fpyproject.toml","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"126","truncatedSloc":"115"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplateHelpUrl":"https://docs.github.com/articles/about-issue-and-pull-request-templates","issueTemplate":null,"discussionTemplate":null,"language":"TOML","languageID":365,"large":false,"loggedIn":false,"newDiscussionPath":"/Pennyw0rth/NetExec/discussions/new","newIssuePath":"/Pennyw0rth/NetExec/issues/new","planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/Pennyw0rth/NetExec/blob/main/pyproject.toml","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","dismissStackNoticePath":"/settings/dismiss-notice/publish_stack_from_file","releasePath":"/Pennyw0rth/NetExec/releases/new?marketplace=true","showPublishActionBanner":false,"showPublishStackBanner":false},"rawBlobUrl":"https://github.com/Pennyw0rth/NetExec/raw/main/pyproject.toml","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"repoOwner":"Pennyw0rth","repoName":"NetExec","showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","showDependabotConfigurationBanner":false,"actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timedOut":false,"notAnalyzed":true,"symbols":[]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/Pennyw0rth/NetExec/branches":{"post":"xYEs2DbxZkTI_2UVX8IS4XCKuDmDxrjE63Di1YFWd3xYQYzdY1hEhNeFEquJ3-qTs42sPtZHjWcZSscVAfQYOQ"},"/repos/preferences":{"post":"Y3fs-fSxXZlmWQVXnLdoDn7lbMQYiwuZb9RDH-wsV8kL7HM2wM0F58gXWW7eIX5m1FVC9ObRgKn9Jx1M9vdVlQ"}}},"title":"NetExec/pyproject.toml at main · Pennyw0rth/NetExec"} \ No newline at end of file +[tool.poetry] +name = "netexec" +version = "1.1.0" +description = "The Network Execution tool" +authors = [ + "Marshall Hallenbeck ", + "Alexander Neff ", + "Thomas Seigneuret " +] +readme = "README.md" +homepage = "https://github.com/Pennyw0rth/NetExec" +repository = "https://github.com/Pennyw0rth/NetExec" +exclude = [] +include = [ + "nxc/data/*", + "nxc/modules/*" +] +license = "BSD-2-Clause" +classifiers = [ + 'Environment :: Console', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 3', + 'Topic :: Security', +] +packages = [ + { include = "nxc"} +] + +[tool.poetry.scripts] +nxc = 'nxc.netexec:main' +netexec = 'nxc.netexec:main' +NetExec = 'nxc.netexec:main' +nxcdb = 'nxc.nxcdb:main' + +[tool.poetry.dependencies] +python = "^3.7.0" +requests = ">=2.27.1" +beautifulsoup4 = ">=4.11,<5" +lsassy = ">=3.1.8" +termcolor = "2.0.1" +msgpack = "^1.0.0" +neo4j = "^4.1.1" # do not upgrade this until performance regression issues in 5 are fixed (as of 9/23) +pylnk3 = "^0.4.2" +pypsrp = "^0.8.1" +paramiko = "^3.3.1" +impacket = { git = "https://github.com/Pennyw0rth/impacket.git", branch = "gkdi" } +dsinternals = "^1.2.4" +xmltodict = "^0.13.0" +terminaltables = "^3.1.0" +aioconsole = "^0.6.2" +pywerview = "^0.3.3" # pywerview 5 requires libkrb5-dev installed which is not default on kali (as of 9/23) +minikerberos = "^0.4.1" +pypykatz = "^0.6.8" +aardwolf = "^0.2.7" +dploot = "^2.2.1" +bloodhound = "^1.6.1" +asyauth = "~0.0.14" +masky = "^0.2.0" +sqlalchemy = "^2.0.4" +aiosqlite = "^0.19.0" +pyasn1-modules = "^0.3.0" +rich = "^13.3.5" +python-libnmap = "^0.7.3" +resource = "^0.2.1" +oscrypto = { git = "https://github.com/Pennyw0rth/oscrypto" } # Pypi version currently broken, see: https://github.com/wbond/oscrypto/issues/78 (as of 9/23) +pyreadline = "^2.1" # for the build - impacket imports its hidden from the builder so an error occurs +ruff = "=0.0.292" + +[tool.poetry.group.dev.dependencies] +flake8 = "*" +shiv = "*" +pytest = "^7.2.2" + +[build-system] +requires = ["poetry-core>=1.2.0"] +build-backend = "poetry.core.masonry.api" + +[tool.ruff] +# Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +# Other options: pep8-naming (N), flake8-annotations (ANN), flake8-blind-except (BLE), flake8-commas (COM), flake8-pyi (PYI), flake8-pytest-style (PT), flake8-unused-arguments (ARG), etc +# Should tackle flake8-use-pathlib (PTH) at some point +select = ["E", "F", "D", "UP", "YTT", "ASYNC", "B", "A", "C4", "ISC", "ICN", "PIE", "PT", "Q", "RSE", "RET", "SIM", "TID", "ERA", "FLY", "PERF", "FURB", "LOG", "RUF"] +ignore = [ "E501", "F405", "D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107", "D203", "D204", "D205", "D212", "D213", "D400", "D401", "D415", "D417", "D419", "RET503", "RET505", "RET506", "RET507", "RET508", "PERF203", "RUF012"] + +# Allow autofix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] +unfixable = [] + +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", +] +per-file-ignores = {} + +line-length = 65000 + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +target-version = "py37" + +[tool.ruff.flake8-quotes] +docstring-quotes = "double" +inline-quotes = "double" +multiline-quotes = "double" \ No newline at end of file From cf91a1145375e79973e7c85828e9a949d7fe3539 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:09:31 +0800 Subject: [PATCH 13/56] [mssql] self review Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 37 +++++++++------------- nxc/protocols/mssql/mssql_ntlm_parser.py | 1 + nxc/protocols/mssql/mssqlexec.py | 40 ++++++++++++------------ nxc/protocols/mssql/proto_args.py | 4 +-- 4 files changed, 38 insertions(+), 44 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index bb6da7a4..71b928e4 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -322,41 +322,34 @@ class mssql(connection): return raw_output @requires_admin - def execute(self, payload=None, print_output=False): + def execute(self, payload=None, get_output=False): if not payload and self.args.execute: payload = self.args.execute - self.logger.info(f"Command to execute:\n{payload}") + if not self.args.no_output: + get_output = True + + self.logger.info(f"Command to execute: {payload}") try: - exec_method = MSSQLEXEC(self.conn) - raw_output = exec_method.execute(payload, print_output) - self.logger.info("Executed command via mssqlexec") - self.logger.debug(f"Raw output: {raw_output}") + exec_method = MSSQLEXEC(self.conn, self.logger) + raw_output = exec_method.execute(payload, get_output) except Exception as e: - self.logger.exception(e) - return None - - if hasattr(self, "server"): - self.server.track_host(self.host) - - if self.args.execute or self.args.ps_execute: + self.logger.fail(f"Execute command failed, error: {e!s}") + return False + else: self.logger.success("Executed command via mssqlexec") - if self.args.no_output: - self.logger.debug("Output set to disabled") - else: + if raw_output: for line in raw_output: self.logger.highlight(line) - - return raw_output + return raw_output @requires_admin def ps_execute( self, payload=None, get_output=False, - methods=None, force_ps32=False, - dont_obfs=True, + dont_obfs=False, ): if not payload and self.args.ps_execute: payload = self.args.ps_execute @@ -374,7 +367,7 @@ class mssql(connection): try: data = f.read() self.logger.display(f"Size is {len(data)} bytes") - exec_method = MSSQLEXEC(self.conn) + exec_method = MSSQLEXEC(self.conn, self.logger) exec_method.put_file(data, self.args.put_file[1]) if exec_method.file_exists(self.args.put_file[1]): self.logger.success("File has been uploaded on the remote machine") @@ -390,7 +383,7 @@ class mssql(connection): self.logger.display(f'Copying "{remote_path}" to "{download_path}"') try: - exec_method = MSSQLEXEC(self.conn) + exec_method = MSSQLEXEC(self.conn, self.logger) exec_method.get_file(self.args.get_file[0], self.args.get_file[1]) self.logger.success(f'File "{remote_path}" was downloaded to "{download_path}"') except Exception as e: diff --git a/nxc/protocols/mssql/mssql_ntlm_parser.py b/nxc/protocols/mssql/mssql_ntlm_parser.py index 2ca8ea55..3d4506df 100644 --- a/nxc/protocols/mssql/mssql_ntlm_parser.py +++ b/nxc/protocols/mssql/mssql_ntlm_parser.py @@ -2,6 +2,7 @@ import datetime + def decoder(byte_string, decode_type): if decode_type == "byte": return byte_string.decode("UTF-8").replace("\x00", "") diff --git a/nxc/protocols/mssql/mssqlexec.py b/nxc/protocols/mssql/mssqlexec.py index a2081a99..5272b631 100755 --- a/nxc/protocols/mssql/mssqlexec.py +++ b/nxc/protocols/mssql/mssqlexec.py @@ -1,38 +1,38 @@ import binascii -from nxc.logger import nxc_logger class MSSQLEXEC: - def __init__(self, connection): + def __init__(self, connection, logger): self.mssql_conn = connection - self.outputBuffer = "" + self.outputBuffer = [] + self.logger = logger def execute(self, command, output=False): - command_output = [] try: self.enable_xp_cmdshell() except Exception as e: - nxc_logger.error(f"Error when attempting to enable x_cmdshell: {e}") + self.logger.error(f"Error when attempting to enable x_cmdshell: {e}") + try: result = self.mssql_conn.sql_query(f"exec master..xp_cmdshell '{command}'") - nxc_logger.debug(f"SQL Query Result: {result}") - for row in result: - if row["output"] == "NULL": - continue - command_output.append(row["output"]) except Exception as e: - nxc_logger.error(f"Error when attempting to execute command via xp_cmdshell: {e}") + self.logger.error(f"Error when attempting to execute command via xp_cmdshell: {e}") - if output: - nxc_logger.debug("Output is enabled") - for row in command_output: - nxc_logger.debug(row) - # if len(self.outputBuffer): try: self.disable_xp_cmdshell() except Exception as e: - nxc_logger.error(f"[OPSEC] Error when attempting to disable xp_cmdshell: {e}") - return command_output + self.logger.error(f"[OPSEC] Error when attempting to disable xp_cmdshell: {e}") + + if output: + self.logger.debug(f"SQL Query Result: {result}") + for row in result: + if row["output"] == "NULL": + continue + self.outputBuffer.append(row["output"]) + else: + self.logger.info("Output set to disabled") + + return self.outputBuffer def enable_xp_cmdshell(self): self.mssql_conn.sql_query("exec master.dbo.sp_configure 'show advanced options',1;RECONFIGURE;exec master.dbo.sp_configure 'xp_cmdshell', 1;RECONFIGURE;") @@ -53,7 +53,7 @@ class MSSQLEXEC: self.mssql_conn.sql_query(f"DECLARE @ob INT;EXEC sp_OACreate 'ADODB.Stream', @ob OUTPUT;EXEC sp_OASetProperty @ob, 'Type', 1;EXEC sp_OAMethod @ob, 'Open';EXEC sp_OAMethod @ob, 'Write', NULL, 0x{hexdata};EXEC sp_OAMethod @ob, 'SaveToFile', NULL, '{remote}', 2;EXEC sp_OAMethod @ob, 'Close';EXEC sp_OADestroy @ob;") self.disable_ole() except Exception as e: - nxc_logger.debug(f"Error uploading via mssqlexec: {e}") + self.logger.debug(f"Error uploading via mssqlexec: {e}") def file_exists(self, remote): try: @@ -71,4 +71,4 @@ class MSSQLEXEC: f.write(binascii.unhexlify(data)) except Exception as e: - nxc_logger.debug(f"Error downloading via mssqlexec: {e}") + self.logger.debug(f"Error downloading via mssqlexec: {e}") diff --git a/nxc/protocols/mssql/proto_args.py b/nxc/protocols/mssql/proto_args.py index 4ee7fcc8..6f4d3641 100644 --- a/nxc/protocols/mssql/proto_args.py +++ b/nxc/protocols/mssql/proto_args.py @@ -25,8 +25,8 @@ def proto_args(parser, std_parser, module_parser): psgroup.add_argument("--clear-obfscripts", action="store_true", help="Clear all cached obfuscated PowerShell scripts") tgroup = mssql_parser.add_argument_group("Files", "Options for put and get remote files") - tgroup.add_argument("--put-file", nargs=2, metavar="FILE", help="Put a local file into remote target, ex: whoami.txt C:\\Windows\\Temp\\whoami.txt") - tgroup.add_argument("--get-file", nargs=2, metavar="FILE", help="Get a remote file, ex: C:\\Windows\\Temp\\whoami.txt whoami.txt") + tgroup.add_argument("--put-file", nargs=2, metavar=("SRC_FILE", "DEST_FILE"), help="Put a local file into remote target, ex: whoami.txt C:\\Windows\\Temp\\whoami.txt") + tgroup.add_argument("--get-file", nargs=2, metavar=("SRC_FILE", "DEST_FILE"), help="Get a remote file, ex: C:\\Windows\\Temp\\whoami.txt whoami.txt") return parser From cbdf87a4d891a3884af666206ccc7476f4615191 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:20:05 +0800 Subject: [PATCH 14/56] [mssql] bye bye '--no-smb' Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql/proto_args.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nxc/protocols/mssql/proto_args.py b/nxc/protocols/mssql/proto_args.py index 6f4d3641..be67c7d2 100644 --- a/nxc/protocols/mssql/proto_args.py +++ b/nxc/protocols/mssql/proto_args.py @@ -6,12 +6,10 @@ def proto_args(parser, std_parser, module_parser): mssql_parser.add_argument("-H", "--hash", metavar="HASH", dest="hash", nargs="+", default=[], help="NTLM hash(es) or file(s) containing NTLM hashes") mssql_parser.add_argument("--port", default=1433, type=int, metavar="PORT", help="MSSQL port (default: 1433)") mssql_parser.add_argument("-q", "--query", dest="mssql_query", metavar="QUERY", type=str, help="execute the specified query against the MSSQL DB") - no_smb_arg = mssql_parser.add_argument("--no-smb", action=get_conditional_action(_StoreTrueAction), make_required=[], help="No smb connection") dgroup = mssql_parser.add_mutually_exclusive_group() - domain_arg = dgroup.add_argument("-d", metavar="DOMAIN", dest="domain", type=str, help="domain name") + dgroup.add_argument("-d", metavar="DOMAIN", dest="domain", type=str, help="domain name") dgroup.add_argument("--local-auth", action="store_true", help="authenticate locally to each target") - no_smb_arg.make_required = [domain_arg] cgroup = mssql_parser.add_argument_group("Command Execution", "options for executing commands") cgroup.add_argument("--force-ps32", action="store_true", help="force the PowerShell command to run in a 32-bit process") From dd78e229383f5673e097529d405c8c21f42df1ee Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:21:04 +0800 Subject: [PATCH 15/56] [mssql] move outputBuffer Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql/mssqlexec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nxc/protocols/mssql/mssqlexec.py b/nxc/protocols/mssql/mssqlexec.py index 5272b631..53255ecc 100755 --- a/nxc/protocols/mssql/mssqlexec.py +++ b/nxc/protocols/mssql/mssqlexec.py @@ -4,8 +4,8 @@ import binascii class MSSQLEXEC: def __init__(self, connection, logger): self.mssql_conn = connection - self.outputBuffer = [] self.logger = logger + self.outputBuffer = [] def execute(self, command, output=False): try: From f7078bb76bffe1a85628ce5602252d311a8ba7a1 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:22:54 +0800 Subject: [PATCH 16/56] [mssql] more linebreak Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 71b928e4..4f4cd8b0 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -26,6 +26,7 @@ from impacket.tds import ( TDS_ENVCHANGE_PACKETSIZE, ) + class mssql(connection): def __init__(self, args, db, host): self.mssql_instances = [] From 9a6a37152f61d049c90ba8ff9503d28ee0b37f2f Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:24:34 +0800 Subject: [PATCH 17/56] [mssql] ruff Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql/proto_args.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/nxc/protocols/mssql/proto_args.py b/nxc/protocols/mssql/proto_args.py index be67c7d2..4bc35bfd 100644 --- a/nxc/protocols/mssql/proto_args.py +++ b/nxc/protocols/mssql/proto_args.py @@ -1,6 +1,3 @@ -from argparse import _StoreTrueAction - - def proto_args(parser, std_parser, module_parser): mssql_parser = parser.add_parser("mssql", help="own stuff using MSSQL", parents=[std_parser, module_parser]) mssql_parser.add_argument("-H", "--hash", metavar="HASH", dest="hash", nargs="+", default=[], help="NTLM hash(es) or file(s) containing NTLM hashes") @@ -26,19 +23,4 @@ def proto_args(parser, std_parser, module_parser): tgroup.add_argument("--put-file", nargs=2, metavar=("SRC_FILE", "DEST_FILE"), help="Put a local file into remote target, ex: whoami.txt C:\\Windows\\Temp\\whoami.txt") tgroup.add_argument("--get-file", nargs=2, metavar=("SRC_FILE", "DEST_FILE"), help="Get a remote file, ex: C:\\Windows\\Temp\\whoami.txt whoami.txt") - return parser - - -def get_conditional_action(baseAction): - class ConditionalAction(baseAction): - def __init__(self, option_strings, dest, **kwargs): - x = kwargs.pop("make_required", []) - super().__init__(option_strings, dest, **kwargs) - self.make_required = x - - def __call__(self, parser, namespace, values, option_string=None): - for x in self.make_required: - x.required = True - super().__call__(parser, namespace, values, option_string) - - return ConditionalAction + return parser \ No newline at end of file From 4a18e2f4520262f9991cdc7c0152f446d6d4684b Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 13:05:10 +0800 Subject: [PATCH 18/56] [mssql] Bringing up timeout argument Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 15 +++++++++++---- nxc/protocols/mssql/proto_args.py | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 4f4cd8b0..ec0d7124 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -1,5 +1,6 @@ import os import random +import socket import contextlib from nxc.config import process_secret @@ -101,11 +102,17 @@ class mssql(connection): def create_conn_obj(self): try: self.conn = tds.MSSQL(self.host, self.port) - self.conn.connect() - except OSError as e: - self.logger.debug(f"Error connecting to MSSQL: {e}") + # Default has not timeout option in tds.MSSQL.connect() function, let rewrite it. + af, socktype, proto, canonname, sa = socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM)[0] + sock = socket.socket(af, socktype, proto) + sock.settimeout(self.args.mssql_timeout) + sock.connect(sa) + except Exception as e: + self.logger.debug(f"Error connecting to MSSQL service on host: {self.host}, reason: {e}") return False - return True + else: + self.conn.socket = sock + return True def check_if_admin(self): try: diff --git a/nxc/protocols/mssql/proto_args.py b/nxc/protocols/mssql/proto_args.py index 4bc35bfd..48042151 100644 --- a/nxc/protocols/mssql/proto_args.py +++ b/nxc/protocols/mssql/proto_args.py @@ -2,6 +2,7 @@ def proto_args(parser, std_parser, module_parser): mssql_parser = parser.add_parser("mssql", help="own stuff using MSSQL", parents=[std_parser, module_parser]) mssql_parser.add_argument("-H", "--hash", metavar="HASH", dest="hash", nargs="+", default=[], help="NTLM hash(es) or file(s) containing NTLM hashes") mssql_parser.add_argument("--port", default=1433, type=int, metavar="PORT", help="MSSQL port (default: 1433)") + mssql_parser.add_argument("--mssql-timeout", help="SQL server connection timeout, default is %(default)s seconds", type=int, default=2) mssql_parser.add_argument("-q", "--query", dest="mssql_query", metavar="QUERY", type=str, help="execute the specified query against the MSSQL DB") dgroup = mssql_parser.add_mutually_exclusive_group() From 86ebce472294e5e6a872f4e3c38ec73cd596b2cc Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 13:45:46 +0800 Subject: [PATCH 19/56] [mssql] self review Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 139 +++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 83 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index ec0d7124..73a8f04e 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -83,14 +83,16 @@ class mssql(connection): self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] self.server_os = f'Windows NT {ntlm_info["version"]}' self.logger.extra["hostname"] = self.hostname + self.db.add_host(self.host, self.hostname, self.domain, self.server_os, len(self.mssql_instances),) - self.db.add_host( - self.host, - self.hostname, - self.domain, - self.server_os, - len(self.mssql_instances), - ) + if self.args.domain: + self.domain = self.args.domain + + if self.args.local_auth: + self.domain = self.hostname + + if self.domain is None: + self.domain = "" with contextlib.suppress(Exception): self.conn.disconnect() @@ -115,19 +117,15 @@ class mssql(connection): return True def check_if_admin(self): + self.admin_privs = False try: results = self.conn.sql_query("SELECT IS_SRVROLEMEMBER('sysadmin')") is_admin = int(results[0][""]) except Exception as e: self.logger.fail(f"Error querying for sysadmin role: {e}") - return False - - if is_admin: - self.admin_privs = True - self.logger.debug("User is admin") else: - return False - return True + if is_admin: + self.admin_privs = True def kerberos_login( self, @@ -143,24 +141,30 @@ class mssql(connection): self.conn.disconnect() self.create_conn_obj() - hashes = None - if ntlm_hash != "": - if ntlm_hash.find(":") != -1: - hashes = ntlm_hash - ntlm_hash.split(":")[1] - else: - # only nt hash - hashes = f":{ntlm_hash}" + if useCache and kerb_pass == "": + ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) + principal = ccache.principal.toPrincipal() + self.username = principal.components[0] + username = principal.components[0] + + self.username = username + self.password = password + self.domain = domain + + self.nthash = None + if ntlm_hash: + self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" + try: res = self.conn.kerberosLogin( None, username, password, domain, - hashes, + self.nthash, aesKey, kdcHost=kdcHost, useCache=useCache, @@ -169,8 +173,8 @@ class mssql(connection): error_msg = self.conn.printReplies() self.logger.fail( "{}\\{}:{} {}".format( - domain, - username, + self.domain, + self.username, used_ccache, error_msg if error_msg else "" ) @@ -180,28 +184,15 @@ class mssql(connection): self.logger.fail("Broken Pipe Error while attempting to login") return False except Exception as e: - domain = f"{domain}\\" if not self.args.local_auth else "" - self.logger.fail(f"{domain}{username}{used_ccache} ({e!s})") + self.logger.fail(f"{self.domain}\\{self.username}{used_ccache} ({e!s})") return False else: - self.password = password - if username == "" and useCache: - ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) - principal = ccache.principal.toPrincipal() - self.username = principal.components[0] - username = principal.components[0] - else: - self.username = username - self.domain = domain self.check_if_admin() - - domain = f"{domain}\\" if not self.args.local_auth else "" - - self.logger.success(f"{domain}{username}{used_ccache} {self.mark_pwned()}") + self.logger.success(f"{self.domain}\\{self.username}{used_ccache} {self.mark_pwned()}") if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) if self.admin_privs: - add_user_bh(f"{self.hostname}$", domain, self.logger, self.config) + add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True def plaintext_login(self, domain, username, password): @@ -209,16 +200,20 @@ class mssql(connection): self.conn.disconnect() self.create_conn_obj() + self.password = password + self.username = username + self.domain = domain + try: # domain = "" is to prevent a decoding issue in impacket/ntlm.py:617 where it attempts to decode the domain - res = self.conn.login(None, username, password, domain if domain else "", None, not self.args.local_auth) + res = self.conn.login(None, username, password, domain, None, not self.args.local_auth) if res is not True: error_msg = self.handle_mssql_reply() self.logger.fail( "{}\\{}:{} {}".format( - domain, - username, - process_secret(password), + self.domain, + self.username, + process_secret(self.password), error_msg if error_msg else "" ) ) @@ -227,24 +222,16 @@ class mssql(connection): self.logger.fail("Broken Pipe Error while attempting to login") return False except Exception as e: - self.logger.fail(f"{domain}\\{username}:{process_secret(password)} ({e!s})") + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} ({e!s})") return False else: - self.password = password - self.username = username - self.domain = domain self.check_if_admin() - self.db.add_credential("plaintext", domain, username, password) - - if self.admin_privs: - self.db.add_admin_user("plaintext", domain, username, password, self.host) - add_user_bh(f"{self.hostname}$", domain, self.logger, self.config) - - domain = f"{domain}\\" if not self.args.local_auth else "" - out = f"{domain}{username}:{process_secret(password)} {self.mark_pwned()}" + out = f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}" self.logger.success(out) if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) + if self.admin_privs: + add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True def hash_login(self, domain, username, ntlm_hash): @@ -252,14 +239,9 @@ class mssql(connection): self.conn.disconnect() self.create_conn_obj() - lmhash = "" - nthash = "" - - # This checks to see if we didn't provide the LM Hash - if ntlm_hash.find(":") != -1: - lmhash, nthash = ntlm_hash.split(":") - else: - nthash = ntlm_hash + self.username = username + self.domain = domain + self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" try: res = self.conn.login( @@ -267,16 +249,16 @@ class mssql(connection): username, "", domain, - ":" + nthash if not lmhash else ntlm_hash, + self.nthash, not self.args.local_auth, ) if res is not True: error_msg = self.conn.printReplies() self.logger.fail( "{}\\{}:{} {}".format( - domain, - username, - process_secret(nthash), + self.domain, + self.username, + process_secret(self.nthash), error_msg if error_msg else "" ) ) @@ -285,23 +267,15 @@ class mssql(connection): self.logger.fail("Broken Pipe Error while attempting to login") return False except Exception as e: - self.logger.fail(f"{domain}\\{username}:{process_secret(ntlm_hash)} ({e!s})") + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} ({e!s})") return False else: - self.hash = ntlm_hash - self.username = username - self.domain = domain self.check_if_admin() - self.db.add_credential("hash", domain, username, ntlm_hash) - - if self.admin_privs: - self.db.add_admin_user("hash", domain, username, ntlm_hash, self.host) - add_user_bh(f"{self.hostname}$", domain, self.logger, self.config) - - out = f"{domain}\\{username} {process_secret(ntlm_hash)} {self.mark_pwned()}" - self.logger.success(out) + self.logger.success(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}") if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) + if self.admin_privs: + add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True def mssql_query(self): @@ -324,9 +298,8 @@ class mssql(connection): else: self.logger.fail("Unexpected output") except Exception as e: - self.logger.exception(e) + self.logger.exception(f"Failed to excuted MSSQL query, reason: {e}") return None - return raw_output @requires_admin From 8a5d77b1d7d7b2a13c1458848501ccf0f9adda66 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:07:10 +0800 Subject: [PATCH 20/56] [mssql] fix kerb_pass Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 73a8f04e..31c1b845 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -141,6 +141,8 @@ class mssql(connection): self.conn.disconnect() self.create_conn_obj() + kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" + if useCache and kerb_pass == "": ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) principal = ccache.principal.toPrincipal() @@ -155,7 +157,6 @@ class mssql(connection): if ntlm_hash: self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" - kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" try: @@ -358,7 +359,7 @@ class mssql(connection): self.logger.fail(f"Error during upload : {e}") @requires_admin - def get_file(self): + def get_file(self): remote_path = self.args.get_file[0] download_path = self.args.get_file[1] self.logger.display(f'Copying "{remote_path}" to "{download_path}"') From 93f3bccd7bdd46d405050911a8e5a32683f1fbbf Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:15:38 +0800 Subject: [PATCH 21/56] [mssql] fix ccache Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 31c1b845..a9fca5ba 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -139,15 +139,16 @@ class mssql(connection): ): with contextlib.suppress(Exception): self.conn.disconnect() + # When using ccache file, we must need to set target host to hostname when creating connection object. + self.host = self.hostname self.create_conn_obj() kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" if useCache and kerb_pass == "": ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) - principal = ccache.principal.toPrincipal() - self.username = principal.components[0] - username = principal.components[0] + username = ccache.credentials[0].header["client"].prettyPrint().decode().split("@")[0] + self.username = username self.username = username self.password = password @@ -206,7 +207,6 @@ class mssql(connection): self.domain = domain try: - # domain = "" is to prevent a decoding issue in impacket/ntlm.py:617 where it attempts to decode the domain res = self.conn.login(None, username, password, domain, None, not self.args.local_auth) if res is not True: error_msg = self.handle_mssql_reply() From 2c174369bae4315e34ed35ccaca654a8040fa0c8 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:34:53 +0800 Subject: [PATCH 22/56] [mssql] less code Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index a9fca5ba..b7c51304 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -94,9 +94,6 @@ class mssql(connection): if self.domain is None: self.domain = "" - with contextlib.suppress(Exception): - self.conn.disconnect() - def print_host_info(self): self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") return True @@ -116,6 +113,17 @@ class mssql(connection): self.conn.socket = sock return True + def reconnect_mssql(func): + def wrapper(self, *args, **kwargs): + with contextlib.suppress(Exception): + self.conn.disconnect() + # When using ccache file, we must need to set target host to hostname when creating connection object. + if self.kerberos: + self.host = self.hostname + self.create_conn_obj() + return func(self, *args, **kwargs) + return wrapper + def check_if_admin(self): self.admin_privs = False try: @@ -127,6 +135,7 @@ class mssql(connection): if is_admin: self.admin_privs = True + @reconnect_mssql def kerberos_login( self, domain, @@ -137,12 +146,6 @@ class mssql(connection): kdcHost="", useCache=False, ): - with contextlib.suppress(Exception): - self.conn.disconnect() - # When using ccache file, we must need to set target host to hostname when creating connection object. - self.host = self.hostname - self.create_conn_obj() - kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" if useCache and kerb_pass == "": @@ -197,11 +200,8 @@ class mssql(connection): add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True + @reconnect_mssql def plaintext_login(self, domain, username, password): - with contextlib.suppress(Exception): - self.conn.disconnect() - self.create_conn_obj() - self.password = password self.username = username self.domain = domain @@ -235,11 +235,8 @@ class mssql(connection): add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True + @reconnect_mssql def hash_login(self, domain, username, ntlm_hash): - with contextlib.suppress(Exception): - self.conn.disconnect() - self.create_conn_obj() - self.username = username self.domain = domain self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" From b4ae46f65dcae01be2f5c6039edfbd2fff9cf83b Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:32:24 +0800 Subject: [PATCH 23/56] [mssql] bug fix Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index b7c51304..458a9f04 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -39,6 +39,19 @@ class mssql(connection): connection.__init__(self, args, db, host) + def proto_flow(self): + self.logger.debug("Kicking off proto_flow") + self.proto_logger() + if self.create_conn_obj() and self.enum_host_info(): + self.logger.debug("Created connection object") + if self.print_host_info() and (self.login() or (self.username == "" and self.password == "")): + if hasattr(self.args, "module") and self.args.module: + self.logger.debug("Calling modules") + self.call_modules() + else: + self.logger.debug("Calling command arguments") + self.call_cmd_args() + def proto_logger(self): self.logger = NXCAdapter( extra={ @@ -77,6 +90,7 @@ class mssql(connection): self.logger.info(f"NTLM challenge: {challenge!s}") except Exception as e: self.logger.info(f"Failed to receive NTLM challenge, reason: {e!s}") + return False else: ntlm_info = parse_challenge(challenge) self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] @@ -94,6 +108,8 @@ class mssql(connection): if self.domain is None: self.domain = "" + return True + def print_host_info(self): self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") return True From d6eb6c205aae3648714de7ca736787935a3f7ef7 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:40:12 +0800 Subject: [PATCH 24/56] [mssql] add is_mssql check Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 94 +++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 52 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 458a9f04..76689c5c 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -36,22 +36,10 @@ class mssql(connection): self.hash = None self.os_arch = None self.nthash = "" + self.is_mssql = False connection.__init__(self, args, db, host) - def proto_flow(self): - self.logger.debug("Kicking off proto_flow") - self.proto_logger() - if self.create_conn_obj() and self.enum_host_info(): - self.logger.debug("Created connection object") - if self.print_host_info() and (self.login() or (self.username == "" and self.password == "")): - if hasattr(self.args, "module") and self.args.module: - self.logger.debug("Calling modules") - self.call_modules() - else: - self.logger.debug("Calling command arguments") - self.call_cmd_args() - def proto_logger(self): self.logger = NXCAdapter( extra={ @@ -62,6 +50,47 @@ class mssql(connection): } ) + def create_conn_obj(self): + try: + self.conn = tds.MSSQL(self.host, self.port) + # Default has not timeout option in tds.MSSQL.connect() function, let rewrite it. + af, socktype, proto, canonname, sa = socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM)[0] + sock = socket.socket(af, socktype, proto) + sock.settimeout(self.args.mssql_timeout) + sock.connect(sa) + self.conn.socket = sock + if self.is_mssql == False: + self.conn.preLogin() + except Exception as e: + self.logger.debug(f"Error connecting to MSSQL service on host: {self.host}, reason: {e}") + return False + else: + self.is_mssql = True + return True + + def reconnect_mssql(func): + def wrapper(self, *args, **kwargs): + with contextlib.suppress(Exception): + self.conn.disconnect() + # When using ccache file, we must need to set target host to hostname when creating connection object. + if self.kerberos: + self.host = self.hostname + self.create_conn_obj() + return func(self, *args, **kwargs) + return wrapper + + def check_if_admin(self): + self.admin_privs = False + try: + results = self.conn.sql_query("SELECT IS_SRVROLEMEMBER('sysadmin')") + is_admin = int(results[0][""]) + except Exception as e: + self.logger.fail(f"Error querying for sysadmin role: {e}") + else: + if is_admin: + self.admin_privs = True + + @reconnect_mssql def enum_host_info(self): challenge = None try: @@ -108,49 +137,10 @@ class mssql(connection): if self.domain is None: self.domain = "" - return True - def print_host_info(self): self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") return True - def create_conn_obj(self): - try: - self.conn = tds.MSSQL(self.host, self.port) - # Default has not timeout option in tds.MSSQL.connect() function, let rewrite it. - af, socktype, proto, canonname, sa = socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM)[0] - sock = socket.socket(af, socktype, proto) - sock.settimeout(self.args.mssql_timeout) - sock.connect(sa) - except Exception as e: - self.logger.debug(f"Error connecting to MSSQL service on host: {self.host}, reason: {e}") - return False - else: - self.conn.socket = sock - return True - - def reconnect_mssql(func): - def wrapper(self, *args, **kwargs): - with contextlib.suppress(Exception): - self.conn.disconnect() - # When using ccache file, we must need to set target host to hostname when creating connection object. - if self.kerberos: - self.host = self.hostname - self.create_conn_obj() - return func(self, *args, **kwargs) - return wrapper - - def check_if_admin(self): - self.admin_privs = False - try: - results = self.conn.sql_query("SELECT IS_SRVROLEMEMBER('sysadmin')") - is_admin = int(results[0][""]) - except Exception as e: - self.logger.fail(f"Error querying for sysadmin role: {e}") - else: - if is_admin: - self.admin_privs = True - @reconnect_mssql def kerberos_login( self, From ae5d57a75dfe087a9d42f79eb64d8a889a0bfe76 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:45:02 +0800 Subject: [PATCH 25/56] [mssql] ruff Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 76689c5c..47e6f85a 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -59,7 +59,7 @@ class mssql(connection): sock.settimeout(self.args.mssql_timeout) sock.connect(sa) self.conn.socket = sock - if self.is_mssql == False: + if not self.is_mssql: self.conn.preLogin() except Exception as e: self.logger.debug(f"Error connecting to MSSQL service on host: {self.host}, reason: {e}") From 275bc4147755c29ac18d4915bcff230905545364 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Mon, 22 Jan 2024 16:52:18 -0500 Subject: [PATCH 26/56] fix(database): only attempt to initialize default workspace if it doesnt exist --- nxc/database.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nxc/database.py b/nxc/database.py index f3d5509a..3f93d7db 100644 --- a/nxc/database.py +++ b/nxc/database.py @@ -93,4 +93,5 @@ def delete_workspace(workspace_name): def initialize_db(): - create_workspace("default") \ No newline at end of file + if not exists(path_join(WORKSPACE_DIR, "default")): + create_workspace("default") \ No newline at end of file From d6dae9c60547f5b5a83d47ed80148175db5a770b Mon Sep 17 00:00:00 2001 From: Deft_ Date: Thu, 8 Feb 2024 11:54:08 +0100 Subject: [PATCH 27/56] Update ntlmv1.py Update the module as it was not working anymore and the values were not accurate Signed-off-by: Deft_ --- nxc/modules/ntlmv1.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nxc/modules/ntlmv1.py b/nxc/modules/ntlmv1.py index ad5c3bde..683d7d6a 100644 --- a/nxc/modules/ntlmv1.py +++ b/nxc/modules/ntlmv1.py @@ -7,10 +7,11 @@ class NXCModule: """ Detect if the target's LmCompatibilityLevel will allow NTLMv1 authentication Module by @Tw1sm + Modified by Deft (08/02/2024) """ name = "ntlmv1" - description = "Detect if lmcompatibilitylevel on the target is set to 0 or 1" + description = "Detect if lmcompatibilitylevel on the target is set to lower than 3 (which means ntlmv1 is enabled)" supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True @@ -32,19 +33,22 @@ class NXCModule: "SYSTEM\\CurrentControlSet\\Control\\Lsa", ) key_handle = ans["phkResult"] - rtype = None - data = None + rtype = data = None try: rtype, data = rrp.hBaseRegQueryValue( remote_ops._RemoteOperations__rrp, key_handle, "lmcompatibilitylevel\x00", ) + except rrp.DCERPCSessionError: context.log.debug("Unable to reference lmcompatabilitylevel, which probably means ntlmv1 is not set") - if rtype and data and int(data) in [0, 1, 2]: + # Changed by Defte + # Unless this keys is set to 3 or higher, NTLMv1 can be used + if data in [0, 1, 2]: context.log.highlight(self.output.format(connection.conn.getRemoteHost(), data)) + except DCERPCSessionError as e: context.log.debug(f"Error connecting to RemoteRegistry: {e}") finally: From 0442376287e23fa05f2766bae9a8ffe8fd4d2a71 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Fri, 9 Feb 2024 14:29:39 +0100 Subject: [PATCH 28/56] Add error handling for protocol level --- nxc/netexec.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nxc/netexec.py b/nxc/netexec.py index e09e249e..ce1a0140 100755 --- a/nxc/netexec.py +++ b/nxc/netexec.py @@ -44,11 +44,12 @@ def create_db_engine(db_path): async def start_run(protocol_obj, args, db, targets): + futures = [] nxc_logger.debug("Creating ThreadPoolExecutor") if args.no_progress or len(targets) == 1: with ThreadPoolExecutor(max_workers=args.threads + 1) as executor: nxc_logger.debug(f"Creating thread for {protocol_obj}") - _ = [executor.submit(protocol_obj, args, db, target) for target in targets] + futures = [executor.submit(protocol_obj, args, db, target) for target in targets] else: with Progress(console=nxc_console) as progress, ThreadPoolExecutor(max_workers=args.threads + 1) as executor: current = 0 @@ -62,6 +63,11 @@ async def start_run(protocol_obj, args, db, targets): for _ in as_completed(futures): current += 1 progress.update(tasks, completed=current) + for future in as_completed(futures): + try: + future.result() + except Exception: + nxc_logger.exception(f"Exception for target {targets[futures.index(future)]}: {future.exception()}") def main(): From 3d9cbca7a879df30d2204922408005436767b6cd Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Wed, 14 Feb 2024 15:06:41 +0100 Subject: [PATCH 29/56] Allow a whole word as audit mode character --- nxc/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nxc/config.py b/nxc/config.py index ce9c688f..07f2e55b 100644 --- a/nxc/config.py +++ b/nxc/config.py @@ -43,5 +43,5 @@ if len(host_info_colors) != 4: # this should probably be put somewhere else, but if it's in the config helpers, there is a circular import def process_secret(text): - hidden = text[:reveal_chars_of_pwd] - return text if not audit_mode else hidden + audit_mode * 8 + reveal = text[:reveal_chars_of_pwd] + return text if not audit_mode else reveal + (audit_mode if len(audit_mode) > 1 else audit_mode * 8) From 7d99d519e543e9930fc685f1fe54da957b626d8b Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Sun, 18 Feb 2024 01:04:37 +0100 Subject: [PATCH 30/56] Write without delete will now be displayed as write access --- nxc/protocols/smb.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nxc/protocols/smb.py b/nxc/protocols/smb.py index 386468ec..bb0629ea 100755 --- a/nxc/protocols/smb.py +++ b/nxc/protocols/smb.py @@ -741,12 +741,18 @@ class smb(connection): if not self.args.no_write_check: try: self.conn.createDirectory(share_name, temp_dir) - self.conn.deleteDirectory(share_name, temp_dir) write = True share_info["access"].append("WRITE") except SessionError as e: error = get_error_string(e) - self.logger.debug(f"Error checking WRITE access on share: {error}") + self.logger.debug(f"Error checking WRITE access on share {share_name}: {error}") + + if write: + try: + self.conn.deleteDirectory(share_name, temp_dir) + except SessionError as e: + error = get_error_string(e) + self.logger.debug(f"Error DELETING created temp dir {temp_dir} on share {share_name}: {error}") permissions.append(share_info) From c16aa4cd9f0c56b53cc34cb6f1e7800f2913ab4e Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Sun, 18 Feb 2024 11:48:28 +0100 Subject: [PATCH 31/56] Add share name in debug info for write check --- nxc/protocols/smb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nxc/protocols/smb.py b/nxc/protocols/smb.py index bb0629ea..b169f2b9 100755 --- a/nxc/protocols/smb.py +++ b/nxc/protocols/smb.py @@ -736,7 +736,7 @@ class smb(connection): share_info["access"].append("READ") except SessionError as e: error = get_error_string(e) - self.logger.debug(f"Error checking READ access on share: {error}") + self.logger.debug(f"Error checking READ access on share {share_name}: {error}") if not self.args.no_write_check: try: From 16c02372457ff87bb1b11ab1339984930ffe7368 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Wed, 21 Feb 2024 19:11:09 +0100 Subject: [PATCH 32/56] Impacket already checks if remote_ops is running, we don't need it in here Besides that, it intruduces a bug where nxc think rrp is enabled, but we closed it before without setting the self.remote_ops variable to None. This leads to sometimes crashing in lsa/sam dump if the service wasnt started originally. --- nxc/protocols/smb.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/nxc/protocols/smb.py b/nxc/protocols/smb.py index 386468ec..76235f22 100755 --- a/nxc/protocols/smb.py +++ b/nxc/protocols/smb.py @@ -1258,12 +1258,11 @@ class smb(connection): os.remove(download_path) def enable_remoteops(self): - if self.remote_ops is not None and self.bootkey is not None: - return try: self.remote_ops = RemoteOperations(self.conn, self.kerberos, self.kdcHost) self.remote_ops.enableRegistry() - self.bootkey = self.remote_ops.getBootKey() + if self.bootkey is None: + self.bootkey = self.remote_ops.getBootKey() except Exception as e: self.logger.fail(f"RemoteOperations failed: {e}") From b8912b516675145563ec52af047741039689f1ff Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:09:04 +0800 Subject: [PATCH 33/56] [nanodump] Bug fixed Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/modules/nanodump.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nxc/modules/nanodump.py b/nxc/modules/nanodump.py index 70375524..f157c945 100644 --- a/nxc/modules/nanodump.py +++ b/nxc/modules/nanodump.py @@ -98,7 +98,7 @@ class NXCModule: with open(os.path.join(self.nano_path, self.nano), "rb") as nano: try: self.context.log.display(f"Copy {self.nano} to {self.remote_tmp_dir}") - exec_method = MSSQLEXEC(self.connection.conn) + exec_method = MSSQLEXEC(self.connection.conn, self.context.log) exec_method.put_file(nano.read(), self.remote_tmp_dir + self.nano) if exec_method.file_exists(self.remote_tmp_dir + self.nano): self.context.log.success(f"Created file {self.nano} on the remote machine {self.remote_tmp_dir}") @@ -118,13 +118,13 @@ class NXCModule: self.context.log.display(f"Getting LSASS PID via command {command}") p = self.connection.execute(command, display_output) self.context.log.debug(f"tasklist Command Result: {p}") - if len(p) == 1: - p = p[0] - if not p or p == "None": self.context.log.fail("Failed to execute command to get LSASS PID") return + if len(p) == 1: + p = p[0] + pid = p.split(",")[1][1:-1] self.context.log.debug(f"pid: {pid}") timestamp = datetime.today().strftime("%Y%m%d_%H%M") From 26c35b3811bfe6c0288ac8fd7604db8f1dc9fe54 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Tue, 27 Feb 2024 10:33:11 +0100 Subject: [PATCH 34/56] Update impacket dependency to pull latest changes --- poetry.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index c2979f0a..db8c35be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -817,7 +817,7 @@ files = [ [[package]] name = "impacket" -version = "0.12.0.dev1+20231130.165011.d370e635" +version = "0.12.0.dev1+20240215.65950.da6f5255" description = "Network protocols Constructors and Dissectors" optional = false python-versions = "*" @@ -840,7 +840,7 @@ six = "*" type = "git" url = "https://github.com/Pennyw0rth/impacket.git" reference = "gkdi" -resolved_reference = "d370e6359a410063b2c9c68f6572c3b5fb178a38" +resolved_reference = "da6f52552b7d15f177587d902b3405e0aa07f22e" [[package]] name = "importlib-metadata" From b7df87c7f7f1de74ee4750bfab8af3ae19db6714 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Tue, 27 Feb 2024 02:21:54 +0100 Subject: [PATCH 35/56] Fix audit_mode in ldap --- nxc/protocols/ldap.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/nxc/protocols/ldap.py b/nxc/protocols/ldap.py index 7766f87d..586b9f48 100644 --- a/nxc/protocols/ldap.py +++ b/nxc/protocols/ldap.py @@ -399,7 +399,7 @@ class ldap(connection): return False except (KeyError, KerberosException, OSError) as e: self.logger.fail( - f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8)} {e!s}", + f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (process_secret(kerb_pass))} {e!s}", color="red", ) return False @@ -442,21 +442,21 @@ class ldap(connection): except SessionError as e: error, desc = e.getErrorString() self.logger.fail( - f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8)} {error!s}", + f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (process_secret(kerb_pass))} {error!s}", color="magenta" if error in ldap_error_status else "red", ) return False except Exception as e: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", + f"{self.domain}\\{self.username}:{process_secret(self.password)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", color="magenta" if error_code in ldap_error_status else "red", ) return False else: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8)} {error_code!s}", + f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (process_secret(kerb_pass))} {error_code!s}", color="magenta" if error_code in ldap_error_status else "red", ) return False @@ -526,18 +526,18 @@ class ldap(connection): except Exception as e: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", + f"{self.domain}\\{self.username}:{process_secret(self.password)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", color="magenta" if (error_code in ldap_error_status and error_code != 1) else "red", ) else: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", + f"{self.domain}\\{self.username}:{process_secret(self.password)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", color="magenta" if (error_code in ldap_error_status and error_code != 1) else "red", ) return False except OSError as e: - self.logger.fail(f"{self.domain}\\{self.username}:{self.password if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {'Error connecting to the domain, are you sure LDAP service is running on the target?'} \nError: {e}") + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} {'Error connecting to the domain, are you sure LDAP service is running on the target?'} \nError: {e}") return False def hash_login(self, domain, username, ntlm_hash): @@ -619,18 +619,18 @@ class ldap(connection): except ldap_impacket.LDAPSessionError as e: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}:{nthash if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", + f"{self.domain}\\{self.username}:{process_secret(nthash)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", color="magenta" if (error_code in ldap_error_status and error_code != 1) else "red", ) else: error_code = str(e).split()[-2][:-1] self.logger.fail( - f"{self.domain}\\{self.username}:{nthash if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", + f"{self.domain}\\{self.username}:{process_secret(nthash)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", color="magenta" if (error_code in ldap_error_status and error_code != 1) else "red", ) return False except OSError as e: - self.logger.fail(f"{self.domain}\\{self.username}:{self.password if not self.config.get('nxc', 'audit_mode') else self.config.get('nxc', 'audit_mode') * 8} {'Error connecting to the domain, are you sure LDAP service is running on the target?'} \nError: {e}") + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} {'Error connecting to the domain, are you sure LDAP service is running on the target?'} \nError: {e}") return False def create_smbv1_conn(self): From c0ac68272208ae970f572822b9b256dfdbe1581b Mon Sep 17 00:00:00 2001 From: Josh <68809797+0xjbb@users.noreply.github.com> Date: Sat, 6 Jan 2024 14:04:56 +0000 Subject: [PATCH 36/56] New Module added anonymous ADCS CA enumeration module --- nxc/modules/enum_ca.py | 115 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 nxc/modules/enum_ca.py diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py new file mode 100644 index 00000000..43d76209 --- /dev/null +++ b/nxc/modules/enum_ca.py @@ -0,0 +1,115 @@ + +from impacket.dcerpc.v5 import transport, epm +from impacket.http import AUTH_NTLM +from impacket.dcerpc.v5.rpch import RPC_PROXY_INVALID_RPC_PORT_ERR, \ + RPC_PROXY_CONN_A1_0X6BA_ERR, RPC_PROXY_CONN_A1_404_ERR, \ + RPC_PROXY_RPC_OUT_DATA_404_ERR +from impacket import uuid +import requests + +class NXCModule: + """ + ------- + Module by @0xjbb, original code from Impacket rpcdump.py + """ + KNOWN_PROTOCOLS = { + 135: {'bindstr': r'ncacn_ip_tcp:%s[135]'}, + 139: {'bindstr': r'ncacn_np:%s[\pipe\epmapper]'}, + 443: {'bindstr': r'ncacn_http:[593,RpcProxy=%s:443]'}, + 445: {'bindstr': r'ncacn_np:%s[\pipe\epmapper]'}, + 593: {'bindstr': r'ncacn_http:%s'} + } + + name = "enum_ca" + description = "Anonymously uses RPC endpoints to hunt for ADCS CAs" + supported_protocols = ['smb'] # Example: ['smb', 'mssql'] + opsec_safe = True # Does the module touch disk? + multiple_hosts = True # Does it make sense to run this module on multiple hosts at a time? + + def __init__(self, context=None, module_options=None): + self.context = context + self.module_options = module_options + + def options(self, context, module_options): + """Required. + Module options get parsed here. Additionally, put the modules usage here as well + Usage: nxc smb $IP -u '' -p '' -M enum-ca + """ + + def on_login(self, context, connection): + """Concurrent. + Required if on_admin_login is not present. This gets called on each authenticated connection + """ + self.__username = connection.username + self.__password = connection.password + self.__domain = connection.domain + self.__lmhash = '' + self.__nthash = '' + self.__port = 135. + self.__stringbinding = '' + + if context.hash and ":" in context.hash[0]: + hashList = context.hash[0].split(":") + self.__nthash = hashList[-1] + self.__lmhash = hashList[0] + elif context.hash and ":" not in context.hash[0]: + self.__nthash = context.hash[0] + self.__lmhash = "00000000000000000000000000000000" + + self.__stringbinding = self.KNOWN_PROTOCOLS[self.__port]['bindstr'] % connection.host + context.log.debug('StringBinding %s' % self.__stringbinding) + + rpctransport = transport.DCERPCTransportFactory(self.__stringbinding) + + if self.__port in [139, 445]: + # Setting credentials for SMB + rpctransport.set_credentials(self.__username, self.__password, self.__domain, + self.__lmhash, self.__nthash) + rpctransport.setRemoteHost(connection.host) + rpctransport.set_dport(self.__port) + elif self.__port in [443]: + # Setting credentials only for RPC Proxy, but not for the MSRPC level + rpctransport.set_credentials(self.__username, self.__password, self.__domain, + self.__lmhash, self.__nthash) + rpctransport.set_auth_type(AUTH_NTLM) + else: + pass + + try: + entries = self.__fetchList(rpctransport) + except Exception as e: + error_text = 'Protocol failed: %s' % e + context.log.fail(error_text) + + if RPC_PROXY_INVALID_RPC_PORT_ERR in error_text or \ + RPC_PROXY_RPC_OUT_DATA_404_ERR in error_text or \ + RPC_PROXY_CONN_A1_404_ERR in error_text or \ + RPC_PROXY_CONN_A1_0X6BA_ERR in error_text: + context.log.fail("This usually means the target does not allow " + "to connect to its epmapper using RpcProxy.") + return + for entry in entries: + tmpUUID = str(entry['tower']['Floors'][0]) + + if uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmpUUID))[:18] in epm.KNOWN_UUIDS: + exename = epm.KNOWN_UUIDS[uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmpUUID))[:18]] + context.log.debug('EXEs %s' % exename) + if exename == "certsrv.exe": + context.log.success("[+] Active Directory Certificate Services Found.") + url = "http://%s/certsrv/" % connection.host + context.log.debug(url) + try: + response = requests.get(url, timeout=3) + if "Microsoft Active Directory Certificate Services" in response.text: + context.log.success("[+] Web enrollment found on HTTP (ESC8).") + except requests.RequestException as e: + context.log.debug(e) + return + + def __fetchList(self, rpctransport): + dce = rpctransport.get_dce_rpc() + dce.connect() + resp = epm.hept_lookup(None, dce=dce) + dce.disconnect() + + return resp \ No newline at end of file From a6fbdbff2ba5cf96d2565098b99b3694e4684e59 Mon Sep 17 00:00:00 2001 From: Josh <68809797+0xjbb@users.noreply.github.com> Date: Sat, 6 Jan 2024 14:09:22 +0000 Subject: [PATCH 37/56] linted ran through ruff --- nxc/modules/enum_ca.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py index 43d76209..7ed82a86 100644 --- a/nxc/modules/enum_ca.py +++ b/nxc/modules/enum_ca.py @@ -13,16 +13,16 @@ class NXCModule: Module by @0xjbb, original code from Impacket rpcdump.py """ KNOWN_PROTOCOLS = { - 135: {'bindstr': r'ncacn_ip_tcp:%s[135]'}, - 139: {'bindstr': r'ncacn_np:%s[\pipe\epmapper]'}, - 443: {'bindstr': r'ncacn_http:[593,RpcProxy=%s:443]'}, - 445: {'bindstr': r'ncacn_np:%s[\pipe\epmapper]'}, - 593: {'bindstr': r'ncacn_http:%s'} + 135: {"bindstr": r"ncacn_ip_tcp:%s[135]"}, + 139: {"bindstr": r"ncacn_np:%s[\pipe\epmapper]"}, + 443: {"bindstr": r"ncacn_http:[593,RpcProxy=%s:443]"}, + 445: {"bindstr": r"ncacn_np:%s[\pipe\epmapper]"}, + 593: {"bindstr": r"ncacn_http:%s"} } name = "enum_ca" description = "Anonymously uses RPC endpoints to hunt for ADCS CAs" - supported_protocols = ['smb'] # Example: ['smb', 'mssql'] + supported_protocols = ["smb"] # Example: ['smb', 'mssql'] opsec_safe = True # Does the module touch disk? multiple_hosts = True # Does it make sense to run this module on multiple hosts at a time? @@ -43,10 +43,10 @@ class NXCModule: self.__username = connection.username self.__password = connection.password self.__domain = connection.domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__port = 135. - self.__stringbinding = '' + self.__stringbinding = "" if context.hash and ":" in context.hash[0]: hashList = context.hash[0].split(":") @@ -56,8 +56,8 @@ class NXCModule: self.__nthash = context.hash[0] self.__lmhash = "00000000000000000000000000000000" - self.__stringbinding = self.KNOWN_PROTOCOLS[self.__port]['bindstr'] % connection.host - context.log.debug('StringBinding %s' % self.__stringbinding) + self.__stringbinding = self.KNOWN_PROTOCOLS[self.__port]["bindstr"] % connection.host + context.log.debug("StringBinding %s" % self.__stringbinding) rpctransport = transport.DCERPCTransportFactory(self.__stringbinding) @@ -78,7 +78,7 @@ class NXCModule: try: entries = self.__fetchList(rpctransport) except Exception as e: - error_text = 'Protocol failed: %s' % e + error_text = "Protocol failed: %s" % e context.log.fail(error_text) if RPC_PROXY_INVALID_RPC_PORT_ERR in error_text or \ @@ -89,11 +89,11 @@ class NXCModule: "to connect to its epmapper using RpcProxy.") return for entry in entries: - tmpUUID = str(entry['tower']['Floors'][0]) + tmpUUID = str(entry["tower"]["Floors"][0]) if uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmpUUID))[:18] in epm.KNOWN_UUIDS: exename = epm.KNOWN_UUIDS[uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmpUUID))[:18]] - context.log.debug('EXEs %s' % exename) + context.log.debug("EXEs %s" % exename) if exename == "certsrv.exe": context.log.success("[+] Active Directory Certificate Services Found.") url = "http://%s/certsrv/" % connection.host From b20f6e199d2f31d8611c2beaea8ec959f19fa34e Mon Sep 17 00:00:00 2001 From: Josh <68809797+0xjbb@users.noreply.github.com> Date: Sat, 6 Jan 2024 14:19:05 +0000 Subject: [PATCH 38/56] Update enum_ca.py removed newline on line 1 Signed-off-by: Josh <68809797+0xjbb@users.noreply.github.com> --- nxc/modules/enum_ca.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py index 7ed82a86..090538e2 100644 --- a/nxc/modules/enum_ca.py +++ b/nxc/modules/enum_ca.py @@ -1,4 +1,3 @@ - from impacket.dcerpc.v5 import transport, epm from impacket.http import AUTH_NTLM from impacket.dcerpc.v5.rpch import RPC_PROXY_INVALID_RPC_PORT_ERR, \ @@ -112,4 +111,4 @@ class NXCModule: resp = epm.hept_lookup(None, dce=dce) dce.disconnect() - return resp \ No newline at end of file + return resp From bf61e93466aa18c11187397e04bb6d92993bb5f0 Mon Sep 17 00:00:00 2001 From: Josh <68809797+0xjbb@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:30:26 +0000 Subject: [PATCH 39/56] Update enum_ca.py Updated as requested Signed-off-by: Josh <68809797+0xjbb@users.noreply.github.com> --- nxc/modules/enum_ca.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py index 090538e2..bf30db80 100644 --- a/nxc/modules/enum_ca.py +++ b/nxc/modules/enum_ca.py @@ -30,15 +30,9 @@ class NXCModule: self.module_options = module_options def options(self, context, module_options): - """Required. - Module options get parsed here. Additionally, put the modules usage here as well - Usage: nxc smb $IP -u '' -p '' -M enum-ca - """ + pass def on_login(self, context, connection): - """Concurrent. - Required if on_admin_login is not present. This gets called on each authenticated connection - """ self.__username = connection.username self.__password = connection.password self.__domain = connection.domain From 97af55337c7e020a8466c7689c12e1008788139b Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Mon, 12 Feb 2024 19:39:48 +0100 Subject: [PATCH 40/56] Added proposal by Dfte and formating --- nxc/modules/enum_ca.py | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py index bf30db80..f3a11cdc 100644 --- a/nxc/modules/enum_ca.py +++ b/nxc/modules/enum_ca.py @@ -6,6 +6,7 @@ from impacket.dcerpc.v5.rpch import RPC_PROXY_INVALID_RPC_PORT_ERR, \ from impacket import uuid import requests + class NXCModule: """ ------- @@ -17,8 +18,8 @@ class NXCModule: 443: {"bindstr": r"ncacn_http:[593,RpcProxy=%s:443]"}, 445: {"bindstr": r"ncacn_np:%s[\pipe\epmapper]"}, 593: {"bindstr": r"ncacn_http:%s"} - } - + } + name = "enum_ca" description = "Anonymously uses RPC endpoints to hunt for ADCS CAs" supported_protocols = ["smb"] # Example: ['smb', 'mssql'] @@ -50,28 +51,26 @@ class NXCModule: self.__lmhash = "00000000000000000000000000000000" self.__stringbinding = self.KNOWN_PROTOCOLS[self.__port]["bindstr"] % connection.host - context.log.debug("StringBinding %s" % self.__stringbinding) - + context.log.debug(f"StringBinding {self.__stringbinding}") + rpctransport = transport.DCERPCTransportFactory(self.__stringbinding) if self.__port in [139, 445]: # Setting credentials for SMB - rpctransport.set_credentials(self.__username, self.__password, self.__domain, - self.__lmhash, self.__nthash) + rpctransport.set_credentials(self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash) rpctransport.setRemoteHost(connection.host) rpctransport.set_dport(self.__port) elif self.__port in [443]: # Setting credentials only for RPC Proxy, but not for the MSRPC level - rpctransport.set_credentials(self.__username, self.__password, self.__domain, - self.__lmhash, self.__nthash) + rpctransport.set_credentials(self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash) rpctransport.set_auth_type(AUTH_NTLM) else: pass - + try: entries = self.__fetchList(rpctransport) except Exception as e: - error_text = "Protocol failed: %s" % e + error_text = f"Protocol failed: {e}" context.log.fail(error_text) if RPC_PROXY_INVALID_RPC_PORT_ERR in error_text or \ @@ -88,21 +87,20 @@ class NXCModule: exename = epm.KNOWN_UUIDS[uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmpUUID))[:18]] context.log.debug("EXEs %s" % exename) if exename == "certsrv.exe": - context.log.success("[+] Active Directory Certificate Services Found.") - url = "http://%s/certsrv/" % connection.host - context.log.debug(url) + context.log.highlight("Active Directory Certificate Services Found.") + url = f"http://{connection.host}/certsrv/certfnsh.asp" + context.log.debug(url) try: - response = requests.get(url, timeout=3) - if "Microsoft Active Directory Certificate Services" in response.text: - context.log.success("[+] Web enrollment found on HTTP (ESC8).") + response = requests.get(url, timeout=5) + if response.status_code == 401 and "WWW-Authenticate" in response.headers and "ntlm" in response.headers["WWW-Authenticate"].lower(): + context.log.highlight("Web enrollment found on HTTP (ESC8).") except requests.RequestException as e: - context.log.debug(e) - return - + context.log.debug(e) + return + def __fetchList(self, rpctransport): dce = rpctransport.get_dce_rpc() dce.connect() resp = epm.hept_lookup(None, dce=dce) dce.disconnect() - return resp From 7a46f9eb6417c60579a54900ce998312a5c2f0ee Mon Sep 17 00:00:00 2001 From: Josh <68809797+0xjbb@users.noreply.github.com> Date: Tue, 27 Feb 2024 10:41:13 +0000 Subject: [PATCH 41/56] Update enum_ca.py Signed-off-by: Josh <68809797+0xjbb@users.noreply.github.com> --- nxc/modules/enum_ca.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nxc/modules/enum_ca.py b/nxc/modules/enum_ca.py index f3a11cdc..a9571aec 100644 --- a/nxc/modules/enum_ca.py +++ b/nxc/modules/enum_ca.py @@ -89,7 +89,7 @@ class NXCModule: if exename == "certsrv.exe": context.log.highlight("Active Directory Certificate Services Found.") url = f"http://{connection.host}/certsrv/certfnsh.asp" - context.log.debug(url) + context.log.highlight(url) try: response = requests.get(url, timeout=5) if response.status_code == 401 and "WWW-Authenticate" in response.headers and "ntlm" in response.headers["WWW-Authenticate"].lower(): From 9ceab247a8fb1f7c04d6357451065b40d8e8c492 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Thu, 8 Feb 2024 00:14:07 +0800 Subject: [PATCH 42/56] [winrm] say goodbye to SMB Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/winrm.py | 78 +++++++----------- nxc/protocols/winrm/winrm_ntlm_parser.py | 100 +++++++++++++++++++++++ 2 files changed, 129 insertions(+), 49 deletions(-) create mode 100644 nxc/protocols/winrm/winrm_ntlm_parser.py diff --git a/nxc/protocols/winrm.py b/nxc/protocols/winrm.py index 2b37b802..f7ae1a58 100644 --- a/nxc/protocols/winrm.py +++ b/nxc/protocols/winrm.py @@ -1,7 +1,7 @@ import os +import base64 import requests import urllib3 -import contextlib import logging import xml.etree.ElementTree as ET @@ -10,7 +10,6 @@ from datetime import datetime from pypsrp.wsman import NAMESPACES from pypsrp.client import Client -from impacket.smbconnection import SMBConnection from impacket.examples.secretsdump import LocalOperations, LSASecrets, SAMHashes from nxc.config import process_secret @@ -18,6 +17,7 @@ from nxc.connection import connection from nxc.helpers.bloodhound import add_user_bh from nxc.helpers.misc import gen_random_string from nxc.logger import NXCAdapter +from nxc.protocols.winrm.winrm_ntlm_parser import parse_challenge urllib3.disable_warnings() @@ -33,58 +33,33 @@ class winrm(connection): self.lmhash = "" self.nthash = "" self.ssl = False - self.auth_type = None + self.challenge_header = None connection.__init__(self, args, db, host) def proto_logger(self): - # Reason why default is SMB/445, because default is enumerate over SMB. # For more details, please check the function "print_host_info" logging.getLogger("pypsrp").disabled = True logging.getLogger("pypsrp.wsman").disabled = True self.logger = NXCAdapter( extra={ - "protocol": "SMB", + "protocol": "WINRM", "host": self.host, - "port": "445", + "port": "5985", "hostname": self.hostname, } ) def enum_host_info(self): - # smb no open, specify the domain - if self.args.no_smb: - self.domain = self.args.domain - else: - try: - smb_conn = SMBConnection(self.host, self.host, None, timeout=5) - no_ntlm = False - except Exception as e: - self.logger.fail(f"Error retrieving host domain: {e} specify one manually with the '-d' flag") - else: - try: - smb_conn.login("", "") - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - except Exception as e: - if "STATUS_NOT_SUPPORTED" in str(e): - # no ntlm supported - no_ntlm = True + ntlm_info = parse_challenge(base64.b64decode(self.challenge_header.split(' ')[1].replace(',', ''))) + self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] + self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] + self.server_os = f'Windows NT {ntlm_info["version"]}' + self.logger.extra["hostname"] = self.hostname - self.domain = smb_conn.getServerDNSDomainName() if not no_ntlm else self.args.domain - self.hostname = smb_conn.getServerName() if not no_ntlm else self.host - self.server_os = smb_conn.getServerOS() - if isinstance(self.server_os.lower(), bytes): - self.server_os = self.server_os.decode("utf-8") + self.output_filename = os.path.expanduser(f"~/.nxc/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") - self.logger.extra["hostname"] = self.hostname - - self.output_filename = os.path.expanduser(f"~/.nxc/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") - - with contextlib.suppress(Exception): - smb_conn.logoff() - - self.db.add_host(self.host, self.port, self.hostname, self.domain, self.server_os) + self.db.add_host(self.host, self.port, self.hostname, self.domain, self.server_os) if self.args.domain: self.domain = self.args.domain @@ -98,16 +73,10 @@ class winrm(connection): self.output_filename = os.path.expanduser(f"~/.nxc/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}".replace(":", "-")) def print_host_info(self): - if self.args.no_smb: - self.logger.extra["protocol"] = "WINRM-SSL" if self.ssl else "WINRM" - self.logger.extra["port"] = self.port - self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") - else: - self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") - self.logger.extra["protocol"] = "WINRM-SSL" if self.ssl else "WINRM" - self.logger.extra["port"] = self.port - - self.logger.info(f"Connection information: {self.endpoint} (auth type:{self.auth_type}) (domain:{self.domain if self.args.domain else ''})") + self.logger.extra["protocol"] = "WINRM-SSL" if self.ssl else "WINRM" + self.logger.extra["port"] = self.port + self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") + return True def create_conn_obj(self): @@ -117,6 +86,14 @@ class winrm(connection): endpoints = {} + headers = { + "Content-Length": "0", + "Keep-Alive": "true", + "Content-Type": "application/soap+xml;charset=UTF-8", + "User-Agent": "Microsoft WinRM Client", + "Authorization": "Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==" + } + for protocol in self.args.check_proto: endpoints[protocol] = {} endpoints[protocol]["port"] = self.port[self.args.check_proto.index(protocol)] if len(self.port) == 2 else self.port[0] @@ -131,9 +108,12 @@ class winrm(connection): self.port = endpoints[protocol]["port"] try: self.logger.debug(f"Requesting URL: {endpoints[protocol]['url']}") - res = requests.post(endpoints[protocol]["url"], verify=False, timeout=self.args.http_timeout) + res = requests.post(endpoints[protocol]["url"], headers=headers, verify=False, timeout=self.args.http_timeout) self.logger.debug(f"Received response code: {res.status_code}") - self.auth_type = res.headers["WWW-Authenticate"] if "WWW-Authenticate" in res.headers else "NOAUTH" + self.challenge_header = res.headers["WWW-Authenticate"] + if (not self.challenge_header) or (not 'Negotiate' in self.challenge_header): + self.logger.info('Failed to get NTLM challenge from target "/wsman" endpoint, maybe isn\'t winrm service.') + return False self.endpoint = endpoints[protocol]["url"] self.ssl = endpoints[protocol]["ssl"] return True diff --git a/nxc/protocols/winrm/winrm_ntlm_parser.py b/nxc/protocols/winrm/winrm_ntlm_parser.py new file mode 100644 index 00000000..3d4506df --- /dev/null +++ b/nxc/protocols/winrm/winrm_ntlm_parser.py @@ -0,0 +1,100 @@ +# Original from here: https://github.com/nopfor/ntlm_challenger + +import datetime + + +def decoder(byte_string, decode_type): + if decode_type == "byte": + return byte_string.decode("UTF-8").replace("\x00", "") + else: + return int.from_bytes(byte_string, "little") + +def parse_version(version_bytes): + major_version = version_bytes[0] + minor_version = version_bytes[1] + product_build = decoder(version_bytes[2:4], "int") + return f"{major_version}.{minor_version}.{product_build}" + +def parse_target_info(target_info_bytes): + MsvAvEOL = 0x0000 + MsvAvNbComputerName = 0x0001 + MsvAvNbDomainName = 0x0002 + MsvAvDnsComputerName = 0x0003 + MsvAvDnsDomainName = 0x0004 + MsvAvDnsTreeName = 0x0005 + MsvAvFlags = 0x0006 + MsvAvTimestamp = 0x0007 + MsvAvSingleHost = 0x0008 + MsvAvTargetName = 0x0009 + MsvAvChannelBindings = 0x000A + + target_info = { + "MsvAvNbComputerName": None, + "MsvAvDnsDomainName": None, + } + info_offset = 0 + + while info_offset < len(target_info_bytes): + av_id = decoder(target_info_bytes[info_offset:info_offset + 2], "int") + av_len = decoder(target_info_bytes[info_offset + 2:info_offset + 4], "int") + av_value = target_info_bytes[info_offset + 4:info_offset + 4 + av_len] + + info_offset = info_offset + 4 + av_len + + if av_id == MsvAvEOL: + pass + elif av_id == MsvAvNbComputerName: + target_info["MsvAvNbComputerName"] = decoder(av_value, "byte") + elif av_id == MsvAvNbDomainName: + target_info["MsvAvNbDomainName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsComputerName: + target_info["MsvAvDnsComputerName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsDomainName: + target_info["MsvAvDnsDomainName"] = decoder(av_value, "byte") + elif av_id == MsvAvDnsTreeName: + target_info["MsvAvDnsTreeName"] = decoder(av_value, "byte") + elif av_id == MsvAvFlags: + pass + elif av_id == MsvAvTimestamp: + filetime = decoder(av_value, "int") + microseconds = (filetime - 116444736000000000) / 10 + time = datetime.datetime(1970, 1, 1) + datetime.timedelta(microseconds=microseconds) + target_info["MsvAvTimestamp"] = time.strftime("%b %d, %Y %H:%M:%S.%f") + elif av_id == MsvAvSingleHost: + target_info["MsvAvSingleHost"] = decoder(av_value, "byte") + elif av_id == MsvAvTargetName: + target_info["MsvAvTargetName"] = decoder(av_value, "byte") + elif av_id == MsvAvChannelBindings: + target_info["MsvAvChannelBindings"] = av_value + return target_info + +def parse_challenge(challenge_message): + # TargetNameFields + target_name_fields = challenge_message[12:20] + target_name_len = decoder(target_name_fields[0:2], "int") + target_name_offset = decoder(target_name_fields[4:8], "int") + + # TargetInfoFields + target_info_fields = challenge_message[40:48] + target_info_len = decoder(target_info_fields[0:2], "int") + target_info_offset = decoder(target_info_fields[4:8], "int") + + # Version + version = None + version_bytes = challenge_message[48:56] + version = parse_version(version_bytes) + + # TargetName + target_name = challenge_message[target_name_offset:target_name_offset + target_name_len] + target_name = decoder(target_name, "byte") + + # TargetInfo + target_info_bytes = challenge_message[target_info_offset:target_info_offset + target_info_len] + + target_info = parse_target_info(target_info_bytes) + + return { + "target_name": target_name, + "version": version, + "target_info": target_info + } \ No newline at end of file From 217cf21cff1ccc41a6995f8abae2a1bec38e766e Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Thu, 8 Feb 2024 00:19:13 +0800 Subject: [PATCH 43/56] [winrm] Clean args.py Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/winrm/proto_args.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/nxc/protocols/winrm/proto_args.py b/nxc/protocols/winrm/proto_args.py index 0c896aee..66b1959b 100644 --- a/nxc/protocols/winrm/proto_args.py +++ b/nxc/protocols/winrm/proto_args.py @@ -9,12 +9,10 @@ def proto_args(parser, std_parser, module_parser): winrm_parser.add_argument("--check-proto", nargs="+", default=["http", "https"], help="Choose what prorocol you want to check, default is %(default)s, format: 'http https'(with space separated) or 'single-protocol'") winrm_parser.add_argument("--laps", dest="laps", metavar="LAPS", type=str, help="LAPS authentification", nargs="?", const="administrator") winrm_parser.add_argument("--http-timeout", dest="http_timeout", type=int, default=10, help="HTTP timeout for WinRM connections") - no_smb_arg = winrm_parser.add_argument("--no-smb", action=get_conditional_action(_StoreTrueAction), make_required=[], help="No smb connection") dgroup = winrm_parser.add_mutually_exclusive_group() domain_arg = dgroup.add_argument("-d", metavar="DOMAIN", dest="domain", type=str, default=None, help="domain to authenticate to") dgroup.add_argument("--local-auth", action="store_true", help="authenticate locally to each target") - no_smb_arg.make_required = [domain_arg] cgroup = winrm_parser.add_argument_group("Credential Gathering", "Options for gathering credentials") cgroup.add_argument("--dump-method", action="store", default="cmd", choices={"cmd", "powershell"}, help="Select shell type in hashes dump") From 19ee0665422da89b299db321bbd902b115355d03 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Thu, 8 Feb 2024 00:22:44 +0800 Subject: [PATCH 44/56] [winrm] Ruff Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/winrm.py | 4 ++-- nxc/protocols/winrm/proto_args.py | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/nxc/protocols/winrm.py b/nxc/protocols/winrm.py index f7ae1a58..c0960762 100644 --- a/nxc/protocols/winrm.py +++ b/nxc/protocols/winrm.py @@ -51,7 +51,7 @@ class winrm(connection): ) def enum_host_info(self): - ntlm_info = parse_challenge(base64.b64decode(self.challenge_header.split(' ')[1].replace(',', ''))) + ntlm_info = parse_challenge(base64.b64decode(self.challenge_header.split(" ")[1].replace(",", ""))) self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] self.server_os = f'Windows NT {ntlm_info["version"]}' @@ -111,7 +111,7 @@ class winrm(connection): res = requests.post(endpoints[protocol]["url"], headers=headers, verify=False, timeout=self.args.http_timeout) self.logger.debug(f"Received response code: {res.status_code}") self.challenge_header = res.headers["WWW-Authenticate"] - if (not self.challenge_header) or (not 'Negotiate' in self.challenge_header): + if (not self.challenge_header) or ("Negotiate" not in self.challenge_header): self.logger.info('Failed to get NTLM challenge from target "/wsman" endpoint, maybe isn\'t winrm service.') return False self.endpoint = endpoints[protocol]["url"] diff --git a/nxc/protocols/winrm/proto_args.py b/nxc/protocols/winrm/proto_args.py index 66b1959b..d00a1372 100644 --- a/nxc/protocols/winrm/proto_args.py +++ b/nxc/protocols/winrm/proto_args.py @@ -1,6 +1,3 @@ -from argparse import _StoreTrueAction - - def proto_args(parser, std_parser, module_parser): winrm_parser = parser.add_parser("winrm", help="own stuff using WINRM", parents=[std_parser, module_parser]) winrm_parser.add_argument("-H", "--hash", metavar="HASH", dest="hash", nargs="+", default=[], help="NTLM hash(es) or file(s) containing NTLM hashes") @@ -11,7 +8,7 @@ def proto_args(parser, std_parser, module_parser): winrm_parser.add_argument("--http-timeout", dest="http_timeout", type=int, default=10, help="HTTP timeout for WinRM connections") dgroup = winrm_parser.add_mutually_exclusive_group() - domain_arg = dgroup.add_argument("-d", metavar="DOMAIN", dest="domain", type=str, default=None, help="domain to authenticate to") + dgroup.add_argument("-d", metavar="DOMAIN", dest="domain", type=str, default=None, help="domain to authenticate to") dgroup.add_argument("--local-auth", action="store_true", help="authenticate locally to each target") cgroup = winrm_parser.add_argument_group("Credential Gathering", "Options for gathering credentials") From 1e12cadb3353f53bab7ef1b8c1329d4b45db4f50 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Tue, 13 Feb 2024 01:23:42 +0100 Subject: [PATCH 45/56] Removed unused conditional function, removed "NT" from windows version so it matches SMB enumeration --- nxc/protocols/winrm.py | 2 +- nxc/protocols/winrm/proto_args.py | 15 --------------- nxc/protocols/winrm/winrm_ntlm_parser.py | 2 +- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/nxc/protocols/winrm.py b/nxc/protocols/winrm.py index c0960762..fb9cf642 100644 --- a/nxc/protocols/winrm.py +++ b/nxc/protocols/winrm.py @@ -54,7 +54,7 @@ class winrm(connection): ntlm_info = parse_challenge(base64.b64decode(self.challenge_header.split(" ")[1].replace(",", ""))) self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] - self.server_os = f'Windows NT {ntlm_info["version"]}' + self.server_os = f'Windows {ntlm_info["version"]}' self.logger.extra["hostname"] = self.hostname self.output_filename = os.path.expanduser(f"~/.nxc/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") diff --git a/nxc/protocols/winrm/proto_args.py b/nxc/protocols/winrm/proto_args.py index d00a1372..ca4e81a5 100644 --- a/nxc/protocols/winrm/proto_args.py +++ b/nxc/protocols/winrm/proto_args.py @@ -24,18 +24,3 @@ def proto_args(parser, std_parser, module_parser): cgroup.add_argument("-X", metavar="PS_COMMAND", dest="ps_execute", help="execute the specified PowerShell command") return parser - - -def get_conditional_action(baseAction): - class ConditionalAction(baseAction): - def __init__(self, option_strings, dest, **kwargs): - x = kwargs.pop("make_required", []) - super().__init__(option_strings, dest, **kwargs) - self.make_required = x - - def __call__(self, parser, namespace, values, option_string=None): - for x in self.make_required: - x.required = True - super().__call__(parser, namespace, values, option_string) - - return ConditionalAction \ No newline at end of file diff --git a/nxc/protocols/winrm/winrm_ntlm_parser.py b/nxc/protocols/winrm/winrm_ntlm_parser.py index 3d4506df..838a5d08 100644 --- a/nxc/protocols/winrm/winrm_ntlm_parser.py +++ b/nxc/protocols/winrm/winrm_ntlm_parser.py @@ -13,7 +13,7 @@ def parse_version(version_bytes): major_version = version_bytes[0] minor_version = version_bytes[1] product_build = decoder(version_bytes[2:4], "int") - return f"{major_version}.{minor_version}.{product_build}" + return f"{major_version}.{minor_version} Build {product_build}" def parse_target_info(target_info_bytes): MsvAvEOL = 0x0000 From 7e0c0e0c07ad610c8131c0fb8a51b2f291240022 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Tue, 13 Feb 2024 01:24:42 +0100 Subject: [PATCH 46/56] Formating --- nxc/protocols/winrm.py | 2 +- nxc/protocols/winrm/winrm_ntlm_parser.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/nxc/protocols/winrm.py b/nxc/protocols/winrm.py index fb9cf642..f152e453 100644 --- a/nxc/protocols/winrm.py +++ b/nxc/protocols/winrm.py @@ -38,7 +38,7 @@ class winrm(connection): connection.__init__(self, args, db, host) def proto_logger(self): - # For more details, please check the function "print_host_info" + # For more details, please check the function "print_host_info" logging.getLogger("pypsrp").disabled = True logging.getLogger("pypsrp.wsman").disabled = True self.logger = NXCAdapter( diff --git a/nxc/protocols/winrm/winrm_ntlm_parser.py b/nxc/protocols/winrm/winrm_ntlm_parser.py index 838a5d08..75feb580 100644 --- a/nxc/protocols/winrm/winrm_ntlm_parser.py +++ b/nxc/protocols/winrm/winrm_ntlm_parser.py @@ -9,12 +9,14 @@ def decoder(byte_string, decode_type): else: return int.from_bytes(byte_string, "little") -def parse_version(version_bytes): + +def parse_version(version_bytes): major_version = version_bytes[0] minor_version = version_bytes[1] product_build = decoder(version_bytes[2:4], "int") return f"{major_version}.{minor_version} Build {product_build}" + def parse_target_info(target_info_bytes): MsvAvEOL = 0x0000 MsvAvNbComputerName = 0x0001 @@ -38,9 +40,9 @@ def parse_target_info(target_info_bytes): av_id = decoder(target_info_bytes[info_offset:info_offset + 2], "int") av_len = decoder(target_info_bytes[info_offset + 2:info_offset + 4], "int") av_value = target_info_bytes[info_offset + 4:info_offset + 4 + av_len] - + info_offset = info_offset + 4 + av_len - + if av_id == MsvAvEOL: pass elif av_id == MsvAvNbComputerName: @@ -68,6 +70,7 @@ def parse_target_info(target_info_bytes): target_info["MsvAvChannelBindings"] = av_value return target_info + def parse_challenge(challenge_message): # TargetNameFields target_name_fields = challenge_message[12:20] @@ -97,4 +100,4 @@ def parse_challenge(challenge_message): "target_name": target_name, "version": version, "target_info": target_info - } \ No newline at end of file + } From 1d1c03be7a4f75f7e9ee110faaead171a167039b Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Tue, 27 Feb 2024 19:15:42 +0800 Subject: [PATCH 47/56] [winrm] better os info Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- .../winrm/winrm_ntlm_parser.py => helpers/ntlm_parser.py} | 6 +++--- nxc/protocols/winrm.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename nxc/{protocols/winrm/winrm_ntlm_parser.py => helpers/ntlm_parser.py} (96%) diff --git a/nxc/protocols/winrm/winrm_ntlm_parser.py b/nxc/helpers/ntlm_parser.py similarity index 96% rename from nxc/protocols/winrm/winrm_ntlm_parser.py rename to nxc/helpers/ntlm_parser.py index 75feb580..bda36b09 100644 --- a/nxc/protocols/winrm/winrm_ntlm_parser.py +++ b/nxc/helpers/ntlm_parser.py @@ -2,6 +2,8 @@ import datetime +from impacket.smb3 import WIN_VERSIONS + def decoder(byte_string, decode_type): if decode_type == "byte": @@ -11,10 +13,8 @@ def decoder(byte_string, decode_type): def parse_version(version_bytes): - major_version = version_bytes[0] - minor_version = version_bytes[1] product_build = decoder(version_bytes[2:4], "int") - return f"{major_version}.{minor_version} Build {product_build}" + return f"{WIN_VERSIONS[product_build]} Build {product_build}" def parse_target_info(target_info_bytes): diff --git a/nxc/protocols/winrm.py b/nxc/protocols/winrm.py index f152e453..9a094557 100644 --- a/nxc/protocols/winrm.py +++ b/nxc/protocols/winrm.py @@ -16,8 +16,8 @@ from nxc.config import process_secret from nxc.connection import connection from nxc.helpers.bloodhound import add_user_bh from nxc.helpers.misc import gen_random_string +from nxc.helpers.ntlm_parser import parse_challenge from nxc.logger import NXCAdapter -from nxc.protocols.winrm.winrm_ntlm_parser import parse_challenge urllib3.disable_warnings() @@ -54,7 +54,7 @@ class winrm(connection): ntlm_info = parse_challenge(base64.b64decode(self.challenge_header.split(" ")[1].replace(",", ""))) self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] - self.server_os = f'Windows {ntlm_info["version"]}' + self.server_os = ntlm_info["version"] self.logger.extra["hostname"] = self.hostname self.output_filename = os.path.expanduser(f"~/.nxc/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") From 9f0ac2cf90d4ab4075f27dabe1171d38697c58b2 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Wed, 28 Feb 2024 00:55:29 +0100 Subject: [PATCH 48/56] Added fallback if build version is not available (yet) --- nxc/helpers/ntlm_parser.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/nxc/helpers/ntlm_parser.py b/nxc/helpers/ntlm_parser.py index bda36b09..671c3b19 100644 --- a/nxc/helpers/ntlm_parser.py +++ b/nxc/helpers/ntlm_parser.py @@ -13,8 +13,13 @@ def decoder(byte_string, decode_type): def parse_version(version_bytes): + major_version = version_bytes[0] + minor_version = version_bytes[1] product_build = decoder(version_bytes[2:4], "int") - return f"{WIN_VERSIONS[product_build]} Build {product_build}" + if product_build in WIN_VERSIONS: + return f"{WIN_VERSIONS[product_build]} Build {product_build}" + else: + return f"Windows {major_version}.{minor_version} Build {product_build}" def parse_target_info(target_info_bytes): @@ -93,7 +98,6 @@ def parse_challenge(challenge_message): # TargetInfo target_info_bytes = challenge_message[target_info_offset:target_info_offset + target_info_len] - target_info = parse_target_info(target_info_bytes) return { From 3af51869605543f020c18b633109db7e23351438 Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Wed, 28 Feb 2024 12:43:38 +0800 Subject: [PATCH 49/56] [mssql] remove drop mssql-ntlm-parser.py Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 4 +- nxc/protocols/mssql/mssql_ntlm_parser.py | 100 ----------------------- 2 files changed, 2 insertions(+), 102 deletions(-) delete mode 100644 nxc/protocols/mssql/mssql_ntlm_parser.py diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 47e6f85a..1fd5a276 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -8,9 +8,9 @@ from nxc.connection import connection from nxc.connection import requires_admin from nxc.logger import NXCAdapter from nxc.helpers.bloodhound import add_user_bh +from nxc.helpers.ntlm_parser import parse_challenge from nxc.helpers.powershell import create_ps_command from nxc.protocols.mssql.mssqlexec import MSSQLEXEC -from nxc.protocols.mssql.mssql_ntlm_parser import parse_challenge from impacket import tds, ntlm from impacket.krb5.ccache import CCache @@ -124,7 +124,7 @@ class mssql(connection): ntlm_info = parse_challenge(challenge) self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] - self.server_os = f'Windows NT {ntlm_info["version"]}' + self.server_os = ntlm_info["version"] self.logger.extra["hostname"] = self.hostname self.db.add_host(self.host, self.hostname, self.domain, self.server_os, len(self.mssql_instances),) diff --git a/nxc/protocols/mssql/mssql_ntlm_parser.py b/nxc/protocols/mssql/mssql_ntlm_parser.py deleted file mode 100644 index 3d4506df..00000000 --- a/nxc/protocols/mssql/mssql_ntlm_parser.py +++ /dev/null @@ -1,100 +0,0 @@ -# Original from here: https://github.com/nopfor/ntlm_challenger - -import datetime - - -def decoder(byte_string, decode_type): - if decode_type == "byte": - return byte_string.decode("UTF-8").replace("\x00", "") - else: - return int.from_bytes(byte_string, "little") - -def parse_version(version_bytes): - major_version = version_bytes[0] - minor_version = version_bytes[1] - product_build = decoder(version_bytes[2:4], "int") - return f"{major_version}.{minor_version}.{product_build}" - -def parse_target_info(target_info_bytes): - MsvAvEOL = 0x0000 - MsvAvNbComputerName = 0x0001 - MsvAvNbDomainName = 0x0002 - MsvAvDnsComputerName = 0x0003 - MsvAvDnsDomainName = 0x0004 - MsvAvDnsTreeName = 0x0005 - MsvAvFlags = 0x0006 - MsvAvTimestamp = 0x0007 - MsvAvSingleHost = 0x0008 - MsvAvTargetName = 0x0009 - MsvAvChannelBindings = 0x000A - - target_info = { - "MsvAvNbComputerName": None, - "MsvAvDnsDomainName": None, - } - info_offset = 0 - - while info_offset < len(target_info_bytes): - av_id = decoder(target_info_bytes[info_offset:info_offset + 2], "int") - av_len = decoder(target_info_bytes[info_offset + 2:info_offset + 4], "int") - av_value = target_info_bytes[info_offset + 4:info_offset + 4 + av_len] - - info_offset = info_offset + 4 + av_len - - if av_id == MsvAvEOL: - pass - elif av_id == MsvAvNbComputerName: - target_info["MsvAvNbComputerName"] = decoder(av_value, "byte") - elif av_id == MsvAvNbDomainName: - target_info["MsvAvNbDomainName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsComputerName: - target_info["MsvAvDnsComputerName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsDomainName: - target_info["MsvAvDnsDomainName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsTreeName: - target_info["MsvAvDnsTreeName"] = decoder(av_value, "byte") - elif av_id == MsvAvFlags: - pass - elif av_id == MsvAvTimestamp: - filetime = decoder(av_value, "int") - microseconds = (filetime - 116444736000000000) / 10 - time = datetime.datetime(1970, 1, 1) + datetime.timedelta(microseconds=microseconds) - target_info["MsvAvTimestamp"] = time.strftime("%b %d, %Y %H:%M:%S.%f") - elif av_id == MsvAvSingleHost: - target_info["MsvAvSingleHost"] = decoder(av_value, "byte") - elif av_id == MsvAvTargetName: - target_info["MsvAvTargetName"] = decoder(av_value, "byte") - elif av_id == MsvAvChannelBindings: - target_info["MsvAvChannelBindings"] = av_value - return target_info - -def parse_challenge(challenge_message): - # TargetNameFields - target_name_fields = challenge_message[12:20] - target_name_len = decoder(target_name_fields[0:2], "int") - target_name_offset = decoder(target_name_fields[4:8], "int") - - # TargetInfoFields - target_info_fields = challenge_message[40:48] - target_info_len = decoder(target_info_fields[0:2], "int") - target_info_offset = decoder(target_info_fields[4:8], "int") - - # Version - version = None - version_bytes = challenge_message[48:56] - version = parse_version(version_bytes) - - # TargetName - target_name = challenge_message[target_name_offset:target_name_offset + target_name_len] - target_name = decoder(target_name, "byte") - - # TargetInfo - target_info_bytes = challenge_message[target_info_offset:target_info_offset + target_info_len] - - target_info = parse_target_info(target_info_bytes) - - return { - "target_name": target_name, - "version": version, - "target_info": target_info - } \ No newline at end of file From 0d1c8bcdef37ea251f2959eeb7685ed9e8c39713 Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:28:32 +0100 Subject: [PATCH 50/56] Remove pyreadline as it causes errors in nxcdb --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c02c6c49..98eeb616 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,6 @@ pyasn1-modules = "^0.3.0" rich = "^13.3.5" python-libnmap = "^0.7.3" oscrypto = { git = "https://github.com/Pennyw0rth/oscrypto" } # Pypi version currently broken, see: https://github.com/wbond/oscrypto/issues/78 (as of 9/23) -pyreadline = { version = "^2.1", markers = "sys_platform == 'win32'" } # for the build - impacket imports its hidden from the builder so an error occurs argcomplete = "^3.1.4" [tool.poetry.group.dev.dependencies] From 423b70bcfbb6ef17b92e8534e6f1a9a0f2c6bcff Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Thu, 29 Feb 2024 13:26:00 +0800 Subject: [PATCH 51/56] [lib] Improve ntlm_parser.py Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/helpers/ntlm_parser.py | 127 ++++++++----------------------------- nxc/protocols/winrm.py | 6 +- nxc/protocols/wmi.py | 36 ++--------- 3 files changed, 37 insertions(+), 132 deletions(-) diff --git a/nxc/helpers/ntlm_parser.py b/nxc/helpers/ntlm_parser.py index 671c3b19..dd5913f8 100644 --- a/nxc/helpers/ntlm_parser.py +++ b/nxc/helpers/ntlm_parser.py @@ -1,107 +1,34 @@ -# Original from here: https://github.com/nopfor/ntlm_challenger +# Original from here: https://github.com/fortra/impacket/blob/master/examples/DumpNTLMInfo.py#L568 -import datetime +import struct +from impacket import ntlm from impacket.smb3 import WIN_VERSIONS +import contextlib -def decoder(byte_string, decode_type): - if decode_type == "byte": - return byte_string.decode("UTF-8").replace("\x00", "") - else: - return int.from_bytes(byte_string, "little") - - -def parse_version(version_bytes): - major_version = version_bytes[0] - minor_version = version_bytes[1] - product_build = decoder(version_bytes[2:4], "int") - if product_build in WIN_VERSIONS: - return f"{WIN_VERSIONS[product_build]} Build {product_build}" - else: - return f"Windows {major_version}.{minor_version} Build {product_build}" - - -def parse_target_info(target_info_bytes): - MsvAvEOL = 0x0000 - MsvAvNbComputerName = 0x0001 - MsvAvNbDomainName = 0x0002 - MsvAvDnsComputerName = 0x0003 - MsvAvDnsDomainName = 0x0004 - MsvAvDnsTreeName = 0x0005 - MsvAvFlags = 0x0006 - MsvAvTimestamp = 0x0007 - MsvAvSingleHost = 0x0008 - MsvAvTargetName = 0x0009 - MsvAvChannelBindings = 0x000A - +def parse_challenge(challange): target_info = { - "MsvAvNbComputerName": None, - "MsvAvDnsDomainName": None, - } - info_offset = 0 - - while info_offset < len(target_info_bytes): - av_id = decoder(target_info_bytes[info_offset:info_offset + 2], "int") - av_len = decoder(target_info_bytes[info_offset + 2:info_offset + 4], "int") - av_value = target_info_bytes[info_offset + 4:info_offset + 4 + av_len] - - info_offset = info_offset + 4 + av_len - - if av_id == MsvAvEOL: - pass - elif av_id == MsvAvNbComputerName: - target_info["MsvAvNbComputerName"] = decoder(av_value, "byte") - elif av_id == MsvAvNbDomainName: - target_info["MsvAvNbDomainName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsComputerName: - target_info["MsvAvDnsComputerName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsDomainName: - target_info["MsvAvDnsDomainName"] = decoder(av_value, "byte") - elif av_id == MsvAvDnsTreeName: - target_info["MsvAvDnsTreeName"] = decoder(av_value, "byte") - elif av_id == MsvAvFlags: - pass - elif av_id == MsvAvTimestamp: - filetime = decoder(av_value, "int") - microseconds = (filetime - 116444736000000000) / 10 - time = datetime.datetime(1970, 1, 1) + datetime.timedelta(microseconds=microseconds) - target_info["MsvAvTimestamp"] = time.strftime("%b %d, %Y %H:%M:%S.%f") - elif av_id == MsvAvSingleHost: - target_info["MsvAvSingleHost"] = decoder(av_value, "byte") - elif av_id == MsvAvTargetName: - target_info["MsvAvTargetName"] = decoder(av_value, "byte") - elif av_id == MsvAvChannelBindings: - target_info["MsvAvChannelBindings"] = av_value - return target_info - - -def parse_challenge(challenge_message): - # TargetNameFields - target_name_fields = challenge_message[12:20] - target_name_len = decoder(target_name_fields[0:2], "int") - target_name_offset = decoder(target_name_fields[4:8], "int") - - # TargetInfoFields - target_info_fields = challenge_message[40:48] - target_info_len = decoder(target_info_fields[0:2], "int") - target_info_offset = decoder(target_info_fields[4:8], "int") - - # Version - version = None - version_bytes = challenge_message[48:56] - version = parse_version(version_bytes) - - # TargetName - target_name = challenge_message[target_name_offset:target_name_offset + target_name_len] - target_name = decoder(target_name, "byte") - - # TargetInfo - target_info_bytes = challenge_message[target_info_offset:target_info_offset + target_info_len] - target_info = parse_target_info(target_info_bytes) - - return { - "target_name": target_name, - "version": version, - "target_info": target_info + "hostname": None, + "domain": None, + "os_version": None } + challange = ntlm.NTLMAuthChallenge(challange) + av_pairs = ntlm.AV_PAIRS(challange["TargetInfoFields"][:challange["TargetInfoFields_len"]]) + if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] is not None: + with contextlib.suppress(Exception): + target_info["hostname"] = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode("utf-16le") + if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] is not None: + with contextlib.suppress(Exception): + target_info["domain"] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode("utf-16le") + if "Version" in challange.fields: + version = challange["Version"] + if len(version) >= 4: + major_version = version[0] + minor_version = version[1] + product_build = struct.unpack(" 0: - av_pairs = ntlm.AV_PAIRS(ntlmChallenge["TargetInfoFields"][: ntlmChallenge["TargetInfoFields_len"]]) - if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1] is not None: - try: - self.hostname = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode("utf-16le") - except Exception: - self.hostname = self.host - if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1] is not None: - try: - self.domain = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode("utf-16le") - except Exception: - self.domain = self.args.domain - if av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME][1] is not None: - with contextlib.suppress(Exception): - self.fqdn = av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME][1].decode("utf-16le") - if "Version" in ntlmChallenge.fields: - version = ntlmChallenge["Version"] - if len(version) >= 4: - self.server_os = "Windows NT %d.%d Build %d" % (indexbytes(version, 0), indexbytes(version, 1), struct.unpack(" Date: Thu, 29 Feb 2024 13:37:04 +0800 Subject: [PATCH 52/56] [mssql] Ready for PR #191 Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 1fd5a276..090171d2 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -122,9 +122,9 @@ class mssql(connection): return False else: ntlm_info = parse_challenge(challenge) - self.domain = ntlm_info["target_info"]["MsvAvDnsDomainName"] - self.hostname = ntlm_info["target_info"]["MsvAvNbComputerName"] - self.server_os = ntlm_info["version"] + self.domain = ntlm_info["domain"] + self.hostname = ntlm_info["hostname"] + self.server_os = ntlm_info["os_version"] self.logger.extra["hostname"] = self.hostname self.db.add_host(self.host, self.hostname, self.domain, self.server_os, len(self.mssql_instances),) From 88769b1b0d23564b2489ed94221c049cd3be11ff Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 2 Mar 2024 20:47:39 -0500 Subject: [PATCH 53/56] Update README.md add Linux installation directly to README fix french->english :P Signed-off-by: Marshall Hallenbeck --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fa60c9a..d0171dd8 100755 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Going forward, our intent is to maintain a community-driven and maintained proje You are on the **latest up-to-date** repository of the project NetExec (nxc) ! 🎉 -- 🚧 If you want to report a problem, open un [Issue](https://github.com/Pennyw0rth/NetExec/issues) +- 🚧 If you want to report a problem, open an [Issue](https://github.com/Pennyw0rth/NetExec/issues) - 🔀 If you want to contribute, open a [Pull Request](https://github.com/Pennyw0rth/NetExec/pulls) - 💬 If you want to discuss, open a [Discussion](https://github.com/Pennyw0rth/NetExec/discussions) @@ -37,6 +37,12 @@ See the project's [wiki](https://netexec.wiki/) (in development) for documentati # Installation Please see the installation instructions on the [wiki](https://netexec.wiki/getting-started/installation) (in development) +## Linux +``` +sudo apt install pipx git +pipx ensurepath +pipx install git+https://github.com/Pennyw0rth/NetExec +``` # Development Development guidelines and recommendations in development From 9120d1d5dce418f20cd23db8560bfe0aeb72d96e Mon Sep 17 00:00:00 2001 From: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:24:37 +0800 Subject: [PATCH 54/56] [mssql] mpgn: review Signed-off-by: XiaoliChan <30458572+XiaoliChan@users.noreply.github.com> --- nxc/protocols/mssql.py | 130 ++++++++++++++---------------- nxc/protocols/mssql/proto_args.py | 2 +- 2 files changed, 62 insertions(+), 70 deletions(-) diff --git a/nxc/protocols/mssql.py b/nxc/protocols/mssql.py index 090171d2..1fc00f19 100755 --- a/nxc/protocols/mssql.py +++ b/nxc/protocols/mssql.py @@ -152,6 +152,19 @@ class mssql(connection): kdcHost="", useCache=False, ): + self.username = username + self.password = password + self.domain = domain + self.nthash = "" + hashes = None + if ntlm_hash: + if ntlm_hash.find(":") != -1: + self.nthash = ntlm_hash.split(":")[1] + hashes = f":{self.nthash}" + else: + self.nthash = ntlm_hash + hashes = f":{self.nthash}" + kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) if not all(s == "" for s in [self.nthash, password, aesKey]) else "" if useCache and kerb_pass == "": @@ -159,45 +172,21 @@ class mssql(connection): username = ccache.credentials[0].header["client"].prettyPrint().decode().split("@")[0] self.username = username - self.username = username - self.password = password - self.domain = domain - - self.nthash = None - if ntlm_hash: - self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" - used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" try: res = self.conn.kerberosLogin( None, - username, - password, - domain, - self.nthash, + self.username, + self.password, + self.domain, + hashes, aesKey, kdcHost=kdcHost, useCache=useCache, ) if res is not True: - error_msg = self.conn.printReplies() - self.logger.fail( - "{}\\{}:{} {}".format( - self.domain, - self.username, - used_ccache, - error_msg if error_msg else "" - ) - ) - return False - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - return False - except Exception as e: - self.logger.fail(f"{self.domain}\\{self.username}{used_ccache} ({e!s})") - return False - else: + raise self.check_if_admin() self.logger.success(f"{self.domain}\\{self.username}{used_ccache} {self.mark_pwned()}") if not self.args.local_auth: @@ -205,6 +194,13 @@ class mssql(connection): if self.admin_privs: add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception: + error_msg = self.handle_mssql_reply() + self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, kerb_pass, error_msg if error_msg else "")) + return False @reconnect_mssql def plaintext_login(self, domain, username, password): @@ -213,25 +209,16 @@ class mssql(connection): self.domain = domain try: - res = self.conn.login(None, username, password, domain, None, not self.args.local_auth) + res = self.conn.login( + None, + self.username, + self.password, + self.domain, + None, + not self.args.local_auth, + ) if res is not True: - error_msg = self.handle_mssql_reply() - self.logger.fail( - "{}\\{}:{} {}".format( - self.domain, - self.username, - process_secret(self.password), - error_msg if error_msg else "" - ) - ) - return False - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - return False - except Exception as e: - self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} ({e!s})") - return False - else: + raise self.check_if_admin() out = f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}" self.logger.success(out) @@ -240,47 +227,52 @@ class mssql(connection): if self.admin_privs: add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception: + error_msg = self.handle_mssql_reply() + self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, process_secret(self.password), error_msg if error_msg else "")) + return False @reconnect_mssql def hash_login(self, domain, username, ntlm_hash): self.username = username self.domain = domain - self.nthash = f':{ntlm_hash.split(":")[1]}' if ntlm_hash.find(":") != -1 else f":{ntlm_hash}" + self.lmhash = "" + self.nthash = "" + + if ntlm_hash.find(":") != -1: + self.lmhash, self.nthash = ntlm_hash.split(":") + else: + self.nthash = ntlm_hash try: res = self.conn.login( None, - username, + self.username, "", - domain, - self.nthash, + self.domain, + f"{self.lmhash}:{self.nthash}", not self.args.local_auth, ) if res is not True: - error_msg = self.conn.printReplies() - self.logger.fail( - "{}\\{}:{} {}".format( - self.domain, - self.username, - process_secret(self.nthash), - error_msg if error_msg else "" - ) - ) - return False - except BrokenPipeError: - self.logger.fail("Broken Pipe Error while attempting to login") - return False - except Exception as e: - self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} ({e!s})") - return False - else: + raise self.check_if_admin() - self.logger.success(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}") + out = f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}" + self.logger.success(out) if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) if self.admin_privs: add_user_bh(f"{self.hostname}$", self.domain, self.logger, self.config) return True + except BrokenPipeError: + self.logger.fail("Broken Pipe Error while attempting to login") + return False + except Exception: + error_msg = self.handle_mssql_reply() + self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, process_secret(self.nthash), error_msg if error_msg else "")) + return False def mssql_query(self): if self.conn.lastError: diff --git a/nxc/protocols/mssql/proto_args.py b/nxc/protocols/mssql/proto_args.py index 48042151..8a832bc2 100644 --- a/nxc/protocols/mssql/proto_args.py +++ b/nxc/protocols/mssql/proto_args.py @@ -2,7 +2,7 @@ def proto_args(parser, std_parser, module_parser): mssql_parser = parser.add_parser("mssql", help="own stuff using MSSQL", parents=[std_parser, module_parser]) mssql_parser.add_argument("-H", "--hash", metavar="HASH", dest="hash", nargs="+", default=[], help="NTLM hash(es) or file(s) containing NTLM hashes") mssql_parser.add_argument("--port", default=1433, type=int, metavar="PORT", help="MSSQL port (default: 1433)") - mssql_parser.add_argument("--mssql-timeout", help="SQL server connection timeout, default is %(default)s seconds", type=int, default=2) + mssql_parser.add_argument("--mssql-timeout", help="SQL server connection timeout, default is %(default)s seconds", type=int, default=5) mssql_parser.add_argument("-q", "--query", dest="mssql_query", metavar="QUERY", type=str, help="execute the specified query against the MSSQL DB") dgroup = mssql_parser.add_mutually_exclusive_group() From 8215eaa27a453703c5bd773c34cdd45e39c90b72 Mon Sep 17 00:00:00 2001 From: mpgn Date: Wed, 28 Feb 2024 22:48:54 +0100 Subject: [PATCH 55/56] Update connection.py Signed-off-by: mpgn --- nxc/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nxc/connection.py b/nxc/connection.py index cc2d68bb..7a70dea8 100755 --- a/nxc/connection.py +++ b/nxc/connection.py @@ -87,8 +87,8 @@ class connection: self.port = self.args.port self.conn = None self.admin_privs = False - self.password = "" - self.username = "" + self.password = None + self.username = None self.kerberos = bool(self.args.kerberos or self.args.use_kcache or self.args.aesKey) self.aesKey = None if not self.args.aesKey else self.args.aesKey[0] self.kdcHost = None if not self.args.kdcHost else self.args.kdcHost From d6f1ee25ed31c18c737db4f18b1decf1d8e2d615 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Tue, 12 Mar 2024 01:45:52 +0100 Subject: [PATCH 56/56] Update lock file --- poetry.lock | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index db8c35be..a5e35679 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1780,16 +1780,6 @@ tqdm = "*" unicrypto = ">=0.0.10,<=0.1.0" winacl = ">=0.1.7,<=0.2.0" -[[package]] -name = "pyreadline" -version = "2.1" -description = "A python implmementation of GNU readline." -optional = false -python-versions = "*" -files = [ - {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, -] - [[package]] name = "pyspnego" version = "0.10.2" @@ -2298,4 +2288,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "b1498f097759871b38b6ed64c9948316ed443b6814f5a736abaf5cf576cd4b78" +content-hash = "4e045412fc20caeb6239f12573928595853c81e558ed1a53d95a7ff0da39a427"