对著名的信息窃取器RedLine的分析

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/amr-git-dot/RedLineStealer

RedLineStealer 恶意软件分析:

内容

1 - Manual unpacking for the first stage.
2 - Analysis of the shell code injected.
3 - Extracting the second Stage.
4 - List the actual functionalities of the malware.
5 - Yara rule for detecting the unpacked sample.

基础信息

md5         FEA0D408C87697BE73C07B988419DC12
sha1         EDE45222A0BBD2BECBD21B20897DB5BCC048B991
sha256      DD14B18A44EF6AC49EDFE5952D5FD8D5C83FC887D405E97DA15E572ED092B221

该文件是 32 位可执行文件,具有不太高的“.text”熵“我承认加壳器变得更加智能”并且导入和加载的库非常小,所以我相信它将使用运行时解析和加载 API 和库.

fb155b9e9c191243

 

在尝试执行文件以检查其行为时,文件只是静默退出,因此它可能检测到它正在 VM 中运行所以我很快决定继续进行高级分析状态

高级分析

开始时,程序将两个字符串连接在一起“C:\Windows\Microsoft.NET\Frame”我们现在不知道它在做什么,但我们会在进行调查时跟踪它,但在那之后,有一个电话使用下面函数的地址到“CreateThread”。

f45ec3267f191258

 

1f472befd7191310

 

这里发生的事情是,如果另一个线程设法在这三秒内完成执行,则主线程会休眠三秒,主线程将继续正常流程,否则它将退出主线程。 “我认为这是一种反虚拟机技术,因为虚拟机通常没有太多处理能力”。

如果您通过了最后一次检查,您将获得此汇编代码块。

abb5ca9ed1191323

 

在深入了解未知函数之前,我们只需更多地关注我们面前的汇编代码片段,就可以真正制作出它们的良好思维导图,让我解释一下。 这里我们有一个未知函数,它接受两个参数和另一个字符串“C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe”(visual basic 编译器)的连接,如果我们注意到第一个,则解析“VirtualProtect”未知函数的第二个参数与“VirtualProtect”API 的第一个和第二个参数相同然后因为我们知道“virtualProtect”的参数我们现在知道这个未知函数在第一个参数中占用内存空间大小然后做something 并在第二个参数中返回指向该内存的指针。

有了这个,让我们开始分析它。

看完之后你会注意到它只是一个简单的带有硬编码密钥的异或解密。

这个函数的伪代码是这样的

int __fastcall sub_FF1030(unsigned int memory_size, int memory_address)
{
  unsigned int counter;
  char counter_offset;
  char XORed_data;
  int result;

  for ( counter = 0; counter < memory_size; ++counter )
  {
    counter_offset = *(_BYTE *)(counter + memory_address);
    XORed_data = counter_offset ^ XOR_Key[counter & 3];
    result = sub_FF1006((int)"uA72hxBa");// Doesn't have any effect because the return is never used
    *(_BYTE *)(counter + memory_address) += XORed_data - counter_offset;
  }
  return result; // never used
}

这个函数被调用了两次然后两个分配的内存现在包含这个,

第一个包含可执行代码

e7af2bdeb7191336

 

第二个包含一个可执行文件

018c690341191350

 

最后,它将可执行代码的地址压入堆栈,作为 main 的返回地址,这样它就会开始执行它。

解密代码分析(Shell Code):

shell 代码从调用这个函数开始,我称之为“PEB_enumeration”以了解这里发生的事情,我们需要解释一下 PEB 结构的内部结构。

在“PEB”结构的偏移量“0x0C”处,有一个指向另一个名为“Ldr”的结构的指针,在该结构的偏移量“0x14”处,有一个指向指向每个加载模块的双向链表“InMemoryOrderModuleList”的指针正在进行中。

因此,恶意软件使用 PEB 结构来枚举加载的模块及其基地址,以便能够在运行时解析所需的 API。

xor edx, edx          ; Make sure edx is empty
mov edx, fs:[edx+30h] ; Get the address of PEB
mov edx, [edx+0Ch]    ; Get the address of PEB->Ldr
mov edx, [edx+14h]    ; Get the PEB->Ldr->InMemoryOrderModuleList

知道模块的基地址后,他们可以使用其散列查找其中的 API,这就是这里发生的事情。

7cac76c611191406

 

这里有一些在这个阶段解决的API

kernel32_ResumeThreadStub
kernel32_TerminateProcessStub
kernel32_VirtualAllocStub
kernel32_SetThreadContextStub
kernel32_ReadProcessMemoryStub
kernel32_GetThreadContextStub
kernel32_CreateProcessWStub
kernel32_VirtualProtectExStub
kernel32_VirtualFreeStub
kernel32_WriteProcessMemoryStub
kernel32_VirtualAllocExStub
kernel32_CloseHandle

ntdll_ZwUnmapViewOfSection
ntdll_memcpy
ntdll_RtlZeroMemory

然后该文件将创建一个处于挂起状态的“vbc.exe”进程,并在其内存中注入可执行文件并恢复线程以开始第二阶段。

573eda4c53191420

 

第二阶段

将注入的文件从内存中转储出来后,我们只需要手动取消映射,然后我们就有了第二阶段文件来继续我们的分析,这是一个“.NET”文件

9048abbba5191434

 

恶意软件首先检查它运行的设备所在的区域,如果它位于以下国家/地区之一,它将直接退出而不做任何事情。

e987f27430191500

 

然后恶意软件将开始尝试联系其 C2,并将继续尝试每 5 秒这样做一次,直到收到响应,这就是“connectionProvider”类的“Id1”所做的事情。 这是 C2 地址“89.22.231.25:45245”

3ea2a4eb51191514

 

然后配置一些连接设置,如标头和代理使用,然后使用“Invoker”方法开始从设备实际收集数据。

72bd427360191527

 

这里是被调用的方法,每个方法都负责收集一种数据。

49a6b00fe0191540

 

这是其中一种收集方法的示例。

4f179790a6191554

 

这是已收集数据的列表。

IPv4 Address
Domain Name
Windows Version
Virtual Display Size
Country
User Name
Processor Info
Graphics Card Info
RAM Info
Browsers Data
Installed Programs
Running Processes
Available Languages
Telegram data
Discord tokens
Steam configuration
VPN Credentials(OpenVPN, ProtonVPN)
Antiviruses
screenshots

Yara规则:

rule redline : infostealer
{
    meta:
        description = "This is a basic rule for detecting unpacked RedLineStealer"
        author = "Amr Ashraf"

    strings:
        $mz = {4D 5A}          //MZ header

        $string1 = "DownloadAndExecuteUpdate"

        $string2 = "net.tcp://"

        $string3 = "get_VirtualScreenWidth"

        $string4 = "StringDecrypt"

        $string5 = "ChromeGetRoamingName"

        $string6 = "SystemInfoHelper"

        $string7 ="cookies.sqlite"

        $string8 ="installedBrowsers"

    condition:
        ($mz at 0) and (6 of ($string*))
}

 

标签:工具分享, 思路分享, 学习笔记