18000美金——Steam客户端缓冲区溢出的RCE

Track-SSG   ·   发表于 2019-03-19 10:58:09   ·   漏洞文章

22.png

近期,白帽汇安全研究院检测到HackerOne公布了一个Steam游戏客户端的缓冲区溢出漏洞,可实现远程命令执行。Steam平台是Valve公司聘请BitTorrent(BT下载)发明者布拉姆·科恩亲自开发设计的游戏平台。Steam平台是目前全球最大的综合性数字发行平台之一。玩家可以在该平台购买、下载、讨论、上传和分享游戏和软件(来自百度百科)。最终,发现者得到了18000美金的奖励。以下是详细信息:

介绍

在Steam和其他Valve的游戏(CSGO,半条命)中,有一种可以找到游戏服务器的功能,被称为服务浏览器(server browser)。为了检索有关这些服务器的信息,服务浏览器会使用特定UDP协议进行通信,这被称为服务查询(server queries)。该协议在Steam的在线开发人员手册中有详细描述。

在测试中,我们搭建了一个python服务器,实现了文档中所说明的通信流程。在通过Steam和我们的服务进行成功通信后,我们fuzz了几个参数,并注意到Steam客户端某时刻在接收回复时崩溃了。更具体地说,当我们在A2S_PLAYER响应中包含使用一个超长的玩家名字时,客户端崩溃了。经过调试,我们注意到客户端是由于基于堆栈的缓冲区溢出而崩溃的。

漏洞的存在已经很明显了,我们进一步研究,以便能够利用缓冲区溢出。然后,我们注意到在serverbrowser库中发生了溢出。在某些时候,玩家的名字被转换为unicode编码,此时没有检查存储边界,从而发生溢出。而且,由于没有任何canary保护,我们得以覆盖返回地址并在Windows上实现任意代码执行。

利用细节

首先,我们在Linux上进行测试,我们能够通过覆盖返回地址控制执行流程。但是,在Linux上,我们只能控制EIP寄存器的两个字节(例如0x00004141),所以没有进一步研究它。在OSX(苹果系统)上,进程被终止,显示SIGABRT,这意味着OSX上的库中可能存在一个canary保护。最后,我们尝试在Windows上利用它,并成功了(Windows 8.1和10)。

在Windows上,通过UDP发送玩家名字,就像A*1100时,会产生以下堆栈:

0x00410041
0x00410041
...

这是由于unicode转换(全角字符)而导致的,因为玩家名字可以使用unicode编码。使用unicode字符组成玩家名字u"\u4141"*1100,并发送时:

0x41414141
0x41414141
...

但是,由于在函数返回之前就破坏了堆栈和寄存器,因此无法控制EIP寄存器。在取消引用edi寄存器后程序崩溃,但我们还是想到了办法控制它。我们使用Steam.exe二进制文件中的常量值满足这些特殊条件:

33.png

然后,我们构建了一个Steam.exe自带小工具的unicode编码的ROP链,动态调用VirtualProtect使堆栈执行,并跳转到我们的unicode编码 shellcode,以便执行cmd.exe。这是一个很大的挑战,因为我们不能在ROP链中使用0x00000040这样的值,否则攻击就会失效。此外,我们不能使用无效的unicode字符,像u"\uda01",因为库会用问号来替换它们?- 0x003F

注意:以上这些都是使用Steam.exe基址计算的。如果重新启动Windows 8或Windows 10,则基址会更改。如果可以编辑基址,那么这个漏洞100%可以攻击成功,但由于ASLR,无法预测受害者计算机中的基址。因此,我们有以下两种方案:

  • 只有9bits被随机化:攻击者成功概率为0.2%(1/512),如果向所有Steam用户进行攻击,每512次攻击能有一个成功

  • 此漏洞可能与另一个内存泄漏漏洞结合,达到100%利用成功

  • 复现

    首先,确保已安装Steam。如果你安装的是测试版,请在漏洞利用代码中取消测试版自带小工具的注释。

    1 - 下载附件:steam_serverinfo_exploit.py(放在后面)

    2 - 使用像Immunity Debugger这样的调试器

    3 - 获取Steam.exe(View> Executable modules)的基地址并编辑为以上脚本中的STEAM_ba se变量,使漏洞的演示一定成功

    44.png

    4 - 在您选择的服务器上运行漏洞脚本(例如localhost):python steam_serverinfo_exploit.py5 - 编辑POC.html改变内置src中你的恶意服务器IP地址(脚本在下)6 - 在浏览器中打开POC.html并等待cmd.exe执行7 - 你也可以打开菜单中的服务浏览器(View > Servers),并单击View server info以触发漏洞利用(如果在同一网络中运行恶意服务器,它将出现在LAN中)

    攻击脚本

    steam_serverinfo_exploit.py

    POC.html

    PoC

    第一个是视频是通过与Steam服务器浏览器进行攻击。

    https://v.youku.com/v_show/id_XNDEwMTEzOTk1Ng==.html?spm=a2h3j.8428770.3416059.1

    第二个是通过Windows 10的浏览器进行攻击。

    https://v.youku.com/v_show/id_XNDEwMTE0MTU4MA==.html?spm=a2h3j.8428770.3416059.1

    影响

    一旦受害者查看恶意服务器的服务器信息,就会被攻击,攻击者可在受害者的计算机上执行任意代码。通常,会配合后门长期获得对受害者计算机的访问权限。

    具体来说有两种攻击方法:

  • 用户在Steam客户端服务浏览器中查看服务器信息

  • 用户访问Steam浏览器协议的攻击者所控制的恶意网站steam://connect/1.2.3.4

  • 此外,还有一些方法可以增加攻击的可成功概率,例如伪造人气很高的服务器来吸引玩家加入。

    最后,Steam也表示了感谢。

    55.png

    来源:https://hackerone.com/reports/470520
               


    打赏我,让我更有动力~

    0 条回复   |  直到 2019-3-19 | 1165 次浏览
    登录后才可发表内容
    返回顶部 投诉反馈

    © 2016 - 2024 掌控者 All Rights Reserved.