详解Bypass UAC过程中踩过的坑(第一部分)

本文讲的是详解Bypass UAC过程中踩过的坑(第一部分),我目前正在尝试对Chrome沙盒进行一些改进。而作为其中的一部分,我现在正在对我的沙盒攻击Surface 分析工具进行更新,因为我想衡量我对Chrome做的事情是否具有实际的安全性。但事实上当我在进行这一切时,我一直躲不开绕过UAC的麻烦,这就导致进程出现了问题。所以为了顺便演示下我以前在UAC绕过的博文中所讲的,我决定将这一切再来一次。当我完成这一切的时候,我将使用最新版本的NtObjectManager  Powershell模块来显示一些演示文稿。

在我开始之前,我必须解决/讨论关于UAC绕过的“fileless”标记。我以前的博客文章说这是一个fileless绕过,但是我仍然需要写入注册表(由文件支持),当然还有一些可执行文件仍然需要运行(这在某些时候被页面支持)文件)等。基本上所有的fileless绕过都意味着它将不依赖于旧的IFileOperation技巧来劫持一个DLL。但这并不意味着某个文件不会在某个地方停在磁盘上,我想这更像是DFIR这样的术语。

一个奇怪的设计决策

当微软正在设计UAC时,可能就有窥探者利用不同的攻击向导来减少普通用户升级到管理员的机会。例如,使用UIPI减轻了Shatter攻击(和一般UI驱动)。通过使管理员进程仅使用HKLM进行COM注册(不是特别成功地添加)来缓解COM DLL种植。使用强制性完整性标签来减轻用户资源的滥用,以防止从低到高的写访问。

也许UAC有一个超级安全版UAC开发,但麻烦的是它可能已经不可用了。所以无疑其中许多安全观念放松了。特别令人感兴趣的是,非管理员用户可以在同一台桌面中查询有关管理员进程的一些不可否认的有限的进程信息。这可能会导致我们将看到非常令人惊讶的影响。

那么普通应用程序获得多少访问权限?通过运行以下PS脚本作为正常的分割令牌管理用户,我们可以很容易地回答。

这应该会导致MMC升高,并将以下打印到PS控制台:

所以它显示我们有3个访问权限,Terminate,QueryLimitedInformation 和Synchronize。这样做是有道理的,毕竟如果你无法在桌面上杀死进程,或者等待他们完成,或者获得他们的名字,那么这将是一种痛苦。正是在这一点上,第一个UAC设计决策发挥作用,存在一个正常的QueryInformation进程访问权限,但是使用该访问权限存在一个问题,而这违反了强制性标签策略(我将引用它)作为IL政策从现在开始)以及它如何在流程上实施。IL策略 的目的是指定哪个通用访问权限,读取,写入和执行低IL用户可以获取资源。这是允许的最大访问权限,IL策略本身不会授予访问权限。用户仍然需要在DACL中获得适当的访问权限。因此,例如,如果策略允许较低的IL进程获取读取和执行但不写入(这是大多数资源的默认值),那么如果用户要求写访问权限,内核访问检查将在甚至查看之前返回访问被拒绝在DACL。所以我们来看一下进程对象的IL策略和通用访问权限:

这样将会导致以下输出:

进程的默认策略是不允许较低的IL用户读或写,所以他们可以拥有的是执行访问,我们可以看到,我们拥有这一点。但是请注意,QueryInformation是一个读访问权限,将被默认的IL策略阻止。因此,我们无法给予读取访问权限,因为我们不希望让读者轻松读取特定进程的内存,所以让我们创建一个新的访问权限,QueryLimitedInformation将被分配给执行和只是将一些信息查询转移到新的权限“。

在Vista及以上版本上也值得一提的是,您无法获取QueryInformation访问权限,也不会隐式地拥有QueryLimitedInformation,所以MS认为足够的话可以欺骗而不是别的东西。(为读者思想:为什么我们不能获得ReadControl访问权限?) 当然,您仍然需要能够在DACL中访问这些访问权限,特权进程如何才能实现这些访问?进程的默认安全性来自访问令牌内的默认DACL,用作新进程的主令牌,我们在普通用户PS控制台和升级的PS控制台中使用以下脚本转储默认DACL:

普通用户的输出如下:

管理员的输出如下:

一旦这个重要的点被突出显示,而管理DACL却不允许正常的用户访问,这个好奇的LogonSessionId用户就可以读取和执行访问。因此,这似乎可能是给我们执行访问权限(因为读取将被IL策略过滤)。我们可以通过转储正常用户在其令牌中具有的组来证明这一点:

是的,我们有该组,并且启用了。而这样显然就解决了为什么我们可以得到执行访问的谜底。这是一个明确的设计决定,微软是希望能够使得这样一个普通用户可以获得一定程度的访问升级过程。当然在这一点上,你还会想什么呢?你可以从一个进程中读取一些基本信息,怎么读出是个问题?详见这个系列的第2部分。

原文发布时间为:2017年6月12日

本文作者:Change

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-10-24 03:44:18

详解Bypass UAC过程中踩过的坑(第一部分)的相关文章

详解Bypass UAC 过程中踩过的坑(第二部分)

本文讲的是详解Bypass UAC 过程中踩过的坑(第二部分),在第1部分完成后,我们知道普通用户在拆分令牌管理登录中处理可以获得对升级进程的Terminate,QueryLimitedInformation 和  Synchronize进程访问权限的访问.这是由于正常的用户和管理员具有默认DACL,该默认DACL授予对同一桌面上所有令牌设置的当前登录会话的执行访问权限.我们接下来的问题是如何才能提升你的权限? 在我们拥有的3个访问权限中, Terminate 和 Synchronize 都不是

详解.NET编程过程中的线程冲突

看起来,将其lock起来后,就万事大吉了,没有人能修改这个容器,但实际上这个容器不过是用一个ArrayList实例来实现的,如果某段代码绕过这个容器而直接操作_list的话,则对这个容器对象lock也不可能保证容器不被修改了. 一.什么是线程冲突 线程冲突其实就是指,两个或以上的线程同时对同一个共享资源进行操作而造成的问题. 一个比较经典的例子是,用一个全局变量做计数器,然后开N个线程去完成某个任务,每个线程完成一次任务就将计数器加一,直到完成100次任务.如果不考虑线程冲突问题,用类似下面的代

SharePoint开发详解:一个Feature中使用SPGridView的几个Tips

根据上面一篇随笔所介绍的PC购买流程的项目,在项目中,需要有一个生成 订单的功能,能够使得Admin很方便的在获得批准的申请中选取一些来生成订单 ,要求界面操作简单明了,大概的效果图如下: 开发详解:一个Feature中使用SPGridView的几个Tips-"> 点击checkbox,自动计算当前订单的总价值,点击按钮,生成订单. 有此想到了用SPGridView这个现成的控件来完成,以前也用过这个控件,其 实和GridView没什么大区别.这里就简单介绍一下了: 首先Create 一个

tcpip-TCPIP详解卷一第二版中关于TIME_WAIT态的问题

问题描述 TCPIP详解卷一第二版中关于TIME_WAIT态的问题 在TCPIP详解卷一第二版英文版的第622页, 作者描述了一个使用SO__REUSEADDR来实现地址复用的例子, 在例子的第一行,作者输入了两次"sock -A -v -s 6666",这里输入两次有什么深意吗? 之后作者又输入了"sock -b 32840 -v 127.0.0.1 6666"代表本地客户端从32840端口连接到本地的6666端,这里直接就提示地址被使用,这是什么原因?这个端口与

详解JavaScript节流函数中的Throttle_javascript技巧

首先我们来了解下什么是Throttle     1. 定义 如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出. 也就是会说预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期.       接口定义: * 频率控制 返回函数连续调用时,action 执行频率限定为 次 / delay * @param delay {number} 延迟时间,单位毫秒 * @param action {function} 请求关联函数,实际应用

JavaScript Event Loop机制详解与Vue.js中nextTick的实践应用

本文依次介绍了函数调用栈.MacroTask 与 MicroTask 执行顺序.浅析 Vue.js 中 nextTick 实现等内容;本文中引用的参考资料统一声明在 JavaScript 学习与实践资料索引. 1. 事件循环机制详解与实践应用 JavaScript 是典型的单线程单并发语言,即表示在同一时间片内其只能执行单个任务或者部分代码片.换言之,我们可以认为某个同域浏览器上下中 JavaScript 主线程拥有一个函数调用栈以及一个任务队列(参考 whatwg 规范);主线程会依次执行代码

详解C++设计模式编程中建造者模式的实现_C 语言

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这是建造者模式的标准表达,不过看着让人迷惑,什么叫构建和表示的分离?一个对象使用构造函数构造之后不就固定了,只有通过它方法来改变它的属性吗?而且还要同样的构建过程搞出不同的表示,怎么可能呢?多写几个构造函数? 其实多写几个构造函数,根据不同参数设置对象不同的属性,也可以达到这样的效果,只是这样就非常麻烦了,每次要增加一种表示就要添加一个构造函数,将来构造函数会多得连自己都不记得了,这违背了开放-封闭的原则. 要

详解Ruby设计模式编程中对单例模式的运用_ruby专题

简介      单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义. 要点      显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例.      

详解Java面向对象编程中方法的使用_java

一个 Java 方法是为了执行某个操作的一些语句的组合.举个例子来说,当你调用 System.out.println 方法时,系统实际上会执行很多语句才能在控制台上输出信息. 现在你将学习怎么创建你自己的方法,他们可以有返回值也可以没有返回值,可以有参数,也可以没有参数,重载方法要使用相同的方法名称,并在程序设计中利用抽象的方法. 创建方法我们用下面的例子来解释方法的语法: public static int funcName(int a, int b) { // body } 在这里 publ