攻破 Telegram, Steam, 加密货币钱包… 全面揭秘信息窃取恶意软件的技术细节 - iYouPort

2019-07-31 原文 #iYouPort 的其它文章

攻破 Telegram, Steam, 加密货币钱包… 全面揭秘信息窃取恶意软件的技术细节

  • 如何窃取 Telegram 数据?如何窃取 Steam 数据?如何窃取加密货币钱包?如何窃取浏览器数据?……Fumik0 对 Predator 恶意软件进行了详细分析。本文适合初级逆向工程师或恶意软件分析人员阅读,希望能让大家轻松了解恶意软件所使用的某些技术或技巧,并掌握应对方法

一、概述

本文主要针对一个窃取用户信息的恶意软件 Predator the thief 进行深入分析,该软件使用 C/C++ 语言编写。与当今主流的恶意软件一样,该恶意软件可以作为构建器(Builder),也可以通过C&C渠道下载额外的恶意软件。

对这一恶意软件进行了详细分析,并对其中的一些重点功能模块进行了详细拆解和分析。本文适合初级逆向工程师或恶意软件分析人员阅读,希望通过我们的分析,能让大家轻松了解恶意软件所使用的某些技术或技巧,并掌握应对方法。

二、信息窃取软件的典型生命周期

对于如今的大多数信息窃取软件来说,其执行顺序几乎相同,但逃避检测技术则根据所使用的 C&C 通信方式而有所不同。举例来说,在 Predator 中,设置过程非常简单,但如果攻击者在其 C&C 上部署了加载程序(Loader),就会有所不同了。

Predator the thief 的生命周期:

三、准备阶段

在窃取敏感数据之前,Predator 首先需要进行一些基本的设置才能正常工作。所有的配置,都是逐步加载到内存之中的。

我们将断点设置在 0x00472866 的位置,并检查代码:

1、EBX 设置为循环的长度(在我们所分析的样本中,长度为 0x0F);

2、ESI 保存所有函数地址;

3、EAX 将从 ESI 获取一个地址,并将其移动到 EBP-8;

4、调用 EBP(在这时,配置函数将解压缩一些数据,并将其保存到栈中);

5、ESI 的位置现在提前4位;

6、EDI 递增,直至该值与 EBX 值相等;

7、当 EDI == EBX 时,也就表示所有必须的配置值都已经存储到栈中。此时,恶意软件的主要部分便可以启动。

举例来说,我们看看 00488278 位置的 0040101D 中的内容。

通过x32dbg,使用简单的命令就可以进行查看。

go 0x0040101D

如我们所见,这是C&C存储的位置,该内容已经保存到了栈中。

恶意软件使用这种方式,存储如下内容:

  • C&C 域名
  • %APPDATA% 文件夹
  • Predator 文件夹
  • Predator 压缩文件的临时名称和位置
  • 发送给 C&C 服务器的压缩文件名称
  • 等等…

恶意软件在 %APPDATA%/Roaming 路径下创建 Predator 文件夹(\ptst)。值得注意的是,其名称是通过 XOR 操作后的硬编码字符串保存的,而并非随机生成。我们猜测,这有可能是 “Predator The Stealer” 的快捷方式。

信息窃取过程中,临时存档的文件名为“ zpar.zip ”。

四、反逆向机制

当我们终于来到恶意软件的主要模块时,发现寻址获得的结果是一个循环 0x06400000 次的文本。这应该是恶意软件设计的反逆向工程机制。

五、混淆技术

5.1 大规模使用的 XOR 操作

在分析中我们发现,该样本中几乎所有字符串都经过了 XOR 操作。但是,这种混淆技术很容易发现,并且是最易于解密的一种方式。在这里,XOR 操作的目的只是为了减慢恶意软件分析的速度。

5.2 使用 GetProcAddress 的替代方案

为了避免直接调用来自不同库的模块,恶意软件使用一些传统的机制,逐一搜索特定的API请求,并将其存储到寄存器中。此外,它还允许将对模块的直接调用隐藏到简单的寄存器调用中。

首先,解密 XOR 运算后的字符串(一个DLL)。针对这种情况,恶意软件要调用的特定模块需要用到 kernel32.dll。

解密完成后,该库使用 LoadLibraryA 进行加载。随后,明文内容 “CreateDirectoryA” 被 PUSH 到 EDX 中,这是恶意软件需要使用到的模块。

现在,恶意软件需要从 kernel32.dll 中检索并导出函数 CreateDirectoryA 的地址。通常,需要通过 GetProcAddress 来实现。但由于 GetProcAddress 是众多安全防护机制重点关注的目标,该恶意软件换用了另一种方式来获取该值。

该字符串和 kernel32.dll 的 IMAGE_DOS_HEADER 都将一起被发送到 func_GetProcesAddress_0。我们可以在导出表(Export Table)的帮助下,手动获取到想要的函数地址的指针。我们接下来仔细查看其中的代码。

struct IMAGE_EXPORT_DIRECTORY {
       long Characteristics;
       long TimeDateStamp;
       short MajorVersion;
       short MinorVersion;
       long Name;
       long Base;
       long NumberOfFunctions;
       long NumberOfNames;
       long *AddressOfFunctions;    <= This good boy
       long *AddressOfNames;        <= This good boy
       long *AddressOfNameOrdinals; <= This good boy
}

结构IMAGE_EXPORT_DIRECTORY中,必须要包含三个字段:

  • AddressOfFunctions:包含模块中函数相对值地址(RVA)的数组;
  • AddressOfNames:包含模块中所有函数的数组,以升序排列;
  • AddressOfNamesOrdinals:一个16位数组,其中包含 AddressOfNames 所有相关的函数名称。

源代码: https://en.wikibooks.org/wiki/X86_Disassembly/Windows_Executable_Files

在保存了这三个数组的绝对位置后,循环过程非常简单。

1、抓取一个函数的相对值地址(RVA);

2、获取该函数的名称;

3、将字符串与所需字符串进行比较。

在这里,详细分析一下其实现方式:

如果我们对 ds:[eax+edx*4] 进行仔细查看,发现其中存储了 kernel32.dll 导出表函数的所有相对值地址。

下一条指令是 eax,ecx,用于计算 AddressOfNames 数组中字符串值的准确位置。

DLLBaseAddress + AddressOfNameRVA[i] = Function Name
   751F0000    +       0C41D4        = CreateDirectoryA

经过比较后,发现二者匹配,所以对 procAddress 进行存储。首先,保存函数的序号(Ordinal Number),然后借助该值,获取函数地址位置,并保存到ESI中。

ADD           ESI, ECX
ProcAddress = Function Address + DLLBaseAddress

经过反汇编后,大致如下:

procAddress 的代码如下:

至此,一切妥当,函数的地址已经保存到EAX中,只需要等待调用即可。

六、反虚拟机技术

在这里,使用了一个简单的反虚拟机技术,来防止恶意软件在虚拟机上运行。这也是 Predator 所使用的唯一的反分析技术。

首先,通过 LoadLibraryA,动态加载 User32.dll(经过 XOR 处理),然后使用 User32.dll 请求 EnumDisplayDevicesA 模块。在这里,恶意软件希望获取当前使用显示器的“设备描述”值。

完成后,将该结果与一些特定值进行比对(同样经过了 XOR 处理):

Hyper-V
VMware
VirtualBox

如果字符串匹配,那么就会重定向到名为 func_VmDetectedGoodBye 的函数。

如何绕过这种反虚拟机技术?

为了绕过恶意软件的这种检测技术,我们将 DriverDesc的REG_SZ 值修改为 {4d36e968-e325–11ce-bfc1–08002be10318}。

然后,便成功绕过了这一检测。

七、信息窃取部分

接下来,我们分析这一恶意软件的主要目的,也就是它如何完成信息窃取的。目前,我对大部分代码进行了反汇编,得到了恶意软件在 ptst 存储库上设置的所有文件夹,并将其压缩后发送到 C&C 服务器。

文件夹

· Files:保存特定路径中所有文本或文档文件。

· FileZilla:从FTP中获取1–2个文件。

· WinFTP:从FTP中获取1个文件。

· Cookies:保存来自不同浏览器的Cookie内容。

· General:通用数据。

· Steam:窃取账户登录信息。

· Discord:窃取账户登录信息。

文件

· Information.log

· Screenshot.jpeg:当前屏幕截图。

7.1 窃取Telegram数据

恶意软件通过检查计算机上是否存在KeyPath“Software\Microsoft\Windows\CurrentVersion\Uninstall\{53F49750–6209–4FBF-9CA8–7A333C87D1ED}_is1”的方法,来验证计算机是否安装 了Telegram。

那么,这个 KeyPath 中的内容是什么呢?在深入分析代码后,我们发现恶意软件会获取 InstallLocation 的值,这是主机上 Telegram 的安装位置。

重新创建路径(在这里,所有字符串也都被异或)

%TELEGRAM_PATH%
\Telegram Desktop
\tdata
\D877F783D5D3EF8C

文件夹 D877F783D5D3EF8C 是存储所有 Telegram 缓存的位置,这也是恶意软件想要获取的敏感数据。此外,在此过程中,还会检查 map*文件(例如 map1),该文件实际上是加密密钥。所以,攻击者如果获取到这一文件夹中的内容,就能够访问目标用户的应用软件数据。

7.2 窃取 Steam 数据

该恶意软件用于窃取某个特定软件中数据的技术,在大多数情况下都是类似的。这样一来,就能极大的帮助我们理解这一恶意软件。

首先,恶意软件检查 HKCU\Software\Valve\Steam中的SteamPath 键值,获取正确的 Steam 存储位置。在获取该位置之后,才能进一步找到保存 Steam 账户信息的相关文件。

通过 func_FindFiles,检查计算机上是否存在 ssfn 文件。如果存在,会将其复制到位于 %APPDATA%/XXXX 的恶意软件临时文件夹中。同样,针对 config.vdf 也进行相同的操作。

那么,这些文件有什么意义呢?经过搜索,我们发现了 Reddit 上的一篇文章,主要介绍了 ssfn 文件允许在用户登录期间绕过 SteamGuard 防护机制。

那么,第二个文件的作用呢?在这里,可以找到关于用户账户,以及计算机上安装的所有应用程序的相关信息。此外,如果找到了有效的 ConnectCache 字段,就可以在不经 Steam 身份验证的情况下登录账户。其内容类似如下:

"ConnectCache"
{
       "STEAM_USERNAME_IN_CRC32_FORMAT" "SOME_HEX_STUFF"
}

攻击者想要窃取的最后一个文件是 loginusers.vdf。该文件有多种用途,但最主要的是用于手动对离线状态的账户进行设置。

有关 Steam 信息窃取的更多详情,Kapersky 曾经发布过一次非常 完整的分析

7.3 窃取加密货币钱包

该恶意软件支持窃取多个数字钱包,包括:Ethereum、Multibit、Electrum、Armory、Bytecoin、Bitcoin 等。

与之前一样,相关的文件都经过了 XOR 操作。

7.4 窃取FTP软件数据

该恶意软件支持对两个 FTP 软件的信息窃取,包括 FileZilla 和 WinFTP。

这部分模块非常简单,只会对以下3个文件进行搜索,如果找到,会将其复制,以实现窃取过程:

%APPDATA%\Filezilla\sitemanager.xml
%APPDATA%\Filezilla\recentservers.xml
%PROGRAMFILES%\WinFtp Client\Favorites.dat

7.5 窃取浏览器数据

在本文,将不对恶意软件窃取浏览器数据的过程做过多解释,因为目前已经有很多文章都详细解释了此类型恶意软件是如何获取Web数据的。建议大家阅读 @coldshell撰写的文章

Predator 的主要目标是如今流行的 Chrome、Firefox 和 Opera 浏览器。该恶意软件支持对众多浏览器进行信息窃取 ,包括:Amigo、BlackHawk、Chromium、Comodo Dragon、Cyberfox、Epic Privacy Browser、Google Chrome、IceCat、K-Meleon、Kometa、Maxthon5、Mozilla Firefox、Nichrome、Opera、Orbitum、Pale Moon、Sputnik、Torch、Vivaldi、Waterfox。

恶意软件使用 SQLite,从浏览器中提取数据,并将其保存到名为 vlmi{lulz}yg.col 的临时文件中。

该过程非常简单:

  1. 窃取 SQL 浏览器文件;
  2. 通过 SQLite,将提取到的数据保存到临时文件中;
  3. 读取文件,并将其中的内容保存到特定名称的文本文件中(针对每种浏览器创建一个文件)。

如果找到表单数据或身份认证凭据,则会将这部分内容保存到通用存储库的相应文件(forms.log、password.log、cards.log)中。

7.6 窃取 Discord 数据

如果检测到计算机上安装了 Discord,恶意软件将搜索 https_discordapp_*localstorage,并将其复制到 ptst 文件夹中。该文件包含所有关于账户的敏感信息,如果将该文件复制到攻击者计算机的正确目录中,那么攻击者可以无需身份验证直接进行登录。

Predator 会对多个位置进行检查。主要将窃取3个文件夹(Desktop、Downloads、Documents)中的数据。每次,其执行的任务都是相同的,会通过 GetFileAttributesA 搜索4种类型的文件:*.doc、*.docx、*.txt、*.log。

如果找到,就会将其复制到名为 Files 的文件夹内。

7.7 产生 Information.log

在上述任务完成后,恶意软件将生成摘要文件,该文件包含被感染计算机的特定和敏感数据。其中,DFIR 文件适用于标识恶意软件名称的组件,其中包含恶意软件的名称和版本信息。

首先,向该文件中写入被感染计算机的用户名称、计算机名称和操作系统版本:

User name: lolilol
Machine name: Computer
OS version: Windoge 10

随后,通过 GetClipBoardData 复制剪贴板中的内容:

Current clipboard:
--------------
Omelette du fromage

保存启动目录下的内容:

Startup folder: C:\Users\lolilol\AppData\Local\Temp\predator.exe

将计算机的一些硬件信息保存到文件中:

CPU info: Some bad CPU | Amount of kernels: 128 (Current CPU usage: 46.112917%)
GPU info: Fumik0_ graphical display
Amount of RAM: 12 GB (Current RAM usage: 240 MB)
Screen resolution: 1900x1005

列出计算机上所有账户:

Computer users:
lolilol
Administrator
All Users
Default
Default User
Public

接下来的一部分内容,是一些看上去非常奇怪的外部信息,我们没有对这部分信息进行深入猜测。这部分内容是在 Payload 中进行了硬编码。

最后一部分奇怪的信息,是在被感染主机执行信息窃取操作的事件,这个信息可能用于恶意软件开发者调试功能。

Additional information:
Compile time: Aug 31 2018
Grabbing time: 0.359375 second(s)

八、C&C 通信

为了记录 Information.log,将会使用 GET 请求,获取一些被感染用户的网络数据。

首先,在请求中设置如下内容:

User-agent
Content-type
API URL ( /api/info.get )

最终得到结果如下所示:

Amsterdam;Netherlands;52.3702;4.89517;51.15.43.205;Europe/Amsterdam;1012;

当请求完成后,恶意软件使用循环和判断语句,合并所获得的数据。

任务完成后,将保存到 Information.log 中。

City: Nopeland
Country:  NopeCountry
Coordinates: XX.XXXX N, X.XXXX W
IP: XXX.XXX.XXX.XXX
Timezone: Nowhere
Zip code: XXXXX

压缩包并不完整,它的作用只是将信息传送到 C&C 服务器。

现在,恶意软件会将一些信息,附加到gate.get请求的参数中,分别从 p1 到 p7,例如:

  • p1:窃取账户的数量
  • p2:窃取 Cookie 的数量
  • p4:窃取表单的数量
  • ……

结果如下:

在 POST 请求发出后,恶意软件会将所有内容清空,随后退出。

Predator C&C 服务器 Web 界面的背景比较花哨:

Example of Predator C2 Panel with fancy background…

九、版本更新:V2.3.7

在我们分析的过程中,这一恶意软件又推出了新的版本,接下来,我们将对新版本的变化进行分析。

针对新的版本,如果从头进行研究,无疑性价比是比较低的。因此,我们找到了恶意软件编写者发布的修改日志,只关注这些恶意软件编写者指出的变化部分。

Changelog of v2.3.7 explained by the author

恶意软件进行版本升级,通常会在两个方面进行改动。一是代码优化,以使恶意软件运行速度更快,或者使其更为轻量化。二是增加功能,使恶意软件具有更强大的能力。

正如我们所看到的,右侧 V2.3.7 代码比左侧 V2.3.5 要长很多,但其主干部分都是相同的。

9.1 互斥体

在 2.3.7 版本中,增加了一个互斥体(Mutex),该互斥体与一个名为 SyystemServs 的特定字符串集成在一起。

9.2 XOR与混淆

在 C&C 请求期间,URL 参数是逐字节生成的,并且经过了 XOR 操作。

例如:

push 04
...
push 61
...
push 70
...

最后结果为:

HEX    : 046170692F676174652E6765743F70313D
STRING : .api/gate.get?p1=

这是一个非常基础和简单的功能,但足以减慢我们的安全研究进度。这一部分调整就是新版本代码变长的主要原因。

9.3 加载工具

在此前分析中,我们没有见到这一加载工具(Loader)。在新版本中,集成了一个加载工具,用于向被感染主机推送其他的Payload。该内容可以通过GET请求轻松识别:

/api/download.get

该API请求允许恶意软件将URL转化为文本格式,然后下载,并将其保存到磁盘。随后使用 ShellExecuteA 来执行下载的 Payload。

此外,还有一些其他调整,但我们认为没有必要对这些变化进行详细说明。如果大家好奇,可以自行探索发现。

十、IoC

10.1 V2.3.5

  • 299f83d5a35f17aa97d40db667a52dcc | 加壳样本
  • 3cb386716d7b90b4dca1610afbd5b146 | 脱壳后样本
  • kent-adam.myjino.ru | C&C域名

10.2 V2.3.7

10.3 HTTP模式

  • GET — /api/info.get
  • POST — /api//gate.get?p1=X&p2=X&p3=X&p4=X&p5=X&p6=X&p7=X
  • GET — /api/download.get

10.4 MITRE ATT&CK

V2.3.5

Discovery – Peripheral Device Discovery
Discovery – System Information Discovery
Discovery – System Time Discovery
Discovery – Query Registry
Credential Access – Credentials in Files
Exfiltration – Data Compressed

V2.3.7

Discovery – Peripheral Device Discovery
Discovery – System Information Discovery
Discovery – System Time Discovery
Discovery – Query Registry
Credential Access – Credentials in Files
Exfiltration – Data Compressed
Execution –  Execution through API

10.5 恶意软件作者

  • Alexuiop1337

10.6 Yara规则

rule Predator_The_Thief : Predator_The_Thief {
   meta:
        description = "Yara rule for Predator The Thief v2.3.5 & +"
        author = "Fumik0_"
        date = "2018/10/12"
   strings:
        $mz = { 4D 5A }
 
        $hex1 = { BF 00 00 40 06 }
        $hex2 = { C6 04 31 6B }
        $hex3 = { C6 04 31 63 }
        $hex4 = { C6 04 31 75 }
        $hex5 = { C6 04 31 66 }
 
        $s1 = "sqlite_" ascii wide
   condition:
        $mz at 0 and all of ($hex*) and all of ($s*)
}

十一、安全建议

1、避免将文件存储在默认位置(例如:Desktop、Documents、Downloads),建议放在自定义的目录下。

2、避免运行破解版本或其他非官方版本的游戏,这些非官方版本的游戏往往不能及时更新,特别是 Fortnite 的游戏。

3、在运行软件的过程中使用容器,从而降低窃取数据的风险。

4、在每次访问后刷新一次浏览器,并且不要将密码直接保存在浏览器中,不要使用自动填充功能。

5、不要在所有网站都使用相同的密码,尽可能选用双因素认证(2FA)。

6、针对一些重要数据,在计算机中准备一些迷惑性的文件,这样攻击者即使成功窃取,也会受到误导。

7、使用 Vault 等密码管理软件。

十二、总结

这一信息泄露软件并不复杂,但 它们却足以对被感染用户产生不可逆转的影响。其中,电子邮件账户和其他软件/平台账户是攻击者重点关注的内容 。由此提醒广大用户,应该具有良好的安全意识,并在使用计算机的过程中注重安全性。防护恶意软件,并不是依靠一个简单的安全产品就能实现的,还需要从方方面面多加注意。


文章版权归原作者所有。
二维码分享本站