From 1f5ded829973da7ace7707f563edd968fae883fa Mon Sep 17 00:00:00 2001 From: robert-todora Date: Wed, 21 Jun 2023 14:16:07 -0400 Subject: [PATCH] added some files with "skeleton" code --- snaffcore/active_directory/ad_data.py | 77 +++++++++++++++++++ .../active_directory/directory_search.py | 48 ++++++++++++ .../active_directory/ldap/directory_search.py | 50 ++++++++++++ snaffler.py | 1 + 4 files changed, 176 insertions(+) create mode 100644 snaffcore/active_directory/ad_data.py create mode 100644 snaffcore/active_directory/directory_search.py create mode 100644 snaffcore/active_directory/ldap/directory_search.py diff --git a/snaffcore/active_directory/ad_data.py b/snaffcore/active_directory/ad_data.py new file mode 100644 index 0000000..bbd17ce --- /dev/null +++ b/snaffcore/active_directory/ad_data.py @@ -0,0 +1,77 @@ +from queue import Queue +from enum import Flag + + +class AdData: + def __init__(self): + self.domain_computers = [] + self.domain_users = [] + self.dfs_shares_dict = {} + self.dfs_namespace_paths = [] + self.current_domain = None + self.domain_name = "" + self.target_domain = "" + self.target_dc = "" + self.target_domain_netbios_name = "" + self.directory_search = None + self.mq = Queue() + + self.DirectoryContext = None + self.DomainControllers = [] + + def get_domain_computers(self): + return self.domain_computers + + def get_domain_users(self): + return self.domain_users + + def get_dfs_shares_dict(self): + return self.dfs_shares_dict + + def get_dfs_namespace_paths(self): + return self.dfs_namespace_paths + + def get_directory_search(self): + if self.directory_search is None: + # set_directory_search() + pass + return self.directory_search + + def get_netbios_domain_name(self): + return + + def set_directory_search(self): + pass + + def set_dfs_path(self): + pass + + def set_domain_computers(self): + pass + + def set_domain_users(self): + pass + + class UserAccountControlFlags(Flag): + Script = 0x1 + AccountDisabled = 0x2 + HomeDirectoryRequired = 0x8 + AccountLockedOut = 0x10 + PasswordNotRequired = 0x20 + PasswordCannotChange = 0x40 + EncryptedTextPasswordAllowed = 0x80 + TempDuplicateAccount = 0x100 + NormalAccount = 0x200 + InterDomainTrustAccount = 0x800 + WorkstationTrustAccount = 0x1000 + ServerTrustAccount = 0x2000 + PasswordDoesNotExpire = 0x10000 + MnsLogonAccount = 0x20000 + SmartCardRequired = 0x40000 + TrustedForDelegation = 0x80000 + AccountNotDelegated = 0x100000 + UseDesKeyOnly = 0x200000 + DontRequirePreauth = 0x400000 + PasswordExpired = 0x800000 + TrustedToAuthenticateForDelegation = 0x1000000 + NoAuthDataRequired = 0x2000000 diff --git a/snaffcore/active_directory/directory_search.py b/snaffcore/active_directory/directory_search.py new file mode 100644 index 0000000..ca4230e --- /dev/null +++ b/snaffcore/active_directory/directory_search.py @@ -0,0 +1,48 @@ +# import queue +# import ldap3 + + +class DirectorySearch: + def __init__(self, domain_controller, domain_name, ldap_username, ldap_password, ldap_port, secure_ldap, is_falted): + self.domain_controller = domain_controller + self.domain_name = domain_name + self.base_ldap_path = "DC=" + self.domain_name.replace(".", ",DC=") + # TODO: figure out the active directory library equivalent for python + self.domain = None + self.ldap_username = ldap_username + self.ldap_password: ldap_password + self.ldap_port = ldap_port + self.secure_ldap = secure_ldap + self.is_falted = is_falted + self.connection_pool = [] + self.domain_guid_map = {} + + def get_domain_name(self): + if self.domain_name is None: + return + return self.domain_name + + async def get_one(self): + return + + # https://ldap3.readthedocs.io/en/latest/tutorial_searches.html + def query_ldap(self): + return + + def ranged_retrieval_async(self): + return + + def get_attribute_from_guid(self, guid: str, name: str): + return self.domain_guid_map.get(guid, name) + + def set_domain_name(self): + return + + def get_global_catalog_connection(self): + return + + def get_ldap_connection(self): + return + + def create_search_request(self): + return diff --git a/snaffcore/active_directory/ldap/directory_search.py b/snaffcore/active_directory/ldap/directory_search.py new file mode 100644 index 0000000..7a814a8 --- /dev/null +++ b/snaffcore/active_directory/ldap/directory_search.py @@ -0,0 +1,50 @@ +# import queue +import ldap3 + + +class DirectorySearch: + def __init__(self, domain_controller, domain_name, ldap_username, ldap_password, ldap_port, secure_ldap, is_falted): + self.domain_controller = domain_controller + self.domain_name = domain_name + self.base_ldap_path = "DC=" + self.domain_name.replace(".", ",DC=") + # TODO: figure out the active directory library equivalent for python + self.domain = None + self.ldap_username = ldap_username + self.ldap_password: ldap_password + self.ldap_port = ldap_port + self.secure_ldap = secure_ldap + self.is_falted = is_falted + self.connection_pool = [] + self.domain_guid_map = {} + + def get_domain_name(self): + if self.domain_name is None: + return + return self.domain_name + + async def get_one(self): + return + + # https://ldap3.readthedocs.io/en/latest/tutorial_searches.html + def query_ldap(self): + return + + def ranged_retrieval_async(self): + return + + def get_attribute_from_guid(self, guid: str, name: str): + return self.domain_guid_map.get(guid, name) + + def set_domain_name(self): + return + + def get_global_catalog_connection(self): + return + + def get_ldap_conenction(self): + return + + def create_search_request(self): + return + + diff --git a/snaffler.py b/snaffler.py index 32c2f1d..9116a90 100644 --- a/snaffler.py +++ b/snaffler.py @@ -2,5 +2,6 @@ def main(): print("I snaffled 'til the snafflin was done") +# TODO: Create SnaffleRunner class with equivalent functions and call the Run() method here. if __name__ == '__main__': main()