和另一个Steam Windows客户端本地特权升级0天

在上一个系列中


不久前, 我发布了 Steam漏洞描述。 我收到了很多读者的反馈。 瓦尔(Valve)一言不发,HackerOne发了一封眼泪汪汪的信,基本上是沉默。 结果,Valve禁止我使用H1-我无法参加他们的计划来拒绝漏洞(我可以使用H1的其余部分)。



您可以在以前的出版物中了解有关该故事的更多信息,在这里我将对当前状态说几句话。

但这很简单又令人难过-Valve仍然失败。 旨在解决该问题的最新更新很容易被绕开,并且该漏洞仍然很重要。 是的,我检查了它-效果很好。

但是本文不是关于旧漏洞仍然存在的事实,而是关于新漏洞的事实。 由于瓦尔(Valve)再次表示希望阅读公开报告,而不是私人报告,因此我们不会剥夺他们的这种乐趣。

漏洞简要说明


利用漏洞的一般描述非常简单,包括三个步骤:

  1. 我们为操作环境做准备(使用不同的安全漏洞,共有两种选择方法)。
  2. 让Steam复制并运行我们的dll。
  3. Dll应该满足小的要求。

所有这些操作都可以由OS的任何用户执行,或更准确地说,可以由计算机上的任何程序执行。 因此,您可以执行具有最大特权的任何代码 ,此类漏洞称为特权升级(eop)或本地特权升级(lpe)。 尽管任何应用程序本身都可能造成损害,但获得最大权限将导致更为严重的后果。 关闭防病毒和防火墙,安装rootkit,隐藏矿工进程,窃取所有PC用户的个人数据只是您能想到的一小部分。

理论最小值


观看上一篇文章的评论非常有趣,人们在文章中写道“用户无法在HKLM中编写注册表项”或“创建符号链接需要管理员权限”。 有趣的是,检查这些指控几乎不会比写这样的评论花费更多的时间。 而且,是的,以防万一:这两个语句都是错误的。 因此,在本文中,我决定做一个小节,描述操作中的一些困难时刻。

“您无法写入HKLM注册表项”


没有这样的一般规则。 对于特定的注册表项,有特定的安全规则。 Valve为HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam分支的所有用户设置了完全访问权限,因此,任何用户都可以在该分支中执行任何操作。

“没有管理员权限就无法启动或停止服务”


没有这样的一般规则。 有针对特定服务的特定安全规则。 Valve设置了权限,以便任何用户都可以启动和停止Steam客户端服务。

“要创建符号链接,您需要管理员权限”


考虑到Windows中的5种主要链接类型,这本身就是一个有趣的问题,只有一半需要这些权限。 因此,满足:文件符号链接,对象目录符号链接,硬链接,NTFS重解析点和reg_link。 仅对于创建文件符号链接和对于永久对象目录符号链接,才需要管理员权限(在一般情况下,临时权限的生存时间与重新创建该会话所创建的会话的生存时间一样长,通常在重新启动之前,并且不需要特殊权限)。

从文件夹到文件夹的Simlink


这称为NTFS重新解析点或NTFS安装点。 名称不是特别重要,事实是,该名称允许您将一个文件夹用作指向另一个文件夹的指针。 如果普通用户具有“写”权限,则可以从一个空文件夹中创建该文件。 为了进行创建,我们将使用一组实用程序中的CreateMountPoint.exe实用程序来测试使用links的情况

离开锁


传出阻止( OpLock或Opportunistic Lock )是一种特殊的机制,其中一个应用程序可以临时阻止所有人访问特定文件资源。 在这里您可以编写许多各种各样的详细信息,使用文件夹的功能以及不同的访问权限。 最重要的是:程序可以“捕获”访问特定文件的事件并保留一段时间。 您可以使用同一测试套件中的SetOpLock.exe实用工具安装oplock,以使用链接 。 运行该实用程序将安装所需的解锁; 当发生访问时,该实用程序会写一条消息; 按Enter即可解除锁定。

拜腾开关


这就是这项技术的名称,它结合了链接的创建和oplos的安装,从而赢得了TOCTOU(检查时间\使用时间)。 通过示例更容易解释其本质。

想象有一个程序连续执行以下操作:

ReadContentFromFile(“C:\test\myfile.txt”); ReadContentFromFile(“C:\test\myfile.txt”); 

它只是连续两次读取同一文件。 总是会读同样的东西吗? 不,不一定。

首先,使用文件C:\ test1 \ myfile.txt和C:\ test2 \ myfile.txt创建两个文件夹。 通常,我们将清除C:\ test文件夹,并在C:\ test1上创建一个重新解析点。 我们将解锁从第一个目录放在文件上,然后运行该程序。 一旦她打开文件,解锁就会起作用。 我们将更改重新解析点,并且C:\ test将指向C:\ test2。 现在,解除锁定后,程序将再次从另一个文件读取文件。

为什么需要这个? 非常简单-一种非常典型的情况,首先检查文件(第一次读取),然后启动文件(第二次读取)。 这就是我们发送一个文件进行验证,另一个发送执行的方式。

现在一切准备就绪。

操作1.准备环境


有必要稍微准备一下工作环境。 首先,您需要获取可执行文件CreateMountPoint.exe和SetOpLock.exe。

现在,我们需要对Steam的文件结构进行一些小的更改。 我们的任务是得到一个包含两个文件Steam.exe和steamclient.dll的文件夹,并且必须缺少bin文件夹。 有两种方法可以做到这一点。

方法1


重命名\从主Steam文件夹中删除bin文件夹。 就是这么简单,您很棒(安装过程中的Steam为任何用户提供了对其文件夹中所有内容的访问权限)。

方法2


在注册表项HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam中,将InstallPath参数更改为某些文件夹。 在此文件夹中,从Steam的主文件夹中删除Steam.exe和steamclient.dll。

假设通过任何一种方法,我们都准备了文件夹C:\ Steam(路径可以是任意路径,但是在示例中,我将使用此路径)。 现在在其中创建另一个文件夹b1,b2,b3和b4。 在前三个文件中,我们将上载steamservice.dll文件(从Steam套件下载,原始文件位于bin文件夹中),然后在b4文件夹中删除具有相同名称的特殊格式库-steamservice.dll。 关于图书馆准备工作的细节将在第3段中。

我们打开控制台的两个窗口。 这样就完成了环境的准备。

操作2.替换文件


我认为,从准备工作中已经很清楚,将会出现上述的BaitAndSwitch之类的东西。

ProcMon的屏幕截图:



这是Steam客户端服务的典型启动的一部分。 请注意dll首先复制到C:\ Program Files(x86)\ Common Files \ Steam,然后加载的部分。 我们将确保从C:\ Steam \ b4复制我们的库。 不幸的是,首先要进行检查,包括库的签名,以使它无法被替换(哦,讽刺的是)。

因此,我将登录。 步骤被组合为相同动作的组。 对于每个步骤,将指示启动位置和发生的位置(我将其称为不同的控制台窗口cmd1和cmd2)。

  1. 创建文件夹C:\ Steam \ bin并在cmd1中执行:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b1
  2. 在cmd1中,我们放置了oplock:
    SetOpLock.exe C:\ Steam \ b1 \ steamservice.dll
  3. 我们启动了Steam客户端服务,在cmd1中看到我们捕获了对该文件的访问。

    ***
  4. 删除C:\ Steam \ bin,在其位置创建C:\ Steam \ bin文件夹,并在cmd2中执行:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b2
  5. 在cmd2中,我们放置了oplock:
    SetOpLock.exe C:\ Steam \ b2 \ steamservice.dll
  6. 在cmd1中,我们释放解锁,我们看到cmd2捕获了对该文件的访问。

    ***
  7. 删除C:\ Steam \ bin,在其位置创建C:\ Steam \ bin文件夹并执行cmd1:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b3
  8. 在cmd1中,我们放置了oplock:
    SetOpLock.exe C:\ Steam \ b3 \ steamservice.dll
  9. 在cmd2中,我们释放解锁,我们看到cmd1捕获了对该文件的访问。

    ***
  10. 删除C:\ Steam \ bin,在其位置创建C:\ Steam \ bin文件夹并执行cmd2:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b2
  11. 在cmd2中,我们放置了oplock:
    SetOpLock.exe C:\ Steam \ b2 \ steamservice.dll
  12. 在cmd1中,我们释放解锁,我们看到cmd2捕获了对该文件的访问。

    ***
  13. 删除C:\ Steam \ bin,在其位置创建C:\ Steam \ bin文件夹并执行cmd1:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b3
  14. 在cmd1中,我们放置了oplock:
    SetOpLock.exe C:\ Steam \ b3 \ steamservice.dll
  15. 在cmd2中,我们释放解锁,我们看到cmd1捕获了对该文件的访问。

    ***
  16. 删除C:\ Steam \ bin,在其位置创建C:\ Steam \ bin文件夹并执行cmd2:
    CreateMountPoint.exe C:\ Steam \ bin C:\ Steam \ b4
  17. 在cmd1中,我们释放解锁

尽管看起来很复杂,但实际上这个想法很简单:从6次访问文件C:\ Steam \ bin \ steamservice.dll,这是不同文件夹中原始文件的前5倍(访问顺序为:b1,b2,b3,b2, b3),并第六次提供带有有效负载的文件进行复制。

示意地,我这样描述它:


左边是正常行为,右边是漏洞利用行为。

操作3.已实施的图书馆


对于有效负载,我首先使用了最典型的dll,它在DllEntry中创建了一个交互式控制台。 由于来自dll的代码将在Steam客户端服务的上下文中执行,因此它将以与服务本身相同的权限执行-NT AUTHORITY \ SYSTEM。 但是,由于操作,控制台没有出现。

下载后,Steam服务仍然了解到他们将菩提树滑到上面并完成了工作,因此来自我dll的有效负载无法执行。

我不得不转过头来,事实证明,加载dll后的服务会检查功能是否存在

 int WINAPI SteamService_RunMainLoop() void WINAPI SteamService_Stop() 

在图书馆。 此外,该服务调用了第一个功能,在这里我决定放置有效负载(使用该服务的权限启动交互式控制台-NT AUTHORITY \ SYSTEM)。 至此,我们将重复所有步骤,并获得具有最大权限的控制台。

结论


您可以将所有这些文件包装到一个exe文件中,但是坦率地说,我真的不想打扰。 我认为带有演示的视频就足够了( 注册表 选项,文件系统选项 )。
我不会在此复制上一篇文章的“投机”部分。 事实:旧的漏洞是最新的,您只是阅读了有关新漏洞的信息,Valve仍然不希望听到这些问题。

更新(08/22/2019)


目前,有两个新闻:

  1. Beta客户端收到补丁修复 。 我将观看更新何时到达主要客户端。
  2. 阀门改变了LPE政策 。 这是个好消息!


更新(08/27/2019)


好消息

  1. 主要客户收到补丁更新
  2. 我被禁止参加H1并获得奖励


本文为英文。

Source: https://habr.com/ru/post/zh-CN464367/


All Articles