利用 AicLaunchAdminProcess 参数污染 bypass UAC

红蓝对抗 2019-11-10

之前花了一段时间研究 UACME 这个开源项目,获益匪浅,对其中的两个方法的非常感兴趣,重点研究了一下。分别是第三十八种和第五十二种方法。同属白名单组件绕过方法。

AicLaunchAdminProcess 参数污染

先介绍第三十八种方法,该方法利用 mmc.exe 执行自定义的 msc 文件从而在本地或者远程执行任意代码(仅适用于 64 位系统)。运行成功之后用 Process Explore 观察启动的 mmc.exe

img

命令行如下

huy32,wf.msc "C:UsersX-ENCO~1AppDataLocalTempkmkze.msc"

这个命令行很奇葩,如果在CMD中输入相同的参数的话,首先会弹出 UAC 验证框,紧接着报错

img

阅读源码发现,通过 SetUnhandledExceptionFilter 函数添加UEF异常并通过CC断点触发异常,实现 AicLaunchAdminProcess 函数的 Hook,从而在运行过程中将 AicLaunchAdminProcess 第二个参数改为上述命令行

img

而 AicLaunchAdminProcess 是 UAC 验证过程中被调用的函数,在 Win10 的 windows.storage.dll 中(无导出),在 64 位下,x64dbg 无法捕获到 UEF 的异常,又因为 CC 断点的存在,交给应用程序之后立马又被调试器接管,导致异常处理流程无法正常执行,所以在调的时候会永久断在 AicLaunchAdminProcess 函数的入口,解决方法有两种,第一种修改源码使用 AddVectoredExceptionHandler 添加 VEH 异常,该异常 x64dbg 可以捕获;第二种重写该方法使用其他方式 Hook AicLaunchAdminProcess 函数。懒惰的我自然会选择第一种方法=-=

友情附上 Windows 异常处理流程图:

img

修改之后发现可以调到 VEH 的 Handler 中,但是……不知道为什么,x64dbg 接管异常之后,修改了 ExceptionCode,导致了 Handler 没有正确的运行

img

x64dbg 中 ExceptionCode 的值

img

自己手动 Patch…… 接下来进入 AicLaunchAdminProcess 内部,发现该函数的主要功能就是将上述命令行以 RPC 的方式发送给服务端,由服务端进行验证

img

服务端是 appinfo.dll,该 dll 主要用于 UAC 权限的验证,载入 IDA,我们可以发现很多白名单文件,所谓白名单就是在启动过程中默认不需要弹 UAC 框的程序。

img

mmc.exe 位列其中,而且对 mmc.exe 的逻辑判断有一个单独的分支流程

img

看到这里就可以解释为什么有些 msc 文件被打开时需要弹框,而有些不需要。白名单如下

img

之后会调用 CCommandLineParser::Parse 对传过来的命令行进行解析,在对逗号(,)进行处理时会将其错误的当作命令行分隔符

img

会导致命令行中的 wf.msc 被认为是打开的目标,从而进行后面的逻辑检验

img

而 wf.msc 正好是白名单的一员,最终就导致了 appinfo 服务端检验通过,不需要弹框。而在客户端 mmc.exe 的 CMMCCommandLineInfo 类中,对命令行的解析逻辑如下

img

本质上是对 CCommandLineInfo 类进行了一层封装,不会对逗号进行特殊处理,最终会导致 mmc.exe 将 "C:UsersX-ENCO~1AppDataLocalTempkmkze.msc" 作为打开的目标……从而实现了 UAC 的完美绕过

实际上就是利用 RPC 服务端和客户端对命令行解析逻辑不一致进行 UAC 绕过的

伪造可信目录

第五十二种方法,网上有相关的文章

https://medium.com/tenable-techblog/uac-bypass-by-mocking-trusted-directories-24a96675f6e

我就简单的介绍一下大致流程,还是在 Appinfo.dll 中,对可信文件进行检查时可以被利用

检查逻辑大体上有三点:

1、清单文件中 autoElevate 为 True

2、有数字签名

3、从可信的目录下执行(C:WindowsSystem32)

满足第一点和第二点的可执行文件有很多,比如上面列的白名单,重点在第三点上。

先通过符号链接创建 C:Windows System32 目录(windows 后有个空格),将白名单中的任意一个 exe 复制到该目录中。appinfo 判断是否为可信目录时调用了 GetLongPathNameW。该函数在对字符串进行处理时会去掉windows 后面的空格,从而导致了可信目录的验证通过

img

之后通过 DLL 劫持的方法,执行 C:Windows System32 目录(windows 后有个空格)下的 exe 即可绕过 UAC,整体流程如下

img

彩蛋

UAC 绕过常见的方法就是 DLL 劫持,而劫持的前提是要把伪造的 DLL 放到可信的目录下面,如果直接 Copyfile 会触发 UAC,常用的方法如下

1、WUSA 的 /extract 命令可以将 cab 文件释放到管理员权限的目录下。Win8 以上把该功能取消了

2、IFileOperation。动态 Patch PEB 通过 COM 接口实现越权复制文件

3、NTFS reparse point。调用 Ntfs 的 API 可以实现低权限下的文件复制

4、使用漏洞,比如 CVE-2017-11783


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论