Esempio n. 1
0
def run_category(category_selected, subcategories={}, system_module=False):
    constant.module_to_exec_at_end = {
        "winapi": [],
        "dpapi": [],
    }
    modules = create_module_dic()
    categories = [category_selected] if category_selected != 'all' else get_categories()
    for category in categories:
        for r in run_modules(modules[category], subcategories, system_module):
            yield r

    if not system_module:
        if constant.is_current_user:
            # Modules using Windows API (CryptUnprotectData) can be called from the current session
            for module in constant.module_to_exec_at_end.get('winapi', []):
                for m in run_module(title=module['title'], module=module['module']):
                    yield m

            if constant.module_to_exec_at_end.get('dpapi', []):
                if are_masterkeys_retrieved():
                    for module in constant.module_to_exec_at_end.get('dpapi', []):
                        for m in run_module(title=module['title'], module=module['module']):
                            yield m
        else:
            if constant.module_to_exec_at_end.get('dpapi', []) or constant.module_to_exec_at_end.get('winapi', []):
                if are_masterkeys_retrieved():
                    # Execute winapi/dpapi modules - winapi decrypt blob using dpapi without calling CryptUnprotectData
                    for i in ['winapi', 'dpapi']:
                        for module in constant.module_to_exec_at_end.get(i, []):
                            for m in run_module(title=module['title'], module=module['module']):
                                yield m
Esempio n. 2
0
def run_category(category_selected, subcategories={}, system_module=False):
    constant.module_to_exec_at_end = {
        "winapi": [],
        "dpapi": [],
    }
    modules = create_module_dic()
    categories = [category_selected] if category_selected != 'all' else get_categories()
    for category in categories:
        for r in run_modules(modules[category], subcategories, system_module):
            yield r

    if not system_module:
        if constant.is_current_user:
            # Modules using Windows API (CryptUnprotectData) can be called from the current session
            for module in constant.module_to_exec_at_end.get('winapi', []):
                for m in run_module(title=module['title'], module=module['module']):
                    yield m

            if constant.module_to_exec_at_end.get('dpapi', []):
                if are_masterkeys_retrieved():
                    for module in constant.module_to_exec_at_end.get('dpapi', []):
                        for m in run_module(title=module['title'], module=module['module']):
                            yield m
        else:
            if constant.module_to_exec_at_end.get('dpapi', []) or constant.module_to_exec_at_end.get('winapi', []):
                if are_masterkeys_retrieved():
                    # Execute winapi/dpapi modules - winapi decrypt blob using dpapi without calling CryptUnprotectData
                    for i in ['winapi', 'dpapi']:
                        for module in constant.module_to_exec_at_end.get(i, []):
                            for m in run_module(title=module['title'], module=module['module']):
                                yield m
def Win32CryptUnprotectData(cipherText,
                            entropy=False,
                            is_current_user=True,
                            user_dpapi=False):
    if python_version == 2:
        cipherText = str(cipherText)

    decrypted = None

    if is_current_user:
        bufferIn = c_buffer(cipherText, len(cipherText))
        blobIn = DATA_BLOB(len(cipherText), bufferIn)
        blobOut = DATA_BLOB()

        if entropy:
            bufferEntropy = c_buffer(entropy, len(entropy))
            blobEntropy = DATA_BLOB(len(entropy), bufferEntropy)

            if CryptUnprotectData(byref(blobIn), None, byref(blobEntropy),
                                  None, None, 0, byref(blobOut)):
                decrypted = getData(blobOut)

        else:
            if CryptUnprotectData(byref(blobIn), None, None, None, None, 0,
                                  byref(blobOut)):
                decrypted = getData(blobOut)

    if not decrypted:
        can_decrypt = True
        if not (user_dpapi and user_dpapi.unlocked):
            from lazagne.config.dpapi_structure import are_masterkeys_retrieved
            can_decrypt = are_masterkeys_retrieved()

        if can_decrypt:
            try:
                decrypted = user_dpapi.decrypt_encrypted_blob(cipherText)
            except:
                # The encrypted blob cannot be parsed - weird (could happen with chrome v80)
                return None
            if decrypted is False:
                decrypted = None
        else:
            # raise ValueError('MasterKeys not found')
            pass

    if not decrypted:
        if not user_dpapi:
            # raise ValueError('DPApi unavailable')
            pass
        elif not user_dpapi.unlocked:
            # raise ValueError('DPApi locked')
            pass

    return decrypted