利用 AicLaunchAdminProcess 参数污染 bypass UAC

来自:信安之路(微信号:xazlsec),作者:x-encounter(信安之路作者团队成员 & 信安之路病毒分析小组组长)

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

AicLaunchAdminProcess 参数污染

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

命令行如下

huy32,wf.msc "C:\Users\X-ENCO~1\AppData\Local\Temp\kmkze.msc"

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

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

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

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


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

x64dbg 中 ExceptionCode 的值

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

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

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

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

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

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

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

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

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

伪造可信目录

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

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

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

检查逻辑大体上有三点:

1、清单文件中 autoElevate 为 True

2、有数字签名

3、从可信的目录下执行(C:\Windows\System32)

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

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

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

彩蛋

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

来自:信安之路(微信号:xazlsec)

信安之路.png

推荐↓↓↓
黑客技术与网络安全
上一篇:轻松理解端口转发和端口映射 下一篇:漫画:什么是 HTTPS 协议?