CHQ1d 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在之前的文章《Empire中的Invoke-WScriptBypassUAC利用分析》中,介绍了一种超越权限复制文件的方法。在普通用户权限下,wusa可以将cab文件释放到具有管理员权限的文件夹中,可以进一步实现文件名劫持和UAC绕过。 但是Win10下取消了这个功能,那么有没有更通用的方法呢? 本文将介绍一种适用于Win7-Win10的方法——。它使用COM组件IFileOperation。 0x01 简介 利用原则 三种实现理念 实例代码 实物试验 利用率分析 0x02 利用原理 注: 这种方法是从Defcon 25的车间学来的,Ruben Boonen 《UAC 0day, all day!》。 ppt下载地址: https://github . com/fuzzy security/defcon 25/blob/master/defcon 25 _ UAC-0日-全天_v1.2.pdf 使用IFileOperation这种COM组件超越权限复制文件的前提; Win7之后的系统 可信路径下的可信文件(例如explorer.exe、powershell.exe) 所以有以下三种实现方式: 1、dll劫持或是dll注入 因为可信路径下的可信文件一般都在需要管理员权限的路径下,所以在普通用户权限下基本不可能实现dll劫持。 可行的方法是dll注入。 例如,explorer.exe可以在普通用户权限下被注入dll。 2、修改PEB结构,欺骗PSAPI,调用COM组件IFileOperation COM组件通过进程状态API (PSAPI)读取进程PEB结构中的命令行,以标识它们正在运行的进程。 如果把进程的路径改成可信文件(比如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。 去掉不必要的函数,只保留向process explorer.exe注入UacBypass.dll的函数: 删除第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/3g student/Use-COM-objects-to-bypass-UAC/blob/master/ifile operation . CPP 已实现将c:\ 6 \ ntwdlib.dll复制到c:\windows\system32。 代码分析: 成功的前提是指定了该COM组件的属性(需要提升权限)。 官方文件地址: https://msdn.microsoft.com/en-us/library/bb775799.aspx 代码位置: https://github . COM/3g student/Use-COM-objects-to-bypass-UAC/blob/master/ifileoperation . CPP # L14 属性描述: FOF_NOCONFIRMATION:不会弹出确认框。 FOF _无声:不要弹盒子。 FOFX_SHOWELEVATIONPROMPT:需要提升的权限。 FOFX_NOCOPYHOOKS:不要使用复制挂钩 FOFX_REQUIREELEVATION:默认情况下,需要特权提升。 F _ no error UI:报错不要弹出框。 实际测试: 直接运行exe,会弹出UAC的确认框,提示权限不够。如果选择允许,您可以复制文件。 接下来,您需要添加修改PEB结构的功能。为了欺骗PSAPI,需要修改以下位置: RTL用户流程参数中的图像路径名 LDR数据表格条目中的完整名称 LDR数据表格条目中的基本名称 注: 不需要修改_ RTL _用户_流程_参数中的命令行。这个属性可以通过Process Explorer查看,你也可以选择修改它,进行更多的欺骗。 我参考的是UACME中supMasqueradeProcess()的实现代码,地址如下: https://github . com/hfiref0x/UAC me/blob/143 EAD 4 db 6b 57 a 84478 c 9883023 FBE 5d 64 AC 277 b/Source/Akagi/sup . c # L947 我做了以下更改: 不要使用ntdll.lib文件(安装DDK后包含),而是通过ntdll获取NTAPI。 提取关键代码 修复bug 通过调用COM组件的IFileOperation增加复制文件的功能。 … 有关更多详细信息,请参考位于以下地址的开放源代码: https://github . COM/3g student/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/fuzzy security/PowerShell-Suite/tree/master/Bypass-UAC/文件操作/文件操作 编译成功后生成FileOperation.dll。 注: Ruben Boonen(b33f@FuzzySecurity)引用源项目: https://github.com/mlaily/MSDNMagazine2007-.NET-Matters-ifileo-in-Windows-Vista 在此基础上,他做了一些修改(修改类名等。)这样powershell就可以直接调用COM组件了,这是一个很棒的功能。 2、通过powershell来调用这个COM组件 有两种方法: (1)[系统。reflection . Assembly]:LoadFile($ Path) 直接加载文件 (2)[反思。程序集]:加载(字节) 将文件压缩成一个字符串,并保存在一个数组中。请参考马修格雷伯的方法。地址如下: http://www . exploit-Monday . com/2012/12/in-memory-dll-loading . html 可以直接输出可用的powershell代码。 注: 前一篇文章《利用Assembly Load LoadFile绕过Applocker的分析总结》中介绍了这两种方法的比较。 3该方法的完整实现代码可以参考: https://github . com/fuzzy security/PowerShell-Suite/blob/ebbb 8991 A8 a 051 b 48 c 05 ce 676524 a1 ba 787 dbf0c/Bypass-UAC/Bypass-UAC . PS1 # l 1082 实际测试: 执行powershell脚本并加载IFileOperation,一个COM组件。因为powershell.exe是可信进程,所以UAC的确认框不会弹出,成功实现了文件的非授权拷贝。 0x06 利用分析 COM IFileOperation适用于Win7-Win10,所以也有未授权复制的方法。 对于explorer.exe,加载高权限的COM组件不会弹出UAC的对话框。 本文实现了模拟explorer.exe的方法,那么还有其他可用的COM组件吗?可以完成哪些「提功操作」? 0x07 小结 本文介绍了三种超越COM组件IFileOperation权限复制文件的方法,并编译开发了实现代码,可用于直接测试。 最后,感谢Ruben Boonen(b33f@FuzzySecurity)对我研究的帮助。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子