导语:在本篇文章中,我们对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界面的背景比较花哨:
九、版本更新:V2.3.7
在我们分析的过程中,这一恶意软件又推出了新的版本,接下来,我们将对新版本的变化进行分析。
针对新的版本,如果从头进行研究,无疑性价比是比较低的。因此,我们找到了恶意软件编写者发布的修改日志,只关注这些恶意软件编写者指出的变化部分。
恶意软件进行版本升级,通常会在两个方面进行改动。一是代码优化,以使恶意软件运行速度更快,或者使其更为轻量化。二是增加功能,使恶意软件具有更强大的能力。
正如我们所看到的,右侧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
· 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等密码管理软件。
十二、总结
这一信息泄露软件并不复杂,但它们却足以对被感染用户产生不可逆转的影响。其中,电子邮件账户和其他软件/平台账户是攻击者重点关注的内容。由此提醒广大用户,应该具有良好的安全意识,并在使用计算机的过程中注重安全性。防护恶意软件,并不是依靠一个简单的安全产品就能实现的,还需要从方方面面多加注意。