当前位置: 首页 > news >正文

检测代码检测到基于堆栈的缓冲区溢出_18000美金——Steam客户端缓冲区溢出的RCE

4fa311ffd18615159d2000dd1a059711.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二进制文件中的常量值满足这些特殊条件:

15bc55cda333aa7499d38f71a7a66bf0.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变量,使漏洞的演示一定成功

4bb5362bd8078433f9da56282d868879.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也表示了感谢。

81724a19fcc01c4aaeffa6e3d56f9684.png

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场

来源:18000美金--Steam客户端缓冲区溢出的RCE|NOSEC安全讯息平台 - NOSEC.ORG

原文:https://hackerone.com/reports/470520

白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

相关文章:

  • 不同系统下的shell的不同_绿雕景观在不同环境下的变化
  • 编写mapreduce程序实现对输入文件的词频统计排序_MapReduce实例分析:单词计数
  • laydate组件 无法传值_vue组件通信
  • python open文件_Python open()文件处理使用介绍
  • java教务管理系统数据库设计_[源码和文档分享]基于JAVA和SQL SERVER数据库实现的酒店管理系统...
  • 执行python代码的方式_用Python执行程序的4种方式,编程必备
  • WPS怎么统计相同名称的数据_教你如何将垃圾的WPS,玩得高大上!
  • vue radio双向绑定_Vue双向数据绑定,时间介绍,ref获取dom节点
  • 抓包实时打印_【硬货分享】 某网红打印机安全分析(下)
  • import pandas as pd 报错_Python数据处理,用pandas解决分段匹配,简单到没朋友
  • cricheditview实现语法高亮和行号_[源码和文档分享]基于VC++和QT实现的图的可视化工具...
  • table 内 下拉列表 被遮挡_Emacs Hack - 通过列表数据创建表格
  • 取出url中的字符_python爬虫,解决大众点评字符库反爬机制的经验
  • 单调有界定理适用于函数吗_实数系的连续性定理
  • java map获取第一个值_深入理解 Java 函数式编程(4): 使用 Vavr 进行函数式编程...
  • 《剑指offer》分解让复杂问题更简单
  • 【css3】浏览器内核及其兼容性
  • 【个人向】《HTTP图解》阅后小结
  • 07.Android之多媒体问题
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • conda常用的命令
  • css系列之关于字体的事
  • Intervention/image 图片处理扩展包的安装和使用
  • java8-模拟hadoop
  • java取消线程实例
  • JS数组方法汇总
  • nodejs实现webservice问题总结
  • scala基础语法(二)
  • Shadow DOM 内部构造及如何构建独立组件
  • socket.io+express实现聊天室的思考(三)
  • Solarized Scheme
  • 创建一个Struts2项目maven 方式
  • 技术:超级实用的电脑小技巧
  • 聊聊flink的BlobWriter
  • 如何编写一个可升级的智能合约
  • 三分钟教你同步 Visual Studio Code 设置
  • 为什么要用IPython/Jupyter?
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​虚拟化系列介绍(十)
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #微信小程序:微信小程序常见的配置传旨
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (南京观海微电子)——COF介绍
  • (十六)串口UART
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .dwp和.webpart的区别
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理