Predator the Thief又增加了新的恶意功能
作者:互联网
lucywang 嘶吼专业版
Predator The Thief是一种著名的恶意软件,旨在窃取密码和其他个人信息。新版本的Predator The Thief包括用于网络钓鱼***的新欺诈性文档,例如伪造发票和防止检测和分析反恶意软件工具的新策略。
Predator the Thief早在2018年就出现了,最新的迭代版本使用了各种反调试和反分析技术来使研究人员的分析复杂化,同时自身仍能顺利进行数据窃取。
在本文中,我们将回顾“Predator the Thief”的演变过程。
Predator the Thief的出现背景
Predator The Thief是在2018年6月17日出现在一个俄罗斯的暗网论坛上的。
以下是Predator的最初销售报价:
以及优惠的一些细节:
截至目前,Predator已经至少有5个迭代版本。尽管版本数量很少,但每个版本的功能都会增加很多,并且开发者仍在继续增强其功能。
目前,在另一个俄罗斯论坛以及Telegram平台上都在出售Predator。它的价格是150美元,加上Clipper模块可能需要另外支付100美元,这使得购买者可以自定义加密钱包的窃取选项。
截至10月30日,共有875个订户进入Telegram平台。
可以看出,自2019年8月19日起Predator 的版本就已经迭代到了3.3.0版本:
面板源代码
我们能够获得Predator the Thief面板源代码,该源代码帮助我们收集了更多信息。
面板界面如下所示:
某些面板脚本的开发者将自己标识为“melloy”:
面板用PHP编写,而恶意软件用c++编写。
下表包含与Predator the Thief的开发者相关的联系人信息:
从Twitter和VK中的信息来看,我们可以说这些账号背后的人就像动漫女孩一样:
Twitter中恶意软件开发者的头像
VK中恶意软件开发者的页面
不过根据以下这些信息,我们还是不能肯定地说恶意软件和面板背后的开发者是同一个团队:
1.昵称的前缀是“Alex”;
2. 《阿凡达》里的动漫女孩;
恶意软件流程
整个恶意作业都在原始可执行文件的地址空间中进行,执行多层解压缩和XOR解密,直到达到主要有效载荷为止。
恶意软件的功能
恶意软件会窃取各种浏览器、电子邮件客户端、加密钱包和其他软件的数据。它还需要桌面屏幕截图,此信息存储在驻留在内存中的ZIP存档中,然后发送到C2C。
恶意软件会从各种应用程序中窃取凭据:
它还通过以下方式获取系统信息(包括剪贴板):
最后,Predator the Thief获取已安装软件的列表并获取桌面屏幕截图。
数据已存档并进行了整理,如以下图所示:
创建互斥对象
Predator the Thief的最新版本会创建互斥对象,创建的互斥对象的名称是从磁盘卷序列号转换而来的。
反调试技术
Predator the Thief实施各种技术来增加研究人员分析的困难性,具体如下:
1.隐藏调试器中的线程
通过调用NtSetThreadInformation和HideFromDebugger枚举参数(11h),可从调试器中隐藏当前线程:
为了绕过这种检测方法,我们必须跳过调用并返回0(STATUS_SUCCESS)作为结果。
这是另一个陷阱,此调用之后有另一个调用。
请注意第3个参数和第4个参数的差异,应将其设置为NULL,以便正确执行该函数。如果传递了错误的参数,则返回0xC0000004错误代码。而这正是恶意软件期望从第二次调用中得到的:它正在等待返回错误代码。在这种情况下,不会从调试器中隐藏线程。
如果研究人员躲过这个陷阱,跳过这第二个调用NtSetThreadInformation函数与错误的参数,并将结果设为0,它将导致恶意软件通过另一个分支,这将导致终止而不是正确执行。
如果研究人员躲过这个陷阱,跳过这第二个调用NtSetThreadInformation函数与错误的参数,并将结果设为0,
2. CheckRemoteDebuggerPresent
可以通过插件(ScyllaHide,OllyAdvanced)或手动方式以多种方式伪造此检查,无论哪种方式,为了继续进行恶意软件调试,必须将此函数的结果设置为0。
3. CloseHandle
参考以下代码示例:
根据是否存在调试器,执行此代码的方式有所不同。恶意软件使用此方法检查是否检测到调试器:它检查是否执行了异常处理程序,并从中返回了1。如果满足所有条件,恶意软件将终止其执行。
当异常处理程序返回1时,对应于EXCEPTION_EXECUTE_HANDLER,表示已处理异常,点击这里了解详情。
要绕过此检查方法,我们必须将异常处理程序的返回值设置为0:
反分析技巧(动态)
1.干扰API调用分析
恶意软件会通过许多无意义的调用来干扰API调用分析:
可以看出总共干扰了28878次:
对于有意义的操作也是如此,在有意义的操作中多次执行相同的操作以使日志变大:
2.检查已安装的防病毒解决方案
如果成功加载以下DLL,则恶意软件将终止其执行:
taleOfTheWorstOne.dll
ActaRes.dll
SavUIRes.dll
“ ActaRes.dll”和“ SavUIRes.dll”都是Symantec Endpoint Protection的库。
我们对“ taleOfTheWorstOne.dll”的猜测是,该库在恶意软件开发过程中被用作***开关。
反分析技巧(静态)
1.字符串混淆
借助以下说明来混淆所有密钥字符串:
xor
sub
div
not
在解密之前将它们放在堆栈中,看起来像这样:
2.动态函数调用
调用函数时,恶意软件首先解密函数名称和相应的DLL。然后,它引用GetProcAddress包装器,然后进行调用。看起来像这样(此处未显示解密):
3. 跳转到指令中间
Predator的开发者在Telegram平台中描述了此方法,其源代码位于GitHub上:
下面我们将展示如何在研究过程中绕过它。
在调试器中考虑以下代码:
在任何情况下,跳转都将引导到指令的中间。以下代码是正确的:
下面是IDA中的代码:
伪造的指示标记为红色,在这种情况下,尝试在IDA中创建函数时,会显示一条错误消息,说明遇到了错误的指令。
在本案例中,用NOP替换伪函数调用是可以的,这样就可以真正地创建函数:
逃避技术
只有从服务器接收到相应的命令时,才会执行这些检查。
1.全局表描述符检查
这个技巧涉及到查看关键操作系统表的指针,这些表通常在虚拟机上重新定位。这就是所谓的“Red Pill”,它是乔安娜·鲁特科夫斯卡(Joanna Rutkowska)首次提出的。
每个CPU有一个本地描述符表寄存器(LDTR),一个全局描述符表寄存器(GDTR)和一个中断描述符表寄存器(IDTR)。在客户机操作系统运行时,必须将它们移至其他位置,以避免与主机发生冲突。
例如,在真实计算机上,IDT在内存中的位置比在来宾(即虚拟)计算机上的位置低。
注意:不适用于较新版本的VMWare Workstation(已在v10和v12中测试)。
使用三个指令来检查这些表的位置:
sidt
sldt(不被恶意软件使用)
sgdt
Predator the Thief只用其中的两个:sidt和sgdt。
代码示例:
idt_vm_detect = ((get_idt_base() >> 24) == 0xff);
ldt_vm_detect = (get_ldt_base() == 0xdead0000);
gdt_vm_detect = ((get_gdt_base >> 24) == 0xff);
// sidt instruction stores the contents of the IDT Register (the IDTR which points to the IDT) in a processor register.
ULONG get_idt_base() {
UCHAR idtr[6];
#if defined (ENV32BIT)
_asm sidt idtr
#endif
return *((unsigned long *)&idtr[2]);
}
// sldt instruction stores the contents of the LDT Register (the LDTR which points to the LDT) in a processor register.
ULONG get_ldt_base() {
UCHAR ldtr[5] = "\xef\xbe\xad\xde";
#if defined (ENV32BIT)
_asm sldt ldtr
#endif
return *((unsigned long *)&ldtr[0]);
}
// sgdt instruction stores the contents of the GDT Register (the GDTR which points to the GDT) in a processor register.
ULONG get_gdt_base() {
UCHAR gdtr[6];
#if defined (ENV32BIT)
_asm sgdt gdtr
#endif
return gdt = *((unsigned long *)&gdtr[2]);
}
CPU环境
这项技术使用“cpuid”指令来检查恶意软件是否在VM中运行,EAX设置为1,ECX设置为0,然后调用cpuid指令。如果在VM中运行,则ECX中的第31位设置为1,恶意软件会准确检查该位。
1.读取状态寄存器
此技术使用英特尔软件开发人员手册中描述的smsw指令:
将计算机状态字存储在r32 / m16的低16位中; r32的高16位未定义。
此处的关键是未定义的高阶位,在Intel处理器上,前16位的返回值始终为0x8001,而在VMware中的虚拟CPU上,目标寄存器包含执行指令之前保留的值。
使用此技术时,首先使用“magic”值初始化目标寄存器,然后执行smsw。如果在执行之后目标寄存器仍然包含“magic”值,则将应用程序视为在虚拟机中运行,这种技术在VMware workstation 12中不起作用。
网络环境
Predator the Thief启动两个连接到硬编码的C2C地址,首先它发送一个热烈欢迎获取配置文件,然后在ZIP存档中发送被盗的数据。
第一步
Config进入经典的Base64 + RC4加密层:
请在“附件”部分中找到解密脚本。
以下五个配置项以加密形式存储:
1.以这种顺序进行窃取的设置(对于布尔值:1 –功能打开; 0 –功能关闭):
2.窃取文件的目录和适当的文件掩码;
3.主机位置信息;
4.空字段,根据我们目前在网站上看到的,这是一个装载模块的地方。
5.为一个额外的模块联系服务器(在本案例中为HTTP POST /api/clipper.get),Clipper是用于通过自定义设置获取其他加密钱包的模块。
注意:借助批处理命令“/c ping 127.0.0.1 && del [filename]”执行自删除。
这些值的示例如下所示:
第二步
在这一步,被盗的数据被发送到C2C服务器的ZIP文件:
请求中的“ p”参数指示某些物品被盗,在此示例中:
p1 = 0&p2 = 243&p3 = 0&p4 = 0&p5 = 0&p6 = 0&p7 = 0&p8 = 0&p9 = 0
以及“ Information.txt”文件中的相同信息:
发送存档后,恶意软件终止其执行。
Predator the Thief的更新迭代
Predator the Thief正在积极迭代,以下是从其官方Telegram平台获取的3.3.1和3.3.2版本更改的说明:
以上屏幕截图来自3.3.1版
Predator the Thief 3.3.1版的说明
onion的域名的恢复
现在,build可以将数据发送到onion域,因此你的服务器被禁止的可能性非常低。因为:
1. build直接发送信息,而无需使用代理等;
2.无法保证与通常域相同的接收速率,对于onion域,速率可能更低;
3. TOR中的管理面板不会删除服务器禁令,但会将其最小化为零
面板更新
1.加了“未检查”筛选器,用于显示所有未经验证的日志;
2.固定显示加载程序和操作系统的统计信息;
3.固定显示Clipper模块中某些元素;
模块更新:加载程序
增加了检查文件是否已经启动的可能性,而不是执行它两次。
模块更新:盗窃程序
1.文件grabber经过优化,可处理最大100MB的日志;
2.截取所有PC监视器的屏幕截图;
3. 增强了关于PC安装应用程序的信息收集;
4.更改了HWID格式;
5. 带有信息的文件现在也包含BIOS信息;
6.增加了窃取信用卡的可能性;
7.从最受欢迎的防病毒解决方案中清除构建
盗窃程序更新
1. 盗窃者发送日志后,有可能执行PowerShell脚本,脚本应采用base64格式;
2.现在文件抓取器可以使用链接(LNK文件);
3.如果将 grabber应用于文件夹名称,则为“例外”;
4.添加了User-Agent的自动生成器,此信息将被写入文件“Software.txt”(在使用前进行检查,自动算法并不总是最好的解决方案)
3.3.0版的恶意软件与以前样本的分析
当前样本(3.3.0版)与先前研究的样本之间有很多差异,比如:
1.本版本中的反调试技术非常独特,以前的任何版本中都不存在;
2. 部分介绍了反分析方法;
3.互斥对象的名字生成算法已经完全改变了;
总结
尽管Predator the Thief不是当今最流行的恶意软件,但其***性不可小觑。
IOCs
哈希
域名
附件
Python互斥对象名称生成算法
import struct
import win32api
if __name__ == '__main__':
disk_num = 0
res = win32api.GetVolumeInformation('c:\\')
if len(res) != 5:
print 'Something went wrong with API function'
raise Exception
disk_num = res[1]
print 'Volume serial number (hex): %#08x' % struct.unpack('<i', struct.pack('
init_value = (disk_num * 5) & 0xFFFFFFFF
print 'Initial value (dec): %d' % init_value
init_string = str(init_value)
transformed_string = init_string + init_string[2:]
print 'String value: %s' % transformed_string
mutex_name = ''
for i in range(0, len(transformed_string)):
mutex_name += transformed_string[i] if i % 2 == 1 else chr(ord(transformed_string[i]) + 0x40)
print 'Mutex name: %s' % mutex_name
参考来源:https://research.checkpoint.com/2020/predator-the-thief/
标签:调用,Thief,恶意软件,Predator,恶意,版本,执行 来源: https://blog.51cto.com/u_15127538/2701782