样本分析:Trinity 勒索软件

前言 Trinity 勒索软件是一个相对较新的威胁行为者,以采用双重勒索策略而闻名。这种方法包括在加密文件之前窃取敏感数据,从而增加受害者支付赎金的压力。这种勒索软件使用 ChaCha20 加密算法...

前言

Trinity 勒索软件是一个相对较新的威胁行为者,以采用双重勒索策略而闻名。这种方法包括在加密文件之前窃取敏感数据,从而增加受害者支付赎金的压力。这种勒索软件使用 ChaCha20 加密算法,加密文件带有“.trinitylock”文件扩展名。Trinity 运营一个受害者支持网站,提供解密帮助,以及一个展示受害者的泄密网站。

样本分析

image.png

运行:
image.png

反检测技术

反虚拟机

image.png

GetDiskFreeSpaceW检索有关指定磁盘的信息,包括磁盘上的可用空间量。恶意软件通过查询系统硬盘大小,根据硬盘大小来判定是否运行在虚拟机中。

互斥体

检查并创建互斥体:

image.png

main

隐藏和系统信息

调用ShowWindow 隐藏控制台窗口:

image.png

硬件环境检测:

image.png

使用 cpuid 指令来检测 CPU 的功能,通过 EAX=0 调用获取CPU的厂商信息;EAX=1可以获取CPU支持的功能标志,包括CPU支持的指令集和扩展功能。

image.png

Trinity还会收集其它系统信息,例如可用线程和连接的驱动器,以优化其多线程加密操作。

反复调用 GetModuleHandleW(L"ntdll.dll"),获取 ntdll.dll 的句柄:

image.png

加载 SetSecurityInfo

image.png

SetSecurityInfo 是一个较高层的 API,用于设置对象(如文件或进程)的安全权限。Trinity使用 SetSecurityInfo 修改文件或进程权限,防止用户或安全软件干扰恶意操作。

删除卷影服务

image.png

创建了一个COM对象实例,将其指针存储在ppv中。接着检查了系统进程(IsWow64Process),是否是64位。

if (CoCreateInstance(&stru_44B654, 0, 0x4401u, &stru_44B634, &v13) >= 0 && v13)
{
    v9 = SysAllocString(L"ROOT\\cimv2");
    if ((*(int (__stdcall **)(LPVOID, OLECHAR *, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, LPVOID, IUnknown **))(*(_DWORD *)v13 + 12))(v13, v9, 0, 0, 0, 0, 0, ppv, &pProxy) >= 0 && pProxy)
    {
        CoSetProxyBlanket(pProxy, 0xAu, 0, 0, 3u, 3u, 0, 0);

使用 CoCreateInstance 创建另一个 WMI 查询对象,并设置命名空间为 ROOT\cimv2。然后调用 CoSetProxyBlanket 配置 WMI 代理的安全设置,确保可以访问该命名空间下的资源。

WMI是微软实现的一种Windows管理规范的应用,它提供了一种标准化的接口,用于访问和管理 Windows 操作系统的各种信息,包括硬件、软件、操作系统配置、进程、服务、网络状态、设备驱动等。Trinity利用它查询并删除卷影服务。

命名空间 ROOT\cimv2 是WMI的默认命名空间。这里通过(*v13 + 12)的函数指针调用执行ConnectServer操作,该函数返回WMI的服务接口pProxy,进行进一步的查询。

image.png

这里恶意软件用 WQL 语言查询系统中的所有卷影副本。该语言类似于SQL语言,例如本例中的 select 语句。

pProxy->lpVtbl[6].Release(pProxy, bstrString, v8, 48, 0, &v12); 相当于执行 ExecQuery 方法;查询成功后返回结果集合给v12。

image.png

获取每个卷影副本的唯一标识符 ID

pProxy->lpVtbl[5].AddRef(pProxy, v5, 0, ppv, 0);实际上调用了 IWbemServices::DeleteInstance,使用 ID 来删除每个卷影副本实例。

初始化检查

设置了一些系统权限标志:

image.png

BOOL __thiscall sub_409CA0(LPCWSTR lpName)
{
  BOOL v1; // esi
  HANDLE CurrentProcess; // edi
  void *TokenHandle; // [esp+Ch] [ebp-18h] BYREF
  struct _LUID Luid[2]; // [esp+10h] [ebp-14h] BYREF

  v1 = 0;
  TokenHandle = 0;
  *(_OWORD *)&Luid[0].LowPart = 0i64;
  CurrentProcess = GetCurrentProcess();
  if ( OpenProcessToken(CurrentProcess, 0x28u, &TokenHandle) )
  {
    if ( LookupPrivilegeValueW(0, lpName, (PLUID)&Luid[0].HighPart) )
    {
      Luid[0].LowPart = 1;
      Luid[1].HighPart = 2;
      v1 = AdjustTokenPrivileges(TokenHandle, 0, (PTOKEN_PRIVILEGES)Luid, 0, 0, 0);
      if ( GetLastError() )
        v1 = 0;
    }
    CloseHandle(CurrentProcess);
  }
  return v1;
}
  • SeDebugPrivilege:调试权限,允许程序操作其他进程,典型的恶意软件权限。
  • SeTcbPrivilege:授予进程完全信任,可以模仿其他用户的权限。
  • SeTakeOwnershipPrivilege:允许进程接管文件、目录等对象的所有权。
  • SeSecurityPrivilege:允许读取和修改安全信息,例如访问控制列表(ACL)。

Cmd.exe

创建一个新进程cmd.exe

image.png

检查是否有管理员权限。

image.png

如果正在以管理员权限运行的话,恶意软件会再启动一个cmd.exe,用于执行Commandline的内容,CommandLine的命令要经过逐字节异或解密。

image.png

获取当前进程后检查是否是64位运行,通过调用 Wow64DisableWow64FsRedirection(&OldValue); 禁用文件系统重定向。确保后续启动的 cmd.exe 可以访问 System32 中的原生 64 位文件,而不是被重定向到 SysWOW64

这里也有wShowWindow = 0 来隐藏新进程的窗口。

开始异或解密 CommandLine 命令,byte_456128...数组是解密密钥,每个数组长度为0x18字节。

image.png

ip扫描

image.png

模拟权限提升的扫描操作,通过 GetShellWindow 获取系统的 Shell 窗口,然后获取该窗口的进程 ID。使用该进程 ID 调用 OpenProcess,打开进程句柄 v1。获取进程令牌 TokenHandle,并使用 DuplicateToken 创建一个具有 SecurityImpersonation 权限的令牌 DuplicateTokenHandle

image.png

降权后再次进行扫描:

image.png

勒索信息

image.png

桌面壁纸

image.png

image.png

创建一个jpg,将其设置为桌面壁纸。

hta文件

image.png

获取Windows目录后,创建一个.hta文件。

image.png

将内容写入后,调用 ShellExecuteExA 执行 .hta 文件。

总结

该样本在安装后会进行系统信息收集,例如处理器数量、可用线程和连接的驱动器,以优化其多线程加密操作。同时,检测驱动器、硬盘大小来进行反虚拟机操作。接着,它会尝试冒充合法进程的令牌来提升权限。Trinity能够进行网络扫描,这意味着它能够在目标网络的多个系统上传播和实施攻击。

  • 发表于 2024-12-10 10:00:02
  • 阅读 ( 2280 )
  • 分类:二进制

0 条评论

请先 登录 后评论
Sciurdae
Sciurdae

16 篇文章

站长统计