Windows权限维持_右键维权

记录下windows右键维权实现的学习

Posted by Ga0weI on February 13, 2025

0x01 背景

最近做一个应急的时候发现一个通过 右键文件、文件夹弹出菜单来维权的操作。于是系统的学习了下,并且分析如何排查。

0x02 右键维权原理

目前看到互联网上通过右键维权的实现方式大致分为两类:

1、劫持一些第三方软件的右键菜单实现,当用户正常使用的时候触发的任意代码执行操作;

2、自拟一个windows shell拓展,实现右键菜单拓展功能, 用户右键的时候触发菜单的初始化从而触发任意代码执行。

1、劫持第三方软件已经做好的右键菜单

一般来说windows右键菜单分为三种情况:

(1、右键空白

(2、右键文件夹

(3、右键文件

如下使右键文件位置弹出的菜单:

image-20250211152938781

第三方软件是通过注册自己的com组件到系统中(简单说就是开发一个windows shell 拓展的右键菜单拓展的com组件,然后为其在对应位置创建注册表键值),从而实现将其运行方式添加到右键菜单中;如上面的ExE info PE scan

在如下的注册表位置能找到对应的注册项,其中*表示任意后缀的文件:

1
2
3
计算机\HKEY_CLASSES_ROOT\*\shell                         任意文件右键
计算机\HKEY_CLASSES_ROOT\Directory\Background\shell		背景右键
计算机\HKEY_CLASSES_ROOT\Directory\shell					目录右键

如下可以看到对应上图菜单里面的内容:

pescan:这个是在shell下,直接通过右键运行对应的命令;

image-20250211160122084

Notepad++:这个是在shellex下(shell 拓展下),是需要实现shell拓展的com组件;

image-20250211160146733

image-20250212103535324

还有我们更为常见的比如:7-zip,这种也是更适合被攻击者利用的;

image-20250211160600480

image-20250211160628574

根据CLSID找到对应的com组件({23170F69-40C1-278A-1000-000100020000}),也就是说7zip.dll是7zip为explorer.exe 提供的实现了右键菜单shell拓展的com组件。

image-20250211160742408

攻击者这里的思路是将计就计,利用这个第三方的com组件,对第三方com组件7-zip.dll进行代理劫持,即实现一个自己的假的7zip.dll,原始功能都代理转发到真的7zip.dll即可;然后再假dll 的dllmain方法处或者再一些函数的入口处嵌入我们的恶意代码用于维权的逻辑即可。

对于代理劫持的技术实现此文就不做赘述,详情可以参考:

https://minhangxiaohui.github.io/2024/07/26/%E5%BF%86%E5%BE%80%E6%98%94_%E8%AE%B0%E4%B8%80%E6%AC%A1-%E7%99%BD%E5%8A%A0%E9%BB%91dll%E5%8A%AB%E6%8C%81+%E5%9F%9F%E5%90%8D%E5%89%8D%E7%BD%AE-%E6%A0%B7%E6%9C%AC%E5%88%86%E6%9E%90/

一文中的第7章节。

为什么说这类更适合被攻击者利用呢?

1、7zip这种解压软件,右键菜单调用 一般用户会经常使用。

2、这里是劫持的的是dll,dll没有签名(目前来说很多软件都是这样,只对exe签名,但是依赖的dll不做签名或者签名校验不完善,7zip就是这样);直观的从注册表里面的键值是没有办法判断是否有问题的;并且即使使用进程排查工具,也会导致排查的人不能直观的排查出是否被劫持了,因为不管是否被劫持,你看到的都是一个没有签名的dll文件被加载到的了explorer进程。

2、自实现一个右键菜单的shell拓展com组件

通过自定义重新实现shell拓展功能的com组件,然后让explorer.exe来调用;其实就是自己实现一个第三方的要做的com组件。

自己实现一个com组件基本上就是,实现自定义类,然后继承某些接口,一一实现这些接口的所有虚函数,然后实现组件的注册即可。

这里我们参考如下项目代码,开发对应dll,并注册进行测试:

https://github.com/RistBS/ContextMenuHijack

整体代码的话就是shell拓展开发,几大功能块

1、自定义的功能类要实现IUnknown(com接口的基础类) 、IShellExtInit(shell拓展的必须的)和IContextMenuj(这个是右键菜单必须的)接口

2、创建com对象实例需要类工厂IClassFactory 接口;

3、com组件在windows系统的注册和注销;

4、dllmain 逻辑。

对应到上述的项目里面:

1
2
3
4
5
ClassFactory.cpp就是第二部分;
dllmain.cpp就是第四部分;
ContextMenuHiJack就是第一部分;
Reg.cpp就是第三部分。

在FileContextMenuExt.cpp 代码中,我们可以看到FileContentMenuExt这个实现类继承IShellExtInit (shell拓展的初始化的核心接口,右键的时候explorer初始化自定义菜单会调用这个接口的初始化函数Initialize方法)和 IContextMenuj(IContextMenu 是定义管理菜单扩展功能的核心接口)的类, 实现IShellExtInit 的虚函数Initialize中调用CreateThread方法,创建线程调用恶意函数InjectShc;恶意函数中就是常规申请内存空间做shellcode加载;这里我们测试的时候把shellcode加载逻辑改成弹窗逻辑即可;

image-20250211192243035

image-20250211192227021

然后编译生成x64的dll,并利用regsvr32进行测试:

image-20250211192539011

然后右键文件或文件夹,我们会发现都会产生弹窗:

image-20250211192657483

0x03 排查

1、排查第一种维权

对于第一种通过劫持第三方实现的权限维持,我们需要去如下三个注册表(右键菜单相关)中是否存在可疑的执行路径文件,如果遇到没有签名的dll文件,就需要看下是否存在劫持的情况,具体可以通过查看其导入和导出函数来看,如果导入函数和导出函数都很多且一一对应,那么基本就是代理劫持的dll;

1
2
3
计算机\HKEY_CLASSES_ROOT\*\shell                         任意文件右键
计算机\HKEY_CLASSES_ROOT\Directory\Background\shell		背景右键
计算机\HKEY_CLASSES_ROOT\Directory\shell					目录右键

如下是一个正常实现了windows shell拓展的com组件dll的导出表:

image-20250212102620572

如果dll的导入表里面也出现了上面函数,那就是被劫持,代理转发到其他dll了。

2、排查第二种维权

对于第二种的劫持方法,我们可以从结果入手,一旦右键,触发了对于的恶意代码,那么explorer.exe里面就会加载到对应的恶意dll文件。我们就可以通过火绒见类似的工具开展加载的模块排查,如下:对发现explorer进程中发现未知文件一一排查即可;如果非常多的话,简单粗暴的快速过滤:可以直接丢情报平台,像7zip这种肯定有记录,没有记录基本就是有问题。

image-20250211200004819

0x04 思考

是否可以升级下第一种方法,也就是通过代码注入的方式hook第三方的shel拓展com组件对应dll中实现类 中的IShellExtInit接口的Initialize方法,来实现劫持,这样就不用修改文件了;

这里笔者思考之后是不行,因为Initialize没有被导出;windows 在调用的时候,客户端先是通过调用厂类的CoCreateInstance方法,然后调用DllGetClassObject函数来获取类厂指针的,然后通过执行创建对象,然后调用对象的Initialize方法,所以这里我们直接hook的话不好找到Initialize方法在哪;

调用流程参考:https://gh0st.cn/Binary-Learning/COM%E7%BB%84%E4%BB%B6.html

image-20250212153601076