反恐精英0 day,被用于传播Belonard木马

ang010ela 新闻 2019年3月20日发布
Favorite收藏

导语:​研究人员发现反恐精英Counter-Strike 1.6存在0 day漏洞,攻击者利用该漏洞来传播Belonard木马。

反恐精英Counter-Strike 1.6是Valve Software(维尔福软件公司)2000年发布的一款游戏。截止目前,该游戏仍然有很多忠实粉丝。使用官方CS 1.6客户端的有20000在线用户,在Steam上注册的游戏服务器数量超过5000个。

出于广告和获利的目的,名为Belonard的开发者使用他的服务器用木马感染了CS 1.6玩家的设备,并用其账号推荐其他的游戏服务器。

恶意服务器的所有者使用游戏客户端的漏洞和木马作为其技术基础。木马的目的就是感染玩家设备并下载恶意软件来确保系统中木马的安全,并将它分发到其他玩家的设备上。截止目前,至少在官方游戏客户端和4个盗版游戏客户端中发现了多个远程代码执行RCE漏洞。

在系统中安装完成后,木马将游戏客户端中可用的游戏服务器列表替换,并在受感染的计算机上创建代理来传播木马。代理服务器的ping值会比较小,玩家会觉得这是最快的服务器。选择了代理服务器后,玩家就会被重定向到会感染木马的恶意服务器上。

基于此,木马开发者就可用创建一个由CS 1.6客户端组成的僵尸网络。根据分析师的分析,官方Steam客户端的5000个服务器中有1951个都是Belonard木马创建的。

感染客户端

木马Trojan.Belonard含有11个组件,可用根据游戏客户端在不同的场景下运作。如果使用了官方客户端,木马就会利用RCE漏洞来感染设备;盗版客户端的感染也是一样的。如果用户从恶意服务器所有者的网站上下载受感染的客户端,游戏第一次启动后就保证了木马在系统中的驻留。

#drweb

当用户启动官方Steam客户端并选择游戏服务器时,如果链接到恶意服务器,就会利用RCE漏洞上传恶意库到受害者的设备。根据漏洞的类型,会下载和执行client.dll (Trojan.Belonard.1)或Mssv24.asi (Trojan.Belonard.5)。

木马Trojan.Belonard.1会在受害者设备上删除任意的和库文件相同目录下的.dat文件。之后恶意库会理解到C2服务器fuztxhus.valve-ms[.]ru:28445,并发送解密的请求来下载文件Mp3enc.asi (Trojan.Belonard.2)。服务器会在响应中发送加密的文件。

下图是来自服务器的解密的数据包:

#drweb

安装到客户端

启动后,游戏会从游戏代理处下载ASI文件。从木马开发者的网站下载的客户端会感染木马Trojan.Belonard.10 (Mssv36.asi),但是木马在系统中发安装于在清洁版的游戏客户端不同。安装到受感染的客户端之后,木马Trojan.Belonard.10会检查用户操作系统中的组件。如果不存在,就从主体释放组件并下载Trojan.Belonard.5 (Mssv24.asi)到进程内存中。与其他模块类似,Trojan.Belonard.10会修改创建、修改和访问的日期和时间,所以木马的文件无法通过对文件夹中的内容安装创建日期排序找出。

在安装完新组件后,木马Trojan.Belonard.10仍然在系统中,承担客户端的保护校色。它会来自其他游戏服务器的过滤请求、文件和命令,将客户端修改变化相关的数据转移到木马开发者的服务器上。

Trojan.Belonard.5会接收关于运行进程和路径的信息。如果进程名不是rundll32.exe,就开始一个新的线程用于随后的动作。在运行的线程中,木马Trojan.Belonard.5会创建注册表值[HKCU\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers] '<path to the executable file process>,分配值RUNASADMIN,检查模块名。如果不在Mssv24.asi,就在Mssv24.asi模块中复制自己、删除名字不同的版本、启动Trojan.Belonard.3 (Mssv16.asi)。如果名字匹配,就立刻下载和启动木马。

在干净客户端中执行是由木马Trojan.Belonard.2进行的。下载后,木马会检查client.dll(Trojan.Belonard.1)加载的进程的DllMain。如果不在rundll32.exe中,就用注册表key [HKCU\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers] '<path to the executable file process>创建一个线程,并且分配给它值RUNASADMIN。然后,木马会手机用户设备中的数据,从DialogGamePage.res文件中提取信息;再将这些收集的数据以加密格式的形式发送给木马开发者的服务器。

收集的系统数据结构如下:

#drweb

服务器会响应Mssv16.asi (Trojan.Belonard.3)文件。关于新模块的元数据会保存在DialogGamePage.res文件中,而Trojan.Belonard.5会从用户设备中移除。

系统中安装

确保木马在系统中驻留利用了木马Trojan.Belonard.3。木马安装后就会移除Trojan.Belonard.5和检查进程。如果不在rundll32.exe中,就保存另外2个木马到%WINDIR%\System32\文件夹中,分别是Trojan.Belonard.7 (WinDHCP.dll)和Trojan.Belonard.6 (davapi.dll)。这2个木马的主体被分成0xFFFC字节的区块。当保存在硬盘中,木马会将所有区块集合起来来获取工作文件。

集合起来后,Trojan.Belonard.3会创建一个WinDHCP服务在svchost.exe环境中来运行WinDHCP.dll (Trojan.Belonard.7)。根据语言设置,操作系统使用俄语或英语来设置服务参数。

WinDHCP服务参数:

Service name: “Windows DHCP Service” or “Служба Windows DHCP”;
Description: “Windows Dynamic Host Configuration Protocol Service” or “Служба протокола динамической настройки узла Windows”;

ImagePath参数指定为 “%SystemRoot%\System32\svchost.exe -k netsvcs”,而ServiceDll制定了到木马库的路径。

之后,Trojan.Belonard.3会检查WinDHCP是否在运行。如果没有运行,就重新安装该服务。

Trojan.Belonard.7 是一个含有ServiceMain导出函数的WinDHCP.dll,它是通过自动运行服务来安装在受感染的设备上。其目的是检查注册表key HKLM\\SYSTEM\\CurrentControlSet\\Services\\WinDHCP中的Tag参数。如果设置为0,Trojan.Belonard.7会加载davapi.dll,调用其导出函数,传递一个到SERVICE_STATUS的指针作为参数,该参数反映了WinDHCP服务的状态。然后等待1秒并再次检查tag参数。如果值不等于0,Trojan.Belonard.7就会加载spwinres.dll。之后,调用spwinres.dll的导出函数,传递一个到SERVICE_STATUS的指针作为参数。木马每秒钟都回重复上面的操作。

WinDHCP服务参数:

<RegistryKey Name="WinDHCP" Subkeys="1" Values="11">
 <RegistryKey Name="Parameters" Subkeys="0" Values="1">
 <RegistryValue Name="ServiceDll" Type="REG_EXPAND_SZ" SizeInBytes="68" Value="%SystemRoot%\system32\WinDHCP.dll" />
 </RegistryKey>
 <RegistryValue Name="Type" Type="REG_DWORD" Value="32" />
 <RegistryValue Name="Start" Type="REG_DWORD" Value="2" />
 <RegistryValue Name="ErrorControl" Type="REG_DWORD" Value="0" />
 <RegistryValue Name="ImagePath" Type="REG_EXPAND_SZ" SizeInBytes="90" Value="%SystemRoot%\System32\svchost.exe -k netsvcs" />
 <RegistryValue Name="DisplayName" Type="REG_SZ" Value="Служба Windows DHCP" />
 <RegistryValue Name="ObjectName" Type="REG_SZ" Value="LocalSystem" />
 <RegistryValue Name="Description" Type="REG_SZ" Value="Служба протокола динамической настройки узла Windows" />
 <RegistryValue Name="Tag" Type="REG_DWORD" Value="0" />
 <RegistryValue Name="Data" Type="REG_BINARY" SizeInBytes="32" Value="f0dd5c3aeda155767042fa9f58ade24681af5fbd45d5df9f55a759bd65bc0b7e" />
 <RegistryValue Name="Scheme" Type="REG_BINARY" SizeInBytes="16" Value="dcef62f71f8564291226d1628278239e" />
 <RegistryValue Name="Info" Type="REG_BINARY" SizeInBytes="32" Value="55926164986c6020c60ad81b887c616db85f191fda743d470f392bb45975dfeb" />
 </RegistryKey>

在函数开始启动前,木马Trojan.Belonard.6会检查WinDHCP服务注册表的Tag和Data参数。Data参数必须含有用于生成AES Key的数组。如果没有,木马就使用openssl库来生成32随机字节,用于生成加密key。之后,木马会读取WinDHCP服务的Info和Scheme参数。在Scheme中,木马保存了4个参数,都使用AES加密,info保存了已安装持续列表的SHA256哈希值。

Trojan.Belonard.6会解密C2服务器的地址oihcyenw.valve-ms[.]ru,并尝试与服务器建立连接。如果连接失败,木马就使用DGA来生成.ru zone内的域名。但是域名生成代码中存在错误,因此无法为木马开发者创建域名。

在发送加密的信息后,木马从服务器处接收了响应消息,解密并保存到%WINDIR%\System32\。数据中含有木马wmcodecs.dll (Trojan.Belonard.8)和ssdp32.dll (Trojan.Belonard.9)。

Belonard还会在设备上安装新的游戏客户端,这是由Trojan.Belonard.8和Trojan.Belonard.6完成的。

Trojan.Belonard.8会初始化一个含有关于Counter-Strike 1.6客户端文件名和SHA 256哈希的容器。Trojan.Belonard.6会开始搜索安装的游戏客户端。如果木马找到运行的客户端,就根据从Trojan.Belonard.8接收的数据检查文件和SHA 256哈希值的列表。如果不匹配的话,Trojan.Belonard.8会结束客户端进程,然后释放hl.exe文件到游戏目录。该文件只有展示在加载游戏时会显示错误信息“Could not load game. Please try again at a later time”。这样木马就有时间他替换客户端的文件。然后,木马会用工作文件替换Hl.exe,这样游戏启动时就会出现错误了。

木马会删除以下客户端文件:

<path>\\valve\\dlls\\*
 <path>\\cstrike\\dlls\\*
 <path>\\valve\\cl_dlls\\*
 <path>\\cstrike\\cl_dlls\\*
 <path>\\cstrike\\resource\\*.res
 <path>\\valve\\resource\\*.res
 <path>\\valve\\motd.txt
 <path>\\cstrike\\resource\\gameui_english.txt
 <path>\\cstrike\\resource\\icon_steam.tga
 <path>\\valve\\resource\\icon_steam.tga
 <path>\\cstrike\\resource\\icon_steam_disabled.tga
 <path>\\valve\\resource\\icon_steam_disabled.tga
 <path>\\cstrike\\sound\\weapons\\fiveseven_reload_clipin_sliderelease.dll
 <path>\\cstrike_russian\\sound\\weapons\\fiveseven_reload_clipin_sliderelease.dll
 <path>\\cstrike_romanian\\sound\\weapons\\fiveseven_reload_clipin_sliderelease.dll

根据操作系统的语言设定,木马会下载英文和俄文的游戏菜单文件。

木马的payload是在用户设备上枚举大量的伪造的游戏服务器。为此,木马会将游戏客户端的相关信息转移到开发者的服务器,服务器会响应创建伪造服务器的加密参数。

#drweb

Trojan.Belonard.9会创建代理游戏服务器并有Steam API注册。游戏服务器端口是从服务器指定的game_srv_low_port的最低值开始顺序定义的。服务器还会设置fakesrvbatch的值,该值巨顶了协议模拟器线程的数量。模拟器支持到Goldsource引擎游戏服务器的基本请求:A2S_INFO, A2S_PLAYER, A2A_PING, 接收challenge steam/non-steam client请求等。在响应connect命令后,木马就会追踪来自客户端的第一个和第二个包。

在交换这些包后,木马会发送最后一个包svc_director,可以启动CS客户端任意命令的执行。该漏洞从2014年发现至今一直没有修复。尝试连接到游戏代理服务器后,玩家会被重定向到恶意服务器。之后,木马开发者可以利用用户游戏客户端的漏洞来安装Trojan.Belonard。但是Trojan.Belonard.9也有一个bug,可以用来检测木马伪造的游戏服务器。而且在Game列,伪造的服务器有一个字符串Counter-Strike n,n的范围在1到3之间。

#drweb

加密

Belonard使用加密来在木马中保存数据,以及与服务器进行通信。它会保存C2服务器的加密名,一些代码和库名。老版本的木马使用的另一个算法来加密代码。Trojan.Belonard.2中的解密算法如下所示:

def decrypt(d):
   s = ''
   c = ord(d[0])
   for i in range(len(d)-1):
     c = (ord(d[i+1]) + 0xe2*c - 0x2f*ord(d[i]) - 0x58) & 0xff
   s += chr(c)
   return s

老版本的解密算法:

def decrypt(data):
   s = 'f'
   for i in range(0,len(data)-1):
     s += chr((ord(s[i]) + ord(data[i]))&0xff)
   print s

Belonard使用一个很复杂的加密方法来与C2服务器交换数据。在发送信息到服务器之前,木马会将每个模块变成不同的结构。收集的数据会用恶意软件中保存的RSA公钥加密。但RSA只对数据的前342字节进行加密,如果模块发送的包的数据大于342字节,只有前342字节会被加密,剩下的数据会用AES加密。

详细分析报告下载地址:https://st.drweb.com/static/new-www/news/2019/march/belonard_trojan_en.pdf

本文翻译自:https://news.drweb.com/show/?i=13135&lng=en如若转载,请注明原文地址: https://www.4hou.com/info/news/16876.html
点赞 2
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论