AD域中尝试绕过UAC
什么是UAC?
用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。
--百度百科
高:
任何程序启动都需要申请
默认:
UAC在不手动更改的情况下,程序需要administrator权限的时候。会弹出框框申请
中:
申请administrator权限不弹出申请框框,默认允许
从不提醒:
所有程序启动皆为administrator权限
最近需要在AD域中推送一个exe,如果只用管理员权限(administrator,或者具备管理权限的AD账号)运行,会因为权限不够而中断执行,需要UAC权限(也就是右键以管理员身份运行)才能够运行安装。就算登录用户已经在本地administrator组或者域的admin组中也不行。
尝试了不少方法,做一个总结。
绕过UAC失败的方法:
失败方法一:使用AD用户管理中的登录脚本
此方式也是该软件官方推荐的方式,将exe放在域控的登录脚本目录下,再为目标账户设置登录脚本。
\\域控机计算机名\SYSVOL\sysvol\域控domain\SCRIPTS\
或者也可以放入能够让域内成员访问的共享目录,但是登录脚本要使用绝对路径。
此方法可以成功让域成员登录时执行该exe,但是会因为权限不足而中断进程
失败方法二:使用系统自带的runas命令
系统自带的runas
命令需要手动输入密码,但如果此方法成功,便可以使用autoit等方法重新将此命令封装,到达自动输入密码的目的。
尝试了本地管理员和域管理员,皆失败,同样因为权限不够而中断进程
runas /user:administrator C:\Users\test01\Desktop\run.exe
加了/netonly
参数之后,可以使exe被调起,但是仍因权限不足而中断
runas /netonly /user:admin@xxxxx.local \\dc1\NETLOGON\run.exe
失败方法三:使用第三方工具(其实就是加强版的runas)
- 工具1,RunAsRob,失败
- 工具2,RunAsSPC,失败
- 工具3,Lsrunase,失败
- 工具4,AdvancedRun,失败,这个功能很丰富,如果不是特殊的场景,很好用
其实在尝试runas
命令失败时,我已经知道这个程序是需要UAC权限的,这些软件最多能够调用administrator级别的权限,却不能pass UAC。
以上工具如果不是像这种特殊的程序,在某些场景下还是很有用的,比如一些只需要管理员权限而不需要UAC权限时,就可以通过他们来实现。
附上一个脚本。判断进程决定是否执行
@echo off
set "processFlag=run.exe"
tasklist | findstr /IM %processFlag%
if %errorlevel% == 0 (
exit /b 0
)
copy /Y \\dc2\NETLOGON\run.exe %windir%\Temp\
start /MIN "" %windir%\Temp\run.exe -Silence=Y
##或者使用 Lsrunase 等工具带参数直接运行程序
if %errorlevel% ==0 (
echo >%windir%\Temp\flag.log%
exit /b 0
£©
exit /b 0
成功的方法
花了大约1小时进行以上各种尝试之后,我想起来了很久之前当脚本小子时用过的一个方法:使用系统自带的计划任务
马上新建了一个域策略进行测试,配置如图:
运行任务使用的用户%LogonDomain%\%LogonUser%
即 AD域名\登录用户
并且勾选 使用最高权限运行
策略下发之后,等待客户端自动刷新策略(默认90分钟和域控同步一次策略),或者客户端手动gpupdate /force
看日志,可见该exe已成功完成安装!
但此方法的弊端就是登录的域账户本身具有本地计算机管理权(在administrator组中),否则也会因为权限不足而中断。
至少有了一个可行方法吧~
未尝试的方法:
有人说SCCM方式也可以pass UAC,找时间尝试了之后再更新。
DLL劫持法,非常规方法,曾经用msf成功pass UAC,太过于麻烦且非常规方法,未尝试。
参考: