通过COM组件IFileOperation越权复制文件

本文介绍了一种利用COM组件IFileOperation在Windows 7至10系统中实现越权复制文件的方法,包括DLL注入、修改PEB结构及通过可信文件调用组件等三种实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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复制到下

实际测试:

运行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

实现了将复制到下

代码分析:

成功的前提是指定了该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中的,该属性能够通过Process Explorer查看,为了更具有欺骗性,可以选择将其修改

我在这里参考了UACME中的实现代码,地址如下:

https://github.com/hfiref0x/UACME/blob/143ead4db6b57a84478c9883023fbe5d64ac277b/Source/Akagi/sup.c#L947

我做了以下修改:

不使用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组件

代码参考地址:

https://github.com/FuzzySecurity/PowerShell-Suite/tree/master/Bypass-UAC/FileOperations/FileOperations

编译成功后生成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代码

注:

两种方式的比较在之前的文章《利用Assembly Load & LoadFile绕过Applocker的分析总结》有过介绍

方法3完整的实现代码可参考:

https://github.com/FuzzySecurity/PowerShell-Suite/blob/ebbb8991a8a051b48c05ce676524a1ba787dbf0c/Bypass-UAC/Bypass-UAC.ps1#L1082

实际测试:

执行powershell脚本,加载COM组件IFileOperation,由于powershell.exe为可信进程,所以不会弹出UAC的确认框,成功实现越权复制文件

0x06 利用分析

COM组件IFileOperation适用于Win7-Win10,所以越权复制的方法也是可用的

对于explorer.exe,加载高权限的COM组件不会弹出UAC的对话框。

本文已经实现了模拟explorer.exe的方法,那么是否有其他可用的COM组件呢?又能完成哪些“提权操作呢”?留在以后会慢慢介绍

0x07

本文介绍了通过COM组件IFileOperation越权复制文件的三种方法,整理并开发了实现代码,可用于直接测试

最后感谢Ruben Boonen(b33f@FuzzySecurity)在研究上对我的帮助

<think>好的,我现在要帮用户解析ColorOS文件管理器中文件复制的具体流程,特别是关于com.coloros.filemanager这个组件的实现。首先,我需要回忆一下用户提供的参考引用内容,这些可能涉及系统服务和Android组件相关的代码。 用户引用了三个来源,其中第一个提到coloros-services.jar中的ColorPackageInstallInterceptManager类,这可能涉及到安装拦截管理,但不确定是否直接相关。第二个引用指向AndroidManifest.xml中的某个定义,第三个是关于FileProvider的配置,这在处理文件URI和权限时很重要。 首先,文件复制在Android中通常涉及到几个步骤:选择源文件和目标路径,检查权限,执行IO操作,处理可能的覆盖或冲突,以及更新媒体库。对于系统应用如ColorOS的文件管理器,可能还会调用系统级API或使用自定义服务来优化操作。 用户提到的com.coloros.filemanager,这个包名可能对应的应用模块。我需要考虑该应用如何与其他系统服务交互。例如,在复制文件时,可能需要通过ContentProvider或者使用FileProvider来处理文件URI的分享,如引用3中的配置所示。FileProvider在这里的作用是安全地共享文件,通过声明authorities和指定路径映射。 接下来,复制流程可能涉及以下步骤: 1. 用户界面操作触发复制命令,获取源文件和目标路径。 2. 检查文件读写权限,包括Storage Access Framework(SAF)或通过Context.checkSelfPermission验证权限。 3. 使用Java的IO流或者NIO的Files.copy进行实际的文件复制。或者,可能使用系统级服务来执行高效的文件操作,比如调用MediaStore API或者使用Root权限(如果是系统应用可能有更高权限)。 4. 处理复制过程中的异常,如存储空间不足、文件正在使用等。 5. 复制完成后,发送广播通知MediaScanner扫描新文件,更新媒体库。 6. 用户界面反馈,如进度条更新或完成提示。 另外,ColorOS可能对原生的Android文件管理进行了定制,比如引用1中的ColorPackageInstallInterceptManager可能与安装包管理相关,可能在复制APK文件时有特殊处理,但一般文件复制可能不涉及这个类。需要确认该拦截管理器是否在文件操作流程中被调用。 此外,文件路径的处理可能需要参考file_paths.xml中定义的可访问目录,如引用3中的@xml/file_paths,这可能限制了文件复制的目标位置,确保应用遵循沙箱规则。 可能还需要查看FileManagerService相关的代码,如果有的话,该类可能负责协调文件操作。但具体到ColorOS的实现,可能需要查阅其内部代码结构,比如在coloros-services.jar中是否有FileOperationService之类的服务。 关于权限,由于文件管理器是系统应用,可能拥有更高的权限,比如直接访问外部存储而无需用户授权,或者通过特权权限声明在AndroidManifest.xml中。 最后,用户可能需要了解复制流程中是否涉及多线程或异步任务,以避免阻塞主线程,提升用户体验。比如使用AsyncTask或者IntentService来处理耗时的IO操作。 总结下来,解析流程需要结合Android标准文件操作机制和ColorOS的定制部分,包括权限管理、文件操作API的使用、系统服务交互以及UI更新机制。</think>### ColorOS文件管理器文件复制流程解析 1. **用户操作触发** 用户选择文件并触发复制操作后,`com.coloros.filemanager`会通过`Intent`或界面事件捕获源文件路径和目标路径。此时会验证存储权限(如`Manifest.permission.WRITE_EXTERNAL_STORAGE`),若未授权则请求动态权限[^3]。 2. **权限与路径检查** - 系统通过`FileProvider`声明安全访问路径,如引用3中的`androidx.core.content.FileProvider`配置,限制可访问的目录。 - 检查目标路径是否在`file_paths.xml`定义的合法范围内,避免越权访问。 3. **执行文件复制** - **低层级IO操作**:通常使用`java.nio.file.Files.copy()`或自定义的`FileUtils.copy()`方法实现数据流传输。 - **系统服务调用**:若涉及系统级优化(如大文件加速),可能调用`ColorPackageInstallInterceptManager`中的方法(需结合引用1的代码逻辑)[^1]。 4. **异常处理与进度反馈** - 捕获`IOException`等异常(如存储空间不足、文件被占用)。 - 通过`Handler`或`LiveData`更新UI进度条。 5. **媒体库更新** 复制完成后,发送广播通知`MediaScannerConnection`扫描新文件: ```java Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(Uri.fromFile(targetFile)); context.sendBroadcast(mediaScanIntent); ``` 6. **日志与权限回收** - 记录操作日志(如复制耗时、文件大小)。 - 若临时授予URI权限(通过`grantUriPermissions`),操作完成后需调用`revokeUriPermission()`回收。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值