通过 COM 组件 IFileOperation 越权复制文件
0x00 前言
在之前的文章 《Empire 中的 Invoke-WScriptBypassUAC 利用分析》 曾介绍过一个越权复制文件的方法,在普通用户的权限下,利用 wusa 能够将 cab 文件释放至管理员权限的文件夹,进一步可以实现文件名劫持和 UAC 绕过。
但该功能在 Win10 下被取消,那么有没有更为通用的方法呢?
本文将要介绍一个适用于 Win7-Win10 的方法——利用 COM 组件 IFileOperation
0x01 简介
- 利用原理
- 三种实现思路
- 实例代码
- 实际测试
- 利用分析
0x02 利用原理
注: 该方法学习自 Defcon 25 中的 workshop,Ruben Boonen 《UAC 0day, all day!》
ppt 下载地址: https://github.com/FuzzySecurity/DefCon25/blob/master/DefCon25_UAC-0day-All-Day_v1.2.pdf
利用 COM 组件 IFileOperation 越权复制文件的前提:
- Win7 以后的系统
- 可信路径下的可信文件(例如 explorer.exe,powershell.exe)
所以有以下三种实现思路:
1、dll 劫持或是 dll 注入
由于可信路径下的可信文件一般都是在需要管理员权限的路径下,所以普通用户权限下基本无法实现 dll 劫持
可行的方法是 dll 注入
例如 explorer.exe,在普通用户权限就可以对其进行 dll 注入
2、修改 PEB 结构,欺骗 PSAPI,调用 COM 组件 IFileOperation
COM 组件通过 Process Status API (PSAPI) 读取进程 PEB 结构中的 Commandline 来识别它们正在运行的进程
如果将进程的 Path 改成可信文件(如 explorer.exe),就能够欺骗 PSAPI,调用 COM 组件 IFileOperation 实现越权复制
3、通过可信文件直接调用 COM 组件 IFileOperation
例如 powershell.exe 为可信文件,并且能够直接调用 COM 组件 IFileOperation
0x03 实现方法 1:dll 注入 explorer.exe
具体实现分为如下两段:
- 将 dll 注入到进程 explorer.exe
- dll 实现调用 COM 组件 IFileOperation 复制文件
github 已经有一个完整的实现代码,因此可以参考该工程对其分析,工程地址: https://github.com/hjc4869/UacBypass
(1) 工程 UacBypassTest 实现了 dll 注入到进程 explorer.exe
去掉不必要的功能,只保留将 UacBypass.dll 注入到进程 explorer.exe 的功能:
删除 Line 58 即可
(2) 工程 UacBypass 实现了调用 COM 组件 IFileOperation 复制文件
该工程编译后生成文件 UacBypass.dll,实现了将同级目录下的 ntwdblib.dll 复制到 C:\windows\System32
下
实际测试:
运行 UacBypassTest.exe,将 UacBypass.dll 注入到进程 explorer.exe,成功实现越权文件复制
0x04 实现方法 2:修改 PEB 结构,欺骗 PSAPI,调用 COM 组件 IFileOperation
参考工程 UacBypass,将 dll 转为 exe,添加头文件,修复 bug,可供参考的完整代码: https://github.com/3gstudent/Use-COM-objects-to-bypass-UAC/blob/master/IFileOperation.cpp
实现了将 c:\6\ntwdblib.dll
复制到 c:\windows\system32
下
代码分析:
成功的前提是指定了该 COM 组件的属性(需要提升权限)
官方文档地址: https://msdn.microsoft.com/en-us/library/bb775799.aspx
代码位置: https://github.com/3gstudent/Use-COM-objects-to-bypass-UAC/blob/master/IFileOperation.cpp#L14
属性说明:
- FOF_NOCONFIRMATION :不弹出确认框
- FOF_SILENT:不弹框
- FOFX_SHOWELEVATIONPROMPT:需要提升权限
- FOFX_NOCOPYHOOKS:不使用 copy hooks
- FOFX_REQUIREELEVATION:默认需要提升权限
- FOF_NOERRORUI:报错不弹框
实际测试:
直接运行 exe,会弹出 UAC 的确认框,提示权限不够,如果选择允许,能够实现文件复制
接下来需要添加修改 PEB 结构的功能,为了欺骗 PSAPI,共需要修改以下位置:
- _RTL_USER_PROCESS_PARAMETERS 中的 ImagePathName
- _LDR_DATA_TABLE_ENTRY 中的 FullDllName
- _LDR_DATA_TABLE_ENTRY 中的 BaseDllName
注: 不需要修改_RTL_USER_PROCESS_PARAMETERS 中的 CommandLine
,该属性能够通过 Process Explorer 查看,为了更具有欺骗性,可以选择将其修改
我在这里参考了 UACME 中 supMasqueradeProcess()
的实现代码,地址如下: https://github.com/hfiref0x/UACME/blob/143ead4db6b57a84478c9883023fbe5d64ac277b/Source/Akagi/sup.c
我做了以下修改:
- 不使用 ntdll.lib 文件(安装 DDK 后包含),改为通过 ntdll 获得 NTAPI
- 提取关键代码
- 修复 bug
- 添加调用 COM 组件 IFileOperation 复制文件的功能
更多细节可参考开源的代码,地址如下:https://github.com/3gstudent/Use-COM-objects-to-bypass-UAC/blob/master/MasqueradePEB.cpp
代码实现了修改当前进程的 PEB 结构,欺骗 PSAPI,将其识别为 explorer.exe,接着调用 COM 组件 IFileOperation 实现文件复制
实际测试:
当前进程被修改为 explorer.exe,如下图
文件复制成功,并且没有弹出 UAC 的确认框,实现了越权复制文件
0x05 实现方法 3:通过 powershell.exe 调用 COM 组件 IFileOperation
先通过 c#编译一个 COM 组件实现调用 COM 组件 IFileOperation 复制文件,接着通过 powershell 来调用这个 COM 组件
1、编写 COM 组件
编译成功后生成 FileOperation.dll
注:Ruben Boonen(b33f@FuzzySecurity) 参考的源工程:https://github.com/mlaily/MSDNMagazine2007-.NET-Matters-IFileOperation-in-Windows-Vista
他在此基础上做了修改(修改类名等),使得 powershell 能够直接调用 COM 组件,这个功能很棒
2、通过 powershell 来调用这个 COM 组件
有以下两种方式:
(1) [System.Reflection.Assembly]::LoadFile($Path)
直接加载文件
(2) [Reflection.Assembly]::Load($bytes)
将文件压缩为字符串保存在数组中,可参考 Matthew Graeber 的方法,地址如下:http://www.exploit-monday.com/2012/12/in-memory-dll-loading.html
能够直接输出可供使用的 powershell 代码
方法 3 完整的实现代码可参考:https://github.com/FuzzySecurity/PowerShell-Suite/blob/ebbb8991a8a051b48c05ce676524a1ba787dbf0c/Bypass-UAC/Bypass-UAC.ps1
实际测试:
执行 powershell 脚本,加载 COM 组件 IFileOperation,由于 powershell.exe 为可信进程,所以不会弹出 UAC 的确认框,成功实现越权复制文件
0x06 利用分析
COM 组件 IFileOperation 适用于 Win7-Win10,所以越权复制的方法也是可用的
对于 explorer.exe,加载高权限的 COM 组件不会弹出 UAC 的对话框。
本文已经实现了模拟 explorer.exe 的方法,那么是否有其他可用的 COM 组件呢?又能完成哪些“提权操作呢”?
0x07 小结
本文介绍了通过 COM 组件 IFileOperation 越权复制文件的三种方法,整理并开发了实现代码,可用于直接测试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论