社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 14阅读
  • 0回复

[分享]请勿轻信低价骗局!Steam假入库灰产陷阱手法剖析

楼层直达
z3960 
级别: FLY版主
发帖
843340
飞翔币
121424
威望
325892
飞扬币
3799767
信誉值
8

[font=-apple-system, BlinkMacSystemFont, &quot]近期,我们监测到一类通过低价出售Steam游戏激活码的恶意攻击活动。攻击者通过伪装官方工具诱导用户执行恶意脚本,进而植入恶意组件并窃取用户信息。
  
查杀图
[font=-apple-system, BlinkMacSystemFont, &quot]        
        Steam 是一款游戏整合平台,其平台的部分游戏商品需用户付费“入库”后才能游玩。目前,网络上存在一类售价远低于官方渠道的Steam游戏激活码,且商家宣传其是 “正版游戏”“永久激活”“绝非共享”等承诺。

        部分商家会明确告知其激活码需借助第三方软件运行;另有部分商家通过具有欺骗性的宣传话术诱导消费者,让消费者误以为其所售产品是官方正版密钥,进而促成购买。
        在完成购买后,商家会向用户发送一个伪装为Steam官方提供的软件或命令行工具,要求用户运行该工具后,再向Steam客户端中输入其提供的“正版激活码”以完成“入库”。
使用说明图
        目前,火绒安全软件已具备对该程序的核心组件及网络连接进行拦截查杀的能力。若您尚未安装火绒安全软件且系统已经受到影响,建议您参考下方我们提供的手动清理方案:
        [1] 建议彻底卸载、删除 steam 客户端及文件,然后重新安装并执行步骤[4]。
        [2] 尽快删除 steam 客户端根目录下的 hid.dll 和 zlib1.dll 。
        [3] 在资源管理器中输入 %APPDATA% 并删除 Stool 目录以清理衍生文件。
        [4] 在注册表中清理 HKEY_CURRENT_USERSoftwareValveSteamSteamtools 键来清理衍生注册项。
        在 steam 根目录下删除 steam.cfg 来还原官方客户端配置,使官方客户端能够正常安全更新
一、准备流程分析
        商家首先会要求用户运行其提供的第三方程序或脚本,这些程序或脚本通常会伪装成Steam平台官方工具。本文以商家提供的PowerShell脚本为例,商家会指示用户在终端中运行其提供的PowerShell脚本,具体代码如下:
       其中 irm 为从对应的网址下载内容, iex 为将前面下载的内容作为 PowerShell 脚本执行。其执行流程图如下:
[font=-apple-system, BlinkMacSystemFont, &quot]       通过 [font=-apple-system, BlinkMacSystemFont, &quot]irm [font=-apple-system, BlinkMacSystemFont, &quot]下载的脚本主要内容如下:
PowerShell脚本主要内容
[font=-apple-system, BlinkMacSystemFont, &quot]        文字版描述脚本运行逻辑如下:[font=-apple-system, BlinkMacSystemFont, &quot]        [font=-apple-system, BlinkMacSystemFont, &quot]1.删除a.ps1(部分版本通过a.ps1文件运行)。        2.创建 %APPDATA%Stool 目录。        3.通过注册表读取 Steam 路径并终止正在运行的 Steam 进程。        4.从 gitee 仓库下载 legit, appdata.vdf, hid.dll, zlib1.dll 文件并解密。        5.删除 Steam 路径中的 steam.cfg, version.dll, user32.dll 文件 (其他版本的假入库利用文件)。        6.修改 loginusers.vdf 文件中 WantsOfflineMode = 0 来关闭离线模式。        7.修改 config.vdf 中 DisableShaderCache = 1 来关闭着色器缓存。        8.通过 steam://open/activateproduct 来打开 Steam 并启动激活窗口。[font=-apple-system, BlinkMacSystemFont, &quot]        利用[font=-apple-system, BlinkMacSystemFont, &quot]hid.dll [font=-apple-system, BlinkMacSystemFont, &quot]篡改程序执行流程是网络灰黑产常用手段,因其隐蔽性和优先级高、实施简单且兼容性好,深受黑灰产从业者青睐。[font=-apple-system, BlinkMacSystemFont, &quot]        由于[font=-apple-system, BlinkMacSystemFont, &quot] hid.dll [font=-apple-system, BlinkMacSystemFont, &quot]是 Steam 客户端运行必需的系统 DLL 动态链接库,脚本将伪造的[font=-apple-system, BlinkMacSystemFont, &quot] hid.dll[font=-apple-system, BlinkMacSystemFont, &quot] 放在与 Steam 可执行文件相同的目录中。系统会优先加载该目录下的 [font=-apple-system, BlinkMacSystemFont, &quot]hid.dll[font=-apple-system, BlinkMacSystemFont, &quot],而非系统路径中的原始文件。通过这种优先加载机制,伪造的[font=-apple-system, BlinkMacSystemFont, &quot] hid.dll[font=-apple-system, BlinkMacSystemFont, &quot] 可以在 Steam 初始化前执行其代码,从而篡改客户端的运行逻辑。
HID.DLL代码
[font=-apple-system, BlinkMacSystemFont, &quot]        该 [font=-apple-system, BlinkMacSystemFont, &quot]hid.dll[font=-apple-system, BlinkMacSystemFont, &quot] 携带由已注册公司提供、状态正常的签名,公司信息为“临沂追风艾美信息科技有限公司”。
状态正常的签名信息
[font=-apple-system, BlinkMacSystemFont, &quot]         当Steam客户端运行后,其会自动加载[font=-apple-system, BlinkMacSystemFont, &quot]hid.dll[font=-apple-system, BlinkMacSystemFont, &quot]。该文件首先从系统路径载入原有的[font=-apple-system, BlinkMacSystemFont, &quot]hid.dll[font=-apple-system, BlinkMacSystemFont, &quot],以确保相关程序功能正常运行;随后对先前释放的[font=-apple-system, BlinkMacSystemFont, &quot]appdata.vdf[font=-apple-system, BlinkMacSystemFont, &quot]文件进行解密与解压,并在内存中直接执行所得到的DLL动态链接库文件。[font=-apple-system, BlinkMacSystemFont, &quot]由于此DLL由[font=-apple-system, BlinkMacSystemFont, &quot]appdata.vdf[font=-apple-system, BlinkMacSystemFont, &quot]解密并解压生成,下文将其称之为[font=-apple-system, BlinkMacSystemFont, &quot]appdata.dll[font=-apple-system, BlinkMacSystemFont, &quot]。[font=-apple-system, BlinkMacSystemFont, &quot]         该 [font=-apple-system, BlinkMacSystemFont, &quot]appdata.dll [font=-apple-system, BlinkMacSystemFont, &quot]文件读取其内存中的一系列hash字符串并将其在内存中解码为新的DLL动态链接库文件,然后在内存中不落地执行该最终DLL动态链接库,我们将其称为 [font=-apple-system, BlinkMacSystemFont, &quot]unpacker.dll[font=-apple-system, BlinkMacSystemFont, &quot] 。然后, [font=-apple-system, BlinkMacSystemFont, &quot]unpacker.dll [font=-apple-system, BlinkMacSystemFont, &quot]读取 [font=-apple-system, BlinkMacSystemFont, &quot]legit [font=-apple-system, BlinkMacSystemFont, &quot]文件并在解密解压后内存执行,我们将其称为 [font=-apple-system, BlinkMacSystemFont, &quot]legit.dll [font=-apple-system, BlinkMacSystemFont, &quot]。最后,核心动态链接库[font=-apple-system, BlinkMacSystemFont, &quot] legit.dll[font=-apple-system, BlinkMacSystemFont, &quot] 执行程序的主要逻辑。此时,程序中共有 3 个内存 DLL 文件(Memory-PE)。
内存中DLL文件表
二、核心流程分析
        核心动态链接库文件 legit.dll 的主要逻辑代码均由代码虚拟化保护壳保护,分析难度较高。
[1]程序在 Steam 进程空间中劫持系统库、加密库、UI库、客户端库的执行逻辑。
程序劫持的程序流程表
[2]程序请求托管在公开网站上的数据,获取可更新的服务器地址。
        首先,程序从内存中解密、生成配置并解析配置来控制后续的行为。
内存中生成的数据
        解密后的数据包含用于替换用户数据的Steam用户ID、存储云控配置所在的GitHub仓库路径与分支信息、待启用功能特性以及访问时使用的UA等配置参数。
        配置中还包含多个镜像地址,用于确保全球不同地区均可访问获取云控配置数据。程序将通过访问指定的代码仓库来下载经过加密的云控配置文件。
云控原始数据
[font=-apple-system, BlinkMacSystemFont, &quot][3]程序在本地生成数据库,将劫持得到的Steam数据保存到本地。     [font=-apple-system, BlinkMacSystemFont, &quot]         程序运行时会把本地数据以加密 sqllite 数据库的方式保存到 [font=-apple-system, BlinkMacSystemFont, &quot]%APPDATA%Stool[font=-apple-system, BlinkMacSystemFont, &quot] 目录中的[font=-apple-system, BlinkMacSystemFont, &quot] info[font=-apple-system, BlinkMacSystemFont, &quot] ,[font=-apple-system, BlinkMacSystemFont, &quot] info-journal [font=-apple-system, BlinkMacSystemFont, &quot],[font=-apple-system, BlinkMacSystemFont, &quot] info-wal[font=-apple-system, BlinkMacSystemFont, &quot] 文件中。其中 [font=-apple-system, BlinkMacSystemFont, &quot]info [font=-apple-system, BlinkMacSystemFont, &quot]应为加密后的数据库长期存储文件, [font=-apple-system, BlinkMacSystemFont, &quot]info-journal [font=-apple-system, BlinkMacSystemFont, &quot]和 [font=-apple-system, BlinkMacSystemFont, &quot]info-wal [font=-apple-system, BlinkMacSystemFont, &quot]是在 sqllite 数据库操作的过程中产生的临时文件,程序会在使用后立即删除。
产生的文件
[font=-apple-system, BlinkMacSystemFont, &quot]        经过对程序逻辑的详细分析后,解析得到程序数据库文件结构如下:
程序数据库文件结构
[font=-apple-system, BlinkMacSystemFont, &quot]        程序可以通过劫持 [font=-apple-system, BlinkMacSystemFont, &quot]crypt32.CryptUnprotectData [font=-apple-system, BlinkMacSystemFont, &quot]的方式[font=-apple-system, BlinkMacSystemFont, &quot]过滤获取所有将解密的密钥数据[font=-apple-system, BlinkMacSystemFont, &quot],使得用户数据不再安全,并将用户的敏感信息字段:[font=-apple-system, BlinkMacSystemFont, &quot]AuthSessionTicket [font=-apple-system, BlinkMacSystemFont, &quot]的二进制源数据,[font=-apple-system, BlinkMacSystemFont, &quot]jwt [font=-apple-system, BlinkMacSystemFont, &quot]的完整字符串数据完整保存到数据库中。[font=-apple-system, BlinkMacSystemFont, &quot]    [font=-apple-system, BlinkMacSystemFont, &quot]    AuthSessionTicket[font=-apple-system, BlinkMacSystemFont, &quot] 是 Steam 中的用户身份验证令牌,持有令牌后[font=-apple-system, BlinkMacSystemFont, &quot]可以使用用户的账户请求任意 Steam API [font=-apple-system, BlinkMacSystemFont, &quot],从而窃取账户所有权。[font=-apple-system, BlinkMacSystemFont, &quot]       在Steam平台用户数据中[font=-apple-system, BlinkMacSystemFont, &quot] jwt [font=-apple-system, BlinkMacSystemFont, &quot]全称[font=-apple-system, BlinkMacSystemFont, &quot] JSON Web Token[font=-apple-system, BlinkMacSystemFont, &quot] ,持有者[font=-apple-system, BlinkMacSystemFont, &quot]可以获得 Steam 账户的登录权限[font=-apple-system, BlinkMacSystemFont, &quot],从而窃取账户所有权。[font=-apple-system, BlinkMacSystemFont, &quot]       具体来说,程序在图中代码处完整的将用户的 [font=-apple-system, BlinkMacSystemFont, &quot]jwp [font=-apple-system, BlinkMacSystemFont, &quot]令牌数据插入到本地加密的数据库中。[font=-apple-system, BlinkMacSystemFont, &quot]       图中的代码可以通过 [font=-apple-system, BlinkMacSystemFont, &quot]51 53 8B 5C 24 0C 55 56 57 8B 73 14 33 FF 80 7E 11 02[font=-apple-system, BlinkMacSystemFont, &quot] 特征码来定位。
将插入JWT事务提交到数据库中        
[font=-apple-system, BlinkMacSystemFont, &quot]       其中插入语句如下:
插入语句
[font=-apple-system, BlinkMacSystemFont, &quot]         程序所收集的[font=-apple-system, BlinkMacSystemFont, &quot]jwt[font=-apple-system, BlinkMacSystemFont, &quot]数据包含用户的完整令牌以及与之对应的数字签名信息,其过期时间约为八个月,并且具备更新(renew)权限。
收集到的JWT数据格式
收集到的JWT数字签名信息
[font=-apple-system, BlinkMacSystemFont, &quot]        此外,程序会获取并保存一系列用户数据至其自身数据库,同时通过该数据库保存自身的数据及配置信息。[font=-apple-system, BlinkMacSystemFont, &quot][4] 用户通过激活码兑换游戏时,程序劫持原本控制流并下发虚假的清单文件。[font=-apple-system, BlinkMacSystemFont, &quot]        为了确保灰产手法不被复现,此处简略叙述该方案。在Steam平台中,每个游戏对应一个 [font=-apple-system, BlinkMacSystemFont, &quot]depot [font=-apple-system, BlinkMacSystemFont, &quot](仓库),其中每个下发给用户的版本对应一个 [font=-apple-system, BlinkMacSystemFont, &quot]manifest[font=-apple-system, BlinkMacSystemFont, &quot]   (清单)。在平台用户获取了对应游戏的所有权后,平台才将对应的[font=-apple-system, BlinkMacSystemFont, &quot] manifest [font=-apple-system, BlinkMacSystemFont, &quot]资源和解密密钥下发给对应的用户,从而使得用户可以下载和启动对应版本的游戏资源。[font=-apple-system, BlinkMacSystemFont, &quot]       该“假入库”程序借助修改Steam客户端代码的手段,使客户端得以获取“数据来源账户”所购买游戏的清单[font=-apple-system, BlinkMacSystemFont, &quot](manifest)[font=-apple-system, BlinkMacSystemFont, &quot]以及对应的授权密钥,进而借助“数据来源账户”的数据来下载并启动相应版本的游戏资源。由于仅在Steam客户端实施了相关欺骗行为,实际上云端并无供游戏提供方获取的对应真实数据,因此通过此方式下载并启动的游戏仅可使用离线游戏功能。[font=-apple-system, BlinkMacSystemFont, &quot]       其在密钥激活时,通过[font=-apple-system, BlinkMacSystemFont, &quot]隐蔽TCP且加密请求[font=-apple-system, BlinkMacSystemFont, &quot]的方式携带用户的数据和机器特征信息请求服务器地址[font=-apple-system, BlinkMacSystemFont, &quot]45.207.10.185[font=-apple-system, BlinkMacSystemFont, &quot]来从服务器下载与密钥对应的游戏数据文件。[font=-apple-system, BlinkMacSystemFont, &quot]       创建与服务端的连接时,程序会收集用户的一系列关联信息例如用户名、机器特征等并上传。此处通过监控程序中 OpenSSL 库的 AES128 解密函数可以获取程序的请求:[font=-apple-system, BlinkMacSystemFont, &quot]       图中的代码可以通过 [font=-apple-system, BlinkMacSystemFont, &quot]55 53 56 57 8B 4C 24 1C 83 F9 00 0F 84 D4 01 00 00 [font=-apple-system, BlinkMacSystemFont, &quot]特征码来定位。
携带机器码和用户信息的请求格式
用于获取游戏假清单的请求格式
         返回的格式如下。
游戏数据返回格式
        其中 user 和 AppOwn 为“数据来源用户”的名称和 Steam ID 。[font=-apple-system, BlinkMacSystemFont, &quot][font=&amp][size=; font-size: 10.5pt,10.5pt][font=-apple-system, BlinkMacSystemFont, &quot]        通过相关平台查询,发现[font=-apple-system, BlinkMacSystemFont, &quot][font=&amp]“[font=-apple-system, BlinkMacSystemFont, &quot]数据来源用户[font=-apple-system, BlinkMacSystemFont, &quot][font=&amp]”[font=-apple-system, BlinkMacSystemFont, &quot]的信息如下。
数据来源用户信息
[font=-apple-system, BlinkMacSystemFont, &quot][5]程序按照时间生成序列化的数据,目标地址为服务器地址。[font=-apple-system, BlinkMacSystemFont, &quot]        即便未进行激活操作,程序亦持续处于活跃状态,且准备将要被发送到目标服务器的序列化数据代码。
准备在队列中将要被发送的数据
[font=-apple-system, BlinkMacSystemFont, &quot]       数据以队列的方式在内存中准备,每条数据携带其生成时的时间戳和将被发送的加密数据,队列中可见 SteamId , features 等字段,推测这些数据为分散式队列加密发送程序在运行期间所收集到的信息。
抓包加密数据图
[font=-apple-system, BlinkMacSystemFont, &quot][6]程序修改Steam配置项禁用自动更新。[font=-apple-system, BlinkMacSystemFont, &quot]        通过设置 Steam 根目录 steam.cfg 中  BootStrapperInhibitAll = Enable 的方式,禁用 Steam 客户端自动更新,防止程序失效。
禁用Steam客户端自动更新
[font=-apple-system, BlinkMacSystemFont, &quot]三、关键风险总结[font=-apple-system, BlinkMacSystemFont, &quot][1] 部分售卖该程序的商家在发布或推销时通过模糊的说辞欺骗并诱导用户下载程序。[font=-apple-system, BlinkMacSystemFont, &quot][2] 程序通过修改 Steam 客户端的方式提供服务,通过恶意手段破坏官方客户端的安全性以实施注入操作,使用户数据陷入风险。[font=-apple-system, BlinkMacSystemFont, &quot][3] 程序将用户的敏感数据,甚至是登录令牌收集至自身数据库进行存储与传输。[font=-apple-system, BlinkMacSystemFont, &quot][4] 程序所采用的一系列运行方式与病毒的行为特征极为相似。[font=-apple-system, BlinkMacSystemFont, &quot][5] 程序配置可以由云端服务器随时修改控制,存在极强的安全隐患。[font=-apple-system, BlinkMacSystemFont, &quot]        从 Gitee 仓库日志能够得知,在文章完成定稿的前 14 天,作者仍通过云端仓库对下发的数据进行修改。
云端仓库下发数据
四、附录
HASH:
HASH
C&C:
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。