剪切板注入

简介

利用剪切板实现进程注入是一种隐蔽的技术,它通过模拟Windows的Component Object Model (COM)接口来执行恶意代码。在这种方法中,攻击者首先选择一个目标进程,该进程具有与剪切板相关的窗口。接着,攻击者创建一个伪造的IUnknown COM接口,并将其Release方法指向恶意的shellcode。当目标进程尝试释放与剪切板相关的资源时,它会调用这个伪造接口的Release方法,从而触发并执行恶意代码。这种技术的巧妙之处在于它利用了Windows的正常功能和行为,从而在不引起任何可疑活动的情况下执行代码

实现流程

1.定义IUknown_t结构

首先定义了一个IUknown_t结构,用于模拟COM对象的IUnknown接口,其中的Release方法将在WM_DESTROYCLIPBOARD消息被处理时执行,这也为后续的shellcode执行埋下伏笔

typedef struct _IUnknown_t {
    // a pointer to virtual function table
    ULONG_PTR lpVtbl;
    // the virtual function table
    ULONG_PTR QueryInterface;
    ULONG_PTR AddRef;
    ULONG_PTR Release;       // executed for WM_DESTROYCLIPBOARD
} IUnknown_t;

2.查找目标窗口并获取其PID

使用FindWindowsExA函数遍历所有具有CLIPBRDWNDCLASS类名的窗口,并打印与其关联的进程PID

3.将IUnknown结构的Release方法指向shellcode

初始化IUnknown结构,其中Release方法指向写入的shellcode。然后将此结构写入目标进程的内存中

4.触发Release方法执行shellcode

使用USER32$SetPropA函数将IUnknown结构设置为目标窗口的属性,随后发送WM_DESTROYCLIPBOARD消息到目标窗口,这将导致Release方法被执行(即执行shellcode)

BOF代码实现

以下代码源自TrustSec的Bof仓库:https://github.com/trustedsec/CS-Remote-OPs-BOF/tree/main

运行演示

首次执行该项目你可能会执行失败,因为你挑选要注入的进程不一定与CLIPBRDWNDCLASS窗口类有关联,但是它接下来会打印能够利用剪切板实现进程注入的Pid

image-20230917202939067

以下是对Explorer进程的注入,其Pid是4716,即上述打印出来的

image-20230917170306302

最后更新于