本文作者: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

断点运行的参数_利用 AicLaunchAdminProcess 参数污染 bypass UAC相关推荐

  1. 降维后的高维特征的参数_高维超参数调整简介

    降维后的高维特征的参数 by Thalles Silva 由Thalles Silva 高维超参数调整简介 (An introduction to high-dimensional hyper-par ...

  2. 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试

    单元测试junit参数 大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们. 而且,大多数人不喜欢在他们从事的项目中编写单元测试. TDD的人当然处于另一面,但根据我的经验,他们 ...

  3. java使用初始化输入参数_使用初始化参数配置java web应用程序

    在编写java web应用程序的时候,我们难免会遇到需要使用参数来初始化应用程序的问题.在这里介绍最简单的三种方式:使用上下文参数进行配置.使用Servlet初始化参数以及使用注释来初始化参数. 这些 ...

  4. 投影参数_智能投影仪参数如何去看,其实很简单

    我又来给大家安利投影仪了,毕竟用过的都知道有多刺激,但是估计很多人看到参数就头疼了吧?所以话不多说,直接上科普啦 流明亮度 流明怎么算的,家人们就不用详细了解了,只用记住,流明越高画面就越亮!而且我发 ...

  5. python中可选参数_带可选参数的Python函数

    我试图改进Python中的函数.它需要几个参数,其中一些可能会丢失. def some_function (self, a, b, c, d = None, e = None, f = None, g ...

  6. matlab xlsread参数_利用MATLAB批量完成科研数据处理

    利用常用软件批量完成科研数据处理 tags: - MATLAB - 科研软件 相信平时大家都有这种时候,测了一大堆数据,也知道该怎么去处理,但是样品很多,数据量很大,然后对于每个样品去处理的时候都得用 ...

  7. Mysql中循环拼接参数_利用循环向数据库中插入数据,参数重复的问题

    又看了些资料,发现对于说参数存在的问题可以把SqlCommand的创建放到For循环里,可以只连一次数据库,但是效率还是没提高.效率的问题不在于对数据库的开关,而是还是逐条地插入数据.而且数据库连接有 ...

  8. fre740变频器参数_三菱变频器参数设置教程

    1 工作监视选择 1. 待机状态现在为频率监视 2. 按SET键进入电流监视 3. 在2状态下按SET键进入电压监视 4. 在3状态下按SET键进入报警监视 5. 在4状态下按SET键进入频率监视 2 ...

  9. java+hadoop配置参数_将Hadoop参数传递给Java代码

    我有一个Uber jar执行一些级联ETL任务. jar的执行方式如下: hadoop jar munge-data.jar 我希望在作业启动时将参数传递给jar,例如 hadoop jar mung ...

最新文章

  1. 深度学习数据集+模型说明
  2. 光流(Optical Flow)简介
  3. 07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
  4. linux 本机发送邮件 smtp-server 553,Zabbix监控之邮件发送失败-smtp-server: 错误代码550与535...
  5. SAP Marketing Cloud里获取Contact Interaction的postman请求
  6. 流控思路——多消费者定量生产(第100篇)
  7. xgboost算法_工业大数据:分析算法
  8. Python如何连接Mysql及基本操作
  9. Spring数据转换(二)-- @InitBinder
  10. python 怎么样去txt中提取xml_如何使用python将.txt文件转换成xml文件?
  11. Atitit uuid 的概念与实现与最佳实践总结 目录 1. 概念与组成 1 1.1. 在空间(Space)与时间(Time)上的唯一性 1 1.2. UUID 1 1.3. 组成 2 1.3.1
  12. 分享一个mysql的docker-compose.yml
  13. python之花瓣美女下载
  14. android立方体旋转动画,如何画出一个旋转的立方体
  15. 万字好文,手把手教你做一个「vue3+express+typescript」的全栈模板项目
  16. JAVA 查看线程、内存
  17. 欧洲十大电动摩托车市场-Part one
  18. Mac电脑上如何关闭屏幕时间
  19. 抖音直播间挂人气协议工具
  20. 12306_qiang票子(爬虫小练_2)

热门文章

  1. 在linux下编译android下的opencv,使用cmake的方法
  2. LInux下centos6.7 设置字符集,解决乱码问题
  3. 如何利用 AVFoundation 设计一个通用稳定的音视频框架?
  4. Diango 框架起步
  5. asp.net 性能调较
  6. 《GO并发编程实战》—— 条件变量
  7. 盘点我们最容易误解的30个英语句子
  8. SAP BPC最佳实践-BPC系统备份及恢复
  9. mysql高级用法(函数)
  10. [ BZOJ 3879 ] SvT