导语:在本篇文章中,我们对Predator恶意软件进行了详细分析。本文适合初级逆向工程师或恶意软件分析人员阅读,希望通过我们的分析,能让大家轻松了解恶意软件所使用的某些技术或技巧,并掌握应对方法。

一、概述

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

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

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

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

Predator the thief的生命周期:

1.png

三、准备阶段

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

2.png

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

3.png

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

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

4.png

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

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

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

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

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

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

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

go 0x0040101D

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

5.png

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

· C&C域名

· %APPDATA%文件夹

· Predator文件夹

· Predator压缩文件的临时名称和位置

· 发送给C&C服务器的压缩文件名称

· 等等…

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

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

四、反逆向机制

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

6.png

五、混淆技术

5.1 大规模使用的XOR操作

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

7.png

5.2 使用GetProcAddress的替代方案

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

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

8.png

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

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

9.png

该字符串和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

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

10.png

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

2、获取该函数的名称;

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

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

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

11.png

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

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

12.png

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

ADD           ESI, ECX
ProcAddress = Function Address + DLLBaseAddress

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

13.png

procAddress的代码如下:

14.png

15.png

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

六、反虚拟机技术

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

16.png

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

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

Hyper-V
VMware
VirtualBox

17.png

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

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

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

18.png

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

19.png

七、信息窃取部分

接下来,我们分析这一恶意软件的主要目的,也就是它如何完成信息窃取的。目前,我对大部分代码进行了反汇编,得到了恶意软件在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的安装位置。

20.png

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

%TELEGRAM_PATH%
\Telegram Desktop
\tdata
\D877F783D5D3EF8C

21.png

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

7.2 窃取Steam数据

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

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

22.png

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

23.png

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

24.png

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

"ConnectCache"
{
       "STEAM_USERNAME_IN_CRC32_FORMAT" "SOME_HEX_STUFF"
}

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

25.png

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

7.3 窃取加密货币钱包

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

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

26.png

7.4 窃取FTP软件数据

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

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

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

27.png

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的临时文件中。

28.png

该过程非常简单:

1、窃取SQL浏览器文件;

2、通过SQLite,将提取到的数据保存到临时文件中;

3、读取文件,并将其中的内容保存到特定名称的文本文件中(针对每种浏览器创建一个文件)。

29.png

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

30.png

7.6 窃取Discord数据

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

31.png

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中进行了硬编码。

32.png

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

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

八、C&C通信

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

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

User-agent
Content-type

33.png

API URL ( /api/info.get )

最终得到结果如下所示:

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

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

34.png

任务完成后,将保存到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服务器。

35.png

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

· p1:窃取账户的数量

· p2:窃取Cookie的数量

· p4:窃取表单的数量

· ……

结果如下:

36.png

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

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

37.png

九、版本更新:V2.3.7

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

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

38.png

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

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

39.png

9.1 互斥体

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

40.png

9.2 XOR与混淆

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

例如:

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

最后结果为:

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

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

41.png

9.3 加载工具

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

/api/download.get

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

42.png

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

十、IoC

10.1 V2.3.5

· 299f83d5a35f17aa97d40db667a52dcc | 加壳样本

· 3cb386716d7b90b4dca1610afbd5b146 | 脱壳后样本

· kent-adam.myjino.ru | C&C域名

10.2 V2.3.7

· cbcc48fe0fa0fd30cb4c088fae582118 | 脱壳后样本

· denbaliberdin.myjino.ru | C&C域名

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等密码管理软件。

十二、总结

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

源链接

Hacking more

...