DLL劫持、COM劫持、Bypass UAC
DLL劫持
DLL劫持原理
- 研究目标:找到一个程序经常调用的、合法的DLL文件(比如
version.dll、dinput8.dll)。 - 制作恶意DLL:创建一个同名(例如也叫
version.dll)的恶意DLL文件。 - 放置陷阱:将这个恶意DLL文件放在一个比系统目录更优先被搜索的位置,最常见的就是程序的安装目录或当前工作目录。
- 诱骗执行:当用户运行这个程序时,程序会首先在自己的目录下寻找DLL,于是找到了恶意DLL并加载它,而不是去系统目录加载那个正确的、安全的DLL。
DLL寻找过程
- 程序所在目录
- 系统目录即SYSTEM32目录
- 16位系统目录即SYSTEM目录
- Windows目录
- 加载DLL时所在的当前目录
- PATH环境变量中列出的目录
COM劫持
COM组件
COM组件 是一个遵循COM规范编写的、预编译好的二进制代码块(通常是一个 .dll 或 .exe 文件),它包含了一个或多个COM对象的实现,并通过接口向外提供服务。
COM组件的形态与创建
1. 物理形态
一个COM组件通常以两种形式存在:
- 动态链接库:这是最常见的形式。多个应用程序可以共享同一个DLL组件,节省资源。
- 优点:共享、节省内存。
- 缺点:与调用者在同一进程,若组件崩溃可能拖垮整个进程。
- 可执行文件:作为一个独立的进程运行。
- 优点:进程隔离,稳定性高,一个组件崩溃不影响调用者。
- 缺点:进程间通信开销大,效率较低。
2. 身份标识:GUID
在COM的世界里,每个组件、每个接口都有一个全球唯一的身份证,称为 GUID。
- CLSID:类ID,用于唯一标识一个COM组件(类)。当你想创建一个组件时,你必须通过它的CLSID来告诉系统“我要哪个组件”。
- IID:接口ID,用于唯一标识一个接口。当你想使用组件的某个功能时,你必须通过IID来查询“你是否支持这个接口”。
系统通过注册表 来维护一个数据库,将CLSID映射到实际的DLL或EXE文件路径。这样,当客户端请求某个CLSID时,系统才知道该去加载哪个文件。
劫持原理
当进程寻找COM组件时,首先会寻找:
HKCU\Software\Classes\CLSID
我们直接在CLSID下新建一个对象ID,就能够劫持某个进程或多个进程。
与DLL劫持原理相近,但是COM组件的劫持可以拓展很多东西,劫持的目标不一定是一个进程,劫持所需的文件不一定是一个DLL,它可以是一个.com文件、二进制PE文件、DLL文件,劫持的目标也可以是一个Windows API。
CLSID
全局唯一标识符
CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分。
- 按下Ctrl+R打开运行窗口,键入::{20D04FE0-3AEA-1069-A2D8-08002B30309D}即可打开“我的电脑
- ::{645FF040-5081-101B-9F08-00AA002F954E}回收站
UAC ByPass
用户帐户控制(User Account Control,简写作UAC)是微软公司在其WindowsVista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。
UAC需要授权的动作包括
- 配置Windows Update
- 增加或删除用户账户
- 改变用户的账户类型
- 改变UAC设置
- 安装ActiveX
- 安装或移除程序
- 安装设备驱动程序
- 设置家长控制
- 将文件移动或复制到Program Files或
- Windows目录
- 查看其他用户文件夹
UAC Bypass的常见技术原理与方式
以下是几种典型且常见的UAC绕过技术原理:
1. 基于白名单程序的自动提升(最经典)
这是最早被广泛利用的一类方法。
具有autoElevate属性True的应用程序会在启动时自动提升权限,而这些应用程序往往都具备微软的签名,微软
认为它是可信的。故此,在该程序启动时,将会以管理员身份启动
- 原理:微软为了用户体验,将一些Windows自带的、被认为是绝对安全的程序(如
slui.exe,fodhelper.exe,eventvwr.msc等)加入了“白名单”。当这些程序启动时,如果当前用户是管理员,操作系统会自动授予它们管理员权限,而不会触发UAC弹窗。 - 攻击手法:
- 发现目标:攻击者找到一个这样的白名单程序(例如
fodhelper.exe)。 - 劫持执行流:这个程序在运行过程中,会去加载一些DLL或读取一些注册表键值。攻击者发现这些位置是用户可写的(例如
HKCU\Software\Classes下的某些键)。 - 放置陷阱:攻击者提前修改这些可写的注册表项,将其指向恶意的DLL或可执行文件。
- 触发执行:攻击者直接运行这个白名单程序(如
fodhelper.exe)。系统自动将其提升为管理员权限,而该程序在运行过程中,会毫无防备地去加载被篡改的注册表项所指向的恶意负载。 - 结果:恶意负载作为高权限进程的子进程或加载的模块,成功以管理员身份运行,绕过了UAC提示。
- 发现目标:攻击者找到一个这样的白名单程序(例如
2. DLL劫持(与白名单结合)
- 原理:在白名单程序启动并自动提升权限后,它可能会尝试加载一些DLL。利用Windows的DLL搜索顺序漏洞,攻击者可以将一个恶意的DLL放在比合法系统DLL更优先被搜索的位置(如程序当前目录)。
- 攻击手法:与上述方法结合,当白名单程序启动后,它首先加载了恶意DLL,从而执行了攻击者的代码。
3. 利用COM接口提升
- 原理:Windows中存在一些高权限的COM组件(例如
IARPUninstallStringLauncher)。这些组件运行在提升的上下文中。COM组件通过注册表HKCU\Software\Classes\CLSID声明。 - 攻击手法:
- 攻击者发现某个高权限COM组件的注册表项是用户可写的。
- 他们可以篡改该COM组件的
InProcServer或LocalServer等键值,将其指向恶意的DLL或EXE。 - 当有程序(甚至是普通权限程序)实例化这个COM组件时,系统会直接以管理员权限启动被篡改的恶意负载。
4. 文件/路径欺骗
- 原理:利用Windows处理文件名和路径时的一些特性。
.IFILE操作:早期通过创建一个特殊名称的文件(如test.exe .),可以欺骗一些文件操作对话框以高权限运行。- 磁盘空间不足:在某些老版本系统中,如果系统盘空间不足,一个名为
wsqmcons.exe的文件会被自动以高权限运行来处理日志。攻击者可以伪造磁盘空间不足的情况并放置恶意文件。 - DLL搜索顺序劫持:如前所述,利用程序加载DLL时的搜索顺序缺陷。
5. 基于服务的提升
- 原理:有些服务在安装或配置时,其二进制路径指向用户可写的位置。攻击者可以替换该二进制文件,然后重启服务或等待系统重启,服务就会以SYSTEM权限运行恶意代码。虽然这更多是权限提升,但与UAC思想类似,都是滥用信任关系。
UAC Bypass演示
使用的程序:fodhelper.exe
程序路径:C:\Windows\system32\fodhelper.exe
注册表项(REG):HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command
使用以下语句可以实现打开fodhelper.exe时,弹出cmd并且已经具有管理员权限
1 | reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f |
/d:指定要存储的数据
/f:强制覆盖
/v:查找特定值
/t:指定数据类型(REG_DWORD:32位数字)
UAC ByPass寻找工具
1 | strings.exe -s *.exe| findstr /i autoelevate |
autoelevate:自动权限提升标志
注意:最好将string.exe放入C:\Windows\System32