断点运行的参数_利用 AicLaunchAdminProcess 参数污染 bypass UAC

本文作者:x-encounter(信安之路作者团队成员 & 信安之路病毒分析小组组长)

成员招募:信安之路病毒分析小组寻找志同道合的朋友

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

AicLaunchAdminProcess 参数污染

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

18c2cad1a5dac6cd345d87447f114703.png

命令行如下

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

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

eea6e994f4c18ac3459c6240da440804.png

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

abe53264db53a054ba09752d1ab4eb10.png

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

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

8bb7cfe6e7eed0a79d413994048ae520.png

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

d17feda418162fa048d87b641a5db9c0.png

x64dbg 中 ExceptionCode 的值

3f496a6c421b08ce5bfe2020e7c04e15.png

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

1ff11b6d99dcbfd506b6f924cfb2aedc.png

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

36b84f7af5b193e715ef8d6684608b57.png

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

efcf091b447590fb8b42e9771dd56f01.png

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

9239791c09be12c0973c3d42de96387f.png

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

39bb7c670d6ce77184618bad4f926284.png

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

bc1df6b1b4cdd488b6a9ed5b2e5b3f35.png

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

7de12a24af88ce3e0d169a185f5b946f.png

本质上是对 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 后面的空格,从而导致了可信目录的验证通过

986eb8ded8ec483e2ad3271f3d7fd750.png

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

91ceb6f5a6ffd3b74d9ded5135d0c721.png

彩蛋

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

23f6fa3617e653214731949af7eb6b87.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值